@remix-run/ui 0.1.2 → 0.3.0

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 (318) hide show
  1. package/README.md +9 -7
  2. package/dist/animation/demos/animation.demo.d.ts +5 -0
  3. package/dist/animation/demos/animation.demo.js +92 -0
  4. package/dist/animation/demos/animation.demo.js.map +1 -0
  5. package/dist/animation/demos/aspect-ratio.d.ts +2 -0
  6. package/dist/animation/demos/aspect-ratio.js +69 -0
  7. package/dist/animation/demos/aspect-ratio.js.map +1 -0
  8. package/dist/animation/demos/bouncy-switch.d.ts +2 -0
  9. package/dist/animation/demos/bouncy-switch.js +36 -0
  10. package/dist/animation/demos/bouncy-switch.js.map +1 -0
  11. package/dist/animation/demos/color-interpolation.d.ts +1 -0
  12. package/dist/animation/demos/color-interpolation.js +53 -0
  13. package/dist/animation/demos/color-interpolation.js.map +1 -0
  14. package/dist/animation/demos/cube.d.ts +2 -0
  15. package/dist/animation/demos/cube.js +86 -0
  16. package/dist/animation/demos/cube.js.map +1 -0
  17. package/dist/animation/demos/default-animate.d.ts +2 -0
  18. package/dist/animation/demos/default-animate.js +89 -0
  19. package/dist/animation/demos/default-animate.js.map +1 -0
  20. package/dist/animation/demos/drag-release.d.ts +24 -0
  21. package/dist/animation/demos/drag-release.js +96 -0
  22. package/dist/animation/demos/drag-release.js.map +1 -0
  23. package/dist/animation/demos/enter.d.ts +1 -0
  24. package/dist/animation/demos/enter.js +19 -0
  25. package/dist/animation/demos/enter.js.map +1 -0
  26. package/dist/animation/demos/exit.d.ts +2 -0
  27. package/dist/animation/demos/exit.js +58 -0
  28. package/dist/animation/demos/exit.js.map +1 -0
  29. package/dist/animation/demos/flip-toggle.d.ts +2 -0
  30. package/dist/animation/demos/flip-toggle.js +37 -0
  31. package/dist/animation/demos/flip-toggle.js.map +1 -0
  32. package/dist/animation/demos/hold-to-confirm.d.ts +13 -0
  33. package/dist/animation/demos/hold-to-confirm.js +211 -0
  34. package/dist/animation/demos/hold-to-confirm.js.map +1 -0
  35. package/dist/animation/demos/html-content.d.ts +2 -0
  36. package/dist/animation/demos/html-content.js +30 -0
  37. package/dist/animation/demos/html-content.js.map +1 -0
  38. package/dist/animation/demos/interruptible-keyframes.d.ts +1 -0
  39. package/dist/animation/demos/interruptible-keyframes.js +48 -0
  40. package/dist/animation/demos/interruptible-keyframes.js.map +1 -0
  41. package/dist/animation/demos/keyframes.d.ts +1 -0
  42. package/dist/animation/demos/keyframes.js +24 -0
  43. package/dist/animation/demos/keyframes.js.map +1 -0
  44. package/dist/animation/demos/material-ripple.d.ts +2 -0
  45. package/dist/animation/demos/material-ripple.js +127 -0
  46. package/dist/animation/demos/material-ripple.js.map +1 -0
  47. package/dist/animation/demos/mixin-presence-list.d.ts +2 -0
  48. package/dist/animation/demos/mixin-presence-list.js +88 -0
  49. package/dist/animation/demos/mixin-presence-list.js.map +1 -0
  50. package/dist/animation/demos/mixin-reclaim.d.ts +2 -0
  51. package/dist/animation/demos/mixin-reclaim.js +90 -0
  52. package/dist/animation/demos/mixin-reclaim.js.map +1 -0
  53. package/dist/animation/demos/multi-state-badge.d.ts +2 -0
  54. package/dist/animation/demos/multi-state-badge.js +231 -0
  55. package/dist/animation/demos/multi-state-badge.js.map +1 -0
  56. package/dist/animation/demos/press.d.ts +2 -0
  57. package/dist/animation/demos/press.js +63 -0
  58. package/dist/animation/demos/press.js.map +1 -0
  59. package/dist/animation/demos/reordering.d.ts +2 -0
  60. package/dist/animation/demos/reordering.js +50 -0
  61. package/dist/animation/demos/reordering.js.map +1 -0
  62. package/dist/animation/demos/rolling-square.d.ts +2 -0
  63. package/dist/animation/demos/rolling-square.js +42 -0
  64. package/dist/animation/demos/rolling-square.js.map +1 -0
  65. package/dist/animation/demos/rotate.d.ts +1 -0
  66. package/dist/animation/demos/rotate.js +18 -0
  67. package/dist/animation/demos/rotate.js.map +1 -0
  68. package/dist/animation/demos/shared-layout.d.ts +2 -0
  69. package/dist/animation/demos/shared-layout.js +114 -0
  70. package/dist/animation/demos/shared-layout.js.map +1 -0
  71. package/dist/animation/demos/spring.demo.d.ts +6 -0
  72. package/dist/animation/demos/spring.demo.js +304 -0
  73. package/dist/animation/demos/spring.demo.js.map +1 -0
  74. package/dist/animation/demos/transition-options.d.ts +1 -0
  75. package/dist/animation/demos/transition-options.js +21 -0
  76. package/dist/animation/demos/transition-options.js.map +1 -0
  77. package/dist/animation/spring.d.ts +24 -31
  78. package/dist/animation/spring.js +31 -8
  79. package/dist/animation/spring.js.map +1 -1
  80. package/dist/components/accordion/accordion.d.ts +6 -6
  81. package/dist/components/accordion/accordion.js.map +1 -1
  82. package/dist/components/accordion/demos/card.demo.d.ts +1 -0
  83. package/dist/components/accordion/demos/card.demo.js +1 -0
  84. package/dist/components/accordion/demos/card.demo.js.map +1 -1
  85. package/dist/components/accordion/demos/multiple.demo.d.ts +1 -0
  86. package/dist/components/accordion/demos/multiple.demo.js +1 -0
  87. package/dist/components/accordion/demos/multiple.demo.js.map +1 -1
  88. package/dist/components/accordion/demos/overview.demo.d.ts +1 -0
  89. package/dist/components/accordion/demos/overview.demo.js +1 -0
  90. package/dist/components/accordion/demos/overview.demo.js.map +1 -1
  91. package/dist/components/anchor/anchor.d.ts +8 -1
  92. package/dist/components/anchor/anchor.js +30 -11
  93. package/dist/components/anchor/anchor.js.map +1 -1
  94. package/dist/components/breadcrumbs/{demos/basic.demo.d.ts → basic.demo.d.ts} +1 -0
  95. package/dist/components/breadcrumbs/{demos/basic.demo.js → basic.demo.js} +1 -0
  96. package/dist/components/breadcrumbs/basic.demo.js.map +1 -0
  97. package/dist/components/breadcrumbs/breadcrumbs.d.ts +1 -1
  98. package/dist/components/breadcrumbs/{demos/separator.demo.d.ts → separator.demo.d.ts} +1 -0
  99. package/dist/components/breadcrumbs/{demos/separator.demo.js → separator.demo.js} +1 -0
  100. package/dist/components/breadcrumbs/separator.demo.js.map +1 -0
  101. package/dist/components/button/button.d.ts +4 -4
  102. package/dist/components/button/button.js +3 -1
  103. package/dist/components/button/button.js.map +1 -1
  104. package/dist/components/button/demos/aliases.demo.d.ts +1 -0
  105. package/dist/components/button/demos/aliases.demo.js +1 -0
  106. package/dist/components/button/demos/aliases.demo.js.map +1 -1
  107. package/dist/components/button/demos/basic.demo.d.ts +1 -0
  108. package/dist/components/button/demos/basic.demo.js +1 -0
  109. package/dist/components/button/demos/basic.demo.js.map +1 -1
  110. package/dist/components/button/demos/states.demo.d.ts +1 -0
  111. package/dist/components/button/demos/states.demo.js +1 -0
  112. package/dist/components/button/demos/states.demo.js.map +1 -1
  113. package/dist/components/combobox/combobox.d.ts +10 -10
  114. package/dist/components/combobox/combobox.js.map +1 -1
  115. package/dist/components/combobox/{demos/overview.demo.d.ts → overview.demo.d.ts} +1 -0
  116. package/dist/components/combobox/{demos/overview.demo.js → overview.demo.js} +1 -0
  117. package/dist/components/combobox/overview.demo.js.map +1 -0
  118. package/dist/components/listbox/listbox.d.ts +3 -3
  119. package/dist/components/listbox/listbox.js.map +1 -1
  120. package/dist/components/listbox/{demos/overview.demo.d.ts → overview.demo.d.ts} +1 -0
  121. package/dist/components/listbox/{demos/overview.demo.js → overview.demo.js} +1 -0
  122. package/dist/components/listbox/overview.demo.js.map +1 -0
  123. package/dist/components/menu/demos/bubbling.demo.d.ts +1 -0
  124. package/dist/components/menu/demos/bubbling.demo.js +1 -0
  125. package/dist/components/menu/demos/bubbling.demo.js.map +1 -1
  126. package/dist/components/menu/demos/context-trigger.demo.d.ts +7 -0
  127. package/dist/components/menu/demos/context-trigger.demo.js +87 -0
  128. package/dist/components/menu/demos/context-trigger.demo.js.map +1 -0
  129. package/dist/components/menu/demos/overview.demo.d.ts +1 -0
  130. package/dist/components/menu/demos/overview.demo.js +1 -0
  131. package/dist/components/menu/demos/overview.demo.js.map +1 -1
  132. package/dist/components/menu/menu.d.ts +15 -12
  133. package/dist/components/menu/menu.js +55 -0
  134. package/dist/components/menu/menu.js.map +1 -1
  135. package/dist/components/popover/{demos/overview.demo.d.ts → overview.demo.d.ts} +1 -0
  136. package/dist/components/popover/{demos/overview.demo.js → overview.demo.js} +1 -0
  137. package/dist/components/popover/overview.demo.js.map +1 -0
  138. package/dist/components/popover/popover.d.ts +7 -7
  139. package/dist/components/popover/popover.js +11 -4
  140. package/dist/components/popover/popover.js.map +1 -1
  141. package/dist/components/select/{demos/deconstructed.demo.d.ts → deconstructed.demo.d.ts} +1 -0
  142. package/dist/components/select/{demos/deconstructed.demo.js → deconstructed.demo.js} +1 -0
  143. package/dist/components/select/deconstructed.demo.js.map +1 -0
  144. package/dist/components/select/{demos/overview.demo.d.ts → overview.demo.d.ts} +1 -0
  145. package/dist/components/select/{demos/overview.demo.js → overview.demo.js} +1 -0
  146. package/dist/components/select/overview.demo.js.map +1 -0
  147. package/dist/components/select/select.d.ts +10 -10
  148. package/dist/components/select/select.js +1 -1
  149. package/dist/components/select/select.js.map +1 -1
  150. package/dist/components/tabs/tabs.d.ts +3 -3
  151. package/dist/index.d.ts +1 -1
  152. package/dist/index.js.map +1 -1
  153. package/dist/interactions/keydown/keydown.d.ts +1 -1
  154. package/dist/interactions/outside-click/outside-click-mixin.d.ts +2 -1
  155. package/dist/interactions/typeahead/typeahead-mixin.d.ts +3 -1
  156. package/dist/runtime/client-entries.d.ts +1 -2
  157. package/dist/runtime/client-entries.js.map +1 -1
  158. package/dist/runtime/component.d.ts +20 -17
  159. package/dist/runtime/component.js +15 -6
  160. package/dist/runtime/component.js.map +1 -1
  161. package/dist/runtime/core/attributes.d.ts +3 -1
  162. package/dist/runtime/core/attributes.js +19 -1
  163. package/dist/runtime/core/attributes.js.map +1 -1
  164. package/dist/runtime/core/props.js +6 -5
  165. package/dist/runtime/core/props.js.map +1 -1
  166. package/dist/runtime/demos/basic.demo.d.ts +6 -0
  167. package/dist/runtime/demos/basic.demo.js +16 -0
  168. package/dist/runtime/demos/basic.demo.js.map +1 -0
  169. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +6 -0
  170. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +77 -0
  171. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +1 -0
  172. package/dist/runtime/demos/keyed-list.demo.d.ts +6 -0
  173. package/dist/runtime/demos/keyed-list.demo.js +62 -0
  174. package/dist/runtime/demos/keyed-list.demo.js.map +1 -0
  175. package/dist/runtime/demos/readme.demo.d.ts +5 -0
  176. package/dist/runtime/demos/readme.demo.js +396 -0
  177. package/dist/runtime/demos/readme.demo.js.map +1 -0
  178. package/dist/runtime/diff-dom.js +194 -21
  179. package/dist/runtime/diff-dom.js.map +1 -1
  180. package/dist/runtime/dom.d.ts +16 -9
  181. package/dist/runtime/frame.d.ts +7 -0
  182. package/dist/runtime/frame.js +176 -41
  183. package/dist/runtime/frame.js.map +1 -1
  184. package/dist/runtime/jsx.d.ts +3 -4
  185. package/dist/runtime/jsx.js.map +1 -1
  186. package/dist/runtime/mixins/link-mixin.d.ts +5 -1
  187. package/dist/runtime/mixins/link-mixin.js.map +1 -1
  188. package/dist/runtime/mixins/mixin.d.ts +2 -1
  189. package/dist/runtime/mixins/mixin.js.map +1 -1
  190. package/dist/runtime/mixins/ref-mixin.d.ts +2 -1
  191. package/dist/runtime/mixins/ref-mixin.js.map +1 -1
  192. package/dist/runtime/reconcile.d.ts +1 -1
  193. package/dist/runtime/reconcile.js +19 -5
  194. package/dist/runtime/reconcile.js.map +1 -1
  195. package/dist/runtime/scheduler.d.ts +10 -10
  196. package/dist/runtime/scheduler.js +1 -1
  197. package/dist/runtime/scheduler.js.map +1 -1
  198. package/dist/runtime/svg-attributes.js +1 -0
  199. package/dist/runtime/svg-attributes.js.map +1 -1
  200. package/dist/runtime/to-vnode.js +2 -2
  201. package/dist/runtime/to-vnode.js.map +1 -1
  202. package/dist/runtime/vnode.d.ts +6 -1
  203. package/dist/runtime/vnode.js +4 -0
  204. package/dist/runtime/vnode.js.map +1 -1
  205. package/dist/server/stream.d.ts +2 -0
  206. package/dist/server/stream.js +82 -11
  207. package/dist/server/stream.js.map +1 -1
  208. package/dist/style/css-mixin.d.ts +2 -1
  209. package/dist/style/css-mixin.js.map +1 -1
  210. package/dist/style/index.d.ts +1 -1
  211. package/dist/style/style.js +27 -10
  212. package/dist/style/style.js.map +1 -1
  213. package/dist/style/stylesheet.d.ts +13 -13
  214. package/dist/style/stylesheet.js.map +1 -1
  215. package/dist/theme/contract.d.ts +24 -222
  216. package/dist/theme/contract.js +2 -2
  217. package/dist/theme/contract.js.map +1 -1
  218. package/dist/theme/glyph-contract.d.ts +1 -3
  219. package/dist/theme/glyph-contract.js.map +1 -1
  220. package/dist/theme/presets/rmx-01/index.d.ts +4 -2
  221. package/dist/theme/presets/rmx-01/index.js.map +1 -1
  222. package/dist/utils/scroll-lock.d.ts +3 -3
  223. package/dist/utils/scroll-lock.js.map +1 -1
  224. package/package.json +4 -4
  225. package/src/animation/README.md +7 -5
  226. package/src/animation/demos/animation.demo.tsx +194 -0
  227. package/src/animation/demos/aspect-ratio.tsx +120 -0
  228. package/src/animation/demos/bouncy-switch.tsx +47 -0
  229. package/src/animation/demos/color-interpolation.tsx +73 -0
  230. package/src/animation/demos/cube.tsx +116 -0
  231. package/src/animation/demos/default-animate.tsx +129 -0
  232. package/src/animation/demos/drag-release.ts +118 -0
  233. package/src/animation/demos/enter.tsx +22 -0
  234. package/src/animation/demos/exit.tsx +79 -0
  235. package/src/animation/demos/flip-toggle.tsx +46 -0
  236. package/src/animation/demos/hold-to-confirm.tsx +317 -0
  237. package/src/animation/demos/html-content.tsx +41 -0
  238. package/src/animation/demos/interruptible-keyframes.tsx +62 -0
  239. package/src/animation/demos/keyframes.tsx +29 -0
  240. package/src/animation/demos/material-ripple.tsx +158 -0
  241. package/src/animation/demos/mixin-presence-list.tsx +121 -0
  242. package/src/animation/demos/mixin-reclaim.tsx +125 -0
  243. package/src/animation/demos/multi-state-badge.tsx +426 -0
  244. package/src/animation/demos/press.tsx +67 -0
  245. package/src/animation/demos/reordering.tsx +65 -0
  246. package/src/animation/demos/rolling-square.tsx +57 -0
  247. package/src/animation/demos/rotate.tsx +21 -0
  248. package/src/animation/demos/shared-layout.tsx +211 -0
  249. package/src/animation/demos/spring.demo.tsx +385 -0
  250. package/src/animation/demos/transition-options.tsx +24 -0
  251. package/src/animation/spring.ts +43 -9
  252. package/src/components/accordion/accordion.tsx +7 -5
  253. package/src/components/accordion/demos/card.demo.tsx +1 -0
  254. package/src/components/accordion/demos/multiple.demo.tsx +1 -0
  255. package/src/components/accordion/demos/overview.demo.tsx +1 -0
  256. package/src/components/anchor/README.md +11 -3
  257. package/src/components/anchor/anchor.ts +54 -13
  258. package/src/components/breadcrumbs/{demos/basic.demo.tsx → basic.demo.tsx} +1 -0
  259. package/src/components/breadcrumbs/breadcrumbs.tsx +1 -1
  260. package/src/components/breadcrumbs/{demos/separator.demo.tsx → separator.demo.tsx} +1 -0
  261. package/src/components/button/button.tsx +30 -18
  262. package/src/components/button/demos/aliases.demo.tsx +1 -0
  263. package/src/components/button/demos/basic.demo.tsx +1 -0
  264. package/src/components/button/demos/states.demo.tsx +1 -0
  265. package/src/components/combobox/README.md +1 -1
  266. package/src/components/combobox/combobox.tsx +30 -12
  267. package/src/components/combobox/{demos/overview.demo.tsx → overview.demo.tsx} +1 -0
  268. package/src/components/glyph/glyph.tsx +2 -2
  269. package/src/components/listbox/listbox.ts +88 -83
  270. package/src/components/listbox/{demos/overview.demo.tsx → overview.demo.tsx} +1 -0
  271. package/src/components/menu/README.md +26 -2
  272. package/src/components/menu/demos/bubbling.demo.tsx +1 -0
  273. package/src/components/menu/demos/context-trigger.demo.tsx +133 -0
  274. package/src/components/menu/demos/overview.demo.tsx +1 -0
  275. package/src/components/menu/menu.tsx +100 -16
  276. package/src/components/popover/{demos/overview.demo.tsx → overview.demo.tsx} +1 -0
  277. package/src/components/popover/popover.ts +101 -81
  278. package/src/components/select/{demos/deconstructed.demo.tsx → deconstructed.demo.tsx} +1 -0
  279. package/src/components/select/{demos/overview.demo.tsx → overview.demo.tsx} +1 -0
  280. package/src/components/select/select.tsx +27 -10
  281. package/src/index.ts +1 -0
  282. package/src/runtime/client-entries.ts +1 -5
  283. package/src/runtime/component.ts +37 -15
  284. package/src/runtime/core/attributes.ts +21 -0
  285. package/src/runtime/core/props.ts +6 -4
  286. package/src/runtime/demos/basic.demo.tsx +21 -0
  287. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +177 -0
  288. package/src/runtime/demos/keyed-list.demo.tsx +94 -0
  289. package/src/runtime/demos/readme.demo.tsx +702 -0
  290. package/src/runtime/diff-dom.ts +270 -20
  291. package/src/runtime/dom.ts +16 -9
  292. package/src/runtime/frame.ts +218 -41
  293. package/src/runtime/jsx.ts +7 -11
  294. package/src/runtime/mixins/link-mixin.ts +88 -86
  295. package/src/runtime/mixins/mixin.ts +9 -1
  296. package/src/runtime/mixins/ref-mixin.ts +4 -5
  297. package/src/runtime/reconcile.ts +23 -14
  298. package/src/runtime/scheduler.ts +20 -20
  299. package/src/runtime/svg-attributes.ts +1 -0
  300. package/src/runtime/to-vnode.ts +2 -2
  301. package/src/runtime/vnode.ts +10 -0
  302. package/src/server/README.md +4 -2
  303. package/src/server/stream.ts +84 -10
  304. package/src/style/css-mixin.ts +6 -1
  305. package/src/style/index.ts +1 -2
  306. package/src/style/style.ts +29 -10
  307. package/src/style/stylesheet.ts +14 -2
  308. package/src/theme/contract.ts +37 -5
  309. package/src/theme/glyph-contract.ts +3 -1
  310. package/src/theme/presets/rmx-01/index.ts +4 -2
  311. package/src/utils/scroll-lock.ts +7 -3
  312. package/dist/components/breadcrumbs/demos/basic.demo.js.map +0 -1
  313. package/dist/components/breadcrumbs/demos/separator.demo.js.map +0 -1
  314. package/dist/components/combobox/demos/overview.demo.js.map +0 -1
  315. package/dist/components/listbox/demos/overview.demo.js.map +0 -1
  316. package/dist/components/popover/demos/overview.demo.js.map +0 -1
  317. package/dist/components/select/demos/deconstructed.demo.js.map +0 -1
  318. package/dist/components/select/demos/overview.demo.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx } from "@remix-run/ui/jsx-runtime";
2
+ import { createMixin, css, on } from '@remix-run/ui';
3
+ import { spring } from '@remix-run/ui/animation';
4
+ export function Press(handle) {
5
+ let pressed = false;
6
+ function setPressed(nextPressed) {
7
+ if (pressed === nextPressed)
8
+ return;
9
+ pressed = nextPressed;
10
+ handle.update();
11
+ }
12
+ return () => (_jsx("div", { tabIndex: 0, mix: [
13
+ css({
14
+ width: 100,
15
+ height: 100,
16
+ backgroundColor: '#9911ff',
17
+ borderRadius: 5,
18
+ transition: `transform ${spring()}`,
19
+ '&:focus': {
20
+ outline: '4px solid rgba(0,120,255,0.7)',
21
+ outlineOffset: 1,
22
+ },
23
+ '&:hover, &:focus': {
24
+ transform: pressed ? 'scale(0.8)' : 'scale(1.2)',
25
+ },
26
+ // or use default browser :active but lose keyboard "down" press states
27
+ // '&:active': {
28
+ // transform: 'scale(0.8)',
29
+ // },
30
+ }),
31
+ onPressDown(() => {
32
+ setPressed(true);
33
+ }),
34
+ onPressUp(() => {
35
+ setPressed(false);
36
+ }),
37
+ ] }));
38
+ }
39
+ const onPressDown = createMixin(() => (handler) => [
40
+ on('pointerdown', (event) => {
41
+ if (event.isPrimary === false)
42
+ return;
43
+ handler();
44
+ }),
45
+ on('keydown', (event) => {
46
+ if (!(event.key === 'Enter' || event.key === ' ') || event.repeat)
47
+ return;
48
+ event.preventDefault();
49
+ handler();
50
+ }),
51
+ ]);
52
+ const onPressUp = createMixin(() => (handler) => [
53
+ on('pointerup', handler),
54
+ on('pointerleave', handler),
55
+ on('keyup', (event) => {
56
+ if (!(event.key === 'Enter' || event.key === ' '))
57
+ return;
58
+ event.preventDefault();
59
+ handler();
60
+ }),
61
+ on('blur', handler),
62
+ ]);
63
+ //# sourceMappingURL=press.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press.js","sourceRoot":"","sources":["../../../src/animation/demos/press.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,SAAS,UAAU,CAAC,WAAoB;QACtC,IAAI,OAAO,KAAK,WAAW;YAAE,OAAM;QACnC,OAAO,GAAG,WAAW,CAAA;QACrB,MAAM,CAAC,MAAM,EAAE,CAAA;IACjB,CAAC;IAED,OAAO,GAAG,EAAE,CAAC,CACX,cACE,QAAQ,EAAE,CAAC,EACX,GAAG,EAAE;YACH,GAAG,CAAC;gBACF,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,eAAe,EAAE,SAAS;gBAC1B,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,aAAa,MAAM,EAAE,EAAE;gBACnC,SAAS,EAAE;oBACT,OAAO,EAAE,+BAA+B;oBACxC,aAAa,EAAE,CAAC;iBACjB;gBACD,kBAAkB,EAAE;oBAClB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;iBACjD;gBACD,uEAAuE;gBACvE,gBAAgB;gBAChB,6BAA6B;gBAC7B,KAAK;aACN,CAAC;YACF,WAAW,CAAC,GAAG,EAAE;gBACf,UAAU,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC,CAAC;YACF,SAAS,CAAC,GAAG,EAAE;gBACb,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,CAAC;SACH,GACD,CACH,CAAA;AACH,CAAC;AAED,MAAM,WAAW,GAAG,WAAW,CAAqC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACrF,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK;YAAE,OAAM;QACrC,OAAO,EAAE,CAAA;IACX,CAAC,CAAC;IACF,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM;YAAE,OAAM;QACzE,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,OAAO,EAAE,CAAA;IACX,CAAC,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,SAAS,GAAG,WAAW,CAAqC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACnF,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;IACxB,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC;IAC3B,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACpB,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;YAAE,OAAM;QACzD,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,OAAO,EAAE,CAAA;IACX,CAAC,CAAC;IACF,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;CACpB,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { type Handle } from '@remix-run/ui';
2
+ export declare function Reordering(handle: Handle): () => import("@remix-run/ui").RemixElement;
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "@remix-run/ui/jsx-runtime";
2
+ import { css } from '@remix-run/ui';
3
+ import { animateLayout, spring } from '@remix-run/ui/animation';
4
+ const initialOrder = ['#ff0088', '#dd00ee', '#9911ff', '#0d63f8'];
5
+ function shuffle(array) {
6
+ let result = [...array];
7
+ for (let i = result.length - 1; i > 0; i--) {
8
+ let j = Math.floor(Math.random() * (i + 1));
9
+ [result[i], result[j]] = [result[j], result[i]];
10
+ }
11
+ return result;
12
+ }
13
+ export function Reordering(handle) {
14
+ let order = initialOrder;
15
+ function scheduleNextShuffle() {
16
+ setTimeout(() => {
17
+ if (handle.signal.aborted)
18
+ return;
19
+ order = shuffle(order);
20
+ handle.update();
21
+ scheduleNextShuffle();
22
+ }, 1000);
23
+ }
24
+ scheduleNextShuffle();
25
+ return () => (_jsx("ul", { mix: [
26
+ css({
27
+ listStyle: 'none',
28
+ padding: 0,
29
+ margin: 0,
30
+ position: 'relative',
31
+ display: 'flex',
32
+ flexWrap: 'wrap',
33
+ gap: 10,
34
+ width: 220,
35
+ flexDirection: 'row',
36
+ justifyContent: 'center',
37
+ alignItems: 'center',
38
+ }),
39
+ ], children: order.map((backgroundColor) => (_jsx("li", { mix: [
40
+ css({
41
+ width: 100,
42
+ height: 100,
43
+ borderRadius: 10,
44
+ }),
45
+ animateLayout({
46
+ ...spring({ duration: 600, bounce: 0.2 }),
47
+ }),
48
+ ], style: { backgroundColor } }, backgroundColor))) }));
49
+ }
50
+ //# sourceMappingURL=reordering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reordering.js","sourceRoot":"","sources":["../../../src/animation/demos/reordering.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAe,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAE/D,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AAEjE,SAAS,OAAO,CAAI,KAAU;IAC5B,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC1C;QAAA,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,KAAK,GAAG,YAAY,CAAA;IAExB,SAAS,mBAAmB;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YACjC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;YACtB,MAAM,CAAC,MAAM,EAAE,CAAA;YACf,mBAAmB,EAAE,CAAA;QACvB,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC;IAED,mBAAmB,EAAE,CAAA;IAErB,OAAO,GAAG,EAAE,CAAC,CACX,aACE,GAAG,EAAE;YACH,GAAG,CAAC;gBACF,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;gBACT,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,MAAM;gBAChB,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,QAAQ;gBACxB,UAAU,EAAE,QAAQ;aACrB,CAAC;SACH,YAEA,KAAK,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAC9B,aAEE,GAAG,EAAE;gBACH,GAAG,CAAC;oBACF,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,GAAG;oBACX,YAAY,EAAE,EAAE;iBACjB,CAAC;gBACF,aAAa,CAAC;oBACZ,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;iBAC1C,CAAC;aACH,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,IAXrB,eAAe,CAYpB,CACH,CAAC,GACC,CACN,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type Handle } from '@remix-run/ui';
2
+ export declare function RollingSquare(handle: Handle): () => import("@remix-run/ui").RemixElement;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@remix-run/ui/jsx-runtime";
2
+ import {} from '@remix-run/ui';
3
+ import { css, on } from '@remix-run/ui';
4
+ import { spring } from '@remix-run/ui/animation';
5
+ export function RollingSquare(handle) {
6
+ let toggled = false;
7
+ return () => (_jsxs("div", { mix: [
8
+ css({
9
+ display: 'flex',
10
+ flexDirection: 'column',
11
+ alignItems: 'center',
12
+ justifyContent: 'center',
13
+ gap: '20px',
14
+ minWidth: '300px',
15
+ }),
16
+ ], children: [_jsx("div", { mix: [
17
+ css({
18
+ width: '80px',
19
+ height: '80px',
20
+ backgroundColor: '#8df0cc',
21
+ borderRadius: '10px',
22
+ transition: `transform ${spring({ duration: 500, bounce: 0.5 })}`,
23
+ }),
24
+ ], style: {
25
+ transform: toggled ? 'translateX(100%) rotate(180deg)' : 'translateX(-100%)',
26
+ } }), _jsx("button", { mix: [
27
+ css({
28
+ backgroundColor: '#8df0cc',
29
+ color: '#0f1115',
30
+ borderRadius: '5px',
31
+ padding: '10px',
32
+ margin: '10px',
33
+ border: 'none',
34
+ cursor: 'pointer',
35
+ }),
36
+ on('click', () => {
37
+ toggled = !toggled;
38
+ handle.update();
39
+ }),
40
+ ], children: "Toggle position" })] }));
41
+ }
42
+ //# sourceMappingURL=rolling-square.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolling-square.js","sourceRoot":"","sources":["../../../src/animation/demos/rolling-square.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAe,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,OAAO,GAAG,EAAE,CAAC,CACX,eACE,GAAG,EAAE;YACH,GAAG,CAAC;gBACF,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,QAAQ;gBACxB,GAAG,EAAE,MAAM;gBACX,QAAQ,EAAE,OAAO;aAClB,CAAC;SACH,aAED,cACE,GAAG,EAAE;oBACH,GAAG,CAAC;wBACF,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,MAAM;wBACd,eAAe,EAAE,SAAS;wBAC1B,YAAY,EAAE,MAAM;wBACpB,UAAU,EAAE,aAAa,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;qBAClE,CAAC;iBACH,EACD,KAAK,EAAE;oBACL,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,mBAAmB;iBAC7E,GACD,EACF,iBACE,GAAG,EAAE;oBACH,GAAG,CAAC;wBACF,eAAe,EAAE,SAAS;wBAC1B,KAAK,EAAE,SAAS;wBAChB,YAAY,EAAE,KAAK;wBACnB,OAAO,EAAE,MAAM;wBACf,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,SAAS;qBAClB,CAAC;oBACF,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;wBACf,OAAO,GAAG,CAAC,OAAO,CAAA;wBAClB,MAAM,CAAC,MAAM,EAAE,CAAA;oBACjB,CAAC,CAAC;iBACH,gCAGM,IACL,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function Rotate(): () => import("@remix-run/ui").RemixElement;
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "@remix-run/ui/jsx-runtime";
2
+ import { css } from '@remix-run/ui';
3
+ export function Rotate() {
4
+ return () => (_jsx("div", { mix: [
5
+ css({
6
+ width: 100,
7
+ height: 100,
8
+ backgroundColor: '#ff0088',
9
+ borderRadius: 5,
10
+ '@keyframes rotate-demo': {
11
+ '0%': { transform: 'rotate(0deg)' },
12
+ '100%': { transform: 'rotate(360deg)' },
13
+ },
14
+ animation: `rotate-demo 1s ease-in-out 1`,
15
+ }),
16
+ ] }));
17
+ }
18
+ //# sourceMappingURL=rotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../../src/animation/demos/rotate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAEnC,MAAM,UAAU,MAAM;IACpB,OAAO,GAAG,EAAE,CAAC,CACX,cACE,GAAG,EAAE;YACH,GAAG,CAAC;gBACF,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,eAAe,EAAE,SAAS;gBAC1B,YAAY,EAAE,CAAC;gBACf,wBAAwB,EAAE;oBACxB,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;oBACnC,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE;iBACxC;gBACD,SAAS,EAAE,8BAA8B;aAC1C,CAAC;SACH,GACD,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type Handle } from '@remix-run/ui';
2
+ export declare function SharedLayout(handle: Handle): () => import("@remix-run/ui").RemixElement;
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@remix-run/ui/jsx-runtime";
2
+ import { css, on } from '@remix-run/ui';
3
+ import { animateEntrance, animateExit } from '@remix-run/ui/animation';
4
+ const ease = 'cubic-bezier(0.26, 0.02, 0.23, 0.94)';
5
+ function OverlapExample(handle) {
6
+ let shouldAnimate = false;
7
+ handle.queueTask(() => {
8
+ shouldAnimate = true;
9
+ });
10
+ return () => {
11
+ let { state } = handle.props;
12
+ let animationMix = [
13
+ animateExit({
14
+ opacity: 0,
15
+ transform: 'scale(0.8)',
16
+ duration: 300,
17
+ easing: ease,
18
+ }),
19
+ ];
20
+ if (shouldAnimate) {
21
+ animationMix.unshift(animateEntrance({
22
+ opacity: 0,
23
+ transform: 'scale(0.6)',
24
+ duration: 300,
25
+ easing: ease,
26
+ }));
27
+ }
28
+ return (_jsx("div", {
29
+ // grid layout so children render in the same position
30
+ mix: [css({ display: 'grid', width: 80, height: 80, '& > *': { gridArea: '1 / 1' } })], children: state ? (_jsx("div", { mix: animationMix, children: _jsx(Circle, { filled: true, children: _jsx(FilledIcon, {}) }) }, "filled")) : (_jsx("div", { mix: animationMix, children: _jsx(Circle, { children: _jsx(OutlineIcon, {}) }) }, "outline")) }));
31
+ };
32
+ }
33
+ function WaitExample(handle) {
34
+ let shouldAnimate = false;
35
+ handle.queueTask(() => {
36
+ shouldAnimate = true;
37
+ });
38
+ return () => {
39
+ let { state } = handle.props;
40
+ let animationMix = [
41
+ animateExit({
42
+ opacity: 0,
43
+ transform: 'scale(0.8)',
44
+ duration: 300,
45
+ easing: ease,
46
+ }),
47
+ ];
48
+ if (shouldAnimate) {
49
+ animationMix.unshift(animateEntrance({
50
+ opacity: 0,
51
+ transform: 'scale(0.6)',
52
+ duration: 300,
53
+ easing: ease,
54
+ delay: 300,
55
+ }));
56
+ }
57
+ return (_jsx("div", {
58
+ // grid layout so children render in the same position
59
+ mix: [css({ display: 'grid', width: 80, height: 80, '& > *': { gridArea: '1 / 1' } })], children: state ? (_jsx("div", { mix: animationMix, children: _jsx(Circle, { filled: true, children: _jsx(FilledIcon, {}) }) }, "filled")) : (_jsx("div", { mix: animationMix, children: _jsx(Circle, { children: _jsx(OutlineIcon, {}) }) }, "outline")) }));
60
+ };
61
+ }
62
+ export function SharedLayout(handle) {
63
+ let state = true;
64
+ return () => (_jsxs("div", { mix: [
65
+ css({
66
+ display: 'flex',
67
+ flexDirection: 'column',
68
+ alignItems: 'center',
69
+ gap: 16,
70
+ }),
71
+ ], children: [_jsxs("div", { mix: [css({ display: 'flex', gap: 16 })], children: [_jsx(OverlapExample, { state: state }), _jsx(WaitExample, { state: state })] }), _jsx("button", { mix: [
72
+ css({
73
+ backgroundColor: '#0f1115',
74
+ color: '#f5f5f5',
75
+ border: 'none',
76
+ borderRadius: 8,
77
+ padding: '12px 32px',
78
+ fontSize: 14,
79
+ fontWeight: 500,
80
+ cursor: 'pointer',
81
+ transition: 'transform 100ms ease-in-out',
82
+ '&:active': {
83
+ transform: 'scale(0.95)',
84
+ },
85
+ }),
86
+ on('click', () => {
87
+ state = !state;
88
+ handle.update();
89
+ }),
90
+ ], children: "Switch" })] }));
91
+ }
92
+ function Circle(handle) {
93
+ return () => (_jsx("div", { mix: [
94
+ css({
95
+ width: 80,
96
+ height: 80,
97
+ borderRadius: '50%',
98
+ display: 'flex',
99
+ alignItems: 'center',
100
+ justifyContent: 'center',
101
+ boxSizing: 'border-box',
102
+ backgroundColor: handle.props.filled ? '#0f1115' : 'transparent',
103
+ color: handle.props.filled ? '#f5f5f5' : '#0f1115',
104
+ border: handle.props.filled ? '2px solid #0f1115' : '2px solid #0f1115',
105
+ }),
106
+ ], children: handle.props.children }));
107
+ }
108
+ function FilledIcon() {
109
+ return () => (_jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6" }), _jsx("path", { d: "m21 3-9 9" }), _jsx("path", { d: "M15 3h6v6" })] }));
110
+ }
111
+ function OutlineIcon() {
112
+ return () => (_jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("path", { d: "M9 12h6" })] }));
113
+ }
114
+ //# sourceMappingURL=shared-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-layout.js","sourceRoot":"","sources":["../../../src/animation/demos/shared-layout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type Handle } from '@remix-run/ui';
2
+ /**
3
+ * @name Spring Drag Release
4
+ * @description A full-screen spring physics playground with click targets and drag-release velocity.
5
+ */
6
+ export default function SpringDemo(handle: Handle): () => import("@remix-run/ui").RemixElement;
@@ -0,0 +1,304 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@remix-run/ui/jsx-runtime";
2
+ import { addEventListeners, css, on, ref } from '@remix-run/ui';
3
+ import { dragVelocityEvents } from "./drag-release.js";
4
+ import { spring } from '@remix-run/ui/animation';
5
+ function PointerTrail(handle) {
6
+ let canvas;
7
+ let points = [];
8
+ let isDown = false;
9
+ let releaseTime = 0;
10
+ let animationId = null;
11
+ let maxAge = 150; // ms - how long points stay in the trail while dragging
12
+ let fadeDuration = 800; // ms - how long the trail fades after release
13
+ function draw() {
14
+ if (!canvas)
15
+ return;
16
+ let ctx = canvas.getContext('2d');
17
+ if (!ctx)
18
+ return;
19
+ let now = performance.now();
20
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
21
+ // Calculate overall opacity based on release time
22
+ let overallOpacity = 1;
23
+ if (!isDown && releaseTime > 0) {
24
+ let elapsed = now - releaseTime;
25
+ overallOpacity = Math.max(0, 1 - elapsed / fadeDuration);
26
+ if (overallOpacity <= 0) {
27
+ points = [];
28
+ animationId = null;
29
+ return;
30
+ }
31
+ }
32
+ // Filter out old points while dragging
33
+ if (isDown) {
34
+ points = points.filter((p) => now - p.time < maxAge);
35
+ }
36
+ if (points.length < 2) {
37
+ if (isDown || overallOpacity > 0) {
38
+ animationId = requestAnimationFrame(draw);
39
+ }
40
+ else {
41
+ animationId = null;
42
+ }
43
+ return;
44
+ }
45
+ // Draw the trail as a tapered path
46
+ ctx.beginPath();
47
+ ctx.lineCap = 'round';
48
+ ctx.lineJoin = 'round';
49
+ for (let i = 1; i < points.length; i++) {
50
+ let prev = points[i - 1];
51
+ let curr = points[i];
52
+ // Age-based opacity (older = more transparent)
53
+ let age = isDown ? (now - prev.time) / maxAge : 0;
54
+ let segmentOpacity = (1 - age) * overallOpacity;
55
+ // Thickness tapers from thin (old) to thick (new)
56
+ let progress = i / (points.length - 1);
57
+ let thickness = 2 + progress * 8;
58
+ ctx.beginPath();
59
+ ctx.moveTo(prev.x, prev.y);
60
+ ctx.lineTo(curr.x, curr.y);
61
+ ctx.strokeStyle = `rgba(14, 165, 233, ${segmentOpacity * 0.6})`;
62
+ ctx.lineWidth = thickness;
63
+ ctx.stroke();
64
+ }
65
+ // Draw a red glow at the end to show direction
66
+ if (points.length > 0) {
67
+ let last = points[points.length - 1];
68
+ let gradient = ctx.createRadialGradient(last.x, last.y, 0, last.x, last.y, 20);
69
+ gradient.addColorStop(0, `rgba(239, 68, 68, ${overallOpacity * 0.6})`);
70
+ gradient.addColorStop(1, 'rgba(239, 68, 68, 0)');
71
+ ctx.fillStyle = gradient;
72
+ ctx.beginPath();
73
+ ctx.arc(last.x, last.y, 20, 0, Math.PI * 2);
74
+ ctx.fill();
75
+ }
76
+ animationId = requestAnimationFrame(draw);
77
+ }
78
+ function startDrawing() {
79
+ if (!animationId) {
80
+ animationId = requestAnimationFrame(draw);
81
+ }
82
+ }
83
+ if (typeof document !== 'undefined') {
84
+ addEventListeners(document, handle.signal, {
85
+ pointerdown(event) {
86
+ if (!event.target.closest('.draggable'))
87
+ return;
88
+ isDown = true;
89
+ releaseTime = 0;
90
+ points = [{ x: event.clientX, y: event.clientY, time: performance.now() }];
91
+ startDrawing();
92
+ },
93
+ pointermove(event) {
94
+ if (!isDown)
95
+ return;
96
+ points.push({ x: event.clientX, y: event.clientY, time: performance.now() });
97
+ },
98
+ pointerup() {
99
+ if (!isDown)
100
+ return;
101
+ isDown = false;
102
+ releaseTime = performance.now();
103
+ },
104
+ pointercancel() {
105
+ isDown = false;
106
+ releaseTime = performance.now();
107
+ },
108
+ });
109
+ }
110
+ return () => (_jsx("canvas", { mix: [
111
+ ref((node) => {
112
+ canvas = node;
113
+ canvas.width = window.innerWidth;
114
+ canvas.height = window.innerHeight;
115
+ }),
116
+ css({
117
+ position: 'absolute',
118
+ inset: 0,
119
+ pointerEvents: 'none',
120
+ zIndex: 5,
121
+ }),
122
+ ] }));
123
+ }
124
+ /**
125
+ * @name Spring Drag Release
126
+ * @description A full-screen spring physics playground with click targets and drag-release velocity.
127
+ */
128
+ export default function SpringDemo(handle) {
129
+ let viewportWidth = globalThis.window?.innerWidth ?? 1000;
130
+ let viewportHeight = globalThis.window?.innerHeight ?? 700;
131
+ // Target circle position (click to move)
132
+ let targetX = viewportWidth / 2;
133
+ let targetY = viewportHeight / 2;
134
+ // Draggable circle state
135
+ let dragX = viewportWidth / 2 - 150;
136
+ let dragY = viewportHeight / 2;
137
+ let isDragging = false;
138
+ let isAnimating = false;
139
+ // Current spring transitions (separate for X and Y to capture 2D velocity)
140
+ let transitionX = '';
141
+ let transitionY = '';
142
+ let selectedPreset = 'bouncy';
143
+ // Get default spring transition for target circle
144
+ let springValue = spring(selectedPreset);
145
+ if (typeof document !== 'undefined') {
146
+ addEventListeners(document, handle.signal, {
147
+ click(event) {
148
+ // Ignore clicks on controls or when dragging
149
+ if (event.target.closest('.controls'))
150
+ return;
151
+ if (event.target.closest('.draggable'))
152
+ return;
153
+ targetX = event.clientX;
154
+ targetY = event.clientY;
155
+ handle.update();
156
+ },
157
+ });
158
+ }
159
+ return () => (_jsxs("div", { mix: [
160
+ css({
161
+ position: 'fixed',
162
+ inset: 0,
163
+ backgroundColor: '#1a1a2e',
164
+ cursor: 'crosshair',
165
+ overflow: 'hidden',
166
+ }),
167
+ ], children: [_jsx(PointerTrail, {}), _jsx("div", { mix: [
168
+ css({
169
+ position: 'absolute',
170
+ width: '80px',
171
+ height: '80px',
172
+ borderRadius: '50%',
173
+ backgroundColor: 'transparent',
174
+ border: '3px dashed rgba(233, 69, 96, 0.5)',
175
+ transform: 'translate(-50%, -50%)',
176
+ pointerEvents: 'none',
177
+ }),
178
+ ], style: {
179
+ left: `${targetX}px`,
180
+ top: `${targetY}px`,
181
+ transition: `left ${springValue}, top ${springValue}`,
182
+ } }), _jsx("div", { className: "draggable", mix: [
183
+ css({
184
+ position: 'absolute',
185
+ width: '60px',
186
+ height: '60px',
187
+ borderRadius: '50%',
188
+ backgroundColor: '#0ea5e9',
189
+ boxShadow: '0 0 20px rgba(14, 165, 233, 0.5)',
190
+ transform: 'translate(-50%, -50%)',
191
+ userSelect: 'none',
192
+ touchAction: 'none',
193
+ zIndex: 10,
194
+ }),
195
+ on('transitionend', () => {
196
+ isAnimating = false;
197
+ handle.update();
198
+ }),
199
+ on('pointerdown', (event) => {
200
+ event.preventDefault();
201
+ isDragging = true;
202
+ isAnimating = false;
203
+ handle.update();
204
+ }),
205
+ on('pointermove', (event) => {
206
+ if (!isDragging)
207
+ return;
208
+ dragX = event.clientX;
209
+ dragY = event.clientY;
210
+ handle.update();
211
+ }),
212
+ dragVelocityEvents(),
213
+ on(dragVelocityEvents.release, (event) => {
214
+ isDragging = false;
215
+ // Calculate distance to target on each axis
216
+ let distX = targetX - dragX;
217
+ let distY = targetY - dragY;
218
+ if (Math.abs(distX) < 1 && Math.abs(distY) < 1) {
219
+ handle.update();
220
+ return;
221
+ }
222
+ // Create separate springs for X and Y with their own normalized velocities
223
+ // normalizedVelocity = velocity / distance (with sign!) for each axis
224
+ // The sign matters: positive = moving toward target, negative = moving away
225
+ if (Math.abs(distX) >= 1) {
226
+ let normalizedVelocityX = event.velocityX / distX;
227
+ normalizedVelocityX = Math.max(-20, Math.min(20, normalizedVelocityX));
228
+ transitionX = String(spring(selectedPreset, { velocity: normalizedVelocityX }));
229
+ }
230
+ else {
231
+ transitionX = String(spring(selectedPreset));
232
+ }
233
+ if (Math.abs(distY) >= 1) {
234
+ let normalizedVelocityY = event.velocityY / distY;
235
+ normalizedVelocityY = Math.max(-20, Math.min(20, normalizedVelocityY));
236
+ transitionY = String(spring(selectedPreset, { velocity: normalizedVelocityY }));
237
+ }
238
+ else {
239
+ transitionY = String(spring(selectedPreset));
240
+ }
241
+ // Animate to target
242
+ isAnimating = true;
243
+ dragX = targetX;
244
+ dragY = targetY;
245
+ handle.update();
246
+ }),
247
+ ], style: {
248
+ left: `${dragX}px`,
249
+ top: `${dragY}px`,
250
+ cursor: isDragging ? 'grabbing' : 'grab',
251
+ transition: isAnimating ? `left ${transitionX}, top ${transitionY}` : 'none',
252
+ } }), _jsx("div", { className: "controls", mix: [
253
+ css({
254
+ position: 'absolute',
255
+ top: '20px',
256
+ left: '50%',
257
+ transform: 'translateX(-50%)',
258
+ display: 'flex',
259
+ gap: '4px',
260
+ padding: '4px',
261
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
262
+ borderRadius: '8px',
263
+ fontFamily: 'system-ui, sans-serif',
264
+ fontSize: '14px',
265
+ cursor: 'default',
266
+ }),
267
+ ], children: Object.keys(spring.presets).map((preset) => (_jsxs("label", { mix: [
268
+ css({
269
+ display: 'flex',
270
+ alignItems: 'center',
271
+ gap: '6px',
272
+ padding: '8px 12px',
273
+ borderRadius: '6px',
274
+ color: '#fff',
275
+ cursor: 'pointer',
276
+ transition: 'background-color 150ms ease',
277
+ '&:hover': {
278
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
279
+ },
280
+ '&:has(input:checked)': {
281
+ backgroundColor: 'rgba(14, 165, 233, 0.3)',
282
+ },
283
+ }),
284
+ ], children: [_jsx("input", { type: "radio", name: "spring-preset", value: preset, checked: selectedPreset === preset, mix: [
285
+ css({ accentColor: '#0ea5e9' }),
286
+ on('change', () => {
287
+ selectedPreset = preset;
288
+ springValue = spring(selectedPreset);
289
+ handle.update();
290
+ }),
291
+ ] }), preset] }, preset))) }), _jsx("div", { mix: [
292
+ css({
293
+ position: 'absolute',
294
+ bottom: '20px',
295
+ left: '50%',
296
+ transform: 'translateX(-50%)',
297
+ color: '#ffffff80',
298
+ fontFamily: 'system-ui, sans-serif',
299
+ fontSize: '14px',
300
+ textAlign: 'center',
301
+ }),
302
+ ], children: "Click to move target \u2022 Drag the blue circle and release to see velocity-based spring" })] }));
303
+ }
304
+ //# sourceMappingURL=spring.demo.js.map