@remix-run/ui 0.3.0 → 0.4.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 (308) hide show
  1. package/README.md +50 -164
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
  9. package/dist/anchor/index.js.map +1 -0
  10. package/dist/animation/demos/reordering.js +9 -6
  11. package/dist/animation/demos/reordering.js.map +1 -1
  12. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  13. package/dist/breadcrumbs/index.js.map +1 -0
  14. package/dist/button/index.d.ts +15 -0
  15. package/dist/button/index.js +128 -0
  16. package/dist/button/index.js.map +1 -0
  17. package/dist/checkbox/index.d.ts +14 -0
  18. package/dist/checkbox/index.js +125 -0
  19. package/dist/checkbox/index.js.map +1 -0
  20. package/dist/combobox/index.d.ts +21 -0
  21. package/dist/combobox/index.js +58 -0
  22. package/dist/combobox/index.js.map +1 -0
  23. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  24. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  25. package/dist/combobox/primitives.js.map +1 -0
  26. package/dist/input/index.d.ts +13 -0
  27. package/dist/input/index.js +121 -0
  28. package/dist/input/index.js.map +1 -0
  29. package/dist/listbox/flash-attribute.js.map +1 -0
  30. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  31. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  32. package/dist/listbox/index.js.map +1 -0
  33. package/dist/menu/hover-aim.js.map +1 -0
  34. package/dist/menu/index.d.ts +42 -0
  35. package/dist/menu/index.js +250 -0
  36. package/dist/menu/index.js.map +1 -0
  37. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +3 -32
  38. package/dist/{components/menu/menu.js → menu/primitives.js} +97 -314
  39. package/dist/menu/primitives.js.map +1 -0
  40. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
  41. package/dist/{components/popover/popover.js → popover/index.js} +5 -48
  42. package/dist/popover/index.js.map +1 -0
  43. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  44. package/dist/popover/outside-click.js.map +1 -0
  45. package/dist/popover/scroll-lock.d.ts +1 -0
  46. package/dist/{utils → popover}/scroll-lock.js +0 -18
  47. package/dist/popover/scroll-lock.js.map +1 -0
  48. package/dist/radio/index.d.ts +12 -0
  49. package/dist/radio/index.js +77 -0
  50. package/dist/radio/index.js.map +1 -0
  51. package/dist/runtime/reconcile.js +11 -5
  52. package/dist/runtime/reconcile.js.map +1 -1
  53. package/dist/runtime/vdom.js +3 -0
  54. package/dist/runtime/vdom.js.map +1 -1
  55. package/dist/select/index.d.ts +19 -0
  56. package/dist/select/index.js +95 -0
  57. package/dist/select/index.js.map +1 -0
  58. package/dist/select/keydown.js.map +1 -0
  59. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  60. package/dist/{components/select/select.js → select/primitives.js} +11 -63
  61. package/dist/select/primitives.js.map +1 -0
  62. package/dist/server/stream.js +2 -2
  63. package/dist/server/stream.js.map +1 -1
  64. package/dist/shared/focus-styles.d.ts +1 -0
  65. package/dist/shared/focus-styles.js +2 -0
  66. package/dist/shared/focus-styles.js.map +1 -0
  67. package/dist/shared/icons.d.ts +9 -0
  68. package/dist/shared/icons.js +42 -0
  69. package/dist/shared/icons.js.map +1 -0
  70. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  71. package/dist/shared/listbox-popover-styles.js +137 -0
  72. package/dist/shared/listbox-popover-styles.js.map +1 -0
  73. package/dist/shared/style-values.d.ts +78 -0
  74. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  75. package/dist/shared/style-values.js.map +1 -0
  76. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  77. package/dist/shared/typeahead.js.map +1 -0
  78. package/dist/shared/wait-for-css-transition.js.map +1 -0
  79. package/dist/shared/wait.js.map +1 -0
  80. package/dist/tabs/index.d.ts +32 -0
  81. package/dist/tabs/index.js +157 -0
  82. package/dist/tabs/index.js.map +1 -0
  83. package/dist/tabs/primitives.d.ts +57 -0
  84. package/dist/tabs/primitives.js +238 -0
  85. package/dist/tabs/primitives.js.map +1 -0
  86. package/dist/toggle/index.d.ts +9 -0
  87. package/dist/toggle/index.js +108 -0
  88. package/dist/toggle/index.js.map +1 -0
  89. package/dist/toggle/primitives.d.ts +29 -0
  90. package/dist/toggle/primitives.js +127 -0
  91. package/dist/toggle/primitives.js.map +1 -0
  92. package/package.json +73 -44
  93. package/src/{components/accordion → accordion}/README.md +50 -14
  94. package/src/accordion/index.tsx +285 -0
  95. package/src/accordion/primitives.tsx +512 -0
  96. package/src/{components/anchor → anchor}/README.md +37 -2
  97. package/src/animation/demos/reordering.tsx +9 -6
  98. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  99. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  100. package/src/button/README.md +44 -0
  101. package/src/button/index.ts +168 -0
  102. package/src/checkbox/README.md +59 -0
  103. package/src/checkbox/index.ts +162 -0
  104. package/src/{components/combobox → combobox}/README.md +58 -9
  105. package/src/combobox/index.tsx +112 -0
  106. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  107. package/src/input/README.md +52 -0
  108. package/src/input/index.ts +147 -0
  109. package/src/{components/listbox → listbox}/README.md +9 -41
  110. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  111. package/src/{components/menu → menu}/README.md +55 -14
  112. package/src/menu/index.tsx +354 -0
  113. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
  114. package/src/{components/popover → popover}/README.md +20 -39
  115. package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
  116. package/src/{utils → popover}/scroll-lock.ts +0 -28
  117. package/src/radio/README.md +53 -0
  118. package/src/radio/index.ts +100 -0
  119. package/src/runtime/demos/readme.demo.tsx +16 -14
  120. package/src/runtime/reconcile.ts +11 -5
  121. package/src/runtime/vdom.ts +3 -0
  122. package/src/{components/select → select}/README.md +29 -19
  123. package/src/select/index.tsx +159 -0
  124. package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
  125. package/src/server/stream.ts +3 -3
  126. package/src/shared/focus-styles.ts +2 -0
  127. package/src/shared/icons.tsx +62 -0
  128. package/src/shared/listbox-popover-styles.ts +146 -0
  129. package/src/shared/style-values.ts +165 -0
  130. package/src/tabs/README.md +141 -0
  131. package/src/tabs/index.tsx +244 -0
  132. package/src/tabs/primitives.ts +365 -0
  133. package/src/toggle/README.md +56 -0
  134. package/src/toggle/index.tsx +134 -0
  135. package/src/toggle/primitives.ts +192 -0
  136. package/dist/animation/demos/animation.demo.d.ts +0 -5
  137. package/dist/animation/demos/animation.demo.js +0 -92
  138. package/dist/animation/demos/animation.demo.js.map +0 -1
  139. package/dist/animation/demos/spring.demo.d.ts +0 -6
  140. package/dist/animation/demos/spring.demo.js +0 -304
  141. package/dist/animation/demos/spring.demo.js.map +0 -1
  142. package/dist/components/accordion/accordion.d.ts +0 -92
  143. package/dist/components/accordion/accordion.js +0 -335
  144. package/dist/components/accordion/accordion.js.map +0 -1
  145. package/dist/components/accordion/demos/card.demo.d.ts +0 -7
  146. package/dist/components/accordion/demos/card.demo.js +0 -59
  147. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  148. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
  149. package/dist/components/accordion/demos/multiple.demo.js +0 -20
  150. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  151. package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
  152. package/dist/components/accordion/demos/overview.demo.js +0 -20
  153. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  154. package/dist/components/anchor/anchor.js.map +0 -1
  155. package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
  156. package/dist/components/breadcrumbs/basic.demo.js +0 -15
  157. package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
  158. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  159. package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
  160. package/dist/components/breadcrumbs/separator.demo.js +0 -15
  161. package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
  162. package/dist/components/button/button.d.ts +0 -105
  163. package/dist/components/button/button.js +0 -207
  164. package/dist/components/button/button.js.map +0 -1
  165. package/dist/components/button/demos/aliases.demo.d.ts +0 -7
  166. package/dist/components/button/demos/aliases.demo.js +0 -19
  167. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  168. package/dist/components/button/demos/basic.demo.d.ts +0 -7
  169. package/dist/components/button/demos/basic.demo.js +0 -20
  170. package/dist/components/button/demos/basic.demo.js.map +0 -1
  171. package/dist/components/button/demos/states.demo.d.ts +0 -7
  172. package/dist/components/button/demos/states.demo.js +0 -30
  173. package/dist/components/button/demos/states.demo.js.map +0 -1
  174. package/dist/components/combobox/combobox.js.map +0 -1
  175. package/dist/components/combobox/overview.demo.d.ts +0 -7
  176. package/dist/components/combobox/overview.demo.js +0 -154
  177. package/dist/components/combobox/overview.demo.js.map +0 -1
  178. package/dist/components/glyph/glyph.d.ts +0 -14
  179. package/dist/components/glyph/glyph.js +0 -65
  180. package/dist/components/glyph/glyph.js.map +0 -1
  181. package/dist/components/listbox/listbox.js.map +0 -1
  182. package/dist/components/listbox/overview.demo.d.ts +0 -7
  183. package/dist/components/listbox/overview.demo.js +0 -65
  184. package/dist/components/listbox/overview.demo.js.map +0 -1
  185. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
  186. package/dist/components/menu/demos/bubbling.demo.js +0 -16
  187. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  188. package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
  189. package/dist/components/menu/demos/context-trigger.demo.js +0 -87
  190. package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
  191. package/dist/components/menu/demos/overview.demo.d.ts +0 -7
  192. package/dist/components/menu/demos/overview.demo.js +0 -33
  193. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  194. package/dist/components/menu/hover-aim.js.map +0 -1
  195. package/dist/components/menu/menu.js.map +0 -1
  196. package/dist/components/popover/overview.demo.d.ts +0 -7
  197. package/dist/components/popover/overview.demo.js +0 -65
  198. package/dist/components/popover/overview.demo.js.map +0 -1
  199. package/dist/components/popover/popover.js.map +0 -1
  200. package/dist/components/select/deconstructed.demo.d.ts +0 -7
  201. package/dist/components/select/deconstructed.demo.js +0 -54
  202. package/dist/components/select/deconstructed.demo.js.map +0 -1
  203. package/dist/components/select/overview.demo.d.ts +0 -6
  204. package/dist/components/select/overview.demo.js +0 -28
  205. package/dist/components/select/overview.demo.js.map +0 -1
  206. package/dist/components/select/select.js.map +0 -1
  207. package/dist/components/separator/separator.d.ts +0 -2
  208. package/dist/components/separator/separator.js +0 -15
  209. package/dist/components/separator/separator.js.map +0 -1
  210. package/dist/components/tabs/tabs.d.ts +0 -78
  211. package/dist/components/tabs/tabs.js +0 -339
  212. package/dist/components/tabs/tabs.js.map +0 -1
  213. package/dist/interactions/keydown/keydown.js.map +0 -1
  214. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  215. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  216. package/dist/runtime/demos/basic.demo.d.ts +0 -6
  217. package/dist/runtime/demos/basic.demo.js +0 -16
  218. package/dist/runtime/demos/basic.demo.js.map +0 -1
  219. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
  220. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
  221. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
  222. package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
  223. package/dist/runtime/demos/keyed-list.demo.js +0 -62
  224. package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
  225. package/dist/runtime/demos/readme.demo.d.ts +0 -5
  226. package/dist/runtime/demos/readme.demo.js +0 -396
  227. package/dist/runtime/demos/readme.demo.js.map +0 -1
  228. package/dist/theme/contract.d.ts +0 -61
  229. package/dist/theme/contract.js +0 -131
  230. package/dist/theme/contract.js.map +0 -1
  231. package/dist/theme/glyph-contract.d.ts +0 -11
  232. package/dist/theme/glyph-contract.js +0 -34
  233. package/dist/theme/glyph-contract.js.map +0 -1
  234. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  235. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  236. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  237. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  238. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  239. package/dist/theme/runtime.d.ts +0 -2
  240. package/dist/theme/runtime.js +0 -84
  241. package/dist/theme/runtime.js.map +0 -1
  242. package/dist/theme/theme.d.ts +0 -6
  243. package/dist/theme/theme.js +0 -5
  244. package/dist/theme/theme.js.map +0 -1
  245. package/dist/utils/flash-attribute.js.map +0 -1
  246. package/dist/utils/scroll-lock.d.ts +0 -3
  247. package/dist/utils/scroll-lock.js.map +0 -1
  248. package/dist/utils/wait-for-css-transition.js.map +0 -1
  249. package/dist/utils/wait.js.map +0 -1
  250. package/src/animation/demos/animation.demo.tsx +0 -194
  251. package/src/animation/demos/spring.demo.tsx +0 -385
  252. package/src/components/accordion/accordion.tsx +0 -565
  253. package/src/components/accordion/demos/card.demo.tsx +0 -114
  254. package/src/components/accordion/demos/multiple.demo.tsx +0 -57
  255. package/src/components/accordion/demos/overview.demo.tsx +0 -57
  256. package/src/components/breadcrumbs/basic.demo.tsx +0 -18
  257. package/src/components/breadcrumbs/separator.demo.tsx +0 -19
  258. package/src/components/button/README.md +0 -44
  259. package/src/components/button/button.tsx +0 -286
  260. package/src/components/button/demos/aliases.demo.tsx +0 -28
  261. package/src/components/button/demos/basic.demo.tsx +0 -31
  262. package/src/components/button/demos/states.demo.tsx +0 -53
  263. package/src/components/combobox/overview.demo.tsx +0 -200
  264. package/src/components/glyph/README.md +0 -72
  265. package/src/components/glyph/glyph.tsx +0 -110
  266. package/src/components/listbox/overview.demo.tsx +0 -102
  267. package/src/components/menu/demos/bubbling.demo.tsx +0 -35
  268. package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
  269. package/src/components/menu/demos/overview.demo.tsx +0 -77
  270. package/src/components/popover/overview.demo.tsx +0 -144
  271. package/src/components/select/deconstructed.demo.tsx +0 -96
  272. package/src/components/select/overview.demo.tsx +0 -52
  273. package/src/components/separator/separator.ts +0 -19
  274. package/src/components/tabs/README.md +0 -105
  275. package/src/components/tabs/tabs.tsx +0 -504
  276. package/src/runtime/demos/basic.demo.tsx +0 -21
  277. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
  278. package/src/runtime/demos/keyed-list.demo.tsx +0 -94
  279. package/src/theme/README.md +0 -103
  280. package/src/theme/contract.ts +0 -215
  281. package/src/theme/glyph-contract.ts +0 -59
  282. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  283. package/src/theme/presets/rmx-01/index.ts +0 -123
  284. package/src/theme/runtime.ts +0 -119
  285. package/src/theme/theme.ts +0 -15
  286. package/src/utils/scroll-lock/README.md +0 -33
  287. /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
  288. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  289. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  290. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  291. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  292. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  293. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  294. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  295. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  296. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  297. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  298. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  299. /package/dist/{utils → shared}/wait.d.ts +0 -0
  300. /package/dist/{utils → shared}/wait.js +0 -0
  301. /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
  302. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  303. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  304. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  305. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  306. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  307. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  308. /package/src/{utils → shared}/wait.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scroll-lock.js","sourceRoot":"","sources":["../../src/utils/scroll-lock.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait-for-css-transition.js","sourceRoot":"","sources":["../../src/utils/wait-for-css-transition.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,IAAiB,EAAE,MAAmB,EAAE,MAAmB;IAC9F,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,gBAAgB,GAAG,KAAK,CAAA;QAC5B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,aAAa,GAAG,CAAC,CAAA;QAErB,SAAS,OAAO;YACd,oBAAoB,CAAC,YAAY,CAAC,CAAA;YAClC,oBAAoB,CAAC,aAAa,CAAC,CAAA;YACnC,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAA;YAC9D,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;YACjD,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC7C,CAAC;QAED,SAAS,mBAAmB,CAAC,KAAsB;YACjD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAM;YACR,CAAC;YAED,gBAAgB,GAAG,IAAI,CAAA;QACzB,CAAC;QAED,SAAS,MAAM,CAAC,KAAa;YAC3B,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC9D,OAAM;YACR,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,EAAE,CAAA;YACT,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAA;QAC3D,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QACjD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAExD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,EAAE,CAAA;YACV,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAA;gBACT,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,CAAA;YACR,OAAM;QACR,CAAC;QAED,YAAY,GAAG,qBAAqB,CAAC,GAAG,EAAE;YACxC,aAAa,GAAG,qBAAqB,CAAC,GAAG,EAAE;gBACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,EAAE,CAAA;gBACV,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/utils/wait.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,IAAI,CAAC,EAAU;IAC7B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1,194 +0,0 @@
1
- import { css, on, type Handle, type RemixNode } from '@remix-run/ui'
2
- import { DefaultAnimate } from './default-animate.tsx'
3
- import { EnterAnimation } from './enter.tsx'
4
- import { ExitAnimation } from './exit.tsx'
5
- import { Press } from './press.tsx'
6
- import { HTMLContent } from './html-content.tsx'
7
- import { Keyframes } from './keyframes.tsx'
8
- import { InterruptibleKeyframes } from './interruptible-keyframes.tsx'
9
- import { RollingSquare } from './rolling-square.tsx'
10
- import { Rotate } from './rotate.tsx'
11
- import { TransitionOptions } from './transition-options.tsx'
12
- import { Cube } from './cube.tsx'
13
- import { SharedLayout } from './shared-layout.tsx'
14
- import { AspectRatio } from './aspect-ratio.tsx'
15
- import { BouncySwitch } from './bouncy-switch.tsx'
16
- import { ColorInterpolation } from './color-interpolation.tsx'
17
- import { FlipToggle } from './flip-toggle.tsx'
18
- import { Reordering } from './reordering.tsx'
19
- import { MultiStateBadge } from './multi-state-badge.tsx'
20
- import { HoldToConfirm } from './hold-to-confirm.tsx'
21
- import { MaterialRipple } from './material-ripple.tsx'
22
-
23
- function Tile(handle: Handle<{ title: string; children: RemixNode; notes?: string }>) {
24
- let remountKey = 0
25
-
26
- return () => {
27
- let { title, children, notes } = handle.props
28
-
29
- return (
30
- <div
31
- mix={[
32
- css({
33
- backgroundColor: 'white',
34
- padding: '40px',
35
- borderRadius: 12,
36
- boxShadow: '0 0 10px 0 rgba(0, 0, 0, 0.1)',
37
- display: 'flex',
38
- alignItems: 'center',
39
- flexDirection: 'column',
40
- gap: 12,
41
- position: 'relative',
42
- }),
43
- ]}
44
- >
45
- <button
46
- mix={[
47
- css({
48
- position: 'absolute',
49
- bottom: 8,
50
- right: 8,
51
- width: 18,
52
- height: 18,
53
- padding: 0,
54
- border: 'none',
55
- background: 'transparent',
56
- cursor: 'pointer',
57
- opacity: 0.4,
58
- '&:hover': {
59
- opacity: 1,
60
- },
61
- }),
62
- on('click', () => {
63
- remountKey++
64
- handle.update()
65
- }),
66
- ]}
67
- title="Replay animation"
68
- >
69
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
70
- <path d="M1 4v6h6M23 20v-6h-6" />
71
- <path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15" />
72
- </svg>
73
- </button>
74
- <h3 mix={[css({ margin: 0 })]}>{title}</h3>
75
- <div
76
- key={remountKey}
77
- mix={[
78
- css({
79
- flex: 1,
80
- display: 'flex',
81
- alignItems: 'center',
82
- justifyContent: 'center',
83
- minHeight: 280,
84
- }),
85
- ]}
86
- >
87
- {children}
88
- </div>
89
- {notes && (
90
- <p
91
- mix={[
92
- css({
93
- margin: 0,
94
- fontSize: 12,
95
- color: '#666',
96
- textAlign: 'center',
97
- maxWidth: '200px',
98
- }),
99
- ]}
100
- >
101
- {notes}
102
- </p>
103
- )}
104
- </div>
105
- )
106
- }
107
- }
108
-
109
- /**
110
- * @name Animation Gallery
111
- * @description A collection of motion and animation experiments adapted from the standalone demos.
112
- */
113
- export default function AnimationGallery() {
114
- return () => (
115
- <>
116
- <h1 mix={[css({ marginBottom: 0, '& + p': { marginTop: 0 } })]}>Animations</h1>
117
- <p>
118
- Most animations are adapted from <a href="https://www.motion.dev">Motion</a>. Thank you for
119
- your work <a href="https://motion.dev/@matt">Matt Perry</a>!
120
- </p>
121
- <div
122
- mix={[
123
- css({
124
- display: 'grid',
125
- gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',
126
- gap: 24,
127
- marginTop: 40,
128
- }),
129
- ]}
130
- >
131
- <Tile title="Default Animate" notes="animateEntrance + animateLayout defaults">
132
- <DefaultAnimate />
133
- </Tile>
134
- <Tile title="Rolling Square" notes="CSS transition with spring() timing function">
135
- <RollingSquare />
136
- </Tile>
137
- <Tile title="Enter Animation" notes="animateEntrance() with spring physics">
138
- <EnterAnimation />
139
- </Tile>
140
- <Tile title="Exit Animation" notes="animateEntrance() + animateExit()">
141
- <ExitAnimation />
142
- </Tile>
143
- <Tile title="Press Interaction" notes="CSS transition + pointer/keyboard events">
144
- <Press />
145
- </Tile>
146
- <Tile title="HTML Content" notes="rAF loop with spring iterator for text">
147
- <HTMLContent />
148
- </Tile>
149
- <Tile title="Keyframes" notes="CSS @keyframes with infinite loop">
150
- <Keyframes />
151
- </Tile>
152
- <Tile title="Interruptible Keyframes" notes="Web Animations API with commitStyles()">
153
- <InterruptibleKeyframes />
154
- </Tile>
155
- <Tile title="Rotate" notes="CSS @keyframes (one-shot)">
156
- <Rotate />
157
- </Tile>
158
- <Tile title="Transition Options" notes="animateEntrance() with cubic-bezier + delay">
159
- <TransitionOptions />
160
- </Tile>
161
- <Tile title="3D Cube" notes="rAF loop with direct style manipulation">
162
- <Cube />
163
- </Tile>
164
- <Tile title="Shared Layout" notes="CSS Grid overlap for simultaneous enter/exit">
165
- <SharedLayout />
166
- </Tile>
167
- <Tile title="Aspect Ratio">
168
- <AspectRatio />
169
- </Tile>
170
- <Tile title="Bouncy Switch" notes="Spring up, bounce down with CSS linear()">
171
- <BouncySwitch />
172
- </Tile>
173
- <Tile title="FLIP Toggle" notes="animateLayout() with interruptible WAAPI">
174
- <FlipToggle />
175
- </Tile>
176
- <Tile title="Reordering" notes="animateLayout() with auto-shuffling list">
177
- <Reordering />
178
- </Tile>
179
- <Tile title="Color Interpolation" notes="sRGB vs OKLCH color space">
180
- <ColorInterpolation />
181
- </Tile>
182
- <Tile title="Multi-State Badge" notes="Animated icon/label swap with WAAPI shake">
183
- <MultiStateBadge />
184
- </Tile>
185
- <Tile title="Hold to Confirm" notes="Custom interaction with progress tracking">
186
- <HoldToConfirm />
187
- </Tile>
188
- <Tile title="Material Ripple" notes="Pointer-tracked ripples with enter/exit animations">
189
- <MaterialRipple />
190
- </Tile>
191
- </div>
192
- </>
193
- )
194
- }
@@ -1,385 +0,0 @@
1
- import { addEventListeners, css, on, ref, type Handle } from '@remix-run/ui'
2
-
3
- import { dragVelocityEvents } from './drag-release.ts'
4
- import { spring, type SpringPreset } from '@remix-run/ui/animation'
5
-
6
- interface TrailPoint {
7
- x: number
8
- y: number
9
- time: number
10
- }
11
-
12
- function PointerTrail(handle: Handle) {
13
- let canvas: HTMLCanvasElement
14
- let points: TrailPoint[] = []
15
- let isDown = false
16
- let releaseTime = 0
17
- let animationId: number | null = null
18
-
19
- let maxAge = 150 // ms - how long points stay in the trail while dragging
20
- let fadeDuration = 800 // ms - how long the trail fades after release
21
-
22
- function draw() {
23
- if (!canvas) return
24
- let ctx = canvas.getContext('2d')
25
- if (!ctx) return
26
-
27
- let now = performance.now()
28
- ctx.clearRect(0, 0, canvas.width, canvas.height)
29
-
30
- // Calculate overall opacity based on release time
31
- let overallOpacity = 1
32
- if (!isDown && releaseTime > 0) {
33
- let elapsed = now - releaseTime
34
- overallOpacity = Math.max(0, 1 - elapsed / fadeDuration)
35
- if (overallOpacity <= 0) {
36
- points = []
37
- animationId = null
38
- return
39
- }
40
- }
41
-
42
- // Filter out old points while dragging
43
- if (isDown) {
44
- points = points.filter((p) => now - p.time < maxAge)
45
- }
46
-
47
- if (points.length < 2) {
48
- if (isDown || overallOpacity > 0) {
49
- animationId = requestAnimationFrame(draw)
50
- } else {
51
- animationId = null
52
- }
53
- return
54
- }
55
-
56
- // Draw the trail as a tapered path
57
- ctx.beginPath()
58
- ctx.lineCap = 'round'
59
- ctx.lineJoin = 'round'
60
-
61
- for (let i = 1; i < points.length; i++) {
62
- let prev = points[i - 1]
63
- let curr = points[i]
64
-
65
- // Age-based opacity (older = more transparent)
66
- let age = isDown ? (now - prev.time) / maxAge : 0
67
- let segmentOpacity = (1 - age) * overallOpacity
68
-
69
- // Thickness tapers from thin (old) to thick (new)
70
- let progress = i / (points.length - 1)
71
- let thickness = 2 + progress * 8
72
-
73
- ctx.beginPath()
74
- ctx.moveTo(prev.x, prev.y)
75
- ctx.lineTo(curr.x, curr.y)
76
- ctx.strokeStyle = `rgba(14, 165, 233, ${segmentOpacity * 0.6})`
77
- ctx.lineWidth = thickness
78
- ctx.stroke()
79
- }
80
-
81
- // Draw a red glow at the end to show direction
82
- if (points.length > 0) {
83
- let last = points[points.length - 1]
84
- let gradient = ctx.createRadialGradient(last.x, last.y, 0, last.x, last.y, 20)
85
- gradient.addColorStop(0, `rgba(239, 68, 68, ${overallOpacity * 0.6})`)
86
- gradient.addColorStop(1, 'rgba(239, 68, 68, 0)')
87
- ctx.fillStyle = gradient
88
- ctx.beginPath()
89
- ctx.arc(last.x, last.y, 20, 0, Math.PI * 2)
90
- ctx.fill()
91
- }
92
-
93
- animationId = requestAnimationFrame(draw)
94
- }
95
-
96
- function startDrawing() {
97
- if (!animationId) {
98
- animationId = requestAnimationFrame(draw)
99
- }
100
- }
101
-
102
- if (typeof document !== 'undefined') {
103
- addEventListeners(document, handle.signal, {
104
- pointerdown(event) {
105
- if (!(event.target as HTMLElement).closest('.draggable')) return
106
- isDown = true
107
- releaseTime = 0
108
- points = [{ x: event.clientX, y: event.clientY, time: performance.now() }]
109
- startDrawing()
110
- },
111
-
112
- pointermove(event) {
113
- if (!isDown) return
114
- points.push({ x: event.clientX, y: event.clientY, time: performance.now() })
115
- },
116
-
117
- pointerup() {
118
- if (!isDown) return
119
- isDown = false
120
- releaseTime = performance.now()
121
- },
122
-
123
- pointercancel() {
124
- isDown = false
125
- releaseTime = performance.now()
126
- },
127
- })
128
- }
129
-
130
- return () => (
131
- <canvas
132
- mix={[
133
- ref((node) => {
134
- canvas = node
135
- canvas.width = window.innerWidth
136
- canvas.height = window.innerHeight
137
- }),
138
- css({
139
- position: 'absolute',
140
- inset: 0,
141
- pointerEvents: 'none',
142
- zIndex: 5,
143
- }),
144
- ]}
145
- />
146
- )
147
- }
148
-
149
- /**
150
- * @name Spring Drag Release
151
- * @description A full-screen spring physics playground with click targets and drag-release velocity.
152
- */
153
- export default function SpringDemo(handle: Handle) {
154
- let viewportWidth = globalThis.window?.innerWidth ?? 1000
155
- let viewportHeight = globalThis.window?.innerHeight ?? 700
156
-
157
- // Target circle position (click to move)
158
- let targetX = viewportWidth / 2
159
- let targetY = viewportHeight / 2
160
-
161
- // Draggable circle state
162
- let dragX = viewportWidth / 2 - 150
163
- let dragY = viewportHeight / 2
164
- let isDragging = false
165
- let isAnimating = false
166
-
167
- // Current spring transitions (separate for X and Y to capture 2D velocity)
168
- let transitionX = ''
169
- let transitionY = ''
170
-
171
- let selectedPreset: SpringPreset = 'bouncy'
172
-
173
- // Get default spring transition for target circle
174
- let springValue = spring(selectedPreset)
175
-
176
- if (typeof document !== 'undefined') {
177
- addEventListeners(document, handle.signal, {
178
- click(event) {
179
- // Ignore clicks on controls or when dragging
180
- if ((event.target as HTMLElement).closest('.controls')) return
181
- if ((event.target as HTMLElement).closest('.draggable')) return
182
-
183
- targetX = event.clientX
184
- targetY = event.clientY
185
- handle.update()
186
- },
187
- })
188
- }
189
-
190
- return () => (
191
- <div
192
- mix={[
193
- css({
194
- position: 'fixed',
195
- inset: 0,
196
- backgroundColor: '#1a1a2e',
197
- cursor: 'crosshair',
198
- overflow: 'hidden',
199
- }),
200
- ]}
201
- >
202
- {/* Pointer trail */}
203
- <PointerTrail />
204
-
205
- {/* Target circle */}
206
- <div
207
- mix={[
208
- css({
209
- position: 'absolute',
210
- width: '80px',
211
- height: '80px',
212
- borderRadius: '50%',
213
- backgroundColor: 'transparent',
214
- border: '3px dashed rgba(233, 69, 96, 0.5)',
215
- transform: 'translate(-50%, -50%)',
216
- pointerEvents: 'none',
217
- }),
218
- ]}
219
- style={{
220
- left: `${targetX}px`,
221
- top: `${targetY}px`,
222
- transition: `left ${springValue}, top ${springValue}`,
223
- }}
224
- />
225
-
226
- {/* Draggable circle */}
227
- <div
228
- className="draggable"
229
- mix={[
230
- css({
231
- position: 'absolute',
232
- width: '60px',
233
- height: '60px',
234
- borderRadius: '50%',
235
- backgroundColor: '#0ea5e9',
236
- boxShadow: '0 0 20px rgba(14, 165, 233, 0.5)',
237
- transform: 'translate(-50%, -50%)',
238
- userSelect: 'none',
239
- touchAction: 'none',
240
- zIndex: 10,
241
- }),
242
- on('transitionend', () => {
243
- isAnimating = false
244
- handle.update()
245
- }),
246
- on('pointerdown', (event) => {
247
- event.preventDefault()
248
- isDragging = true
249
- isAnimating = false
250
- handle.update()
251
- }),
252
- on('pointermove', (event) => {
253
- if (!isDragging) return
254
- dragX = event.clientX
255
- dragY = event.clientY
256
- handle.update()
257
- }),
258
- dragVelocityEvents(),
259
- on(dragVelocityEvents.release, (event) => {
260
- isDragging = false
261
-
262
- // Calculate distance to target on each axis
263
- let distX = targetX - dragX
264
- let distY = targetY - dragY
265
-
266
- if (Math.abs(distX) < 1 && Math.abs(distY) < 1) {
267
- handle.update()
268
- return
269
- }
270
-
271
- // Create separate springs for X and Y with their own normalized velocities
272
- // normalizedVelocity = velocity / distance (with sign!) for each axis
273
- // The sign matters: positive = moving toward target, negative = moving away
274
- if (Math.abs(distX) >= 1) {
275
- let normalizedVelocityX = event.velocityX / distX
276
- normalizedVelocityX = Math.max(-20, Math.min(20, normalizedVelocityX))
277
- transitionX = String(spring(selectedPreset, { velocity: normalizedVelocityX }))
278
- } else {
279
- transitionX = String(spring(selectedPreset))
280
- }
281
-
282
- if (Math.abs(distY) >= 1) {
283
- let normalizedVelocityY = event.velocityY / distY
284
- normalizedVelocityY = Math.max(-20, Math.min(20, normalizedVelocityY))
285
- transitionY = String(spring(selectedPreset, { velocity: normalizedVelocityY }))
286
- } else {
287
- transitionY = String(spring(selectedPreset))
288
- }
289
-
290
- // Animate to target
291
- isAnimating = true
292
- dragX = targetX
293
- dragY = targetY
294
- handle.update()
295
- }),
296
- ]}
297
- style={{
298
- left: `${dragX}px`,
299
- top: `${dragY}px`,
300
- cursor: isDragging ? 'grabbing' : 'grab',
301
- transition: isAnimating ? `left ${transitionX}, top ${transitionY}` : 'none',
302
- }}
303
- />
304
-
305
- {/* Controls */}
306
- <div
307
- className="controls"
308
- mix={[
309
- css({
310
- position: 'absolute',
311
- top: '20px',
312
- left: '50%',
313
- transform: 'translateX(-50%)',
314
- display: 'flex',
315
- gap: '4px',
316
- padding: '4px',
317
- backgroundColor: 'rgba(255, 255, 255, 0.1)',
318
- borderRadius: '8px',
319
- fontFamily: 'system-ui, sans-serif',
320
- fontSize: '14px',
321
- cursor: 'default',
322
- }),
323
- ]}
324
- >
325
- {(Object.keys(spring.presets) as SpringPreset[]).map((preset) => (
326
- <label
327
- key={preset}
328
- mix={[
329
- css({
330
- display: 'flex',
331
- alignItems: 'center',
332
- gap: '6px',
333
- padding: '8px 12px',
334
- borderRadius: '6px',
335
- color: '#fff',
336
- cursor: 'pointer',
337
- transition: 'background-color 150ms ease',
338
- '&:hover': {
339
- backgroundColor: 'rgba(255, 255, 255, 0.1)',
340
- },
341
- '&:has(input:checked)': {
342
- backgroundColor: 'rgba(14, 165, 233, 0.3)',
343
- },
344
- }),
345
- ]}
346
- >
347
- <input
348
- type="radio"
349
- name="spring-preset"
350
- value={preset}
351
- checked={selectedPreset === preset}
352
- mix={[
353
- css({ accentColor: '#0ea5e9' }),
354
- on('change', () => {
355
- selectedPreset = preset
356
- springValue = spring(selectedPreset)
357
- handle.update()
358
- }),
359
- ]}
360
- />
361
- {preset}
362
- </label>
363
- ))}
364
- </div>
365
-
366
- {/* Instructions */}
367
- <div
368
- mix={[
369
- css({
370
- position: 'absolute',
371
- bottom: '20px',
372
- left: '50%',
373
- transform: 'translateX(-50%)',
374
- color: '#ffffff80',
375
- fontFamily: 'system-ui, sans-serif',
376
- fontSize: '14px',
377
- textAlign: 'center',
378
- }),
379
- ]}
380
- >
381
- Click to move target • Drag the blue circle and release to see velocity-based spring
382
- </div>
383
- </div>
384
- )
385
- }