@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,704 @@
1
+ import {
2
+ addEventListeners,
3
+ css,
4
+ on,
5
+ ref,
6
+ TypedEventTarget,
7
+ type Handle,
8
+ type RemixNode,
9
+ } from '@remix-run/ui'
10
+
11
+ // ============================================================================
12
+ // Getting Started - Basic App Example
13
+ // ============================================================================
14
+ function App(handle: Handle) {
15
+ let count = 0
16
+ return () => (
17
+ <button
18
+ mix={[
19
+ on('click', () => {
20
+ count++
21
+ handle.update()
22
+ }),
23
+ ]}
24
+ >
25
+ Count: {count}
26
+ </button>
27
+ )
28
+ }
29
+
30
+ // ============================================================================
31
+ // Component State and Updates - Counter
32
+ // ============================================================================
33
+ function Counter(handle: Handle) {
34
+ let count = 0
35
+
36
+ return () => (
37
+ <div>
38
+ <span>Count: {count}</span>
39
+ <button
40
+ mix={[
41
+ on('click', () => {
42
+ count++
43
+ handle.update()
44
+ }),
45
+ ]}
46
+ >
47
+ Increment
48
+ </button>
49
+ </div>
50
+ )
51
+ }
52
+
53
+ // ============================================================================
54
+ // Components - Greeting
55
+ // ============================================================================
56
+ function Greeting(handle: Handle<{ name: string }>) {
57
+ return () => <h1>Hello, {handle.props.name}!</h1>
58
+ }
59
+
60
+ // ============================================================================
61
+ // Stateful Components - CounterWithSetup
62
+ // ============================================================================
63
+ function CounterWithSetup(handle: Handle<{ initialCount: number; label?: string }>) {
64
+ // Component function: runs once
65
+ let count = handle.props.initialCount
66
+
67
+ // Return render function: runs on every update
68
+ return () => (
69
+ <div>
70
+ {handle.props.label || 'Count'}: {count}
71
+ <button
72
+ mix={[
73
+ on('click', () => {
74
+ count++
75
+ handle.update()
76
+ }),
77
+ ]}
78
+ >
79
+ Increment
80
+ </button>
81
+ </div>
82
+ )
83
+ }
84
+
85
+ // ============================================================================
86
+ // Setup Prop vs Props - CounterWithLabel
87
+ // ============================================================================
88
+ function CounterWithLabel(handle: Handle<{ initialCount: number; label?: string }>) {
89
+ let count = handle.props.initialCount
90
+
91
+ return () => (
92
+ <div>
93
+ {handle.props.label}: {count}
94
+ <button
95
+ mix={[
96
+ on('click', () => {
97
+ count++
98
+ handle.update()
99
+ }),
100
+ ]}
101
+ >
102
+ +
103
+ </button>
104
+ </div>
105
+ )
106
+ }
107
+
108
+ // ============================================================================
109
+ // Events - SearchInput
110
+ // ============================================================================
111
+ function SearchInput(handle: Handle) {
112
+ let query = ''
113
+ let results: string[] = []
114
+ let loading = false
115
+
116
+ return () => (
117
+ <div>
118
+ <input
119
+ type="text"
120
+ value={query}
121
+ placeholder="Type to search..."
122
+ mix={[
123
+ on('input', (event, signal) => {
124
+ query = event.currentTarget.value
125
+ loading = true
126
+ handle.update()
127
+
128
+ // Simulated search with timeout
129
+ setTimeout(() => {
130
+ if (signal.aborted) return
131
+ results = query ? [`Result for "${query}" 1`, `Result for "${query}" 2`] : []
132
+ loading = false
133
+ handle.update()
134
+ }, 300)
135
+ }),
136
+ ]}
137
+ />
138
+ {loading && <div>Loading...</div>}
139
+ {!loading && results.length > 0 && (
140
+ <ul>
141
+ {results.map((r) => (
142
+ <li>{r}</li>
143
+ ))}
144
+ </ul>
145
+ )}
146
+ </div>
147
+ )
148
+ }
149
+
150
+ // ============================================================================
151
+ // Controlled Input - Slug Form
152
+ // ============================================================================
153
+ function SlugForm(handle: Handle) {
154
+ let slug = ''
155
+ let generatedSlug = ''
156
+
157
+ return () => (
158
+ <form>
159
+ <label mix={[css({ display: 'flex', alignItems: 'center', gap: '8px' })]}>
160
+ <input
161
+ type="checkbox"
162
+ mix={[
163
+ on('change', (event) => {
164
+ if (event.currentTarget.checked) {
165
+ generatedSlug = crypto.randomUUID().slice(0, 8)
166
+ } else {
167
+ generatedSlug = ''
168
+ }
169
+ handle.update()
170
+ }),
171
+ ]}
172
+ />
173
+ Auto-generate slug
174
+ </label>
175
+ <label mix={[css({ display: 'flex', flexDirection: 'column', gap: '4px' })]}>
176
+ Slug
177
+ <input
178
+ type="text"
179
+ value={generatedSlug || slug}
180
+ disabled={!!generatedSlug}
181
+ mix={[
182
+ on('input', (event) => {
183
+ slug = event.currentTarget.value
184
+ handle.update()
185
+ }),
186
+ ]}
187
+ />
188
+ </label>
189
+ </form>
190
+ )
191
+ }
192
+
193
+ // ============================================================================
194
+ // Global Events - KeyboardTracker
195
+ // ============================================================================
196
+ function KeyboardTracker(handle: Handle) {
197
+ let keys: string[] = []
198
+
199
+ handle.queueTask(() => {
200
+ addEventListeners(document, handle.signal, {
201
+ keydown: (event) => {
202
+ keys.push(event.key)
203
+ if (keys.length > 10) keys.shift()
204
+ handle.update()
205
+ },
206
+ })
207
+ })
208
+
209
+ return () => <div>Keys: {keys.join(', ') || '(press some keys)'}</div>
210
+ }
211
+
212
+ // ============================================================================
213
+ // CSS Prop - Button (Basic)
214
+ // ============================================================================
215
+ function ButtonBasic() {
216
+ return () => (
217
+ <button
218
+ mix={[
219
+ css({
220
+ color: 'white',
221
+ backgroundColor: 'rgb(54, 113, 246)',
222
+ border: 'none',
223
+ padding: '8px 16px',
224
+ borderRadius: '4px',
225
+ cursor: 'pointer',
226
+ '&:hover': {
227
+ backgroundColor: 'rgb(37, 90, 210)',
228
+ },
229
+ '&:active': {
230
+ transform: 'scale(0.98)',
231
+ },
232
+ }),
233
+ ]}
234
+ >
235
+ Click me
236
+ </button>
237
+ )
238
+ }
239
+
240
+ // ============================================================================
241
+ // CSS Prop - Button (Advanced with nested rules)
242
+ // ============================================================================
243
+ function ButtonAdvanced() {
244
+ return () => (
245
+ <button
246
+ mix={[
247
+ css({
248
+ color: 'white',
249
+ backgroundColor: 'rgb(54, 113, 246)',
250
+ border: 'none',
251
+ padding: '10px 20px',
252
+ borderRadius: '6px',
253
+ cursor: 'pointer',
254
+ position: 'relative',
255
+ display: 'inline-flex',
256
+ alignItems: 'center',
257
+ gap: '8px',
258
+ '&:hover': {
259
+ backgroundColor: 'rgb(37, 90, 210)',
260
+ },
261
+ '&::before': {
262
+ content: '""',
263
+ position: 'absolute',
264
+ inset: '-2px',
265
+ borderRadius: '8px',
266
+ background: 'linear-gradient(45deg, rgb(54, 113, 246), rgb(99, 179, 255))',
267
+ zIndex: -1,
268
+ opacity: 0,
269
+ transition: 'opacity 0.2s',
270
+ },
271
+ '&:hover::before': {
272
+ opacity: 1,
273
+ },
274
+ '.icon': {
275
+ width: '16px',
276
+ height: '16px',
277
+ },
278
+ }),
279
+ ]}
280
+ >
281
+ <span className="icon">★</span>
282
+ Click me
283
+ </button>
284
+ )
285
+ }
286
+
287
+ // ============================================================================
288
+ // Ref Mixin - Form (Basic)
289
+ // ============================================================================
290
+ function FormBasic() {
291
+ let inputRef: HTMLInputElement
292
+
293
+ return () => (
294
+ <div>
295
+ <input
296
+ type="text"
297
+ placeholder="Click the button to select this"
298
+ // capture the input node
299
+ mix={[ref((node) => (inputRef = node)), css({ marginRight: '8px', padding: '4px 8px' })]}
300
+ />
301
+ <button
302
+ mix={[
303
+ css({ padding: '4px 12px' }),
304
+ on('click', () => {
305
+ // Select it from other parts of the form
306
+ inputRef.select()
307
+ }),
308
+ ]}
309
+ >
310
+ Select Input
311
+ </button>
312
+ </div>
313
+ )
314
+ }
315
+
316
+ // ============================================================================
317
+ // Ref Mixin with AbortSignal - ResizeObserver Component
318
+ // ============================================================================
319
+ function ResizeComponent(handle: Handle) {
320
+ let dimensions = { width: 0, height: 0 }
321
+
322
+ return () => (
323
+ <div
324
+ mix={[
325
+ ref((node, signal) => {
326
+ // Set up something that needs cleanup
327
+ let observer = new ResizeObserver((entries) => {
328
+ let entry = entries[0]
329
+ if (entry) {
330
+ dimensions.width = Math.round(entry.contentRect.width)
331
+ dimensions.height = Math.round(entry.contentRect.height)
332
+ handle.update()
333
+ }
334
+ })
335
+ observer.observe(node)
336
+
337
+ // Clean up when element is removed
338
+ signal.addEventListener('abort', () => {
339
+ observer.disconnect()
340
+ })
341
+ }),
342
+ css({
343
+ padding: '20px',
344
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
345
+ borderRadius: '8px',
346
+ resize: 'both',
347
+ overflow: 'auto',
348
+ minWidth: '100px',
349
+ minHeight: '60px',
350
+ border: '1px solid rgb(209, 213, 219)',
351
+ }),
352
+ ]}
353
+ >
354
+ Resize me! ({dimensions.width} × {dimensions.height})
355
+ </div>
356
+ )
357
+ }
358
+
359
+ // ============================================================================
360
+ // handle.update() - Player
361
+ // ============================================================================
362
+ function Player(handle: Handle) {
363
+ let isPlaying = false
364
+ let playButton: HTMLButtonElement
365
+ let stopButton: HTMLButtonElement
366
+
367
+ return () => (
368
+ <div mix={[css({ display: 'flex', gap: '8px' })]}>
369
+ <button
370
+ disabled={isPlaying}
371
+ mix={[
372
+ ref((node) => (playButton = node)),
373
+ css({
374
+ padding: '8px 16px',
375
+ opacity: isPlaying ? 0.5 : 1,
376
+ }),
377
+ on('click', async () => {
378
+ isPlaying = true
379
+ await handle.update()
380
+ // Focus the enabled button after update completes
381
+ stopButton.focus()
382
+ }),
383
+ ]}
384
+ >
385
+ ▶ Play
386
+ </button>
387
+ <button
388
+ disabled={!isPlaying}
389
+ mix={[
390
+ ref((node) => (stopButton = node)),
391
+ css({
392
+ padding: '8px 16px',
393
+ opacity: !isPlaying ? 0.5 : 1,
394
+ }),
395
+ on('click', async () => {
396
+ isPlaying = false
397
+ await handle.update()
398
+ // Focus the enabled button after update completes
399
+ playButton.focus()
400
+ }),
401
+ ]}
402
+ >
403
+ ⏹ Stop
404
+ </button>
405
+ </div>
406
+ )
407
+ }
408
+
409
+ // ============================================================================
410
+ // handle.queueTask - Form with scroll
411
+ // ============================================================================
412
+ function FormWithScroll(handle: Handle) {
413
+ let showDetails = false
414
+ let detailsSection: HTMLElement
415
+
416
+ return () => (
417
+ <div>
418
+ <label mix={[css({ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' })]}>
419
+ <input
420
+ type="checkbox"
421
+ checked={showDetails}
422
+ mix={[
423
+ on('change', (event) => {
424
+ showDetails = event.currentTarget.checked
425
+ handle.update()
426
+ if (showDetails) {
427
+ // Scroll to the expanded section after it renders
428
+ handle.queueTask(() => {
429
+ detailsSection.scrollIntoView({ behavior: 'smooth', block: 'start' })
430
+ })
431
+ }
432
+ }),
433
+ ]}
434
+ />
435
+ Show additional details
436
+ </label>
437
+ {showDetails && (
438
+ <section
439
+ mix={[
440
+ ref((node) => (detailsSection = node)),
441
+ css({
442
+ marginTop: '1rem',
443
+ padding: '1rem',
444
+ border: '1px solid rgba(255, 255, 255, 0.2)',
445
+ borderRadius: '8px',
446
+ backgroundColor: 'rgba(255, 255, 255, 0.05)',
447
+ }),
448
+ ]}
449
+ >
450
+ <h3 mix={[css({ margin: '0 0 0.5rem 0' })]}>Additional Details</h3>
451
+ <p mix={[css({ margin: 0 })]}>This section appears when the checkbox is checked.</p>
452
+ </section>
453
+ )}
454
+ </div>
455
+ )
456
+ }
457
+
458
+ // ============================================================================
459
+ // handle.signal - Clock
460
+ // ============================================================================
461
+ function Clock(handle: Handle) {
462
+ handle.queueTask(() => {
463
+ let interval = setInterval(() => {
464
+ handle.update()
465
+ }, 1000)
466
+
467
+ handle.signal.addEventListener('abort', () => clearInterval(interval), { once: true })
468
+ })
469
+
470
+ return () => <span>{new Date().toLocaleTimeString()}</span>
471
+ }
472
+
473
+ // ============================================================================
474
+ // handle.id - LabeledInput
475
+ // ============================================================================
476
+ function LabeledInput(handle: Handle) {
477
+ return () => (
478
+ <div mix={[css({ display: 'flex', flexDirection: 'column', gap: '4px' })]}>
479
+ <label htmlFor={handle.id}>Name</label>
480
+ <input
481
+ id={handle.id}
482
+ type="text"
483
+ mix={[
484
+ css({
485
+ padding: '4px 8px',
486
+ borderRadius: '4px',
487
+ border: '1px solid rgba(255,255,255,0.3)',
488
+ }),
489
+ ]}
490
+ />
491
+ </div>
492
+ )
493
+ }
494
+
495
+ // ============================================================================
496
+ // Context API - Theme Provider and Consumer
497
+ // ============================================================================
498
+ function ThemeProvider(handle: Handle<{}, { theme: string }>) {
499
+ handle.context.set({ theme: 'dark' })
500
+
501
+ return () => (
502
+ <div mix={[css({ display: 'flex', flexDirection: 'column', gap: '8px' })]}>
503
+ <ThemedHeader />
504
+ </div>
505
+ )
506
+ }
507
+
508
+ function ThemedHeader(handle: Handle) {
509
+ // Consume context from ThemeProvider
510
+ let { theme } = handle.context.get(ThemeProvider)
511
+
512
+ return () => (
513
+ <header
514
+ mix={[
515
+ css({
516
+ backgroundColor: theme === 'dark' ? '#000' : '#fff',
517
+ color: theme === 'dark' ? '#fff' : '#000',
518
+ }),
519
+ ]}
520
+ >
521
+ Header
522
+ </header>
523
+ )
524
+ }
525
+
526
+ // ============================================================================
527
+ // Context API with EventTarget - Advanced Theme
528
+ // ============================================================================
529
+ class Theme extends TypedEventTarget<{ change: Event }> {
530
+ #value: 'light' | 'dark' = 'light'
531
+
532
+ get value() {
533
+ return this.#value
534
+ }
535
+
536
+ setValue(value: 'light' | 'dark') {
537
+ this.#value = value
538
+ this.dispatchEvent(new Event('change'))
539
+ }
540
+ }
541
+
542
+ function ThemeProviderAdvanced(handle: Handle<{}, Theme>) {
543
+ let theme = new Theme()
544
+ handle.context.set(theme)
545
+
546
+ return () => (
547
+ <div mix={[css({ display: 'flex', flexDirection: 'column', gap: '8px' })]}>
548
+ <button
549
+ mix={[
550
+ css({ padding: '8px 16px', alignSelf: 'flex-start' }),
551
+ on('click', () => {
552
+ // no updates in the parent component
553
+ theme.setValue(theme.value === 'light' ? 'dark' : 'light')
554
+ }),
555
+ ]}
556
+ >
557
+ Toggle Theme (EventTarget)
558
+ </button>
559
+ <ThemedContent />
560
+ </div>
561
+ )
562
+ }
563
+
564
+ function ThemedContent(handle: Handle) {
565
+ let theme = handle.context.get(ThemeProviderAdvanced)
566
+
567
+ // Subscribe to theme changes and update when it changes
568
+ addEventListeners(theme, handle.signal, {
569
+ change() {
570
+ handle.update()
571
+ },
572
+ })
573
+
574
+ return () => (
575
+ <div
576
+ mix={[
577
+ css({
578
+ padding: '12px',
579
+ borderRadius: '6px',
580
+ backgroundColor: theme.value === 'dark' ? '#1a1a1a' : '#f0f0f0',
581
+ color: theme.value === 'dark' ? '#fff' : '#000',
582
+ }),
583
+ ]}
584
+ >
585
+ Current theme: {theme.value}
586
+ </div>
587
+ )
588
+ }
589
+
590
+ // ============================================================================
591
+ // Fragments - List
592
+ // ============================================================================
593
+ function ListWithFragment() {
594
+ return () => (
595
+ <ul mix={[css({ margin: 0, paddingLeft: '20px' })]}>
596
+ <>
597
+ <li>Item 1</li>
598
+ <li>Item 2</li>
599
+ <li>Item 3</li>
600
+ </>
601
+ </ul>
602
+ )
603
+ }
604
+
605
+ // ============================================================================
606
+ // Example Container Component
607
+ // ============================================================================
608
+ function Example(handle: Handle<{ title: string; children: RemixNode }>) {
609
+ return () => (
610
+ <div className="example">
611
+ <h2>{handle.props.title}</h2>
612
+ <div className="example-content">{handle.props.children}</div>
613
+ </div>
614
+ )
615
+ }
616
+
617
+ // ============================================================================
618
+ // Main Demo App
619
+ // ============================================================================
620
+ /**
621
+ * @name README Examples
622
+ * @description A gallery of small examples that mirror the package README snippets.
623
+ */
624
+ export default function DemoApp() {
625
+ return () => (
626
+ <div className="examples-grid">
627
+ <Example title="Getting Started - Counter">
628
+ <App />
629
+ </Example>
630
+
631
+ <Example title="Component State - Counter">
632
+ <Counter />
633
+ </Example>
634
+
635
+ <Example title="Greeting">
636
+ <Greeting name="World" />
637
+ </Example>
638
+
639
+ <Example title="Counter with Setup">
640
+ <CounterWithSetup initialCount={10} label="Total" />
641
+ </Example>
642
+
643
+ <Example title="Setup vs Props">
644
+ <CounterWithLabel initialCount={5} label="Score" />
645
+ </Example>
646
+
647
+ <Example title="Events - Search Input">
648
+ <SearchInput />
649
+ </Example>
650
+
651
+ <Example title="Controlled Input - Slug Form">
652
+ <SlugForm />
653
+ </Example>
654
+
655
+ <Example title="Global Events - Keyboard Tracker">
656
+ <KeyboardTracker />
657
+ </Example>
658
+
659
+ <Example title="CSS Prop - Basic Button">
660
+ <ButtonBasic />
661
+ </Example>
662
+
663
+ <Example title="CSS Prop - Advanced Button">
664
+ <ButtonAdvanced />
665
+ </Example>
666
+
667
+ <Example title="Ref Mixin - Form">
668
+ <FormBasic />
669
+ </Example>
670
+
671
+ <Example title="Ref with AbortSignal - Resize Observer">
672
+ <ResizeComponent />
673
+ </Example>
674
+
675
+ <Example title="handle.update() - Player">
676
+ <Player />
677
+ </Example>
678
+
679
+ <Example title="handle.queueTask - Scroll to Section">
680
+ <FormWithScroll />
681
+ </Example>
682
+
683
+ <Example title="handle.signal - Clock">
684
+ <Clock />
685
+ </Example>
686
+
687
+ <Example title="handle.id - Labeled Input">
688
+ <LabeledInput />
689
+ </Example>
690
+
691
+ <Example title="Context API - Theme Provider">
692
+ <ThemeProvider />
693
+ </Example>
694
+
695
+ <Example title="Context with EventTarget">
696
+ <ThemeProviderAdvanced />
697
+ </Example>
698
+
699
+ <Example title="Fragments - List">
700
+ <ListWithFragment />
701
+ </Example>
702
+ </div>
703
+ )
704
+ }