@remix-run/ui 0.2.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 (395) 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.d.ts → anchor/index.d.ts} +8 -1
  9. package/dist/{components/anchor/anchor.js → anchor/index.js} +31 -12
  10. package/dist/anchor/index.js.map +1 -0
  11. package/dist/animation/demos/aspect-ratio.d.ts +2 -0
  12. package/dist/animation/demos/aspect-ratio.js +69 -0
  13. package/dist/animation/demos/aspect-ratio.js.map +1 -0
  14. package/dist/animation/demos/bouncy-switch.d.ts +2 -0
  15. package/dist/animation/demos/bouncy-switch.js +36 -0
  16. package/dist/animation/demos/bouncy-switch.js.map +1 -0
  17. package/dist/animation/demos/color-interpolation.d.ts +1 -0
  18. package/dist/animation/demos/color-interpolation.js +53 -0
  19. package/dist/animation/demos/color-interpolation.js.map +1 -0
  20. package/dist/animation/demos/cube.d.ts +2 -0
  21. package/dist/animation/demos/cube.js +86 -0
  22. package/dist/animation/demos/cube.js.map +1 -0
  23. package/dist/animation/demos/default-animate.d.ts +2 -0
  24. package/dist/animation/demos/default-animate.js +89 -0
  25. package/dist/animation/demos/default-animate.js.map +1 -0
  26. package/dist/animation/demos/drag-release.d.ts +24 -0
  27. package/dist/animation/demos/drag-release.js +96 -0
  28. package/dist/animation/demos/drag-release.js.map +1 -0
  29. package/dist/animation/demos/enter.d.ts +1 -0
  30. package/dist/animation/demos/enter.js +19 -0
  31. package/dist/animation/demos/enter.js.map +1 -0
  32. package/dist/animation/demos/exit.d.ts +2 -0
  33. package/dist/animation/demos/exit.js +58 -0
  34. package/dist/animation/demos/exit.js.map +1 -0
  35. package/dist/animation/demos/flip-toggle.d.ts +2 -0
  36. package/dist/animation/demos/flip-toggle.js +37 -0
  37. package/dist/animation/demos/flip-toggle.js.map +1 -0
  38. package/dist/animation/demos/hold-to-confirm.d.ts +13 -0
  39. package/dist/animation/demos/hold-to-confirm.js +211 -0
  40. package/dist/animation/demos/hold-to-confirm.js.map +1 -0
  41. package/dist/animation/demos/html-content.d.ts +2 -0
  42. package/dist/animation/demos/html-content.js +30 -0
  43. package/dist/animation/demos/html-content.js.map +1 -0
  44. package/dist/animation/demos/interruptible-keyframes.d.ts +1 -0
  45. package/dist/animation/demos/interruptible-keyframes.js +48 -0
  46. package/dist/animation/demos/interruptible-keyframes.js.map +1 -0
  47. package/dist/animation/demos/keyframes.d.ts +1 -0
  48. package/dist/animation/demos/keyframes.js +24 -0
  49. package/dist/animation/demos/keyframes.js.map +1 -0
  50. package/dist/animation/demos/material-ripple.d.ts +2 -0
  51. package/dist/animation/demos/material-ripple.js +127 -0
  52. package/dist/animation/demos/material-ripple.js.map +1 -0
  53. package/dist/animation/demos/mixin-presence-list.d.ts +2 -0
  54. package/dist/animation/demos/mixin-presence-list.js +88 -0
  55. package/dist/animation/demos/mixin-presence-list.js.map +1 -0
  56. package/dist/animation/demos/mixin-reclaim.d.ts +2 -0
  57. package/dist/animation/demos/mixin-reclaim.js +90 -0
  58. package/dist/animation/demos/mixin-reclaim.js.map +1 -0
  59. package/dist/animation/demos/multi-state-badge.d.ts +2 -0
  60. package/dist/animation/demos/multi-state-badge.js +231 -0
  61. package/dist/animation/demos/multi-state-badge.js.map +1 -0
  62. package/dist/animation/demos/press.d.ts +2 -0
  63. package/dist/animation/demos/press.js +63 -0
  64. package/dist/animation/demos/press.js.map +1 -0
  65. package/dist/animation/demos/reordering.d.ts +2 -0
  66. package/dist/animation/demos/reordering.js +53 -0
  67. package/dist/animation/demos/reordering.js.map +1 -0
  68. package/dist/animation/demos/rolling-square.d.ts +2 -0
  69. package/dist/animation/demos/rolling-square.js +42 -0
  70. package/dist/animation/demos/rolling-square.js.map +1 -0
  71. package/dist/animation/demos/rotate.d.ts +1 -0
  72. package/dist/animation/demos/rotate.js +18 -0
  73. package/dist/animation/demos/rotate.js.map +1 -0
  74. package/dist/animation/demos/shared-layout.d.ts +2 -0
  75. package/dist/animation/demos/shared-layout.js +114 -0
  76. package/dist/animation/demos/shared-layout.js.map +1 -0
  77. package/dist/animation/demos/transition-options.d.ts +1 -0
  78. package/dist/animation/demos/transition-options.js +21 -0
  79. package/dist/animation/demos/transition-options.js.map +1 -0
  80. package/dist/animation/spring.d.ts +22 -0
  81. package/dist/animation/spring.js +22 -0
  82. package/dist/animation/spring.js.map +1 -1
  83. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  84. package/dist/breadcrumbs/index.js.map +1 -0
  85. package/dist/button/index.d.ts +15 -0
  86. package/dist/button/index.js +128 -0
  87. package/dist/button/index.js.map +1 -0
  88. package/dist/checkbox/index.d.ts +14 -0
  89. package/dist/checkbox/index.js +125 -0
  90. package/dist/checkbox/index.js.map +1 -0
  91. package/dist/combobox/index.d.ts +21 -0
  92. package/dist/combobox/index.js +58 -0
  93. package/dist/combobox/index.js.map +1 -0
  94. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  95. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  96. package/dist/combobox/primitives.js.map +1 -0
  97. package/dist/input/index.d.ts +13 -0
  98. package/dist/input/index.js +121 -0
  99. package/dist/input/index.js.map +1 -0
  100. package/dist/listbox/flash-attribute.js.map +1 -0
  101. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  102. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  103. package/dist/listbox/index.js.map +1 -0
  104. package/dist/menu/hover-aim.js.map +1 -0
  105. package/dist/menu/index.d.ts +42 -0
  106. package/dist/menu/index.js +250 -0
  107. package/dist/menu/index.js.map +1 -0
  108. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +6 -32
  109. package/dist/{components/menu/menu.js → menu/primitives.js} +117 -279
  110. package/dist/menu/primitives.js.map +1 -0
  111. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +3 -5
  112. package/dist/{components/popover/popover.js → popover/index.js} +15 -51
  113. package/dist/popover/index.js.map +1 -0
  114. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  115. package/dist/popover/outside-click.js.map +1 -0
  116. package/dist/popover/scroll-lock.d.ts +1 -0
  117. package/dist/{utils → popover}/scroll-lock.js +0 -18
  118. package/dist/popover/scroll-lock.js.map +1 -0
  119. package/dist/radio/index.d.ts +12 -0
  120. package/dist/radio/index.js +77 -0
  121. package/dist/radio/index.js.map +1 -0
  122. package/dist/runtime/client-entries.d.ts +1 -2
  123. package/dist/runtime/client-entries.js.map +1 -1
  124. package/dist/runtime/component.d.ts +2 -2
  125. package/dist/runtime/component.js +1 -1
  126. package/dist/runtime/component.js.map +1 -1
  127. package/dist/runtime/diff-dom.js +194 -21
  128. package/dist/runtime/diff-dom.js.map +1 -1
  129. package/dist/runtime/frame.d.ts +7 -0
  130. package/dist/runtime/frame.js +176 -41
  131. package/dist/runtime/frame.js.map +1 -1
  132. package/dist/runtime/jsx.d.ts +2 -3
  133. package/dist/runtime/jsx.js.map +1 -1
  134. package/dist/runtime/reconcile.js +11 -5
  135. package/dist/runtime/reconcile.js.map +1 -1
  136. package/dist/runtime/vdom.js +3 -0
  137. package/dist/runtime/vdom.js.map +1 -1
  138. package/dist/select/index.d.ts +19 -0
  139. package/dist/select/index.js +95 -0
  140. package/dist/select/index.js.map +1 -0
  141. package/dist/select/keydown.js.map +1 -0
  142. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  143. package/dist/{components/select/select.js → select/primitives.js} +12 -64
  144. package/dist/select/primitives.js.map +1 -0
  145. package/dist/server/stream.js +5 -4
  146. package/dist/server/stream.js.map +1 -1
  147. package/dist/shared/focus-styles.d.ts +1 -0
  148. package/dist/shared/focus-styles.js +2 -0
  149. package/dist/shared/focus-styles.js.map +1 -0
  150. package/dist/shared/icons.d.ts +9 -0
  151. package/dist/shared/icons.js +42 -0
  152. package/dist/shared/icons.js.map +1 -0
  153. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  154. package/dist/shared/listbox-popover-styles.js +137 -0
  155. package/dist/shared/listbox-popover-styles.js.map +1 -0
  156. package/dist/shared/style-values.d.ts +78 -0
  157. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  158. package/dist/shared/style-values.js.map +1 -0
  159. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  160. package/dist/shared/typeahead.js.map +1 -0
  161. package/dist/shared/wait-for-css-transition.js.map +1 -0
  162. package/dist/shared/wait.js.map +1 -0
  163. package/dist/style/style.js +27 -10
  164. package/dist/style/style.js.map +1 -1
  165. package/dist/tabs/index.d.ts +32 -0
  166. package/dist/tabs/index.js +157 -0
  167. package/dist/tabs/index.js.map +1 -0
  168. package/dist/tabs/primitives.d.ts +57 -0
  169. package/dist/tabs/primitives.js +238 -0
  170. package/dist/tabs/primitives.js.map +1 -0
  171. package/dist/toggle/index.d.ts +9 -0
  172. package/dist/toggle/index.js +108 -0
  173. package/dist/toggle/index.js.map +1 -0
  174. package/dist/toggle/primitives.d.ts +29 -0
  175. package/dist/toggle/primitives.js +127 -0
  176. package/dist/toggle/primitives.js.map +1 -0
  177. package/package.json +74 -45
  178. package/src/{components/accordion → accordion}/README.md +50 -14
  179. package/src/accordion/index.tsx +285 -0
  180. package/src/accordion/primitives.tsx +512 -0
  181. package/src/{components/anchor → anchor}/README.md +48 -5
  182. package/src/{components/anchor/anchor.ts → anchor/index.ts} +53 -12
  183. package/src/animation/demos/aspect-ratio.tsx +120 -0
  184. package/src/animation/demos/bouncy-switch.tsx +47 -0
  185. package/src/animation/demos/color-interpolation.tsx +73 -0
  186. package/src/animation/demos/cube.tsx +116 -0
  187. package/src/animation/demos/default-animate.tsx +129 -0
  188. package/src/animation/demos/drag-release.ts +118 -0
  189. package/src/animation/demos/enter.tsx +22 -0
  190. package/src/animation/demos/exit.tsx +79 -0
  191. package/src/animation/demos/flip-toggle.tsx +46 -0
  192. package/src/animation/demos/hold-to-confirm.tsx +317 -0
  193. package/src/animation/demos/html-content.tsx +41 -0
  194. package/src/animation/demos/interruptible-keyframes.tsx +62 -0
  195. package/src/animation/demos/keyframes.tsx +29 -0
  196. package/src/animation/demos/material-ripple.tsx +158 -0
  197. package/src/animation/demos/mixin-presence-list.tsx +121 -0
  198. package/src/animation/demos/mixin-reclaim.tsx +125 -0
  199. package/src/animation/demos/multi-state-badge.tsx +426 -0
  200. package/src/animation/demos/press.tsx +67 -0
  201. package/src/animation/demos/reordering.tsx +68 -0
  202. package/src/animation/demos/rolling-square.tsx +57 -0
  203. package/src/animation/demos/rotate.tsx +21 -0
  204. package/src/animation/demos/shared-layout.tsx +211 -0
  205. package/src/animation/demos/transition-options.tsx +24 -0
  206. package/src/animation/spring.ts +22 -0
  207. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  208. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  209. package/src/button/README.md +44 -0
  210. package/src/button/index.ts +168 -0
  211. package/src/checkbox/README.md +59 -0
  212. package/src/checkbox/index.ts +162 -0
  213. package/src/{components/combobox → combobox}/README.md +58 -9
  214. package/src/combobox/index.tsx +112 -0
  215. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  216. package/src/input/README.md +52 -0
  217. package/src/input/index.ts +147 -0
  218. package/src/{components/listbox → listbox}/README.md +9 -41
  219. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  220. package/src/menu/README.md +161 -0
  221. package/src/menu/index.tsx +354 -0
  222. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +117 -359
  223. package/src/{components/popover → popover}/README.md +20 -39
  224. package/src/{components/popover/popover.ts → popover/index.ts} +16 -61
  225. package/src/{utils → popover}/scroll-lock.ts +0 -28
  226. package/src/radio/README.md +53 -0
  227. package/src/radio/index.ts +100 -0
  228. package/src/runtime/client-entries.ts +1 -5
  229. package/src/runtime/component.ts +3 -3
  230. package/src/runtime/demos/readme.demo.tsx +704 -0
  231. package/src/runtime/diff-dom.ts +270 -20
  232. package/src/runtime/frame.ts +218 -41
  233. package/src/runtime/jsx.ts +6 -10
  234. package/src/runtime/reconcile.ts +11 -5
  235. package/src/runtime/vdom.ts +3 -0
  236. package/src/{components/select → select}/README.md +29 -19
  237. package/src/select/index.tsx +159 -0
  238. package/src/{components/select/select.tsx → select/primitives.tsx} +11 -99
  239. package/src/server/stream.ts +10 -5
  240. package/src/shared/focus-styles.ts +2 -0
  241. package/src/shared/icons.tsx +62 -0
  242. package/src/shared/listbox-popover-styles.ts +146 -0
  243. package/src/shared/style-values.ts +165 -0
  244. package/src/style/style.ts +29 -10
  245. package/src/tabs/README.md +141 -0
  246. package/src/tabs/index.tsx +244 -0
  247. package/src/tabs/primitives.ts +365 -0
  248. package/src/toggle/README.md +56 -0
  249. package/src/toggle/index.tsx +134 -0
  250. package/src/toggle/primitives.ts +192 -0
  251. package/dist/components/accordion/accordion.d.ts +0 -92
  252. package/dist/components/accordion/accordion.js +0 -335
  253. package/dist/components/accordion/accordion.js.map +0 -1
  254. package/dist/components/accordion/demos/card.demo.d.ts +0 -6
  255. package/dist/components/accordion/demos/card.demo.js +0 -58
  256. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  257. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -6
  258. package/dist/components/accordion/demos/multiple.demo.js +0 -19
  259. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  260. package/dist/components/accordion/demos/overview.demo.d.ts +0 -6
  261. package/dist/components/accordion/demos/overview.demo.js +0 -19
  262. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  263. package/dist/components/anchor/anchor.js.map +0 -1
  264. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  265. package/dist/components/breadcrumbs/demos/basic.demo.d.ts +0 -5
  266. package/dist/components/breadcrumbs/demos/basic.demo.js +0 -14
  267. package/dist/components/breadcrumbs/demos/basic.demo.js.map +0 -1
  268. package/dist/components/breadcrumbs/demos/separator.demo.d.ts +0 -5
  269. package/dist/components/breadcrumbs/demos/separator.demo.js +0 -14
  270. package/dist/components/breadcrumbs/demos/separator.demo.js.map +0 -1
  271. package/dist/components/button/button.d.ts +0 -105
  272. package/dist/components/button/button.js +0 -207
  273. package/dist/components/button/button.js.map +0 -1
  274. package/dist/components/button/demos/aliases.demo.d.ts +0 -6
  275. package/dist/components/button/demos/aliases.demo.js +0 -18
  276. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  277. package/dist/components/button/demos/basic.demo.d.ts +0 -6
  278. package/dist/components/button/demos/basic.demo.js +0 -19
  279. package/dist/components/button/demos/basic.demo.js.map +0 -1
  280. package/dist/components/button/demos/states.demo.d.ts +0 -6
  281. package/dist/components/button/demos/states.demo.js +0 -29
  282. package/dist/components/button/demos/states.demo.js.map +0 -1
  283. package/dist/components/combobox/combobox.js.map +0 -1
  284. package/dist/components/combobox/demos/overview.demo.d.ts +0 -6
  285. package/dist/components/combobox/demos/overview.demo.js +0 -153
  286. package/dist/components/combobox/demos/overview.demo.js.map +0 -1
  287. package/dist/components/glyph/glyph.d.ts +0 -14
  288. package/dist/components/glyph/glyph.js +0 -65
  289. package/dist/components/glyph/glyph.js.map +0 -1
  290. package/dist/components/listbox/demos/overview.demo.d.ts +0 -6
  291. package/dist/components/listbox/demos/overview.demo.js +0 -64
  292. package/dist/components/listbox/demos/overview.demo.js.map +0 -1
  293. package/dist/components/listbox/listbox.js.map +0 -1
  294. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -5
  295. package/dist/components/menu/demos/bubbling.demo.js +0 -15
  296. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  297. package/dist/components/menu/demos/overview.demo.d.ts +0 -6
  298. package/dist/components/menu/demos/overview.demo.js +0 -32
  299. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  300. package/dist/components/menu/hover-aim.js.map +0 -1
  301. package/dist/components/menu/menu.js.map +0 -1
  302. package/dist/components/popover/demos/overview.demo.d.ts +0 -6
  303. package/dist/components/popover/demos/overview.demo.js +0 -64
  304. package/dist/components/popover/demos/overview.demo.js.map +0 -1
  305. package/dist/components/popover/popover.js.map +0 -1
  306. package/dist/components/select/demos/deconstructed.demo.d.ts +0 -6
  307. package/dist/components/select/demos/deconstructed.demo.js +0 -53
  308. package/dist/components/select/demos/deconstructed.demo.js.map +0 -1
  309. package/dist/components/select/demos/overview.demo.d.ts +0 -5
  310. package/dist/components/select/demos/overview.demo.js +0 -27
  311. package/dist/components/select/demos/overview.demo.js.map +0 -1
  312. package/dist/components/select/select.js.map +0 -1
  313. package/dist/components/separator/separator.d.ts +0 -2
  314. package/dist/components/separator/separator.js +0 -15
  315. package/dist/components/separator/separator.js.map +0 -1
  316. package/dist/components/tabs/tabs.d.ts +0 -78
  317. package/dist/components/tabs/tabs.js +0 -339
  318. package/dist/components/tabs/tabs.js.map +0 -1
  319. package/dist/interactions/keydown/keydown.js.map +0 -1
  320. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  321. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  322. package/dist/theme/contract.d.ts +0 -61
  323. package/dist/theme/contract.js +0 -131
  324. package/dist/theme/contract.js.map +0 -1
  325. package/dist/theme/glyph-contract.d.ts +0 -11
  326. package/dist/theme/glyph-contract.js +0 -34
  327. package/dist/theme/glyph-contract.js.map +0 -1
  328. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  329. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  330. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  331. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  332. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  333. package/dist/theme/runtime.d.ts +0 -2
  334. package/dist/theme/runtime.js +0 -84
  335. package/dist/theme/runtime.js.map +0 -1
  336. package/dist/theme/theme.d.ts +0 -6
  337. package/dist/theme/theme.js +0 -5
  338. package/dist/theme/theme.js.map +0 -1
  339. package/dist/utils/flash-attribute.js.map +0 -1
  340. package/dist/utils/scroll-lock.d.ts +0 -3
  341. package/dist/utils/scroll-lock.js.map +0 -1
  342. package/dist/utils/wait-for-css-transition.js.map +0 -1
  343. package/dist/utils/wait.js.map +0 -1
  344. package/src/components/accordion/accordion.tsx +0 -565
  345. package/src/components/accordion/demos/card.demo.tsx +0 -113
  346. package/src/components/accordion/demos/multiple.demo.tsx +0 -56
  347. package/src/components/accordion/demos/overview.demo.tsx +0 -56
  348. package/src/components/breadcrumbs/demos/basic.demo.tsx +0 -17
  349. package/src/components/breadcrumbs/demos/separator.demo.tsx +0 -18
  350. package/src/components/button/README.md +0 -44
  351. package/src/components/button/button.tsx +0 -286
  352. package/src/components/button/demos/aliases.demo.tsx +0 -27
  353. package/src/components/button/demos/basic.demo.tsx +0 -30
  354. package/src/components/button/demos/states.demo.tsx +0 -52
  355. package/src/components/combobox/demos/overview.demo.tsx +0 -199
  356. package/src/components/glyph/README.md +0 -72
  357. package/src/components/glyph/glyph.tsx +0 -110
  358. package/src/components/listbox/demos/overview.demo.tsx +0 -101
  359. package/src/components/menu/README.md +0 -96
  360. package/src/components/menu/demos/bubbling.demo.tsx +0 -34
  361. package/src/components/menu/demos/overview.demo.tsx +0 -76
  362. package/src/components/popover/demos/overview.demo.tsx +0 -143
  363. package/src/components/select/demos/deconstructed.demo.tsx +0 -95
  364. package/src/components/select/demos/overview.demo.tsx +0 -51
  365. package/src/components/separator/separator.ts +0 -19
  366. package/src/components/tabs/README.md +0 -105
  367. package/src/components/tabs/tabs.tsx +0 -504
  368. package/src/theme/README.md +0 -103
  369. package/src/theme/contract.ts +0 -215
  370. package/src/theme/glyph-contract.ts +0 -59
  371. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  372. package/src/theme/presets/rmx-01/index.ts +0 -123
  373. package/src/theme/runtime.ts +0 -119
  374. package/src/theme/theme.ts +0 -15
  375. package/src/utils/scroll-lock/README.md +0 -33
  376. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  377. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  378. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  379. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  380. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  381. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  382. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  383. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  384. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  385. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  386. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  387. /package/dist/{utils → shared}/wait.d.ts +0 -0
  388. /package/dist/{utils → shared}/wait.js +0 -0
  389. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  390. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  391. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  392. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  393. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  394. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  395. /package/src/{utils → shared}/wait.ts +0 -0
@@ -0,0 +1,121 @@
1
+ import type { Handle } from '@remix-run/ui'
2
+ import { css, on } from '@remix-run/ui'
3
+
4
+ import { animateEntrance, animateExit } from '@remix-run/ui/animation'
5
+
6
+ let nextId = 1
7
+ function createItem() {
8
+ return { id: nextId++, label: `Row ${nextId - 1}` }
9
+ }
10
+
11
+ export function MixinPresenceList(handle: Handle) {
12
+ let items = [createItem(), createItem(), createItem()]
13
+
14
+ return () => (
15
+ <div
16
+ mix={[
17
+ css({
18
+ display: 'flex',
19
+ flexDirection: 'column',
20
+ gap: 10,
21
+ width: 220,
22
+ }),
23
+ ]}
24
+ >
25
+ <div mix={[css({ display: 'flex', gap: 8 })]}>
26
+ <button
27
+ mix={[
28
+ css({
29
+ flex: 1,
30
+ padding: '8px 10px',
31
+ border: 'none',
32
+ borderRadius: 6,
33
+ backgroundColor: '#0ea5e9',
34
+ color: 'white',
35
+ cursor: 'pointer',
36
+ '&:hover': { backgroundColor: '#0284c7' },
37
+ }),
38
+ on('click', () => {
39
+ items.unshift(createItem())
40
+ handle.update()
41
+ }),
42
+ ]}
43
+ >
44
+ Add
45
+ </button>
46
+ <button
47
+ mix={[
48
+ css({
49
+ flex: 1,
50
+ padding: '8px 10px',
51
+ border: 'none',
52
+ borderRadius: 6,
53
+ backgroundColor: '#ef4444',
54
+ color: 'white',
55
+ cursor: 'pointer',
56
+ '&:hover': { backgroundColor: '#dc2626' },
57
+ }),
58
+ on('click', () => {
59
+ items = items.slice(0, Math.max(0, items.length - 1))
60
+ handle.update()
61
+ }),
62
+ ]}
63
+ >
64
+ Remove
65
+ </button>
66
+ </div>
67
+ {items.map((item) => (
68
+ <div
69
+ key={String(item.id)}
70
+ mix={[
71
+ animateEntrance({
72
+ opacity: 0,
73
+ transform: 'translateY(-10px) scale(0.98)',
74
+ duration: 220,
75
+ easing: 'ease-out',
76
+ }),
77
+ animateExit({
78
+ opacity: 0,
79
+ transform: 'translateY(10px) scale(0.98)',
80
+ duration: 180,
81
+ easing: 'ease-in',
82
+ }),
83
+ css({
84
+ display: 'flex',
85
+ alignItems: 'center',
86
+ justifyContent: 'space-between',
87
+ padding: '10px 12px',
88
+ borderRadius: 8,
89
+ backgroundColor: '#f8fafc',
90
+ color: '#334155',
91
+ border: '1px solid #e2e8f0',
92
+ }),
93
+ ]}
94
+ >
95
+ <span>{item.label}</span>
96
+ <button
97
+ mix={[
98
+ css({
99
+ width: 24,
100
+ height: 24,
101
+ padding: 0,
102
+ border: 'none',
103
+ borderRadius: 4,
104
+ backgroundColor: 'transparent',
105
+ color: '#64748b',
106
+ cursor: 'pointer',
107
+ '&:hover': { backgroundColor: '#e2e8f0' },
108
+ }),
109
+ on('click', () => {
110
+ items = items.filter((entry) => entry.id !== item.id)
111
+ handle.update()
112
+ }),
113
+ ]}
114
+ >
115
+ ×
116
+ </button>
117
+ </div>
118
+ ))}
119
+ </div>
120
+ )
121
+ }
@@ -0,0 +1,125 @@
1
+ import type { Handle } from '@remix-run/ui'
2
+ import { css, on } from '@remix-run/ui'
3
+
4
+ import { animateEntrance, animateExit } from '@remix-run/ui/animation'
5
+
6
+ export function MixinReclaim(handle: Handle) {
7
+ let visible = true
8
+ let interruptTimer: number | undefined
9
+
10
+ function clearInterruptTimer() {
11
+ if (interruptTimer === undefined) return
12
+ window.clearTimeout(interruptTimer)
13
+ interruptTimer = undefined
14
+ }
15
+
16
+ function scheduleInterrupt() {
17
+ clearInterruptTimer()
18
+ visible = false
19
+ handle.update()
20
+ interruptTimer = window.setTimeout(() => {
21
+ visible = true
22
+ handle.update()
23
+ interruptTimer = undefined
24
+ }, 140)
25
+ }
26
+
27
+ return () => (
28
+ <div mix={[css({ display: 'flex', flexDirection: 'column', gap: 12, width: 240 })]}>
29
+ <div mix={[css({ display: 'flex', gap: 8 })]}>
30
+ <button
31
+ mix={[
32
+ css({
33
+ flex: 1,
34
+ padding: '8px 10px',
35
+ border: 'none',
36
+ borderRadius: 6,
37
+ backgroundColor: '#10b981',
38
+ color: 'white',
39
+ cursor: 'pointer',
40
+ '&:hover': { backgroundColor: '#059669' },
41
+ }),
42
+ on('click', () => {
43
+ clearInterruptTimer()
44
+ visible = true
45
+ handle.update()
46
+ }),
47
+ ]}
48
+ >
49
+ Show
50
+ </button>
51
+ <button
52
+ mix={[
53
+ css({
54
+ flex: 1,
55
+ padding: '8px 10px',
56
+ border: 'none',
57
+ borderRadius: 6,
58
+ backgroundColor: '#f59e0b',
59
+ color: 'white',
60
+ cursor: 'pointer',
61
+ '&:hover': { backgroundColor: '#d97706' },
62
+ }),
63
+ on('click', scheduleInterrupt),
64
+ ]}
65
+ >
66
+ Interrupt
67
+ </button>
68
+ </div>
69
+
70
+ <button
71
+ mix={[
72
+ css({
73
+ padding: '8px 10px',
74
+ border: 'none',
75
+ borderRadius: 6,
76
+ backgroundColor: '#ef4444',
77
+ color: 'white',
78
+ cursor: 'pointer',
79
+ '&:hover': { backgroundColor: '#dc2626' },
80
+ }),
81
+ on('click', () => {
82
+ clearInterruptTimer()
83
+ visible = false
84
+ handle.update()
85
+ }),
86
+ ]}
87
+ >
88
+ Hide
89
+ </button>
90
+
91
+ <div mix={[css({ minHeight: 100, display: 'grid', placeItems: 'center' })]}>
92
+ {visible && (
93
+ <div
94
+ key="reclaim-card"
95
+ mix={[
96
+ animateEntrance({
97
+ opacity: 0,
98
+ transform: 'translateY(12px) scale(0.94)',
99
+ duration: 260,
100
+ easing: 'ease-out',
101
+ }),
102
+ animateExit({
103
+ opacity: 0,
104
+ transform: 'translateY(-12px) scale(0.94)',
105
+ duration: 260,
106
+ easing: 'ease-in',
107
+ }),
108
+ css({
109
+ width: 200,
110
+ padding: '14px 16px',
111
+ borderRadius: 10,
112
+ background: 'linear-gradient(135deg, #7c3aed, #3b82f6)',
113
+ color: 'white',
114
+ textAlign: 'center',
115
+ fontWeight: 600,
116
+ }),
117
+ ]}
118
+ >
119
+ Reclaim Me Mid-Exit
120
+ </div>
121
+ )}
122
+ </div>
123
+ </div>
124
+ )
125
+ }
@@ -0,0 +1,426 @@
1
+ import type { Handle } from '@remix-run/ui'
2
+ import { css, on, ref } from '@remix-run/ui'
3
+
4
+ import { animateEntrance, animateExit } from '@remix-run/ui/animation'
5
+ import { spring } from '@remix-run/ui/animation'
6
+
7
+ const STATES = {
8
+ idle: 'Start',
9
+ processing: 'Processing',
10
+ success: 'Done',
11
+ error: 'Something went wrong',
12
+ } as const
13
+
14
+ type State = keyof typeof STATES
15
+
16
+ function getNextState(state: State): State {
17
+ let states = Object.keys(STATES) as State[]
18
+ let nextIndex = (states.indexOf(state) + 1) % states.length
19
+ return states[nextIndex]
20
+ }
21
+
22
+ const ICON_SIZE = 20
23
+ const STROKE_WIDTH = 1.5
24
+ const VIEW_BOX_SIZE = 24
25
+
26
+ const iconEnterAnimation = {
27
+ transform: 'translateY(-40px) scale(0.5)',
28
+ filter: 'blur(6px)',
29
+ duration: 150,
30
+ easing: 'ease-out',
31
+ }
32
+
33
+ const iconExitAnimation = {
34
+ transform: 'translateY(40px) scale(0.5)',
35
+ filter: 'blur(6px)',
36
+ duration: 150,
37
+ easing: 'ease-in',
38
+ }
39
+
40
+ export function MultiStateBadge(handle: Handle) {
41
+ let state: State = 'idle'
42
+
43
+ return () => (
44
+ <div
45
+ mix={[
46
+ css({
47
+ display: 'flex',
48
+ flexDirection: 'column',
49
+ justifyContent: 'space-between',
50
+ alignItems: 'center',
51
+ padding: 16,
52
+ minHeight: 80,
53
+ }),
54
+ ]}
55
+ >
56
+ <button
57
+ mix={[
58
+ css({
59
+ background: 'none',
60
+ border: 'none',
61
+ cursor: 'pointer',
62
+ padding: 0,
63
+ }),
64
+ on('click', () => {
65
+ state = getNextState(state)
66
+ handle.update()
67
+ }),
68
+ ]}
69
+ >
70
+ <Badge state={state} />
71
+ </button>
72
+ </div>
73
+ )
74
+ }
75
+
76
+ function Badge(handle: Handle<{ state: State }>) {
77
+ let badgeEl: HTMLDivElement
78
+ let prevState: State | null = null
79
+
80
+ return () => {
81
+ let { state } = handle.props
82
+
83
+ // Trigger shake/scale animations on state change
84
+ if (prevState !== null && prevState !== state) {
85
+ handle.queueTask(() => {
86
+ if (state === 'error') {
87
+ badgeEl.animate(
88
+ {
89
+ transform: [
90
+ 'translateX(0)',
91
+ 'translateX(-6px)',
92
+ 'translateX(6px)',
93
+ 'translateX(-6px)',
94
+ 'translateX(0)',
95
+ ],
96
+ },
97
+ { duration: 300, easing: 'ease-in-out', delay: 100 },
98
+ )
99
+ } else if (state === 'success') {
100
+ badgeEl.animate(
101
+ { transform: ['scale(1)', 'scale(1.2)', 'scale(1)'] },
102
+ { duration: 300, easing: 'ease-in-out' },
103
+ )
104
+ }
105
+ })
106
+ }
107
+ prevState = state
108
+
109
+ return (
110
+ <div
111
+ mix={[
112
+ ref((node) => (badgeEl = node)),
113
+ css({
114
+ backgroundColor: '#e2e8f0',
115
+ color: '#0f1115',
116
+ display: 'flex',
117
+ overflow: 'hidden',
118
+ alignItems: 'center',
119
+ justifyContent: 'center',
120
+ padding: '12px 20px',
121
+ fontSize: 16,
122
+ borderRadius: 999,
123
+ willChange: 'transform, filter',
124
+ transition: `gap ${spring('snappy')}`,
125
+ }),
126
+ ]}
127
+ style={{ gap: state === 'idle' ? '0px' : '8px' }}
128
+ >
129
+ <Icon state={state} />
130
+ <Label state={state} />
131
+ </div>
132
+ )
133
+ }
134
+ }
135
+
136
+ function Icon(handle: Handle<{ state: State }>) {
137
+ return () => (
138
+ <span
139
+ mix={[
140
+ css({
141
+ height: ICON_SIZE,
142
+ position: 'relative',
143
+ display: 'flex',
144
+ alignItems: 'center',
145
+ justifyContent: 'center',
146
+ overflow: 'hidden',
147
+ transition: `width ${spring({ duration: 200, bounce: 0.2 })}`,
148
+ }),
149
+ ]}
150
+ style={{ width: handle.props.state === 'idle' ? 0 : ICON_SIZE }}
151
+ >
152
+ {handle.props.state === 'processing' && (
153
+ <span
154
+ key="loader"
155
+ mix={[
156
+ css({ position: 'absolute', left: 0, top: 0 }),
157
+ animateEntrance(iconEnterAnimation),
158
+ animateExit(iconExitAnimation),
159
+ ]}
160
+ >
161
+ <Loader />
162
+ </span>
163
+ )}
164
+ {handle.props.state === 'success' && (
165
+ <span
166
+ key="check"
167
+ mix={[
168
+ css({ position: 'absolute', left: 0, top: 0 }),
169
+ animateEntrance(iconEnterAnimation),
170
+ animateExit(iconExitAnimation),
171
+ ]}
172
+ >
173
+ <Check />
174
+ </span>
175
+ )}
176
+ {handle.props.state === 'error' && (
177
+ <span
178
+ key="x"
179
+ mix={[
180
+ css({ position: 'absolute', left: 0, top: 0 }),
181
+ animateEntrance(iconEnterAnimation),
182
+ animateExit(iconExitAnimation),
183
+ ]}
184
+ >
185
+ <X />
186
+ </span>
187
+ )}
188
+ </span>
189
+ )
190
+ }
191
+
192
+ function Loader() {
193
+ return () => (
194
+ <div
195
+ mix={[
196
+ ref((node) => {
197
+ node.animate(
198
+ { transform: ['rotate(0deg)', 'rotate(360deg)'] },
199
+ { duration: 1000, iterations: Infinity },
200
+ )
201
+ }),
202
+ css({
203
+ display: 'flex',
204
+ alignItems: 'center',
205
+ justifyContent: 'center',
206
+ width: ICON_SIZE,
207
+ height: ICON_SIZE,
208
+ }),
209
+ ]}
210
+ >
211
+ <svg
212
+ width={ICON_SIZE}
213
+ height={ICON_SIZE}
214
+ viewBox={`0 0 ${VIEW_BOX_SIZE} ${VIEW_BOX_SIZE}`}
215
+ fill="none"
216
+ stroke="currentColor"
217
+ strokeWidth={STROKE_WIDTH}
218
+ strokeLinecap="round"
219
+ strokeLinejoin="round"
220
+ >
221
+ <path d="M21 12a9 9 0 1 1-6.219-8.56" />
222
+ </svg>
223
+ </div>
224
+ )
225
+ }
226
+
227
+ function Check() {
228
+ return () => (
229
+ <svg
230
+ width={ICON_SIZE}
231
+ height={ICON_SIZE}
232
+ viewBox={`0 0 ${VIEW_BOX_SIZE} ${VIEW_BOX_SIZE}`}
233
+ fill="none"
234
+ stroke="currentColor"
235
+ strokeWidth={STROKE_WIDTH}
236
+ strokeLinecap="round"
237
+ strokeLinejoin="round"
238
+ >
239
+ <polyline
240
+ points="4 12 9 17 20 6"
241
+ mix={[
242
+ ref((node) => {
243
+ let length = node.getTotalLength()
244
+ node.style.strokeDasharray = `${length}`
245
+ node.style.strokeDashoffset = `${length}`
246
+ node.animate(
247
+ { strokeDashoffset: [length, 0] },
248
+ { ...spring({ duration: 300, bounce: 0.1 }), fill: 'forwards' },
249
+ )
250
+ }),
251
+ ]}
252
+ />
253
+ </svg>
254
+ )
255
+ }
256
+
257
+ function X() {
258
+ return () => (
259
+ <svg
260
+ width={ICON_SIZE}
261
+ height={ICON_SIZE}
262
+ viewBox={`0 0 ${VIEW_BOX_SIZE} ${VIEW_BOX_SIZE}`}
263
+ fill="none"
264
+ stroke="currentColor"
265
+ strokeWidth={STROKE_WIDTH}
266
+ strokeLinecap="round"
267
+ strokeLinejoin="round"
268
+ >
269
+ <line
270
+ x1="6"
271
+ y1="6"
272
+ x2="18"
273
+ y2="18"
274
+ mix={[
275
+ ref((node) => {
276
+ let length = node.getTotalLength()
277
+ node.style.strokeDasharray = `${length}`
278
+ node.style.strokeDashoffset = `${length}`
279
+ node.animate(
280
+ { strokeDashoffset: [length, 0] },
281
+ { ...spring({ duration: 300, bounce: 0.1 }), fill: 'forwards' },
282
+ )
283
+ }),
284
+ ]}
285
+ />
286
+ <line
287
+ x1="18"
288
+ y1="6"
289
+ x2="6"
290
+ y2="18"
291
+ mix={[
292
+ ref((node) => {
293
+ let length = node.getTotalLength()
294
+ node.style.strokeDasharray = `${length}`
295
+ node.style.strokeDashoffset = `${length}`
296
+ node.animate(
297
+ { strokeDashoffset: [length, 0] },
298
+ { ...spring({ duration: 300, bounce: 0.1 }), delay: 100, fill: 'forwards' },
299
+ )
300
+ }),
301
+ ]}
302
+ />
303
+ </svg>
304
+ )
305
+ }
306
+
307
+ function Label(handle: Handle<{ state: State }>) {
308
+ let measureEl: HTMLSpanElement
309
+ let labelWidth = 0
310
+ let labelHeight = 0
311
+
312
+ // Don't animate the label on initial render
313
+ let isFirstRender = true
314
+ handle.queueTask(() => {
315
+ isFirstRender = false
316
+ })
317
+
318
+ return () => {
319
+ let { state } = handle.props
320
+
321
+ // Measure label dimensions after render
322
+ handle.queueTask(() => {
323
+ if (measureEl) {
324
+ let rect = measureEl.getBoundingClientRect()
325
+ if (rect.width !== labelWidth || rect.height !== labelHeight) {
326
+ labelWidth = rect.width
327
+ labelHeight = rect.height
328
+ handle.update()
329
+ }
330
+ }
331
+ })
332
+
333
+ let labelMix = [
334
+ animateExit({
335
+ transform: 'translateY(20px)',
336
+ opacity: 0,
337
+ filter: 'blur(10px)',
338
+ duration: 200,
339
+ easing: 'ease-in-out',
340
+ }),
341
+ ]
342
+
343
+ if (!isFirstRender) {
344
+ labelMix.unshift(
345
+ animateEntrance({
346
+ transform: 'translateY(-20px)',
347
+ opacity: 0,
348
+ filter: 'blur(10px)',
349
+ duration: 200,
350
+ easing: 'ease-in-out',
351
+ }),
352
+ )
353
+ }
354
+
355
+ return (
356
+ <span
357
+ mix={[
358
+ css({
359
+ position: 'relative',
360
+ display: 'inline-block',
361
+ transition: `width ${spring({ duration: 200, bounce: 0.1 })}`,
362
+ }),
363
+ ]}
364
+ style={{
365
+ width: labelWidth || 'auto',
366
+ height: labelHeight || 'auto',
367
+ }}
368
+ >
369
+ {/* Hidden measurement element */}
370
+ <span
371
+ mix={[
372
+ ref((node) => (measureEl = node)),
373
+ css({ position: 'absolute', visibility: 'hidden', whiteSpace: 'nowrap' }),
374
+ ]}
375
+ >
376
+ {STATES[state]}
377
+ </span>
378
+
379
+ {state === 'idle' && (
380
+ <span
381
+ key="idle"
382
+ mix={[
383
+ css({ whiteSpace: 'nowrap', position: 'absolute', left: 0, top: 0 }),
384
+ ...labelMix,
385
+ ]}
386
+ >
387
+ {STATES.idle}
388
+ </span>
389
+ )}
390
+ {state === 'processing' && (
391
+ <span
392
+ key="processing"
393
+ mix={[
394
+ css({ whiteSpace: 'nowrap', position: 'absolute', left: 0, top: 0 }),
395
+ ...labelMix,
396
+ ]}
397
+ >
398
+ {STATES.processing}
399
+ </span>
400
+ )}
401
+ {state === 'success' && (
402
+ <span
403
+ key="success"
404
+ mix={[
405
+ css({ whiteSpace: 'nowrap', position: 'absolute', left: 0, top: 0 }),
406
+ ...labelMix,
407
+ ]}
408
+ >
409
+ {STATES.success}
410
+ </span>
411
+ )}
412
+ {state === 'error' && (
413
+ <span
414
+ key="error"
415
+ mix={[
416
+ css({ whiteSpace: 'nowrap', position: 'absolute', left: 0, top: 0 }),
417
+ ...labelMix,
418
+ ]}
419
+ >
420
+ {STATES.error}
421
+ </span>
422
+ )}
423
+ </span>
424
+ )
425
+ }
426
+ }