background-color: var(--accent-color-bright);
color: var(--text-fg-on-accent-bright);
}
+
+@keyframes bounce {
+ 0% {
+ transform: translateY(0);
+ animation-timing-function: cubic-bezier(0.333, 0.667, 0.667, 1);
+ }
+ 20% {
+ transform: translateY(-5px);
+ animation-timing-function: cubic-bezier(0.333, 0, 0,667, 0.333);
+ }
+ 40% {
+ transform: translateY(0);
+ }
+ 100% {
+ transform: translateY(0);
+ }
+}
+
+.typing span {
+ font-size: 150%;
+ line-height: 0;
+
+ display: inline-block;
+ animation-name: bounce;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+}
+
+.typing span:nth-child(2) {
+ animation-delay: .2s;
+}
+
+.typing span:nth-child(3) {
+ animation-delay: .4s;
+}
+
+.typing.active span {
+ opacity: 1.0;
+}
+
+.typing.idle span {
+ opacity: 0.0;
+ transition-property: opacity;
+ transition-duration: 6s;
+ transition-delay: 3s;
+}
<li
key={player}
>
- {player}
- {this.props.players_judging[player] ?
- <span className="typing"/> : null }
+ {player}{' '}
+ <span className=
+ {this.props.players_judging[player].active ?
+ "typing active"
+ :
+ "typing idle"}>
+ <span>{'.'}</span><span>{'.'}</span><span>{'.'}</span>
+ </span>
</li>
);
})}
<li
key={player}
>
- {player}
- {this.props.players_answering[player] ?
- <span className="typing"/> : null }
+ {player}{' '}
+ <span className=
+ {this.props.players_answering[player].active ?
+ "typing active"
+ :
+ "typing idle"}>
+ <span>{'.'}</span><span>{'.'}</span><span>{'.'}</span>
+ </span>
</li>
);
})}
}
set_player_answering(player) {
+ /* Set the player as actively answering now. */
this.setState({
players_answering: {
...this.state.players_answering,
[player]: {active: true}
}
});
+ /* And arrange to have them marked idle very shortly.
+ *
+ * Note: This timeout is intentionally very, very short. We only
+ * need it long enough that the browser has latched onto the state
+ * change to "active" above. We actually use a CSS transition
+ * delay to control the user-perceptible length of time after
+ * which an active player appears inactive.
+ */
+ setTimeout(() => {
+ this.setState({
+ players_answering: {
+ ...this.state.players_answering,
+ [player]: {active: false}
+ }
+ });
+ }, 100);
}
set_answering_idle(value) {
}
set_player_judging(player) {
+ /* Set the player as actively judging now. */
this.setState({
players_judging: {
...this.state.players_judging,
[player]: {active: true}
}
});
+ /* And arrange to have them marked idle very shortly.
+ *
+ * Note: This timeout is intentionally very, very short. We only
+ * need it long enough that the browser has latched onto the state
+ * change to "active" above. We actually use a CSS transition
+ * delay to control the user-perceptible length of time after
+ * which an active player appears inactive.
+ */
+ setTimeout(() => {
+ this.setState({
+ players_judging: {
+ ...this.state.players_judging,
+ [player]: {active: false}
+ }
+ });
+ }, 100);
+
}
set_judging_idle(value) {