@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,365 @@
1
+ import {
2
+ attrs,
3
+ createMixin,
4
+ on,
5
+ ref,
6
+ type Dispatched,
7
+ type ElementProps,
8
+ type Handle,
9
+ type MixinHandle,
10
+ type MixinFactory,
11
+ type RemixNode,
12
+ } from '@remix-run/ui'
13
+
14
+ const TABS_CHANGE_EVENT = 'rmx:tabs-change' as const
15
+
16
+ type TabsChangeHandler<target extends HTMLElement> = (
17
+ event: Dispatched<TabsChangeEvent, target>,
18
+ signal: AbortSignal,
19
+ ) => void | Promise<void>
20
+
21
+ export type TabsActivationDirection = 'first' | 'last' | 'next' | 'previous'
22
+
23
+ export interface TabsRegisteredTab {
24
+ disabled: boolean
25
+ getTabNode(): HTMLButtonElement | null
26
+ name: string
27
+ }
28
+
29
+ export interface TabsContextValue {
30
+ readonly activeTab: string | null
31
+ readonly disabled: boolean
32
+ activateTab(name: string): void
33
+ activateTabInDirection(name: string, direction: TabsActivationDirection): void
34
+ getPanelId(name: string): string
35
+ getTabId(name: string): string
36
+ isActiveTab(name: string): boolean
37
+ registerRoot(node: HTMLElement): void
38
+ registerTab(tab: TabsRegisteredTab): void
39
+ unregisterRoot(node: HTMLElement): void
40
+ }
41
+
42
+ export interface TabsContextProps {
43
+ activeTab?: string
44
+ children?: RemixNode
45
+ defaultActiveTab?: string
46
+ disabled?: boolean
47
+ onActiveTabChange?: (activeTab: string) => void
48
+ }
49
+
50
+ export interface TabsRootOptions {}
51
+
52
+ export interface TabListOptions {}
53
+
54
+ export interface TabOptions {
55
+ disabled?: boolean
56
+ name: string
57
+ }
58
+
59
+ export interface TabPanelOptions {
60
+ name: string
61
+ }
62
+
63
+ export class TabsChangeEvent extends Event {
64
+ readonly activeTab: string
65
+ readonly previousActiveTab: string | null
66
+
67
+ constructor(activeTab: string, previousActiveTab: string | null) {
68
+ super(TABS_CHANGE_EVENT, {
69
+ bubbles: true,
70
+ })
71
+ this.activeTab = activeTab
72
+ this.previousActiveTab = previousActiveTab
73
+ }
74
+ }
75
+
76
+ declare global {
77
+ interface HTMLElementEventMap {
78
+ [TABS_CHANGE_EVENT]: TabsChangeEvent
79
+ }
80
+ }
81
+
82
+ function encodeIdPart(value: string): string {
83
+ return encodeURIComponent(value).replace(/%/g, '-')
84
+ }
85
+
86
+ function getTabState(active: boolean): 'active' | 'inactive' {
87
+ return active ? 'active' : 'inactive'
88
+ }
89
+
90
+ function getTabsContext(handle: Handle<unknown, unknown> | MixinHandle) {
91
+ return handle.context.get(TabsProvider)
92
+ }
93
+
94
+ function TabsProvider(handle: Handle<TabsContextProps, TabsContextValue>): () => RemixNode {
95
+ let rootNode: HTMLElement | null = null
96
+ let renderedTabs: TabsRegisteredTab[] = []
97
+ let uncontrolledActiveTab: string | null = null
98
+ let hasInitialized = false
99
+
100
+ function getActiveTab() {
101
+ if (handle.props.activeTab !== undefined) {
102
+ return handle.props.activeTab
103
+ }
104
+
105
+ if (!hasInitialized) {
106
+ uncontrolledActiveTab = handle.props.defaultActiveTab ?? null
107
+ hasInitialized = true
108
+ }
109
+
110
+ return uncontrolledActiveTab
111
+ }
112
+
113
+ function getRegisteredTab(name: string) {
114
+ return renderedTabs.find((tab) => tab.name === name)
115
+ }
116
+
117
+ function dispatchChange(activeTab: string, previousActiveTab: string | null) {
118
+ rootNode?.dispatchEvent(new TabsChangeEvent(activeTab, previousActiveTab))
119
+ }
120
+
121
+ function activateTab(name: string) {
122
+ if (handle.props.disabled) {
123
+ return
124
+ }
125
+
126
+ let tab = getRegisteredTab(name)
127
+ if (tab?.disabled) {
128
+ return
129
+ }
130
+
131
+ let previousActiveTab = getActiveTab()
132
+ if (previousActiveTab === name) {
133
+ return
134
+ }
135
+
136
+ if (handle.props.activeTab === undefined) {
137
+ uncontrolledActiveTab = name
138
+ void handle.update()
139
+ }
140
+
141
+ handle.props.onActiveTabChange?.(name)
142
+ dispatchChange(name, previousActiveTab)
143
+ }
144
+
145
+ function getFocusableTabs() {
146
+ return renderedTabs.filter((tab) => !tab.disabled && tab.getTabNode() !== null)
147
+ }
148
+
149
+ function activateTabInDirection(name: string, direction: TabsActivationDirection) {
150
+ let tabs = getFocusableTabs()
151
+ if (tabs.length === 0) {
152
+ return
153
+ }
154
+
155
+ let currentIndex = tabs.findIndex((tab) => tab.name === name)
156
+ let targetIndex = 0
157
+
158
+ switch (direction) {
159
+ case 'first':
160
+ targetIndex = 0
161
+ break
162
+ case 'last':
163
+ targetIndex = tabs.length - 1
164
+ break
165
+ case 'previous':
166
+ targetIndex = currentIndex <= 0 ? tabs.length - 1 : currentIndex - 1
167
+ break
168
+ case 'next':
169
+ targetIndex = currentIndex === -1 || currentIndex === tabs.length - 1 ? 0 : currentIndex + 1
170
+ break
171
+ }
172
+
173
+ let targetTab = tabs[targetIndex]
174
+ targetTab?.getTabNode()?.focus()
175
+ if (targetTab) {
176
+ activateTab(targetTab.name)
177
+ }
178
+ }
179
+
180
+ function getTabId(name: string) {
181
+ return `${handle.id}-${encodeIdPart(name)}-tab`
182
+ }
183
+
184
+ function getPanelId(name: string) {
185
+ return `${handle.id}-${encodeIdPart(name)}-panel`
186
+ }
187
+
188
+ function registerTab(tab: TabsRegisteredTab) {
189
+ renderedTabs.push(tab)
190
+
191
+ if (handle.props.activeTab === undefined && getActiveTab() === null && !tab.disabled) {
192
+ uncontrolledActiveTab = tab.name
193
+ }
194
+ }
195
+
196
+ handle.context.set({
197
+ get activeTab() {
198
+ return getActiveTab()
199
+ },
200
+ get disabled() {
201
+ return handle.props.disabled ?? false
202
+ },
203
+ activateTab,
204
+ activateTabInDirection,
205
+ getPanelId,
206
+ getTabId,
207
+ isActiveTab(name) {
208
+ return getActiveTab() === name
209
+ },
210
+ registerRoot(node) {
211
+ rootNode = node
212
+ },
213
+ registerTab,
214
+ unregisterRoot(node) {
215
+ if (rootNode === node) {
216
+ rootNode = null
217
+ }
218
+ },
219
+ })
220
+
221
+ return () => {
222
+ renderedTabs = []
223
+ return handle.props.children
224
+ }
225
+ }
226
+
227
+ const rootMixin: MixinFactory<HTMLElement, [options?: TabsRootOptions], ElementProps> = createMixin<
228
+ HTMLElement,
229
+ [options?: TabsRootOptions],
230
+ ElementProps
231
+ >((handle) => {
232
+ let context = getTabsContext(handle)
233
+
234
+ handle.queueTask((node, signal) => {
235
+ context.registerRoot(node)
236
+ signal.addEventListener('abort', () => {
237
+ context.unregisterRoot(node)
238
+ })
239
+ })
240
+
241
+ return () =>
242
+ attrs({
243
+ 'data-disabled': context.disabled ? '' : undefined,
244
+ })
245
+ })
246
+
247
+ const listMixin: MixinFactory<HTMLElement, [options?: TabListOptions], ElementProps> = createMixin<
248
+ HTMLElement,
249
+ [options?: TabListOptions],
250
+ ElementProps
251
+ >((handle) => {
252
+ let context = getTabsContext(handle)
253
+
254
+ return () =>
255
+ attrs({
256
+ 'aria-disabled': context.disabled ? true : undefined,
257
+ role: 'tablist',
258
+ })
259
+ })
260
+
261
+ const tabMixin: MixinFactory<HTMLButtonElement, [options: TabOptions], ElementProps> = createMixin<
262
+ HTMLButtonElement,
263
+ [options: TabOptions],
264
+ ElementProps
265
+ >((handle, hostType) => {
266
+ let context = getTabsContext(handle)
267
+ let tabNode: HTMLButtonElement | null = null
268
+
269
+ return (options, props) => {
270
+ let disabled = context.disabled || options.disabled === true || props.disabled === true
271
+
272
+ context.registerTab({
273
+ disabled,
274
+ getTabNode: () => tabNode,
275
+ name: options.name,
276
+ })
277
+
278
+ let active = context.isActiveTab(options.name)
279
+
280
+ return [
281
+ attrs({
282
+ 'aria-controls': context.getPanelId(options.name),
283
+ 'aria-selected': active ? 'true' : 'false',
284
+ 'data-state': getTabState(active),
285
+ disabled: disabled ? true : undefined,
286
+ id: context.getTabId(options.name),
287
+ role: 'tab',
288
+ tabIndex: active && !disabled ? 0 : -1,
289
+ type: hostType === 'button' ? 'button' : undefined,
290
+ }),
291
+ ref((node: HTMLButtonElement, signal) => {
292
+ tabNode = node
293
+ signal.addEventListener('abort', () => {
294
+ if (tabNode === node) {
295
+ tabNode = null
296
+ }
297
+ })
298
+ }),
299
+ on('click', () => {
300
+ context.activateTab(options.name)
301
+ }),
302
+ on('keydown', (event) => {
303
+ switch (event.key) {
304
+ case 'ArrowDown':
305
+ case 'ArrowRight':
306
+ event.preventDefault()
307
+ context.activateTabInDirection(options.name, 'next')
308
+ break
309
+ case 'ArrowUp':
310
+ case 'ArrowLeft':
311
+ event.preventDefault()
312
+ context.activateTabInDirection(options.name, 'previous')
313
+ break
314
+ case 'Home':
315
+ event.preventDefault()
316
+ context.activateTabInDirection(options.name, 'first')
317
+ break
318
+ case 'End':
319
+ event.preventDefault()
320
+ context.activateTabInDirection(options.name, 'last')
321
+ break
322
+ case 'Enter':
323
+ case ' ':
324
+ event.preventDefault()
325
+ context.activateTab(options.name)
326
+ break
327
+ }
328
+ }),
329
+ ]
330
+ }
331
+ })
332
+
333
+ const panelMixin: MixinFactory<HTMLElement, [options: TabPanelOptions], ElementProps> = createMixin<
334
+ HTMLElement,
335
+ [options: TabPanelOptions],
336
+ ElementProps
337
+ >((handle) => {
338
+ let context = getTabsContext(handle)
339
+
340
+ return (options) => {
341
+ let active = context.isActiveTab(options.name)
342
+
343
+ return attrs({
344
+ 'aria-labelledby': context.getTabId(options.name),
345
+ 'data-state': getTabState(active),
346
+ hidden: active ? undefined : true,
347
+ id: context.getPanelId(options.name),
348
+ inert: active ? undefined : true,
349
+ role: 'tabpanel',
350
+ })
351
+ }
352
+ })
353
+
354
+ export const Context = TabsProvider
355
+ export const list = listMixin
356
+ export const panel = panelMixin
357
+ export const root = rootMixin
358
+ export const tab = tabMixin
359
+
360
+ export function onTabsChange<target extends HTMLElement>(
361
+ handler: TabsChangeHandler<target>,
362
+ captureBoolean?: boolean,
363
+ ): ReturnType<typeof on<target, typeof TABS_CHANGE_EVENT>> {
364
+ return on(TABS_CHANGE_EVENT, handler, captureBoolean)
365
+ }
@@ -0,0 +1,56 @@
1
+ # toggle
2
+
3
+ `toggle` is a style mixin for checkbox inputs rendered as switches. Use native input props for normal form behavior, and compose it with `remix/ui/toggle/primitives` when you need the headless toggle state helpers or custom hosts.
4
+
5
+ ## Usage
6
+
7
+ ```tsx
8
+ import toggle from 'remix/ui/toggle'
9
+
10
+ function NotificationSetting() {
11
+ return () => (
12
+ <label>
13
+ <input mix={toggle({ size: 'lg' })} defaultChecked />
14
+ Email notifications
15
+ </label>
16
+ )
17
+ }
18
+ ```
19
+
20
+ ## Primitive Usage
21
+
22
+ Use the lower-level primitive when app code needs normalized checked state, toggle change events, or a non-input host:
23
+
24
+ ```tsx
25
+ import toggle from 'remix/ui/toggle'
26
+ import * as togglePrimitive from 'remix/ui/toggle/primitives'
27
+
28
+ function CustomToggle() {
29
+ return () => (
30
+ <button
31
+ aria-label="Notifications"
32
+ mix={[...toggle(), togglePrimitive.control({ defaultChecked: true })]}
33
+ />
34
+ )
35
+ }
36
+ ```
37
+
38
+ ## `remix/ui/toggle`
39
+
40
+ - `toggle(options)`: styles a native checkbox input as a switch and supplies `type="checkbox"` plus `role="switch"` when the host is an `<input>` without an explicit non-checkbox `type`. Supports `size: 'md' | 'lg'` and defaults to `'md'`.
41
+ - `onToggleChange(handler)`: re-exported primitive event mixin.
42
+ - `ToggleChangeEvent`: re-exported primitive event class.
43
+ - `ToggleSize` and `ToggleOptions`: public TypeScript types for the style mixin.
44
+
45
+ ## `remix/ui/toggle/primitives`
46
+
47
+ - `control(options)`: wires a boolean switch control with checked state, ARIA, keyboard, and native input behavior.
48
+ - `onToggleChange(handler)`: event mixin for bubbling toggle changes.
49
+ - `ToggleChangeEvent`: event class dispatched when a toggle changes.
50
+ - `ToggleControlOptions`: primitive options for controlled and uncontrolled state.
51
+
52
+ ## Behavior Notes
53
+
54
+ - Checked styles apply through `:checked`, `[aria-checked="true"]`, or `[data-state="checked"]`.
55
+ - Native checkbox switches use the native `checked` attribute for state. Custom hosts use `role="switch"` and `aria-checked="true"` or `aria-checked="false"`.
56
+ - Every switch needs an accessible name, usually from visible label text, `aria-label`, or `aria-labelledby`.
@@ -0,0 +1,134 @@
1
+ import { createMixin, css } from '@remix-run/ui'
2
+ import type { CSSMixinDescriptor, ElementProps, MixinDescriptor } from '@remix-run/ui'
3
+ import { renderMixinElement } from '../runtime/mixins/mixin.ts'
4
+ import { controlFocusShadow } from '../shared/focus-styles.ts'
5
+
6
+ export { ToggleChangeEvent, onToggleChange } from '@remix-run/ui/toggle/primitives'
7
+
8
+ export type ToggleSize = 'md' | 'lg'
9
+
10
+ export interface ToggleOptions {
11
+ size?: ToggleSize
12
+ }
13
+
14
+ type ToggleMixin = readonly [MixinDescriptor<Element, [], ElementProps>, CSSMixinDescriptor]
15
+
16
+ const checkedSelector = '&:checked, &[aria-checked="true"], &[data-state="checked"]'
17
+ const checkedThumbSelector =
18
+ '&:checked::before, &[aria-checked="true"]::before, &[data-state="checked"]::before'
19
+ const uncheckedThumbBackground =
20
+ 'linear-gradient(180deg, rgba(0, 0, 0, 0) 33%, rgba(0, 0, 0, 0.04) 100%), #FFFFFF'
21
+ const uncheckedThumbShadow =
22
+ '0 0 0 0.5px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.12), 0 2px 2px -1px rgba(0, 0, 0, 0.12), 0 4px 4px -2px rgba(0, 0, 0, 0.12), inset 0 0 2px 1px #FFFFFF'
23
+ const checkedThumbBackground =
24
+ 'linear-gradient(180deg, rgba(112, 199, 84, 0) 25%, rgba(112, 199, 84, 0.25) 100%), #FFFFFF'
25
+ const checkedThumbShadow =
26
+ '0 1px 2px -0.5px rgba(66, 134, 44, 0.6), 0 2px 4px -1px rgba(66, 134, 44, 0.6), 0 4px 6px -2px rgba(66, 134, 44, 0.6), 0 0 0 0.5px rgba(0, 0, 0, 0.28), inset 0 0 2px 1px #FFFFFF'
27
+
28
+ const toggleDefaultAttrs = createMixin<Element, [], ElementProps>((handle, hostType) => (props) => {
29
+ if (hostType !== 'input') {
30
+ return handle.element
31
+ }
32
+
33
+ let type = props.type ?? 'checkbox'
34
+ if (type !== 'checkbox') {
35
+ return renderMixinElement(handle.element, {
36
+ ...props,
37
+ type,
38
+ })
39
+ }
40
+
41
+ return renderMixinElement(handle.element, {
42
+ ...props,
43
+ role: props.role ?? 'switch',
44
+ type,
45
+ })
46
+ })()
47
+
48
+ const baseStyles = {
49
+ appearance: 'none',
50
+ WebkitAppearance: 'none',
51
+ margin: 0,
52
+ boxSizing: 'border-box',
53
+ position: 'relative',
54
+ display: 'inline-block',
55
+ width: 'var(--rmx-toggle-width)',
56
+ height: 'var(--rmx-toggle-height)',
57
+ minWidth: 'var(--rmx-toggle-width)',
58
+ minHeight: 'var(--rmx-toggle-height)',
59
+ padding: 0,
60
+ border: 0,
61
+ borderRadius: '9999px',
62
+ background: 'linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 100%), #EBEBEB',
63
+ boxShadow:
64
+ 'inset 0 0 4px 1px rgba(0, 0, 0, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.02), inset 0 2px 2px rgba(0, 0, 0, 0.02)',
65
+ verticalAlign: 'middle',
66
+ flex: 'none',
67
+ '&::before': {
68
+ content: '""',
69
+ position: 'absolute',
70
+ left: 'var(--rmx-toggle-thumb-inset)',
71
+ top: 'calc((var(--rmx-toggle-height) - var(--rmx-toggle-thumb-height)) / 2)',
72
+ width: 'var(--rmx-toggle-thumb-width)',
73
+ height: 'var(--rmx-toggle-thumb-height)',
74
+ borderRadius: '99px',
75
+ background: uncheckedThumbBackground,
76
+ boxShadow: uncheckedThumbShadow,
77
+ transform: 'translateX(0)',
78
+ transition: 'transform 160ms ease, background 160ms ease, box-shadow 160ms ease',
79
+ pointerEvents: 'none',
80
+ },
81
+ '&:disabled, &[aria-disabled="true"]': {
82
+ opacity: 0.55,
83
+ },
84
+ [checkedSelector]: {
85
+ background: 'linear-gradient(180deg, #70C754 0%, #70C754 100%)',
86
+ boxShadow:
87
+ '0 1px 0 rgba(255, 255, 255, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.4), 0 -4px 8px 2px #FFFFFF, 0 4px 8px 2px rgba(0, 0, 0, 0.05), 0 0 12px 1px rgba(112, 199, 84, 0.25), inset 0 0 4px 1px rgba(0, 0, 0, 0.25), inset 0 1px 1px rgba(0, 0, 0, 0.1), inset 0 2px 2px rgba(0, 0, 0, 0.1)',
88
+ },
89
+ [checkedThumbSelector]: {
90
+ background: checkedThumbBackground,
91
+ boxShadow: checkedThumbShadow,
92
+ transform: 'translateX(var(--rmx-toggle-thumb-translate-x))',
93
+ },
94
+ '&:focus-visible': {
95
+ outline: 0,
96
+ boxShadow: controlFocusShadow,
97
+ },
98
+ '@media (prefers-reduced-motion: reduce)': {
99
+ '&::before': {
100
+ transition: 'none',
101
+ },
102
+ },
103
+ }
104
+
105
+ const thumbTranslate =
106
+ 'calc(var(--rmx-toggle-width) - var(--rmx-toggle-thumb-width) - (var(--rmx-toggle-thumb-inset) * 2))'
107
+
108
+ const sizeStyles = {
109
+ md: css({
110
+ '--rmx-toggle-width': '30px',
111
+ '--rmx-toggle-height': '18px',
112
+ '--rmx-toggle-thumb-width': '18px',
113
+ '--rmx-toggle-thumb-height': '14px',
114
+ '--rmx-toggle-thumb-inset': '2px',
115
+ '--rmx-toggle-thumb-translate-x': thumbTranslate,
116
+ ...baseStyles,
117
+ }),
118
+ lg: css({
119
+ '--rmx-toggle-width': '36px',
120
+ '--rmx-toggle-height': '22px',
121
+ '--rmx-toggle-thumb-width': '22px',
122
+ '--rmx-toggle-thumb-height': '18px',
123
+ '--rmx-toggle-thumb-inset': '2px',
124
+ '--rmx-toggle-thumb-translate-x': thumbTranslate,
125
+ ...baseStyles,
126
+ }),
127
+ } as const satisfies Record<ToggleSize, CSSMixinDescriptor>
128
+
129
+ export function toggle(options: ToggleOptions = {}): ToggleMixin {
130
+ let { size = 'md' } = options
131
+ return [toggleDefaultAttrs, sizeStyles[size]]
132
+ }
133
+
134
+ export default toggle