Components/Motion loader

Motion loader

137 source-defined loading scenes with independent playback, localization and visibility-aware motion.

Since 0.6.3BETA

This component doc is in progress

This page is still being migrated. Demos and API details may change.

Overview

TxMotionLoader preserves the 134 named Amicro loading implementations and the three additional CSS loaders. Each variant has its own source geometry, trajectory, phase offsets and cadence. The catalog below keeps the original IDs and exported names. This is an indeterminate loading indicator; it never reports business completion.

The root is a polite status region with a stable accessible label. Animated artwork is hidden from assistive technology. Playback requires playing=true, a mounted visible component, a visible document and no reduced-motion preference. When any gate closes, native animations are cancelled and readable static artwork remains. Resuming starts the source rhythm again.

Usage

All named scenes

Filter the complete catalog, control each scene or all scenes, and adjust size, speed and localized status text. All 137 entries are mounted in the scrollable catalog; entries outside the viewport do not animate.

Loading demo...

Controlled playback

playing requests playback; visibility and reduced-motion settings still take priority. Change the source ID to switch geometry. The previous scene is disposed before the next scene starts.

<script setup lang="ts">
import { ref } from 'vue'
import { TxMotionLoader } from '@talex-touch/tuffex'

const playing = ref(true)
</script>

<template>
  <TxMotionLoader variant="wave-physics-loader" :playing="playing" />
  <button type="button" @click="playing = !playing">Toggle playback</button>
</template>

Best Practices

  • Prefer TxSkeleton or TxRowSkeleton for first-load content placeholders. Choose a motion loader for a short indeterminate wait whose geometry suits the surface.
  • Keep playing tied to actual pending work. Pausing an animation does not mean the request has completed, so the status region remains busy.
  • Supply label and labels for the host locale. The text variants use those labels, including per-character wave and pop scenes.
  • Use TxProgressBar when progress is known. No loader simulates percentages or succeeds after a timer.
  • Keep speed moderate and let the component own offscreen, hidden-page, KeepAlive and reduced-motion suspension.

API Reference

Props

PropTypeDefaultDescription
variantMotionLoaderVariant'classic-spinner'Exact source ID from the 137-entry catalog below.
playingbooleantrueRequests playback. False cancels all native tracks and leaves readable static artwork.
size'xs' | 'sm' | 'md' | 'lg''md'Source-geometry scale: 0.65, 0.85, 1 and 1.25. Aspect ratios and phase distances stay source-defined.
speednumber1Positive playback-rate multiplier. Non-finite or non-positive values use 1.
labelstringlabels.loadingAccessible status name and visible status copy; independent of the artwork's words.
labelsMotionLoaderLabelsSee belowLocalized words for textual scenes and paused status.
showLabelbooleantrueShows status text. False visually clips it without removing it from the accessibility tree.

Labels

KeyDefaultUsed by
loading'Loading'Status copy, AppleTextReveal, Typing, TextMorph and SpringTextPop. SpringTextPop appends the source's three dots.
thinking'Thinking'TextBlink, TextDots, TextShimmer and TextShimmerWave.
waiting'Wait'The second TextMorph layer.
unlock'Slide to unlock'Both AppleUnlock shimmer layers.
terminal'loading...'TerminalLoader's command text; cursor and prompt keep their source geometry.
paused'Paused'Status text when playing=false.

Events

No component-specific events. The host controls pending work and the playing prop.

Slots

No slots. Textual scene content comes from labels; generic artwork is not substituted for missing content.

Exports

  • TxMotionLoader and the installed MotionLoader component.
  • MOTION_LOADER_VARIANTS: readonly tuple enumerating all 137 source IDs; MotionLoaderVariant is derived from that tuple.
  • MOTION_LOADER_SOURCES: typed records containing each id, original exported name and pinned upstream source path.
  • MotionLoaderProps, MotionLoaderLabels, MotionLoaderSize, MotionLoaderSource and TxMotionLoaderInstance.

Source mapping

Sources are pinned to Amicro commit 43c29ce9cdd16459e3eab4992381b8d35b38776a under the MIT license, Copyright (c) 2026 SYED SUBHAN UDDIN. The table records source motion values and per-node phases, not animation inferred from a name. Native spin utilities retain their one-second linear revolution. Omitted source easing uses the source's default ease-out.

Variant IDOriginal exportPinned sourceSource trajectory / cadence
accordion-loaderAccordionLoaderregistry/ui/loading/accordion-loader.tsxscaleX=1,0.2,1 · 1.5s/easeInOut
scaleX=1,0.2,1 · 1.5s/easeInOut, phase 0.15s
scaleX=1,0.2,1 · 1.5s/easeInOut, phase 0.3s
scaleX=1,0.2,1 · 1.5s/easeInOut, phase 0.45s
app-icon-loadAppIconLoadregistry/ui/loading/app-icon-load.tsxstrokeDashoffset=125,0 · 2s/easeInOut
apple-breatheAppleBreatheregistry/ui/loading/apple-breathe.tsxscale=1,1.75,1; x=0,11,0; y=0,0,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,5.5,0; y=0,9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-5.5,0; y=0,9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-11,0; y=0,0,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-5.5,0; y=0,-9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,5.5,0; y=0,-9.526279,0 · 3.6s/easeInOut
apple-equalizerAppleEqualizerregistry/ui/loading/apple-equalizer.tsxheight="20%","100%","20%" · 0.8s/circInOut, phase 0.06s
height="20%","100%","20%" · 0.8s/circInOut, phase 0.41s
height="20%","100%","20%" · 0.8s/circInOut, phase 0.19s
height="20%","100%","20%" · 0.8s/circInOut, phase 0.32s
apple-icon-morphAppleIconMorphregistry/ui/loading/apple-icon-morph.tsxborderRadius="20%","50%","50%","20%"; rotate=0,90,180,270 · 2s/easeInOut
apple-pulse-dotsApplePulseDotsregistry/ui/loading/apple-pulse-dots.tsxscale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut
scale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut, phase 0.15s
scale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut, phase 0.3s
anim-apple-spinnerAppleRadialSpinnersrc/components/css-animations/whimsical/AppleLoaders.tsxopacity=1,0.15 · 0.8s/linear, phase -0.8s
opacity=1,0.15 · 0.8s/linear, phase -0.7s
opacity=1,0.15 · 0.8s/linear, phase -0.6s
opacity=1,0.15 · 0.8s/linear, phase -0.5s
opacity=1,0.15 · 0.8s/linear, phase -0.4s
opacity=1,0.15 · 0.8s/linear, phase -0.3s
opacity=1,0.15 · 0.8s/linear, phase -0.2s
opacity=1,0.15 · 0.8s/linear, phase -0.1s
apple-scale-pulseAppleScalePulseregistry/ui/loading/apple-scale-pulse.tsxscale=0,1; opacity=1,0 · 1.5s/easeOut
scale=0,1; opacity=1,0 · 1.5s/easeOut, phase 0.5s
apple-sound-waveAppleSoundWaveregistry/ui/loading/apple-sound-wave.tsxheight=4,8,4 · 1s/easeInOut
height=4,16,4 · 1s/easeInOut, phase 0.1s
height=4,24,4 · 1s/easeInOut, phase 0.2s
height=4,16,4 · 1s/easeInOut, phase 0.3s
height=4,8,4 · 1s/easeInOut, phase 0.4s
apple-text-revealAppleTextRevealregistry/ui/loading/apple-text-reveal.tsxy="100%","0%","-100%" · 2s/easeInOut
apple-unlockAppleUnlockregistry/ui/loading/apple-unlock.tsxbackgroundPosition="200% 0","-200% 0" · 2.2s/linear
arc-tracerArcTracerregistry/ui/loading/arc-tracer.tsxstrokeDashoffset=125,0,-125 · 2s/easeInOut
bar-cascadeBarCascaderegistry/ui/loading/bar-cascade.tsxheight="8px","24px","8px" · 1s/easeInOut
height="8px","24px","8px" · 1s/easeInOut, phase 0.1s
height="8px","24px","8px" · 1s/easeInOut, phase 0.2s
height="8px","24px","8px" · 1s/easeInOut, phase 0.3s
height="8px","24px","8px" · 1s/easeInOut, phase 0.4s
bar-sweepBarSweepregistry/ui/loading/bar-sweep.tsxx=0,24,0 · 1.5s/easeInOut
bobbing-dotsBobbingDotsregistry/ui/loading/bobbing-dots.tsxy=0,-10,0 · 1.2s/easeInOut
y=0,-10,0 · 1.2s/easeInOut, phase 0.15s
y=0,-10,0 · 1.2s/easeInOut, phase 0.3s
bounce-dotsBounceDotsregistry/ui/loading/bounce-dots.tsxy=0,-8,0 · 0.6s/easeInOut
y=0,-8,0 · 0.6s/easeInOut, phase 0.1s
y=0,-8,0 · 0.6s/easeInOut, phase 0.2s
bouncing-barsBouncingBarsregistry/ui/loading/bouncing-bars.tsxscaleY=0.3,1,0.3 · 1s/easeInOut
scaleY=0.3,1,0.3 · 1s/easeInOut, phase 0.2s
scaleY=0.3,1,0.3 · 1s/easeInOut, phase 0.4s
bouncing-dotsBouncingDotsregistry/ui/loading/bouncing-dots.tsxy=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut
y=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut, phase 0.1s
y=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut, phase 0.2s
bouncing-linesBouncingLinesregistry/ui/loading/bouncing-lines.tsxscaleX=0.3,1,0.3 · 1s/easeInOut
scaleX=0.3,1,0.3 · 1s/easeInOut, phase 0.2s
scaleX=0.3,1,0.3 · 1s/easeInOut, phase 0.4s
bouncing-squareBouncingSquareregistry/ui/loading/bouncing-square.tsxy=0,-24,0; scaleY=0.8,1.1,0.8; scaleX=1.2,0.9,1.2 · 0.6s/easeInOut
breathe-ringBreatheRingregistry/ui/loading/breathe-ring.tsxscale=0.8,1.1,0.8; borderWidth=6,2,6 · 3s/easeInOut
breathing-glowBreathingGlowregistry/ui/loading/breathing-glow.tsxscale=1,1.5,1; opacity=0.5,0.8,0.5 · 2s/easeInOut
breathing-squareBreathingSquareregistry/ui/loading/breathing-square.tsxscale=1,1.2,1; borderRadius="0%","50%","0%"; rotate=0,90,180 · 2s/easeInOut
circular-barsCircularBarsregistry/ui/loading/circular-bars.tsxscaleY=0.5,1.5,0.5 · 1.2s/easeInOut
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.15s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.3s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.45s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.6s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.75s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 0.9s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, phase 1.05s
classic-spinnerClassicSpinnerregistry/ui/loading/classic-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, phase 0.083s
opacity=1,0.2 · 1s/linear, phase 0.167s
opacity=1,0.2 · 1s/linear, phase 0.25s
opacity=1,0.2 · 1s/linear, phase 0.333s
opacity=1,0.2 · 1s/linear, phase 0.417s
opacity=1,0.2 · 1s/linear, phase 0.5s
opacity=1,0.2 · 1s/linear, phase 0.583s
opacity=1,0.2 · 1s/linear, phase 0.667s
opacity=1,0.2 · 1s/linear, phase 0.75s
opacity=1,0.2 · 1s/linear, phase 0.833s
opacity=1,0.2 · 1s/linear, phase 0.917s
clock-spinnerClockSpinnerregistry/ui/loading/clock-spinner.tsxrotate=360 · 2s/linear
rotate=360 · 12s/linear
comet-spinnerCometSpinnerregistry/ui/loading/comet-spinner.tsxrotate=360 · 1s/linear
concentric-pulseConcentricPulseregistry/ui/loading/concentric-pulse.tsxwidth=48; height=48; opacity=0 · 2s/easeOut, phase 0.6s
width=48; height=48; opacity=0 · 2s/easeOut, phase 1.2s
width=48; height=48; opacity=0 · 2s/easeOut, phase 1.8s
concentric-ringConcentricRingregistry/ui/loading/concentric-ring.tsxrotate=360 · 2s/linear
rotate=-360 · 1.5s/linear
rotate=360 · 1s/linear
concentric-squaresConcentricSquaresregistry/ui/loading/concentric-squares.tsxrotate=0,90,90; scale=1,1,0.8,1 · 2s/easeInOut
rotate=0,-90,-90; scale=1,1,1.2,1 · 2s/easeInOut
conveyor-loopConveyorLoopregistry/ui/loading/conveyor-loop.tsxx=0,-32 · 1s/linear
cross-spinnerCrossSpinnerregistry/ui/loading/cross-spinner.tsxrotate=0,90,180,270,360 · 2s/easeInOut
cube-flip-springCubeFlipSpringregistry/ui/loading/cube-flip-spring.tsxrotateX=0,180,180; rotateY=0,0,180 · 2s/spring, bounce=0.2
dash-ringDashRingregistry/ui/loading/dash-ring.tsxrotate=360 · 4s/linear
dashed-spiralDashedSpiralregistry/ui/loading/dashed-spiral.tsxrotate=360; scale=1,1.1,1 · 4s/linear
diamond-gridDiamondGridregistry/ui/loading/diamond-grid.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.6s
diamond-rotate-springDiamondRotateSpringregistry/ui/loading/diamond-rotate-spring.tsxrotate=45,135,225,315 · 2s/spring, bounce=0.4
dot-spinnerDotSpinnerregistry/ui/loading/dot-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, phase 0.125s
opacity=1,0.2 · 1s/linear, phase 0.25s
opacity=1,0.2 · 1s/linear, phase 0.375s
opacity=1,0.2 · 1s/linear, phase 0.5s
opacity=1,0.2 · 1s/linear, phase 0.625s
opacity=1,0.2 · 1s/linear, phase 0.75s
opacity=1,0.2 · 1s/linear, phase 0.875s
dots-ringDotsRingregistry/ui/loading/dots-ring.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.15s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.3s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.45s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.6s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.75s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.9s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 1.05s
double-ringDoubleRingregistry/ui/loading/double-ring.tsxrotate=360 · 1.5s/linear
rotate=-360 · 1s/linear
drop-dotDropDotregistry/ui/loading/drop-dot.tsxy=0,24,0; scaleY=1,1.2,1; scaleX=1,0.8,1 · 1s/circIn
dual-arcDualArcregistry/ui/loading/dual-arc.tsxrotate=360; scale=1,0.82,1 · (rotate 1.2s/linear, scale 1.2s/easeInOut)
dynamic-islandDynamicIslandregistry/ui/loading/dynamic-island.tsxwidth=80,110,80 · 2.2s/easeInOut
opacity=0.4,1,0.4 · 1.1s/easeInOut
height=3,8,3 · 0.8s/easeInOut
height=3,8,3 · 0.8s/easeInOut, phase 0.15s
height=3,8,3 · 0.8s/easeInOut, phase 0.3s
elastic-barsElasticBarsregistry/ui/loading/elastic-bars.tsxheight=8,36,8 · 1.1s/easeInOut
height=8,36,8 · 1.1s/easeInOut, phase 0.15s
height=8,36,8 · 1.1s/easeInOut, phase 0.3s
elastic-squareElasticSquareregistry/ui/loading/elastic-square.tsxy=0,-20,0; scaleY=0.7,1.2,0.7; scaleX=1.3,0.8,1.3 · 0.8s/easeInOut
expanding-crossExpandingCrossregistry/ui/loading/expanding-cross.tsxscaleX=0.2,1,0.2 · 1.5s/easeInOut
scaleY=0.2,1,0.2 · 1.5s/easeInOut, phase 0.75s
face-id-scanFaceIDScanregistry/ui/loading/face-id-scan.tsxtop="-100%","100%","-100%" · 2.5s/linear
fade-arcFadeArcregistry/ui/loading/fade-arc.tsxrotate=0→360 · 1s/linear
fade-dotsFadeDotsregistry/ui/loading/fade-dots.tsxopacity=0,1,0 · 1.5s/linear
opacity=0,1,0 · 1.5s/linear, phase 0.2s
opacity=0,1,0 · 1.5s/linear, phase 0.4s
opacity=0,1,0 · 1.5s/linear, phase 0.6s
flip-squareFlipSquareregistry/ui/loading/flip-square.tsxrotateX=0,180,180,0; rotateY=0,0,180,180 · 2s/easeInOut
floating-diamondsFloatingDiamondsregistry/ui/loading/floating-diamonds.tsxy=0,-10,0 · 1s/easeInOut
y=0,-10,0 · 1s/easeInOut, phase 0.2s
y=0,-10,0 · 1s/easeInOut, phase 0.4s
fluid-barsFluidBarsregistry/ui/loading/fluid-bars.tsxrotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, phase 0.1s
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, phase 0.2s
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, phase 0.3s
fluid-diamondFluidDiamondregistry/ui/loading/fluid-diamond.tsxscaleX=1,1.5,1; scaleY=1,0.5,1 · 1.5s/easeInOut
fluid-dot-orbitFluidDotOrbitregistry/ui/loading/fluid-dot-orbit.tsxrotate=360 · 2s/linear
fluid-skeletonFluidSkeletonregistry/ui/loading/fluid-skeleton.tsxx="-100%","200%" · 1.5s/linear
gearsGearsregistry/ui/loading/gears.tsxrotate=360 · 4s/linear
rotate=-360 · 3s/linear
glassmorphic-cardGlassmorphicCardregistry/ui/loading/glassmorphic-card.tsxx=-20,20,-20; y=-10,10,-10 · 3s/easeInOut
rotate=0→360 · 1s/linear
gradient-arcGradientArcregistry/ui/loading/gradient-arc.tsxrotate=360 · 1.2s/linear
grid-dotsGridDotsregistry/ui/loading/grid-dots.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.6s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.8s
haptic-ringHapticRingregistry/ui/loading/haptic-ring.tsxrotate=0,90,180,270,360 · 2s/spring, bounce=0.4
heartbeatHeartbeatregistry/ui/loading/heartbeat.tsxstrokeDashoffset=100,-100 · 2s/linear
hexagon-spinnerHexagonSpinnerregistry/ui/loading/hexagon-spinner.tsxstrokeDashoffset=120,-120 · 2s/linear
hourglassHourglassregistry/ui/loading/hourglass.tsxrotate=0,180,180,360,360 · 3s/easeInOut
infinity-pathInfinityPathregistry/ui/loading/infinity-path.tsxstrokeDashoffset=100,-100 · 2s/linear
intersecting-ringsIntersectingRingsregistry/ui/loading/intersecting-rings.tsxrotateX=360; rotateY=180 · 2.2s/linear
rotateX=180; rotateY=360 · 2.2s/linear
ios-spinnerIOSSpinnerregistry/ui/loading/ios-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, phase 0.083s
opacity=1,0.2 · 1s/linear, phase 0.167s
opacity=1,0.2 · 1s/linear, phase 0.25s
opacity=1,0.2 · 1s/linear, phase 0.333s
opacity=1,0.2 · 1s/linear, phase 0.417s
opacity=1,0.2 · 1s/linear, phase 0.5s
opacity=1,0.2 · 1s/linear, phase 0.583s
opacity=1,0.2 · 1s/linear, phase 0.667s
opacity=1,0.2 · 1s/linear, phase 0.75s
opacity=1,0.2 · 1s/linear, phase 0.833s
opacity=1,0.2 · 1s/linear, phase 0.917s
line-spinnerLineSpinnerregistry/ui/loading/line-spinner.tsxrotate=360 · 1.2s/linear
liquid-dotsLiquidDotsregistry/ui/loading/liquid-dots.tsxx=-16,16,-16 · 2s/easeInOut
x=16,-16,16 · 2s/easeInOut
mac-terminalMacTerminalregistry/ui/loading/mac-terminal.tsxopacity=1,0,1 · 1s/linear
magnetic-dotsMagneticDotsregistry/ui/loading/magnetic-dots.tsxx=0,8,0 · 1.5s/easeInOut
x=0,-8,0 · 1.5s/easeInOut
anim-matrix-loaderMatrixGridLoadersrc/components/css-animations/whimsical/MatrixGridLoader.tsxopacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, phase 0.2s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, phase 0.4s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, phase 0.8s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, phase 0.6s
minimal-triangleMinimalTriangleregistry/ui/loading/minimal-triangle.tsxstrokeDashoffset=120,0,-120 · 2s/easeInOut
morph-dot-ringMorphDotRingregistry/ui/loading/morph-dot-ring.tsxrotate=180; gap="4px","0px","4px" · 2s/easeInOut
morph-loaderMorphLoaderregistry/ui/loading/morph-loader.tsxborderRadius="25%","50%","50%","25%","25%"; rotate=0,90,180,270,360; scale=1,0.8,1.1,0.8,1 · 2.2s/easeInOut
morphing-barsMorphingBarsregistry/ui/loading/morphing-bars.tsxgap="4px","0px","4px" · 2s/easeInOut
height=32,16,32 · 2s/easeInOut
morphing-infinityMorphingInfinityregistry/ui/loading/morphing-infinity.tsxx=0,24,0; scale=1,0.5,1 · 2s/easeInOut
x=24,0,24; scale=0.5,1,0.5 · 2s/easeInOut
morphing-ringMorphingRingregistry/ui/loading/morphing-ring.tsxrotate=180; borderRadius="10%","50%","10%" · 2s/easeInOut
morphing-shapeMorphingShaperegistry/ui/loading/morphing-shape.tsxborderRadius="10%","50%","10%"; rotate=0,90,180; scale=1,0.8,1 · 2s/easeInOut
newtons-cradleNewtonsCradleregistry/ui/loading/newtons-cradle.tsxrotate=25,0,0,0,0,25 · 1.5s/easeInOut
rotate=0,0,0,-25,0,0 · 1.5s/easeInOut
offset-ringsOffsetRingsregistry/ui/loading/offset-rings.tsxrotate=0,180,360 · 2s/easeInOut
rotate=0,-180,-360 · 2s/easeInOut, phase 0.2s
orbiting-circlesOrbitingCirclesregistry/ui/loading/orbiting-circles.tsxrotate=360 · 2s/linear
rotate=-360 · 2s/linear
orbiting-dotOrbitingDotregistry/ui/loading/orbiting-dot.tsxrotate=360 · 2s/linear
origami-shapeOrigamiShaperegistry/ui/loading/origami-shape.tsxrotateY=0,180,0 · 2s/easeInOut
pendulumPendulumregistry/ui/loading/pendulum.tsxrotate=-45,45,-45 · 1.5s/easeInOut
pulsating-dotsPulsatingDotsregistry/ui/loading/pulsating-dots.tsxscale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut
scale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut, phase 0.2s
scale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut, phase 0.4s
pulsePulseregistry/ui/loading/pulse.tsxscale=2.8; opacity=0 · 1.8s/easeOut
scale=2.8; opacity=0 · 1.8s/easeOut, phase 0.6s
pulse-dotPulseDotregistry/ui/loading/pulse-dot.tsxscale=0,1; opacity=0.8,0 · 1.5s/easeOut
pulse-dotsPulseDotsregistry/ui/loading/pulse-dots.tsxopacity=0.2,1,0.2 · 1.4s
opacity=0.2,1,0.2 · 1.4s, phase 0.2s
opacity=0.2,1,0.2 · 1.4s, phase 0.4s
anim-pulse-dotsPulseOrbitDotssrc/components/css-animations/whimsical/AppleLoaders.tsxscale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut
scale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut, phase 0.2s
scale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut, phase 0.4s
pulse-squarePulseSquareregistry/ui/loading/pulse-square.tsxscale=1,1.2,1; opacity=1,0.3,1; borderRadius="20%","50%","20%" · 1.5s/easeInOut
pumping-heartPumpingHeartregistry/ui/loading/pumping-heart.tsxscale=1,1.25,1,1.25,1 · 1.5s/easeInOut
radar-sweepRadarSweepregistry/ui/loading/radar-sweep.tsxrotate=360 · 1.8s/linear
ring-sweepRingSweepregistry/ui/loading/ring-sweep.tsxrotate=360 · 1s/linear
ripple-effectRippleEffectregistry/ui/loading/ripple-effect.tsxscale=1.6; opacity=0 · 2.2s/easeOut
scale=1.6; opacity=0 · 2.2s/easeOut, phase 0.7s
scale=1.6; opacity=0 · 2.2s/easeOut, phase 1.4s
rotating-crossRotatingCrossregistry/ui/loading/rotating-cross.tsxrotate=180 · 0.8s/easeInOut
rotating-triangleRotatingTriangleregistry/ui/loading/rotating-triangle.tsxrotate=360 · 2s/linear
shape-shift-gridShapeShiftGridregistry/ui/loading/shape-shift-grid.tsxborderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, phase 0.1s
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, phase 0.2s
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, phase 0.3s
shimmer-lineShimmerLineregistry/ui/loading/shimmer-line.tsxx="-100%","300%" · 1.5s/easeInOut
siri-waveSiriWaveregistry/ui/loading/siri-wave.tsxheight=4,24,4 · 1.2s/easeInOut
height=4,24,4 · 1.2s/easeInOut, phase 0.1s
height=4,24,4 · 1.2s/easeInOut, phase 0.2s
height=4,24,4 · 1.2s/easeInOut, phase 0.3s
height=4,24,4 · 1.2s/easeInOut, phase 0.4s
skeletonSkeletonregistry/ui/loading/skeleton.tsxx="150%" · 1.6s/easeInOut
skeleton-loaderSkeletonLoaderregistry/ui/loading/skeleton-loader.tsxopacity=0.5,1,0.5 · 1.5s/easeInOut
opacity=0.5,1,0.5 · 1.5s/easeInOut, phase 0.2s
opacity=0.5,1,0.5 · 1.5s/easeInOut, phase 0.4s
opacity=0.5,1,0.5 · 1.5s/easeInOut, phase 0.6s
sliding-barsSlidingBarsregistry/ui/loading/sliding-bars.tsxy=0,24,0 · 1.5s/easeInOut
y=0,-24,0 · 1.5s/easeInOut
smooth-dot-shiftSmoothDotShiftregistry/ui/loading/smooth-dot-shift.tsxx=0,18,36,18,0 · 2s/easeInOut
smooth-ringSmoothRingregistry/ui/loading/smooth-ring.tsxrotate=0→360 · 1s/linear
smooth-rounded-squareSmoothRoundedSquareregistry/ui/loading/smooth-rounded-square.tsxborderRadius="10%","50%","10%" · 2s/easeInOut
spinning-squaresSpinningSquaresregistry/ui/loading/spinning-squares.tsxx=0,24,24,0,0; y=0,0,24,24,0 · 2s/easeInOut
x=0,-24,-24,0,0; y=0,0,-24,-24,0 · 2s/easeInOut
spiral-spinnerSpiralSpinnerregistry/ui/loading/spiral-spinner.tsxrotate=360; scale=1,0.8,1 · 1.5s/easeInOut
spring-barsSpringBarsregistry/ui/loading/spring-bars.tsxscaleX=0.2,1,0.2 · 1.4s/easeInOut
scaleX=0.2,1,0.2 · 1.4s/easeInOut, phase 0.15s
scaleX=0.2,1,0.2 · 1.4s/easeInOut, phase 0.3s
spring-dot-matrixSpringDotMatrixregistry/ui/loading/spring-dot-matrix.tsxscale=1,0.4,1 · 1.5s/easeInOut
scale=1,0.4,1 · 1.5s/easeInOut, phase 0.15s
scale=1,0.4,1 · 1.5s/easeInOut, phase 0.3s
scale=1,0.4,1 · 1.5s/easeInOut, phase 0.45s
scale=1,0.4,1 · 1.5s/easeInOut, phase 0.6s
spring-hexagonSpringHexagonregistry/ui/loading/spring-hexagon.tsxscale=1,1.15,1; rotate=0,60,60 · 2s/spring, bounce=0.3
spring-ring-expandSpringRingExpandregistry/ui/loading/spring-ring-expand.tsxscale=1.25; opacity=0 · 1.6s/easeOut
scale=1.25; opacity=0 · 1.6s/easeOut, phase 0.8s
spring-text-popSpringTextPopregistry/ui/loading/spring-text-pop.tsxy=0,-6,0 · 1.2s/easeInOut
y=0,-6,0 · 1.2s/easeInOut, phase 0.08s
y=0,-6,0 · 1.2s/easeInOut, phase 0.16s
y=0,-6,0 · 1.2s/easeInOut, phase 0.24s
y=0,-6,0 · 1.2s/easeInOut, phase 0.32s
y=0,-6,0 · 1.2s/easeInOut, phase 0.4s
y=0,-6,0 · 1.2s/easeInOut, phase 0.48s
y=0,-6,0 · 1.2s/easeInOut, phase 0.56s
y=0,-6,0 · 1.2s/easeInOut, phase 0.64s
y=0,-6,0 · 1.2s/easeInOut, phase 0.72s
square-accordionSquareAccordionregistry/ui/loading/square-accordion.tsxheight=12,32,12 · 1.5s/easeInOut
height=12,32,12 · 1.5s/easeInOut, phase 0.2s
height=12,32,12 · 1.5s/easeInOut, phase 0.4s
square-gridSquareGridregistry/ui/loading/square-grid.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, phase 0.6s
square-snakeSquareSnakeregistry/ui/loading/square-snake.tsxopacity=0.1,1,0.1 · 1.5s/easeInOut
opacity=0.1,1,0.1 · 1.5s/easeInOut, phase 0.15s
opacity=0.1,1,0.1 · 1.5s/easeInOut, phase 0.3s
opacity=0.1,1,0.1 · 1.5s/easeInOut, phase 0.45s
opacity=0.1,1,0.1 · 1.5s/easeInOut, phase 0.6s
square-spinnerSquareSpinnerregistry/ui/loading/square-spinner.tsxrotate=90 · 0.6s/easeInOut
stacked-bar-pulseStackedBarPulseregistry/ui/loading/stacked-bar-pulse.tsxopacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut
opacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut, phase 0.2s
opacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut, phase 0.4s
swapping-dotsSwappingDotsregistry/ui/loading/swapping-dots.tsxx=0,32,0 · 1.5s/easeInOut
x=0,-32,0 · 1.5s/easeInOut
swirling-spinnerSwirlingSpinnerregistry/ui/loading/swirling-spinner.tsxrotate=360 · 1.3s/linear
rotate=-360 · 0.9s/linear
symmetric-waveSymmetricWaveregistry/ui/loading/symmetric-wave.tsxheight=8,24,8 · 1.2s/easeInOut
height=8,24,8 · 1.2s/easeInOut, phase 0.1s
height=8,24,8 · 1.2s/easeInOut, phase 0.2s
height=8,24,8 · 1.2s/easeInOut, phase 0.3s
height=8,24,8 · 1.2s/easeInOut, phase 0.4s
terminal-loaderTerminalLoaderregistry/ui/loading/terminal-loader.tsxopacity=1,0,1 · 0.8s/linear
text-blinkTextBlinkregistry/ui/loading/text-blink.tsxopacity=1,0.2,1 · 1.5s/easeInOut
text-dotsTextDotsregistry/ui/loading/text-dots.tsxopacity=0,1,1,0 · 2s
opacity=0,0,1,0 · 2s
text-morphTextMorphregistry/ui/loading/text-morph.tsxopacity=1,0,0,1; y=0,-16,16,0 · 3s/easeInOut
opacity=0,1,1,0; y=16,0,0,-16 · 3s/easeInOut
text-shimmerTextShimmerregistry/ui/loading/text-shimmer.tsxWebkitMaskPosition="100% 0%","-100% 0%" · 1.5s/linear
text-shimmer-waveTextShimmerWaveregistry/ui/loading/text-shimmer-wave.tsxopacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.1s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.2s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.3s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.4s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.5s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.6s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, phase 0.7s
trailing-dotsTrailingDotsregistry/ui/loading/trailing-dots.tsxrotate=360 · 1.5s/easeInOut
rotate=360 · 1.5s/easeInOut, phase 0.1s
rotate=360 · 1.5s/easeInOut, phase 0.2s
rotate=360 · 1.5s/easeInOut, phase 0.3s
rotate=360 · 1.5s/easeInOut, phase 0.4s
triple-dot-spinnerTripleDotSpinnerregistry/ui/loading/triple-dot-spinner.tsxrotate=360 · 2s/linear
twin-orbitTwinOrbitregistry/ui/loading/twin-orbit.tsxrotate=360 · 1.5s/linear
rotate=-360 · 1.5s/linear
typingTypingregistry/ui/loading/typing.tsxopacity=1,0,1 · 0.8s/linear
typing-indicatorTypingIndicatorregistry/ui/loading/typing-indicator.tsxy=0,-4,0 · 0.6s/easeInOut
y=0,-4,0 · 0.6s/easeInOut, phase 0.15s
y=0,-4,0 · 0.6s/easeInOut, phase 0.3s
wandering-cubeWanderingCuberegistry/ui/loading/wandering-cube.tsxx=0,24,24,0,0; y=0,0,24,24,0; rotate=0,-90,-180,-270,-360 · 2.5s/easeInOut
watch-spinnerWatchSpinnerregistry/ui/loading/watch-spinner.tsxrotate=360 · 1s/easeInOut
rotate=360 · 1.5s/easeInOut
rotate=360 · 2s/easeInOut
wave-dotsWaveDotsregistry/ui/loading/wave-dots.tsxy=4,-4,4 · 1s/easeInOut
y=4,-4,4 · 1s/easeInOut, phase 0.15s
y=4,-4,4 · 1s/easeInOut, phase 0.3s
y=4,-4,4 · 1s/easeInOut, phase 0.45s
y=4,-4,4 · 1s/easeInOut, phase 0.6s
wave-physics-loaderWavePhysicsLoaderregistry/ui/loading/wave-physics-loader.tsx15 bars + ball; 201 phases; 4 bounces; 4s
waveform-loaderWaveformLoaderregistry/ui/loading/waveform-loader.tsxheight=4,24,4 · 1s/easeInOut
height=4,24,4 · 1s/easeInOut, phase 0.421s
height=4,24,4 · 1s/easeInOut, phase 0.455s
height=4,24,4 · 1s/easeInOut, phase 0.071s
height=4,24,4 · 1s/easeInOut, phase -0.378s
height=4,24,4 · 1s/easeInOut, phase -0.479s
height=4,24,4 · 1s/easeInOut, phase -0.14s
height=4,24,4 · 1s/easeInOut, phase 0.328s
zig-zag-pulseZigZagPulseregistry/ui/loading/zig-zag-pulse.tsxopacity=0.2,1,0.2 · 1.2s/easeInOut
opacity=0.2,1,0.2 · 1.2s/easeInOut, phase 0.1s
opacity=0.2,1,0.2 · 1.2s/easeInOut, phase 0.2s
opacity=0.2,1,0.2 · 1.2s/easeInOut, phase 0.3s
opacity=0.2,1,0.2 · 1.2s/easeInOut, phase 0.4s
opacity=0.2,1,0.2 · 1.2s/easeInOut, phase 0.5s

Technologies

Source declarations render native HTML/SVG without React, Framer Motion or Tailwind runtime. Web Animations preserves separate property tracks, explicit keyframe stops and staggered delays. Spring-marked scenes use the shared TuffEx resolveTransition compiler. Text changes use TxTextMorph; Skeleton, SkeletonLoader and FluidSkeleton compose the existing TxSkeleton geometry without a second unmanaged skeleton loop.

WavePhysicsLoader retains 15 bars, 201 sampled phases, four parabolic bounces per crossing, the cosine influence radius, impact indentation and ball squash/stretch. Its four-second round trip is not replaced by a generic wave. The 292px source scene has a 0.38 native presentation scale before the public size multiplier.

TextDots retains its three source stop lists: [0, 0.2, 0.8, 1], [0, 0.4, 0.8, 1] and [0, 0.6, 0.8, 1]. MatrixGridLoader retains [0, 0.5, 0.75, 1] with the four delays 0.2, 0.4, 0.8 and 0.6 seconds. AppleEqualizer freezes the source's random delay samples to 0.06, 0.41, 0.19 and 0.32 seconds for deterministic SSR rather than generating a new random rhythm during hydration. Colors use theme tokens; SVG goo filter IDs use Vue's hydration-stable useId().

The shared useMotionActivity owns visibility, reduced-motion and KeepAlive lifecycle gates. Each scene owns and cancels its native animations on suspension, source replacement and unmount. Browsers without Web Animations retain the same static artwork.