Skip to content

Commit f693f41

Browse files
feat(website): remove cls on typewritter effect
1 parent 7e44d61 commit f693f41

3 files changed

Lines changed: 80 additions & 15 deletions

File tree

website/src/components/Typewriter/index.js

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useEffect, useMemo, useState } from 'react';
22
import clsx from 'clsx';
33
import styles from './styles.module.css';
44

@@ -13,6 +13,7 @@ export default function Typewriter({
1313
prefix = '',
1414
values = [],
1515
highlightClassName = '',
16+
reservePairs,
1617
}) {
1718
const [phase, setPhase] = useState('typing-prefix');
1819
// Phases:
@@ -128,25 +129,55 @@ export default function Typewriter({
128129
phase === 'paused-before-type' ||
129130
(phase === 'typing-value' && displayedValue.length === 0); // Blink while waiting to start typing value
130131

132+
const reserveVariants = useMemo(
133+
() =>
134+
(reservePairs ?? [[prefix, values]]).flatMap(
135+
([reservePrefix, reserveValues]) =>
136+
(reserveValues.length ? reserveValues : ['']).map(reserveValue => ({
137+
prefix: reservePrefix,
138+
value: reserveValue,
139+
})),
140+
),
141+
[reservePairs, prefix, values],
142+
);
143+
131144
return (
132-
<>
133-
{displayedPrefix}
134-
{showPrefixCursor && (
135-
<span className={clsx(styles.cursor, { [styles.blinking]: false })}>
136-
|
137-
</span>
138-
)}
139-
<br />
140-
<span className={highlightClassName}>
141-
{displayedValue}
142-
{showValueCursor && (
145+
<span className={styles.typewriter}>
146+
<span className={styles.sizer} aria-hidden="true">
147+
{reserveVariants.map(({ prefix: variantPrefix, value }, index) => (
143148
<span
144-
className={clsx(styles.cursor, { [styles.blinking]: isBlinking })}
149+
className={styles.sizerVariant}
150+
key={`${variantPrefix}-${value}-${index}`}
145151
>
146-
|
152+
{variantPrefix}
153+
<span className={styles.cursor}>|</span>
154+
<span className={styles.breakPoint} />
155+
<span className={highlightClassName}>
156+
{value}
157+
<span className={styles.cursor}>|</span>
158+
</span>
147159
</span>
160+
))}
161+
</span>
162+
<span className={styles.visibleText}>
163+
{displayedPrefix}
164+
{showPrefixCursor && <span className={styles.cursor}>|</span>}
165+
{showValueCursor && (
166+
<>
167+
<span className={styles.breakPoint} />
168+
<span className={highlightClassName}>
169+
{displayedValue}
170+
<span
171+
className={clsx(styles.cursor, {
172+
[styles.blinking]: isBlinking,
173+
})}
174+
>
175+
|
176+
</span>
177+
</span>
178+
</>
148179
)}
149180
</span>
150-
</>
181+
</span>
151182
);
152183
}

website/src/components/Typewriter/styles.module.css

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1+
.typewriter {
2+
display: grid;
3+
min-width: 0;
4+
}
5+
6+
.sizer,
7+
.visibleText {
8+
grid-area: 1 / 1 / 2 / 2;
9+
min-width: 0;
10+
}
11+
12+
.sizer {
13+
display: grid;
14+
visibility: hidden;
15+
pointer-events: none;
16+
}
17+
18+
.sizerVariant {
19+
display: block;
20+
grid-area: 1 / 1 / 2 / 2;
21+
}
22+
23+
.breakPoint::before {
24+
content: '\A';
25+
white-space: pre;
26+
}
27+
128
.cursor {
229
display: inline-block;
330
margin-left: 2px;
@@ -18,3 +45,9 @@
1845
opacity: 0;
1946
}
2047
}
48+
49+
@media screen and (max-width: 768px) {
50+
.breakPoint::before {
51+
content: ' ';
52+
}
53+
}

website/src/pages/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ suite.run(formData);`;
6868
prefix={prefix}
6969
values={values}
7070
highlightClassName={styles.heroHighlight}
71+
reservePairs={TYPEWRITER_DATA}
7172
/>
7273
</h1>
7374
<p className={clsx('hero__subtitle', styles.heroTagline)}>

0 commit comments

Comments
 (0)