<dt-text kind="headline" :size="600"> <dt-motion-text text="Welcome to Dialtone Motion Text" animation-mode="slide-in-gradient" loop /> </dt-text>
DtMotionText animates text word by word. Pass text and the effect plays as soon as the component mounts, using gradient-in unless you set animation-mode.
Every effect except shimmer works on whole words, never individual characters. Words animate in reading order, each starting a moment after the one before it. shimmer instead sweeps one dimmed band left to right across the whole text, so it reads well even on a single word. The gradient effects place one continuous purple-to-orange gradient behind all of the words, so each word shows its own slice of the same sweep rather than a gradient of its own. The gradient is the --dt-color-gradient-orange-red-magenta-purple token, a horizontal span of the Ai gradient used by Ai surfaces and borders.
| Mode | Effect |
|---|---|
gradient-in (default) | Each word fades in showing its slice of the gradient, then its text color fades in over it. |
fade-in | Each word fades in. |
slide-in | Each word fades in while rising into place. |
slide-in-gradient | The slide-in motion combined with the gradient-in color reveal. |
gradient-sweep | Text starts solid. Each word fades to the gradient, holds, then fades back to its text color. |
shimmer | A dimmed band sweeps left to right across the whole text. |
none | No animation. The text renders at rest. |
Select a mode to play it. Loop is on, so each effect keeps repeating; turn it off to watch a single play.
<dt-text kind="headline" :size="600"> <dt-motion-text text="The AI platform for customer experience" animation-mode="{mode}" /> </dt-text>
speed scales every timing in the effect proportionally. The default, 300, plays each effect at its designed timing. Lower values are faster and higher values are slower: 100 runs at 0.3× the designed timing, 200 at 0.6×, 400 at 1.5×, and 500 at 2.1×.
<dt-text kind="headline" :size="600"> <dt-motion-text text="Welcome to Dialtone Motion Text" animation-mode="shimmer" :speed="{speed}" loop /> </dt-text>
Set :auto-start="false" to start the effect on your own trigger, then drive it with the start(), pause(), resume(), reset(), and skipToEnd() methods. Switching auto-start to true later also starts the effect.
Until start() is called, the reveal modes (gradient-in, fade-in, slide-in, and slide-in-gradient) keep the text hidden, while gradient-sweep and shimmer show the text at rest. reset() returns every word to that starting frame, and skipToEnd() shows the text at rest immediately.
<dt-button @click="$refs.textRef.start()">Start</dt-button> <dt-button @click="$refs.textRef.pause()">Pause</dt-button> <dt-button @click="$refs.textRef.resume()">Resume</dt-button> <dt-button @click="$refs.textRef.reset()">Reset</dt-button> <dt-button @click="$refs.textRef.skipToEnd()">Skip to End</dt-button> <dt-motion-text ref="textRef" text="Welcome to Dialtone Motion Text" animation-mode="slide-in-gradient" :auto-start="false" loop />
Set loop to repeat the effect continuously. When a cycle finishes, the text holds at rest for a moment, then every word resets together and the cycle plays again. The hold is fixed, so the length of each cycle depends on how many words there are. For a six-word line at speed 300, the reveal modes repeat every 2 seconds and gradient-sweep every 2.65 seconds. shimmer repeats back to back every 3 seconds, whatever the length of the text.
Each cycle emits start when it begins and complete when its last word settles.
<dt-motion-text
text="Thinking through your request"
animation-mode="gradient-sweep"
loop
/>You can pass the text through the default slot instead of the text prop.
shimmer renders the slot as-is, so markup such as <strong> and live updates, like streamed text or a changing name, are kept.Whitespace between words, including line breaks, is kept, so white-space: pre-wrap on the component still applies.
<dt-motion-text animation-mode="shimmer" loop> <strong>{{ userName }}</strong> is typing... </dt-motion-text>
By default, DtMotionText follows the user's prefers-reduced-motion system setting. When reduced motion is requested, the text renders at rest with no movement or gradient, and the start and complete events still fire.
Set :respects-reduced-motion="false" only when the motion itself carries meaning. The effect then plays even when the user has asked for reduced motion.
<dt-motion-text
text="Plays regardless of the reduced motion setting"
:respects-reduced-motion="false"
/>Each word is real text separated by real spaces, so screen readers read the sentence as written. When the visible text isn't a good spoken equivalent, such as text with emoji or symbols, provide screen-reader-text:
<dt-motion-text
text="🎉 Congratulations!"
screen-reader-text="Congratulations"
/>DtMotionText sets these attributes automatically:
aria-live="polite" while the effect is animating, and aria-live="off" otherwise.screen-reader-text, the animated words stay available to assistive technology at all times, including while they animate.screen-reader-text, the component adds an aria-label and a visually hidden copy of that text, and marks the animated words aria-hidden="true".gradient-in, slide-in-gradient, and gradient-sweep) for AI-generated text inside product UI. Don't use them on brand headlines or hero sections (see Gradient). Use fade-in or slide-in for quieter reveals and body text, and a looping gradient-sweep or shimmer for thinking and loading states.300 is the designed timing. Use 200 when the effect needs to finish quickly, and 400 or 500 for slower, more deliberate moments.import { DtMotionText } from '@dialpad/dialtone-vue';
Name
|
Type
|
|---|---|
default |
Name
|
Default
|
Type
|
|---|---|---|
animationMode | 'gradient-in' |
"gradient-in"
|
"fade-in"
|
"slide-in"
|
"slide-in-gradient"
|
"gradient-sweep"
|
"shimmer"
|
"none"
The animation mode to use for the text reveal. |
autoStart | true |
"true"
|
"false"
Whether to start animation automatically when component is mounted. |
loop | false |
"true"
|
"false"
Whether to loop the animation continuously. |
respectsReducedMotion | true |
"true"
|
"false"
Whether to respect the user's prefers-reduced-motion system setting. |
screenReaderText | '' | string Alternative text for screen readers. If provided, this will be announced
instead of the animated text. |
speed | 300 |
"100"
|
"200"
|
"300"
|
"400"
|
"500"
Animation speed. 300 plays the motion spec as designed; lower values are faster. |
text | '' | string The text content to animate. |
Name
|
Type
|
|---|---|
complete | Emitted when the animation completes, and at the end of each looped cycle. |
pause | Emitted when the animation is paused. |
progress | { wordsComplete: number, totalWords: number, progress: number } Emitted as each word finishes animating. |
resume | Emitted when the animation resumes. |
start | Emitted when the animation starts, and at the start of each looped cycle. |
Motion Text documentation last updated Tuesday, October 27, 2026