@remix-run/ui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/README.md +24 -3
  2. package/dist/animation/animate-layout-mixin.js +66 -66
  3. package/dist/animation/animate-layout-mixin.js.map +1 -1
  4. package/dist/components/accordion/accordion.d.ts +3 -3
  5. package/dist/components/accordion/accordion.js +0 -2
  6. package/dist/components/accordion/accordion.js.map +1 -1
  7. package/dist/components/accordion/demos/card.demo.d.ts +6 -0
  8. package/dist/components/accordion/demos/card.demo.js +58 -0
  9. package/dist/components/accordion/demos/card.demo.js.map +1 -0
  10. package/dist/components/accordion/demos/multiple.demo.d.ts +6 -0
  11. package/dist/components/accordion/demos/multiple.demo.js +19 -0
  12. package/dist/components/accordion/demos/multiple.demo.js.map +1 -0
  13. package/dist/components/accordion/demos/overview.demo.d.ts +6 -0
  14. package/dist/components/accordion/demos/overview.demo.js +19 -0
  15. package/dist/components/accordion/demos/overview.demo.js.map +1 -0
  16. package/dist/components/breadcrumbs/breadcrumbs.js +0 -2
  17. package/dist/components/breadcrumbs/breadcrumbs.js.map +1 -1
  18. package/dist/components/breadcrumbs/demos/basic.demo.d.ts +5 -0
  19. package/dist/components/breadcrumbs/demos/basic.demo.js +14 -0
  20. package/dist/components/breadcrumbs/demos/basic.demo.js.map +1 -0
  21. package/dist/components/breadcrumbs/demos/separator.demo.d.ts +5 -0
  22. package/dist/components/breadcrumbs/demos/separator.demo.js +14 -0
  23. package/dist/components/breadcrumbs/demos/separator.demo.js.map +1 -0
  24. package/dist/components/button/button.d.ts +82 -0
  25. package/dist/components/button/button.js +60 -2
  26. package/dist/components/button/button.js.map +1 -1
  27. package/dist/components/button/demos/aliases.demo.d.ts +6 -0
  28. package/dist/components/button/demos/aliases.demo.js +18 -0
  29. package/dist/components/button/demos/aliases.demo.js.map +1 -0
  30. package/dist/components/button/demos/basic.demo.d.ts +6 -0
  31. package/dist/components/button/demos/basic.demo.js +19 -0
  32. package/dist/components/button/demos/basic.demo.js.map +1 -0
  33. package/dist/components/button/demos/states.demo.d.ts +6 -0
  34. package/dist/components/button/demos/states.demo.js +29 -0
  35. package/dist/components/button/demos/states.demo.js.map +1 -0
  36. package/dist/components/combobox/combobox.d.ts +3 -3
  37. package/dist/components/combobox/combobox.js +0 -2
  38. package/dist/components/combobox/combobox.js.map +1 -1
  39. package/dist/components/combobox/demos/overview.demo.d.ts +6 -0
  40. package/dist/components/combobox/demos/overview.demo.js +153 -0
  41. package/dist/components/combobox/demos/overview.demo.js.map +1 -0
  42. package/dist/components/listbox/demos/overview.demo.d.ts +6 -0
  43. package/dist/components/listbox/demos/overview.demo.js +64 -0
  44. package/dist/components/listbox/demos/overview.demo.js.map +1 -0
  45. package/dist/components/listbox/listbox.d.ts +1 -6
  46. package/dist/components/listbox/listbox.js +21 -33
  47. package/dist/components/listbox/listbox.js.map +1 -1
  48. package/dist/components/menu/demos/bubbling.demo.d.ts +5 -0
  49. package/dist/components/menu/demos/bubbling.demo.js +15 -0
  50. package/dist/components/menu/demos/bubbling.demo.js.map +1 -0
  51. package/dist/components/menu/demos/overview.demo.d.ts +6 -0
  52. package/dist/components/menu/demos/overview.demo.js +32 -0
  53. package/dist/components/menu/demos/overview.demo.js.map +1 -0
  54. package/dist/components/menu/menu.d.ts +5 -14
  55. package/dist/components/menu/menu.js +23 -38
  56. package/dist/components/menu/menu.js.map +1 -1
  57. package/dist/components/popover/demos/overview.demo.d.ts +6 -0
  58. package/dist/components/popover/demos/overview.demo.js +64 -0
  59. package/dist/components/popover/demos/overview.demo.js.map +1 -0
  60. package/dist/components/select/demos/deconstructed.demo.d.ts +6 -0
  61. package/dist/components/select/demos/deconstructed.demo.js +53 -0
  62. package/dist/components/select/demos/deconstructed.demo.js.map +1 -0
  63. package/dist/components/select/demos/overview.demo.d.ts +5 -0
  64. package/dist/components/select/demos/overview.demo.js +27 -0
  65. package/dist/components/select/demos/overview.demo.js.map +1 -0
  66. package/dist/components/select/select.d.ts +3 -3
  67. package/dist/components/select/select.js +17 -26
  68. package/dist/components/select/select.js.map +1 -1
  69. package/dist/components/tabs/tabs.d.ts +3 -3
  70. package/dist/components/tabs/tabs.js +0 -2
  71. package/dist/components/tabs/tabs.js.map +1 -1
  72. package/dist/index.d.ts +1 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/runtime/component.d.ts +8 -5
  75. package/dist/runtime/component.js +84 -80
  76. package/dist/runtime/component.js.map +1 -1
  77. package/dist/runtime/core/attributes.d.ts +12 -0
  78. package/dist/runtime/core/attributes.js +85 -0
  79. package/dist/runtime/core/attributes.js.map +1 -0
  80. package/dist/runtime/core/children.d.ts +7 -0
  81. package/dist/runtime/core/children.js +30 -0
  82. package/dist/runtime/core/children.js.map +1 -0
  83. package/dist/runtime/core/props.d.ts +9 -0
  84. package/dist/runtime/core/props.js +169 -0
  85. package/dist/runtime/core/props.js.map +1 -0
  86. package/dist/runtime/core/vnode.d.ts +3 -0
  87. package/dist/runtime/core/vnode.js +39 -0
  88. package/dist/runtime/core/vnode.js.map +1 -0
  89. package/dist/runtime/create-element.js +2 -1
  90. package/dist/runtime/create-element.js.map +1 -1
  91. package/dist/runtime/diff-dom.js +47 -14
  92. package/dist/runtime/diff-dom.js.map +1 -1
  93. package/dist/runtime/diff-props.d.ts +1 -2
  94. package/dist/runtime/diff-props.js +2 -181
  95. package/dist/runtime/diff-props.js.map +1 -1
  96. package/dist/runtime/dom.d.ts +4 -0
  97. package/dist/runtime/frame.d.ts +23 -2
  98. package/dist/runtime/frame.js +51 -52
  99. package/dist/runtime/frame.js.map +1 -1
  100. package/dist/runtime/jsx.js +2 -27
  101. package/dist/runtime/jsx.js.map +1 -1
  102. package/dist/runtime/mixins/mixin.js +9 -4
  103. package/dist/runtime/mixins/mixin.js.map +1 -1
  104. package/dist/runtime/mixins/on-mixin.d.ts +15 -4
  105. package/dist/runtime/mixins/on-mixin.js +9 -2
  106. package/dist/runtime/mixins/on-mixin.js.map +1 -1
  107. package/dist/runtime/navigation.d.ts +6 -0
  108. package/dist/runtime/navigation.js +16 -3
  109. package/dist/runtime/navigation.js.map +1 -1
  110. package/dist/runtime/reconcile.js +444 -181
  111. package/dist/runtime/reconcile.js.map +1 -1
  112. package/dist/runtime/run.d.ts +17 -2
  113. package/dist/runtime/run.js.map +1 -1
  114. package/dist/runtime/scheduler.js +10 -0
  115. package/dist/runtime/scheduler.js.map +1 -1
  116. package/dist/runtime/stream-protocol.d.ts +8 -0
  117. package/dist/runtime/stream-protocol.js +20 -0
  118. package/dist/runtime/stream-protocol.js.map +1 -0
  119. package/dist/runtime/to-vnode.js +17 -18
  120. package/dist/runtime/to-vnode.js.map +1 -1
  121. package/dist/runtime/vnode.d.ts +5 -4
  122. package/dist/runtime/vnode.js +2 -3
  123. package/dist/runtime/vnode.js.map +1 -1
  124. package/dist/server/stream.js +80 -106
  125. package/dist/server/stream.js.map +1 -1
  126. package/dist/style/layers.d.ts +2 -0
  127. package/dist/style/layers.js +3 -0
  128. package/dist/style/layers.js.map +1 -0
  129. package/dist/style/stylesheet.d.ts +3 -1
  130. package/dist/style/stylesheet.js +69 -8
  131. package/dist/style/stylesheet.js.map +1 -1
  132. package/dist/theme/glyph-contract.d.ts +1 -1
  133. package/dist/theme/runtime.js +4 -1
  134. package/dist/theme/runtime.js.map +1 -1
  135. package/package.json +6 -7
  136. package/src/animation/README.md +314 -0
  137. package/src/animation/animate-layout-mixin.ts +79 -71
  138. package/src/components/accordion/README.md +166 -0
  139. package/src/components/accordion/accordion.tsx +8 -10
  140. package/src/components/accordion/demos/card.demo.tsx +113 -0
  141. package/src/components/accordion/demos/multiple.demo.tsx +56 -0
  142. package/src/components/accordion/demos/overview.demo.tsx +56 -0
  143. package/src/components/anchor/README.md +153 -0
  144. package/src/components/breadcrumbs/README.md +55 -0
  145. package/src/components/breadcrumbs/breadcrumbs.tsx +0 -2
  146. package/src/components/breadcrumbs/demos/basic.demo.tsx +17 -0
  147. package/src/components/breadcrumbs/demos/separator.demo.tsx +18 -0
  148. package/src/components/button/README.md +4 -4
  149. package/src/components/button/button.tsx +88 -2
  150. package/src/components/button/demos/aliases.demo.tsx +27 -0
  151. package/src/components/button/demos/basic.demo.tsx +30 -0
  152. package/src/components/button/demos/states.demo.tsx +52 -0
  153. package/src/components/combobox/combobox.tsx +8 -10
  154. package/src/components/combobox/demos/overview.demo.tsx +199 -0
  155. package/src/components/glyph/README.md +72 -0
  156. package/src/components/listbox/README.md +115 -0
  157. package/src/components/listbox/demos/overview.demo.tsx +101 -0
  158. package/src/components/listbox/listbox.ts +23 -32
  159. package/src/components/menu/README.md +96 -0
  160. package/src/components/menu/demos/bubbling.demo.tsx +34 -0
  161. package/src/components/menu/demos/overview.demo.tsx +76 -0
  162. package/src/components/menu/menu.tsx +35 -41
  163. package/src/components/popover/README.md +3 -3
  164. package/src/components/popover/demos/overview.demo.tsx +143 -0
  165. package/src/components/select/README.md +107 -0
  166. package/src/components/select/demos/deconstructed.demo.tsx +95 -0
  167. package/src/components/select/demos/overview.demo.tsx +51 -0
  168. package/src/components/select/select.tsx +28 -28
  169. package/src/components/tabs/tabs.tsx +10 -5
  170. package/src/index.ts +1 -1
  171. package/src/runtime/component.ts +94 -82
  172. package/src/runtime/core/attributes.ts +97 -0
  173. package/src/runtime/core/children.ts +42 -0
  174. package/src/runtime/core/props.ts +185 -0
  175. package/src/runtime/core/vnode.ts +48 -0
  176. package/src/runtime/create-element.ts +2 -1
  177. package/src/runtime/diff-dom.ts +59 -12
  178. package/src/runtime/diff-props.ts +2 -187
  179. package/src/runtime/dom.ts +4 -0
  180. package/src/runtime/frame.ts +84 -61
  181. package/src/runtime/jsx.ts +2 -30
  182. package/src/runtime/mixins/mixin.ts +9 -4
  183. package/src/runtime/mixins/on-mixin.ts +20 -12
  184. package/src/runtime/navigation.ts +24 -3
  185. package/src/runtime/reconcile.ts +552 -186
  186. package/src/runtime/run.ts +17 -1
  187. package/src/runtime/scheduler.ts +7 -0
  188. package/src/runtime/stream-protocol.ts +27 -0
  189. package/src/runtime/to-vnode.ts +15 -17
  190. package/src/runtime/vnode.ts +6 -9
  191. package/src/server/README.md +88 -0
  192. package/src/server/stream.ts +105 -117
  193. package/src/style/layers.ts +2 -0
  194. package/src/style/stylesheet.ts +75 -10
  195. package/src/test/README.md +107 -0
  196. package/src/test/utils.ts +3 -1
  197. package/src/theme/README.md +103 -0
  198. package/src/theme/runtime.ts +4 -1
  199. package/src/utils/scroll-lock/README.md +33 -0
  200. package/src/test/setup.ts +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"stylesheet.js","sourceRoot":"","sources":["../../src/style/stylesheet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stylesheet.js","sourceRoot":"","sources":["../../src/style/stylesheet.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,6 @@ export type GlyphValues = {
8
8
  export type GlyphContract = Readonly<Record<GlyphName, {
9
9
  id: string;
10
10
  }>>;
11
- export declare const glyphContract: Readonly<Readonly<Record<"search" | "menu" | "close" | "copy" | "open" | "add" | "alert" | "check" | "chevronDown" | "chevronVertical" | "chevronUp" | "chevronRight" | "edit" | "expand" | "info" | "spinner" | "trash", {
11
+ export declare const glyphContract: Readonly<Readonly<Record<"search" | "menu" | "close" | "copy" | "open" | "alert" | "add" | "check" | "chevronDown" | "chevronVertical" | "chevronUp" | "chevronRight" | "edit" | "expand" | "info" | "spinner" | "trash", {
12
12
  id: string;
13
13
  }>>>;
@@ -1,4 +1,5 @@
1
1
  import { createElement } from '@remix-run/ui';
2
+ import { REMIX_UI_RESET_LAYER, REMIX_UI_STYLE_LAYER } from "../style/layers.js";
2
3
  import { theme, themeVariableNames, } from "./contract.js";
3
4
  export function createTheme(values, options = {}) {
4
5
  let selector = options.selector ?? ':root';
@@ -46,7 +47,9 @@ function serializeThemeCss(selector, vars, options) {
46
47
  .join('\n');
47
48
  let blocks = [`${selector} {\n${lines}\n}`];
48
49
  if (options.reset) {
49
- blocks.push(serializeThemeResetCss(selector));
50
+ let resetCss = serializeThemeResetCss(selector);
51
+ blocks.push(`@layer ${REMIX_UI_RESET_LAYER}, ${REMIX_UI_STYLE_LAYER};`);
52
+ blocks.push(`@layer ${REMIX_UI_RESET_LAYER} { ${resetCss} }`);
50
53
  }
51
54
  return blocks.join('\n\n');
52
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/theme/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/theme/runtime.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remix-run/ui",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "UI tokens, mixins, and glyphs for Remix components",
5
5
  "author": "Ryan Florence <rpflorence@gmail.com>",
6
6
  "license": "MIT",
@@ -101,12 +101,11 @@
101
101
  },
102
102
  "devDependencies": {
103
103
  "@types/node": "^24.6.0",
104
- "@vitest/browser": "^3.2.4",
105
- "@vitest/coverage-v8": "^3.2.4",
106
104
  "@typescript/native-preview": "7.0.0-dev.20251125.1",
107
105
  "playwright": "^1.59.0",
108
106
  "typescript": "^5.9.3",
109
- "vitest": "^3.2.4"
107
+ "@remix-run/assert": "0.2.0",
108
+ "@remix-run/test": "0.4.0"
110
109
  },
111
110
  "dependencies": {
112
111
  "@types/dom-navigation": "^1.0.7"
@@ -126,9 +125,9 @@
126
125
  "clean": "git clean -fdX",
127
126
  "lint": "pnpm -w exec oxlint packages/ui -A all --quiet",
128
127
  "lint:fix": "pnpm -w exec oxlint packages/ui -A all --fix --quiet",
129
- "test": "vitest run",
130
- "test:coverage": "vitest run --coverage",
131
- "test:watch": "vitest",
128
+ "test": "remix-test",
129
+ "test:coverage": "remix-test --coverage",
130
+ "test:watch": "remix-test --watch",
132
131
  "typecheck": "tsc --noEmit"
133
132
  }
134
133
  }
@@ -0,0 +1,314 @@
1
+ # animation
2
+
3
+ `animation` provides small primitives for entrance, exit, layout, spring, and tween animation. Use these helpers with Remix UI mixins, CSS transitions, the Web Animations API, and imperative `requestAnimationFrame` loops.
4
+
5
+ ## Usage
6
+
7
+ ```tsx
8
+ import { animateEntrance, animateExit, animateLayout, spring } from 'remix/ui/animation'
9
+
10
+ let panelTransition = spring.transition(['opacity', 'transform'], 'snappy')
11
+
12
+ function Panel() {
13
+ return () => (
14
+ <div
15
+ style={{ transition: panelTransition }}
16
+ mix={[
17
+ animateEntrance({ opacity: 0, duration: 120 }),
18
+ animateExit({ opacity: 0, duration: 120 }),
19
+ animateLayout(),
20
+ ]}
21
+ >
22
+ Saved filters
23
+ </div>
24
+ )
25
+ }
26
+ ```
27
+
28
+ ## Entrance And Exit
29
+
30
+ `animateEntrance` animates an element from the provided keyframe into its natural styles when the element is inserted.
31
+
32
+ ```tsx
33
+ import { animateEntrance, spring } from 'remix/ui/animation'
34
+
35
+ function Toast() {
36
+ return () => (
37
+ <div
38
+ mix={[
39
+ animateEntrance({
40
+ opacity: 0,
41
+ transform: 'translateY(8px)',
42
+ ...spring('snappy'),
43
+ }),
44
+ ]}
45
+ >
46
+ Saved
47
+ </div>
48
+ )
49
+ }
50
+ ```
51
+
52
+ `animateExit` keeps a removed keyed element in the DOM long enough to animate from its natural styles to the provided keyframe.
53
+
54
+ ```tsx
55
+ import { animateExit } from 'remix/ui/animation'
56
+
57
+ function Item({ id, label }: { id: string; label: string }) {
58
+ return () => (
59
+ <li
60
+ key={id}
61
+ mix={[
62
+ animateExit({
63
+ opacity: 0,
64
+ transform: 'scale(0.96)',
65
+ duration: 120,
66
+ easing: 'ease-in',
67
+ }),
68
+ ]}
69
+ >
70
+ {label}
71
+ </li>
72
+ )
73
+ }
74
+ ```
75
+
76
+ Passing `true` uses the default opacity animation. Passing `false`, `null`, or `undefined` disables the animation.
77
+
78
+ ```tsx
79
+ <div mix={[animateEntrance(true), animateExit(false)]} />
80
+ ```
81
+
82
+ Animation configs combine WAAPI timing options with style properties for the animated keyframe.
83
+
84
+ ```ts
85
+ type AnimateMixinConfig = {
86
+ duration: number
87
+ easing?: string
88
+ delay?: number
89
+ composite?: CompositeOperation
90
+ initial?: boolean
91
+ [property: string]: unknown
92
+ }
93
+ ```
94
+
95
+ Pass `initial: false` to skip only the first keyed entrance for an element within a parent. Later insertions for the same key can still animate.
96
+
97
+ ```tsx
98
+ <div key={id} mix={[animateEntrance({ opacity: 0, duration: 150, initial: false })]} />
99
+ ```
100
+
101
+ Exit animations can reclaim a removed keyed node if the same keyed element is rendered again before the exit finishes. The reclaimed node retargets toward its natural styles instead of simply reversing the exit animation.
102
+
103
+ ## Layout Animation
104
+
105
+ `animateLayout` animates layout changes with a FLIP-style transform projection. Use it on elements whose position or size can change between renders.
106
+
107
+ ```tsx
108
+ import { animateLayout, spring } from 'remix/ui/animation'
109
+
110
+ function Card({ expanded }: { expanded: boolean }) {
111
+ return () => (
112
+ <section
113
+ class={expanded ? 'card expanded' : 'card'}
114
+ mix={[
115
+ animateLayout({
116
+ ...spring('smooth'),
117
+ }),
118
+ ]}
119
+ >
120
+ Details
121
+ </section>
122
+ )
123
+ }
124
+ ```
125
+
126
+ Pass `size: false` when the element should animate position only and avoid scale projection.
127
+
128
+ ```tsx
129
+ <div mix={[animateLayout({ duration: 180, easing: 'ease-out', size: false })]} />
130
+ ```
131
+
132
+ Passing `true` or no argument enables the default layout animation. Passing `false`, `null`, or `undefined` disables it. Layout animation skips work when geometry does not change, keeps in-flight animations running when their target geometry has not changed, and continues from the current visual transform when a new layout change interrupts an active animation.
133
+
134
+ ## Spring
135
+
136
+ `spring` returns a decorated iterator. It can be iterated for JavaScript animation, spread into Web Animations API options, or stringified for CSS transition syntax.
137
+
138
+ ```tsx
139
+ import { spring } from 'remix/ui/animation'
140
+
141
+ spring('bouncy')
142
+ spring('snappy')
143
+ spring('smooth')
144
+ spring({ duration: 400, bounce: 0.3 })
145
+ ```
146
+
147
+ ```ts
148
+ interface SpringIterator extends IterableIterator<number> {
149
+ duration: number
150
+ easing: string
151
+ toString(): string
152
+ }
153
+ ```
154
+
155
+ Use `spring.transition` to build CSS transition entries.
156
+
157
+ ```tsx
158
+ let transition = spring.transition(['opacity', 'transform'], 'bouncy')
159
+
160
+ function Button() {
161
+ return () => <button style={{ transition }}>Save</button>
162
+ }
163
+ ```
164
+
165
+ Spread a spring into animation mixin or WAAPI options.
166
+
167
+ ```tsx
168
+ <div
169
+ mix={[
170
+ animateEntrance({
171
+ opacity: 0,
172
+ transform: 'scale(0.92)',
173
+ ...spring('bouncy'),
174
+ }),
175
+ ]}
176
+ />
177
+ ```
178
+
179
+ ```ts
180
+ element.animate(
181
+ [
182
+ { opacity: 0, transform: 'scale(0.92)' },
183
+ { opacity: 1, transform: 'scale(1)' },
184
+ ],
185
+ { ...spring('snappy') },
186
+ )
187
+ ```
188
+
189
+ Use the iterator values as progress from `0` to `1` for imperative animation.
190
+
191
+ ```ts
192
+ let from = 0
193
+ let to = 200
194
+
195
+ for (let progress of spring('bouncy')) {
196
+ let x = from + (to - from) * progress
197
+ element.style.transform = `translateX(${x}px)`
198
+ await nextFrame()
199
+ }
200
+ ```
201
+
202
+ The built-in presets are:
203
+
204
+ | Preset | Bounce | Duration | Character |
205
+ | -------- | ------ | -------- | ------------------------ |
206
+ | `smooth` | -0.3 | 400ms | Overdamped, no overshoot |
207
+ | `snappy` | 0 | 200ms | Quick, no overshoot |
208
+ | `bouncy` | 0.3 | 400ms | Underdamped bounce |
209
+
210
+ Override preset duration or velocity with the second argument.
211
+
212
+ ```ts
213
+ spring('bouncy', { duration: 300 })
214
+ spring('snappy', { velocity: 2 })
215
+ ```
216
+
217
+ Use explicit options when you need full control.
218
+
219
+ ```ts
220
+ spring({
221
+ duration: 500,
222
+ bounce: 0.35,
223
+ velocity: 0,
224
+ })
225
+ ```
226
+
227
+ ## Tween
228
+
229
+ `tween` creates a generator that interpolates a numeric value over time with a cubic-bezier curve. Call `next()` once to initialize the generator, then pass `requestAnimationFrame` timestamps into `next(timestamp)`.
230
+
231
+ ```ts
232
+ import { easings, tween } from 'remix/ui/animation'
233
+
234
+ let animation = tween({
235
+ from: 0,
236
+ to: 100,
237
+ duration: 300,
238
+ curve: easings.easeOut,
239
+ })
240
+
241
+ animation.next()
242
+
243
+ function tick(timestamp: number) {
244
+ let { value, done } = animation.next(timestamp)
245
+ element.style.transform = `translateX(${value}px)`
246
+ if (!done) requestAnimationFrame(tick)
247
+ }
248
+
249
+ requestAnimationFrame(tick)
250
+ ```
251
+
252
+ Animate multiple values with separate tweens.
253
+
254
+ ```ts
255
+ let xAnimation = tween({ from: 0, to: 100, duration: 500, curve: easings.easeOut })
256
+ let scaleAnimation = tween({ from: 1, to: 1.2, duration: 500, curve: easings.easeOut })
257
+
258
+ xAnimation.next()
259
+ scaleAnimation.next()
260
+
261
+ function tick(timestamp: number) {
262
+ let x = xAnimation.next(timestamp)
263
+ let scale = scaleAnimation.next(timestamp)
264
+
265
+ element.style.transform = `translateX(${x.value}px) scale(${scale.value})`
266
+
267
+ if (!x.done || !scale.done) {
268
+ requestAnimationFrame(tick)
269
+ }
270
+ }
271
+ ```
272
+
273
+ The built-in easing presets are cubic-bezier control points matching common CSS timing functions.
274
+
275
+ ```ts
276
+ easings.linear
277
+ easings.ease
278
+ easings.easeIn
279
+ easings.easeOut
280
+ easings.easeInOut
281
+ ```
282
+
283
+ Custom curves use the same control points as CSS `cubic-bezier(x1, y1, x2, y2)`.
284
+
285
+ ```ts
286
+ let animation = tween({
287
+ from: 0,
288
+ to: 100,
289
+ duration: 500,
290
+ curve: { x1: 0.68, y1: -0.55, x2: 0.265, y2: 1.55 },
291
+ })
292
+ ```
293
+
294
+ ## API
295
+
296
+ - `animateEntrance(config?)`: mixin that animates an element when it enters the DOM.
297
+ - `animateExit(config?)`: mixin that persists a removed keyed element long enough to run its exit animation.
298
+ - `animateLayout(config?)`: mixin that animates layout changes by comparing geometry between renders.
299
+ - `spring(preset?, overrides?)`: creates a `SpringIterator` from a named preset.
300
+ - `spring(options?)`: creates a `SpringIterator` from explicit spring options.
301
+ - `spring.transition(property, presetOrOptions?, overrides?)`: builds one or more CSS transition entries from a spring.
302
+ - `spring.presets`: named `smooth`, `snappy`, and `bouncy` spring defaults.
303
+ - `tween(options)`: generator that interpolates numeric values over time with a cubic-bezier curve.
304
+ - `easings`: common cubic-bezier presets for `tween`.
305
+ - `SpringIterator`, `SpringPreset`, `SpringOptions`, `TweenOptions`, and `BezierCurve`: public TypeScript types for spring and tween configuration.
306
+
307
+ ## Behavior Notes
308
+
309
+ - Animation mixin style properties are copied into WAAPI keyframes; `duration`, `easing`, `delay`, `composite`, and `initial` are treated as options.
310
+ - `animateEntrance({ initial: false })` only skips the first keyed entrance tracked for the parent node.
311
+ - `animateExit` needs keyed elements when removed nodes may be reclaimed or persisted across list updates.
312
+ - `animateLayout({ size: false })` animates translation without scale projection.
313
+ - `spring()` yields progress values from `0` to `1`; its `duration` and `easing` properties are enumerable so `{ ...spring() }` works with WAAPI options.
314
+ - `tween(...)` yields the initial value first; advance the generator with frame timestamps via `next(timestamp)` and read `done` to detect completion.
@@ -60,30 +60,6 @@ function calcBoxDelta(delta: Delta, source: Box, target: Box, layoutConfig: Layo
60
60
  calcAxisDelta(delta.y, source.y, target.y, origin)
61
61
  }
62
62
 
63
- function mixAxisDelta(output: AxisDelta, delta: AxisDelta, progress: number): void {
64
- output.translate = mix(delta.translate, 0, progress)
65
- output.scale = mix(delta.scale, 1, progress)
66
- output.origin = delta.origin
67
- output.originPoint = delta.originPoint
68
- }
69
-
70
- function mixDelta(output: Delta, delta: Delta, progress: number): void {
71
- mixAxisDelta(output.x, delta.x, progress)
72
- mixAxisDelta(output.y, delta.y, progress)
73
- }
74
-
75
- function copyAxisDeltaInto(target: AxisDelta, source: AxisDelta): void {
76
- target.translate = source.translate
77
- target.scale = source.scale
78
- target.origin = source.origin
79
- target.originPoint = source.originPoint
80
- }
81
-
82
- function copyDeltaInto(target: Delta, source: Delta): void {
83
- copyAxisDeltaInto(target.x, source.x)
84
- copyAxisDeltaInto(target.y, source.y)
85
- }
86
-
87
63
  function buildProjectionTransform(delta: Delta, layoutConfig: LayoutAnimationConfig): string {
88
64
  let transform = ''
89
65
  if (delta.x.translate || delta.y.translate) {
@@ -133,23 +109,51 @@ function isVisualDeltaZero(delta: Delta, layoutConfig: LayoutAnimationConfig): b
133
109
  )
134
110
  }
135
111
 
112
+ function isTargetBoxSame(source: Box, target: Box, layoutConfig: LayoutAnimationConfig): boolean {
113
+ return (
114
+ isNear(source.x.min, target.x.min, TRANSLATE_PRECISION) &&
115
+ isNear(source.y.min, target.y.min, TRANSLATE_PRECISION) &&
116
+ (layoutConfig.size === false ||
117
+ (isNear(source.x.max, target.x.max, TRANSLATE_PRECISION) &&
118
+ isNear(source.y.max, target.y.max, TRANSLATE_PRECISION)))
119
+ )
120
+ }
121
+
122
+ function measureAnimationTargetBox(
123
+ node: HTMLElement,
124
+ animation: Animation,
125
+ animationEndTime: number,
126
+ ): Box {
127
+ let currentTime = animation.currentTime
128
+ let wasRunning = animation.playState === 'running'
129
+
130
+ animation.currentTime = animationEndTime
131
+ let box = measureNaturalBox(node)
132
+ animation.currentTime = currentTime
133
+
134
+ if (wasRunning && animation.playState !== 'running') {
135
+ animation.play()
136
+ }
137
+
138
+ return box
139
+ }
140
+
136
141
  const animateLayoutMixin = createMixin<Element, [config?: LayoutConfig], ElementProps>((handle) => {
137
142
  let snapshot: Box | null = null
138
143
  let currentConfig: LayoutConfig = true
139
- let currentDelta: Delta | null = null
140
- let animationProgress = 0
141
144
  let animation: Animation | null = null
145
+ let animationTarget: Box | null = null
146
+ let animationEndTime = 0
142
147
 
143
- let scheduleProgressTracking = (duration: number, active: Animation) => {
144
- let start = performance.now()
145
- let tick = () => {
146
- if (animation !== active) return
147
- animationProgress = Math.min(1, (performance.now() - start) / duration)
148
- if (animationProgress < 1) {
149
- requestAnimationFrame(tick)
150
- }
151
- }
152
- requestAnimationFrame(tick)
148
+ let clearActiveAnimationState = () => {
149
+ animation = null
150
+ animationTarget = null
151
+ animationEndTime = 0
152
+ }
153
+
154
+ let clearLayoutState = () => {
155
+ clearActiveAnimationState()
156
+ snapshot = null
153
157
  }
154
158
 
155
159
  let clearProjectionStyles = (node: HTMLElement) => {
@@ -157,33 +161,48 @@ const animateLayoutMixin = createMixin<Element, [config?: LayoutConfig], Element
157
161
  node.style.transformOrigin = ''
158
162
  }
159
163
 
160
- let resetAnimation = () => {
161
- animation = null
162
- currentDelta = null
163
- animationProgress = 0
164
- }
165
-
166
164
  handle.addEventListener('beforeUpdate', (event) => {
167
165
  let layoutConfig = resolveLayoutConfig(currentConfig)
168
166
  if (!layoutConfig) return
169
- snapshot = measureNaturalBox(event.node as HTMLElement)
167
+ let htmlNode = event.node as HTMLElement
168
+ // Capture the live on-screen position so the next animation can pick up
169
+ // where this one was interrupted if this update changes the target box.
170
+ if (animation && animation.playState === 'running') {
171
+ snapshot = rectToBox(htmlNode.getBoundingClientRect())
172
+ } else {
173
+ snapshot = measureNaturalBox(htmlNode)
174
+ }
170
175
  })
171
176
 
172
177
  handle.addEventListener('commit', (event) => {
173
178
  let layoutConfig = resolveLayoutConfig(currentConfig)
174
179
  let htmlNode = event.node as HTMLElement
175
- let latest = measureNaturalBox(htmlNode)
180
+ let runningAnimation = animation?.playState === 'running' ? animation : null
181
+ let latest: Box | null = null
182
+
183
+ if (runningAnimation && animationTarget && layoutConfig) {
184
+ latest = measureAnimationTargetBox(htmlNode, runningAnimation, animationEndTime)
185
+ if (isTargetBoxSame(latest, animationTarget, layoutConfig)) {
186
+ snapshot = null
187
+ return
188
+ }
189
+ }
190
+
191
+ // Defensive cleanup for cases where beforeUpdate didn't run (e.g. the
192
+ // mixin was just attached, layoutConfig was disabled this render, or an
193
+ // in-flight animation needs to retarget to a new final box).
194
+ animation?.cancel()
195
+ clearActiveAnimationState()
196
+ clearProjectionStyles(htmlNode)
197
+ latest ??= measureNaturalBox(htmlNode)
176
198
 
177
199
  if (!layoutConfig) {
178
- animation?.cancel()
179
- clearProjectionStyles(htmlNode)
180
- resetAnimation()
181
- snapshot = latest
200
+ clearLayoutState()
182
201
  return
183
202
  }
184
203
 
185
204
  if (!snapshot) {
186
- snapshot = latest
205
+ snapshot = null
187
206
  return
188
207
  }
189
208
 
@@ -191,26 +210,10 @@ const animateLayoutMixin = createMixin<Element, [config?: LayoutConfig], Element
191
210
  calcBoxDelta(targetDelta, latest, snapshot, layoutConfig)
192
211
 
193
212
  if (isVisualDeltaZero(targetDelta, layoutConfig)) {
194
- snapshot = latest
213
+ snapshot = null
195
214
  return
196
215
  }
197
216
 
198
- if (animation && animation.playState === 'running') {
199
- animation.cancel()
200
- if (currentDelta && animationProgress > 0 && animationProgress < 1) {
201
- let visual = createDelta()
202
- mixDelta(visual, currentDelta, animationProgress)
203
- targetDelta.x.translate += visual.x.translate
204
- targetDelta.y.translate += visual.y.translate
205
- targetDelta.x.scale *= visual.x.scale
206
- targetDelta.y.scale *= visual.y.scale
207
- }
208
- }
209
-
210
- if (!currentDelta) currentDelta = createDelta()
211
- copyDeltaInto(currentDelta, targetDelta)
212
- animationProgress = 0
213
-
214
217
  let invert = buildProjectionTransform(targetDelta, layoutConfig)
215
218
  let origin = buildTransformOrigin(targetDelta)
216
219
  htmlNode.style.transform = invert
@@ -226,21 +229,26 @@ const animateLayoutMixin = createMixin<Element, [config?: LayoutConfig], Element
226
229
  { duration, easing, fill: 'forwards' },
227
230
  )
228
231
  animation = active
229
- scheduleProgressTracking(duration, active)
232
+ animationTarget = latest
233
+ animationEndTime = duration
234
+ snapshot = null
230
235
  active.finished
231
236
  .then(() => {
232
237
  if (animation !== active) return
238
+ // Cancel even though the animation finished naturally. A fill:forwards
239
+ // animation in 'finished' state remains an effective animation on
240
+ // transform, which makes commitStyles() throw on the next interrupted
241
+ // animation because more than one effect targets the same property.
242
+ active.cancel()
233
243
  clearProjectionStyles(htmlNode)
234
- resetAnimation()
235
- snapshot = rectToBox(htmlNode.getBoundingClientRect())
244
+ clearLayoutState()
236
245
  })
237
246
  .catch(() => {})
238
247
  })
239
248
 
240
249
  handle.addEventListener('remove', () => {
241
250
  animation?.cancel()
242
- resetAnimation()
243
- snapshot = null
251
+ clearLayoutState()
244
252
  })
245
253
 
246
254
  return (config = true) => {