Motion
Die Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
pnpm dlx shadcn@latest add https://hextaui.com/r/motion.jsonFügt das Utility und alles, wovon es abhängt, zu deinem Projekt hinzu.
Kopiere den folgenden Code und füge ihn in dein Projekt ein.
lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Jede HextaUI-Komponente bewegt sich mit denselben wenigen Kurven und Dauern, sodass sich die Bibliothek wie aus einem Guss anfühlt.
- Ease out für alles, was auf dich reagiert. Elemente, die erscheinen, sich ausdehnen oder einem Klick folgen, starten schnell und beruhigen sich, sodass sich die Oberfläche unmittelbar anfühlt.
- Kurz und unterbrechbar. Die meiste Bewegung dauert 150 bis 300ms. Alles Umkehrbare startet dort, wo es gerade ist, statt neu anzufangen.
- Reduzierte Bewegung ist ein zweites Design, kein Ausschalter. Bewegung wird zu sofortigen Änderungen oder einfachen Fades, und der Zustand bleibt lesbar.
Das Theme definiert die Kurven als Tailwind-Easing-Utilities, und lib/motion exportiert dieselben Werte für die Web Animations API.
| Klasse | Beschreibung |
|---|---|
ease-out-quint | easeOut in JS. Der Standard für Bewegung: Popovers, Highlights, Größenänderungen. |
ease-out-cubic | Ein weicheres Ease out für Farb- und Schattenänderungen bei Hover und Fokus. |
ease-in-out-quart | easeInOut in JS. Für Bewegung zwischen zwei Ruhezuständen, die niemand direkt ausgelöst hat. |
ease-spring | easeSpring in JS. Eine Feder mit leichtem Überschwingen, als linear() geschrieben, für Dinge, die landen, etwa den Thumb eines Toggles. |
ease-drawer | Die iOS-Sheet-Kurve für Drawer und Sheets, die von einem Rand hereingleiten. |
| duration. | Beschreibung |
|---|---|
press: 100 | Gedrückter Zustand beim Herunterdrücken. |
release: 200 | Zurückkommen nach einem Druck. |
hover: 150 | Feedback bei Hover und Fokus. |
enter: 200 | Erscheinende Elemente. |
exit: 150 | Verschwindende Elemente. Exits sind schneller als Entrances, damit sie nie etwas aufhalten. |
morph: 300 | Änderungen von Größe und Position. |
prefersReducedMotion() liest die Media Query beim Aufruf. Prüfe sie, wenn eine Animation startet, statt nur einmal beim Mount, damit eine geänderte Systemeinstellung sofort greift. Auf dem Server gibt es true zurück.
- Jede DOM-Änderung im Element löst einen Morph aus, ob Text, Kinder oder Icons. Größenänderungen von außen, etwa durch Resize, tun das nicht, sodass das Element seinem Container ohne Verzögerung folgt.
- Eine Änderung mitten im Morph läuft von der aktuellen Größe weiter. Solange er läuft, hat das Element
data-morphing, womit du Überlauf abschneiden oder andere Übergänge pausieren kannst. - Lass das Element in seiner natürlichen Größe: keine feste Breite oder Höhe auf der animierten Achse. Füge
overflow-hiddenhinzu, damit neuer Inhalt beim Wachsen nicht herausragt. - Es gibt eine Callback-Ref zurück. Kombiniere sie mit anderen Refs über
useMergedRef.
- Das Highlight wird per Inline-Styles dimensioniert und verschoben. Gib ihm
absolute top-0und einen Übergang auftransform,width,heightundopacity. - Der Hook beobachtet das genannte Attribut mit einem
MutationObserverund folgt so dem Zustand von überall, auch Base UIs eigenemdata-pressed,data-checkedoderaria-current. data-visibleist gesetzt, solange etwas passt.data-instantist gesetzt, wenn das Highlight springen soll: beim ersten Erscheinen, bei Resize und Scroll sowie bei reduzierter Bewegung. Style es alsdata-instant:transition-opacity.- Es misst unter Berücksichtigung der Skalierung der Leiste und bleibt so ausgerichtet, auch in einem Dialog, der noch hineinzoomt.
| Prop | Typ | Standard |
|---|---|---|
axisWelche Dimension animiert wird. | "width" | "height" | – |
enabledOb animiert werden soll. | boolean | true |
durationMillisekunden. | number | 300 |
easingBeliebiges CSS-Easing. | string | easeOut |
| Prop | Typ | Standard |
|---|---|---|
barRefDer positionierte Container. | RefObject<HTMLElement | null> | – |
highlightRefDas Element, das bewegt wird. | RefObject<HTMLElement | null> | – |
selectorPasst zum Kind, das hervorgehoben werden soll. | string | – |
attributeDas Attribut, dessen Änderungen das Highlight bewegen. | string | "data-popup-open" |
| Export | Beschreibung |
|---|---|
easeOut | cubic-bezier(0.23, 1, 0.32, 1) |
easeInOut | cubic-bezier(0.77, 0, 0.175, 1) |
easeSpring | Eine linear()-Feder. |
duration | press, release, hover, enter, exit und morph. |
prefersReducedMotion() | Ob reduzierte Bewegung aktiv ist. Auf dem Server true. |
- AlertInline-Meldungen für Status und Feedback, mit neutraler Fläche, farbigem Icon und einem Schließen, das sanft zusammenklappt.
- AttachmentDatei- und Bildkarten für Uploads, mit Fortschritt, Zuständen, Aktionen, einem Trigger über die ganze Karte und Namen, die ihre Dateiendung behalten.
- BadgeStatuslabels mit farbigen Punkten, entfernbare Tags, die zugleiten, und Zähler, die zu ihrem neuen Wert rollen.
- BreadcrumbEine Linkspur zur aktuellen Seite, die sicher umbricht, sich in Right-to-left-Layouts spiegelt und eingeklappte Segmente an Ort und Stelle erweitert.
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CommandEine durchsuchbare Liste von Aktionen, inline oder als ⌘K-Palette, mit Seiten, Tastenkürzeln und hervorgehobenen Treffern.