@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
@@ -1,504 +0,0 @@
1
- import {
2
- attrs,
3
- css,
4
- createElement,
5
- createMixin,
6
- on,
7
- type CSSMixinDescriptor,
8
- type Dispatched,
9
- type ElementProps,
10
- type Handle,
11
- type MixinHandle,
12
- type Props,
13
- type RemixNode,
14
- } from '@remix-run/ui'
15
- import * as button from '../button/button.tsx'
16
- import { theme } from '../../theme/theme.ts'
17
-
18
- const TABS_CHANGE_EVENT = 'rmx:tabs-change' as const
19
-
20
- type TabsChangeHandler<target extends HTMLElement> = (
21
- event: Dispatched<TabsChangeEvent, target>,
22
- signal: AbortSignal,
23
- ) => void | Promise<void>
24
-
25
- const tabsListCss: CSSMixinDescriptor = css({
26
- display: 'inline-flex',
27
- alignItems: 'center',
28
- gap: theme.space.xs,
29
- minWidth: 0,
30
- padding: theme.space.xs,
31
- border: `1px solid ${theme.colors.border.subtle}`,
32
- borderRadius: theme.radius.xl,
33
- backgroundColor: theme.surface.lvl2,
34
- })
35
-
36
- const tabsTriggerCss: CSSMixinDescriptor = css({
37
- justifyContent: 'flex-start',
38
- minHeight: theme.control.height.md,
39
- paddingInline: theme.space.md,
40
- border: '1px solid transparent',
41
- borderRadius: theme.radius.md,
42
- backgroundColor: 'transparent',
43
- color: theme.colors.text.secondary,
44
- fontSize: theme.fontSize.md,
45
- '&:hover:not(:disabled):not([aria-disabled="true"])': {
46
- color: theme.colors.text.primary,
47
- },
48
- '&:focus-visible': {
49
- outline: `2px solid ${theme.colors.focus.ring}`,
50
- outlineOffset: '2px',
51
- color: theme.colors.text.primary,
52
- },
53
- '&[aria-selected="true"], &[aria-selected="true"]:hover, &[aria-selected="true"]:focus-visible': {
54
- backgroundColor: theme.surface.lvl0,
55
- borderColor: theme.colors.border.subtle,
56
- boxShadow: theme.shadow.xs,
57
- color: theme.colors.text.primary,
58
- },
59
- '&:disabled, &[aria-disabled="true"]': {
60
- opacity: 0.55,
61
- },
62
- })
63
-
64
- export const listStyle = tabsListCss
65
- export const triggerStyle = tabsTriggerCss
66
-
67
- const panelVisibilityUtility = css({
68
- '&[hidden]': {
69
- display: 'none',
70
- },
71
- })
72
-
73
- declare global {
74
- interface HTMLElementEventMap {
75
- [TABS_CHANGE_EVENT]: TabsChangeEvent
76
- }
77
- }
78
-
79
- export class TabsChangeEvent extends Event {
80
- readonly previousValue: string | null
81
- readonly value: string
82
-
83
- constructor(value: string, previousValue: string | null) {
84
- super(TABS_CHANGE_EVENT, { bubbles: true })
85
- this.value = value
86
- this.previousValue = previousValue
87
- }
88
- }
89
-
90
- export type TabsOrientation = 'horizontal' | 'vertical'
91
-
92
- type TabsDirection = 'first' | 'last' | 'next' | 'previous'
93
-
94
- type RegisteredTab = {
95
- disabled: boolean
96
- getNode(): HTMLElement | null
97
- value: string
98
- }
99
-
100
- export interface TabsRef {
101
- readonly selectedValue: string | null
102
- focus: (value?: string) => void
103
- focusFirst: () => void
104
- focusLast: () => void
105
- select: (value: string) => void
106
- }
107
-
108
- interface TabsContextValue {
109
- readonly focusableValue: string | null
110
- readonly orientation: TabsOrientation
111
- readonly value: string | null
112
- getPanelId: (value: string) => string
113
- getTriggerId: (value: string) => string
114
- move: (fromValue: string, direction: TabsDirection) => void
115
- registerTab: (tab: RegisteredTab) => void
116
- select: (value: string) => void
117
- }
118
-
119
- export interface TabsContextProps {
120
- children?: RemixNode
121
- defaultValue?: string
122
- onValueChange?: (value: string) => void
123
- orientation?: TabsOrientation
124
- ref?: (ref: TabsRef) => void
125
- value?: string
126
- }
127
-
128
- export interface TabsProps extends TabsContextProps {}
129
-
130
- export interface TabsTriggerOptions {
131
- disabled?: boolean
132
- value: string
133
- }
134
-
135
- export interface TabsPanelOptions {
136
- value: string
137
- }
138
-
139
- export type TabsListProps = Props<'div'>
140
-
141
- export type TabProps = Omit<Props<'button'>, 'type'> & {
142
- children?: RemixNode
143
- disabled?: boolean
144
- type?: 'button' | 'submit' | 'reset'
145
- value: string
146
- }
147
-
148
- export type TabsPanelProps = Props<'div'> & {
149
- children?: RemixNode
150
- value: string
151
- }
152
-
153
- function getTabsContext(handle: Handle | MixinHandle) {
154
- return handle.context.get(TabsProvider)
155
- }
156
-
157
- function toIdFragment(value: string) {
158
- let fragment = value.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-+|-+$/g, '')
159
- return fragment || 'tab'
160
- }
161
-
162
- function TabsProvider(handle: Handle<TabsContextProps, TabsContextValue>) {
163
- let registeredTabs: RegisteredTab[] = []
164
- let hasInitialized = false
165
- let uncontrolledValue: string | null = null
166
-
167
- function getValue() {
168
- return handle.props.value !== undefined ? handle.props.value : uncontrolledValue
169
- }
170
-
171
- function getOrientation() {
172
- return handle.props.orientation ?? 'horizontal'
173
- }
174
-
175
- function isActiveTab(tab: RegisteredTab | undefined): tab is RegisteredTab {
176
- return !!tab && !tab.disabled && !!tab.getNode()?.isConnected
177
- }
178
-
179
- function getTab(value: string | null | undefined) {
180
- if (value == null) {
181
- return undefined
182
- }
183
-
184
- return registeredTabs.find((tab) => tab.value === value)
185
- }
186
-
187
- function getEnabledTabs() {
188
- return registeredTabs.filter(isActiveTab)
189
- }
190
-
191
- function getFocusableValue() {
192
- let currentValue = getValue()
193
- let currentTab = getTab(currentValue)
194
-
195
- if (isActiveTab(currentTab)) {
196
- return currentValue
197
- }
198
-
199
- return getEnabledTabs()[0]?.value ?? null
200
- }
201
-
202
- function getTargetTab(fromValue: string, direction: TabsDirection) {
203
- let enabledTabs = getEnabledTabs()
204
- if (enabledTabs.length === 0) {
205
- return undefined
206
- }
207
-
208
- let currentIndex = enabledTabs.findIndex((tab) => tab.value === fromValue)
209
- let targetIndex = 0
210
-
211
- switch (direction) {
212
- case 'first':
213
- targetIndex = 0
214
- break
215
- case 'last':
216
- targetIndex = enabledTabs.length - 1
217
- break
218
- case 'next':
219
- targetIndex =
220
- currentIndex === -1 || currentIndex === enabledTabs.length - 1 ? 0 : currentIndex + 1
221
- break
222
- case 'previous':
223
- targetIndex = currentIndex <= 0 ? enabledTabs.length - 1 : currentIndex - 1
224
- break
225
- }
226
-
227
- return enabledTabs[targetIndex]
228
- }
229
-
230
- function dispatchChange(value: string, previousValue: string | null) {
231
- getTab(value)?.getNode()?.dispatchEvent(new TabsChangeEvent(value, previousValue))
232
- }
233
-
234
- function select(value: string) {
235
- let nextTab = getTab(value)
236
- if (!isActiveTab(nextTab)) {
237
- return
238
- }
239
-
240
- let previousValue = getValue()
241
- if (previousValue === value) {
242
- return
243
- }
244
-
245
- if (handle.props.value === undefined) {
246
- uncontrolledValue = value
247
- void handle.update()
248
- }
249
-
250
- handle.props.onValueChange?.(value)
251
- dispatchChange(value, previousValue ?? null)
252
- }
253
-
254
- let tabsRef: TabsRef = {
255
- get selectedValue() {
256
- return getValue()
257
- },
258
- focus(value = getFocusableValue() ?? undefined) {
259
- getTab(value)?.getNode()?.focus()
260
- },
261
- focusFirst() {
262
- getTargetTab(getFocusableValue() ?? '', 'first')
263
- ?.getNode()
264
- ?.focus()
265
- },
266
- focusLast() {
267
- getTargetTab(getFocusableValue() ?? '', 'last')
268
- ?.getNode()
269
- ?.focus()
270
- },
271
- select,
272
- }
273
-
274
- handle.context.set({
275
- get focusableValue() {
276
- return getFocusableValue()
277
- },
278
- get orientation() {
279
- return getOrientation()
280
- },
281
- get value() {
282
- return getValue()
283
- },
284
- getPanelId(value) {
285
- return `${handle.id}-panel-${toIdFragment(value)}`
286
- },
287
- getTriggerId(value) {
288
- return `${handle.id}-trigger-${toIdFragment(value)}`
289
- },
290
- move(fromValue, direction) {
291
- let target = getTargetTab(fromValue, direction)
292
- if (!target) {
293
- return
294
- }
295
-
296
- target.getNode()?.focus()
297
- select(target.value)
298
- },
299
- registerTab(tab) {
300
- registeredTabs.push(tab)
301
- },
302
- select,
303
- })
304
-
305
- return () => {
306
- registeredTabs = []
307
-
308
- if (!hasInitialized) {
309
- uncontrolledValue = handle.props.defaultValue ?? null
310
- hasInitialized = true
311
- }
312
-
313
- handle.queueTask(() => {
314
- handle.props.ref?.(tabsRef)
315
-
316
- if (handle.props.value !== undefined) {
317
- return
318
- }
319
-
320
- let nextValue = getFocusableValue()
321
- if (nextValue === uncontrolledValue) {
322
- return
323
- }
324
-
325
- uncontrolledValue = nextValue
326
- void handle.update()
327
- })
328
-
329
- return handle.props.children
330
- }
331
- }
332
-
333
- const listMixin = createMixin<HTMLElement, [], ElementProps>((handle) => {
334
- let context = getTabsContext(handle)
335
-
336
- return () =>
337
- attrs({
338
- role: 'tablist',
339
- 'aria-orientation': context.orientation === 'vertical' ? 'vertical' : undefined,
340
- 'data-orientation': context.orientation,
341
- })
342
- })
343
-
344
- const triggerMixin = createMixin<HTMLElement, [options: TabsTriggerOptions], ElementProps>(
345
- (handle) => {
346
- let triggerRef: HTMLElement | null = null
347
- let context = getTabsContext(handle)
348
-
349
- handle.queueTask((node) => {
350
- triggerRef = node
351
- })
352
-
353
- return (options, props) => {
354
- let disabled = options.disabled === true || props.disabled === true
355
- context.registerTab({
356
- disabled,
357
- getNode() {
358
- return triggerRef
359
- },
360
- value: options.value,
361
- })
362
-
363
- return [
364
- attrs({
365
- id: context.getTriggerId(options.value),
366
- role: 'tab',
367
- tabIndex: !disabled && context.focusableValue === options.value ? 0 : -1,
368
- 'aria-controls': context.getPanelId(options.value),
369
- 'aria-disabled': disabled ? 'true' : undefined,
370
- 'aria-selected': context.value === options.value ? 'true' : 'false',
371
- 'data-orientation': context.orientation,
372
- 'data-selected': context.value === options.value ? 'true' : 'false',
373
- }),
374
- !disabled && [
375
- on('click', () => {
376
- context.select(options.value)
377
- }),
378
- on('keydown', (event) => {
379
- switch (event.key) {
380
- case 'ArrowRight':
381
- if (context.orientation !== 'horizontal') {
382
- return
383
- }
384
- event.preventDefault()
385
- context.move(options.value, 'next')
386
- break
387
- case 'ArrowLeft':
388
- if (context.orientation !== 'horizontal') {
389
- return
390
- }
391
- event.preventDefault()
392
- context.move(options.value, 'previous')
393
- break
394
- case 'ArrowDown':
395
- if (context.orientation !== 'vertical') {
396
- return
397
- }
398
- event.preventDefault()
399
- context.move(options.value, 'next')
400
- break
401
- case 'ArrowUp':
402
- if (context.orientation !== 'vertical') {
403
- return
404
- }
405
- event.preventDefault()
406
- context.move(options.value, 'previous')
407
- break
408
- case 'Home':
409
- event.preventDefault()
410
- context.move(options.value, 'first')
411
- break
412
- case 'End':
413
- event.preventDefault()
414
- context.move(options.value, 'last')
415
- break
416
- }
417
- }),
418
- ],
419
- ]
420
- }
421
- },
422
- )
423
-
424
- const panelMixin = createMixin<HTMLElement, [options: TabsPanelOptions], ElementProps>((handle) => {
425
- let context = getTabsContext(handle)
426
-
427
- return (options) => {
428
- let isSelected = context.value === options.value
429
-
430
- return [
431
- attrs({
432
- id: context.getPanelId(options.value),
433
- role: 'tabpanel',
434
- hidden: isSelected ? undefined : true,
435
- 'aria-labelledby': context.getTriggerId(options.value),
436
- 'data-orientation': context.orientation,
437
- 'data-selected': isSelected ? 'true' : 'false',
438
- }),
439
- panelVisibilityUtility,
440
- ]
441
- }
442
- })
443
-
444
- export const Context = TabsProvider
445
- export const list = listMixin
446
- export const panel = panelMixin
447
- export const trigger = triggerMixin
448
-
449
- const tabs = { Context, list, panel, trigger } as const
450
-
451
- export function onTabsChange<target extends HTMLElement>(
452
- handler: TabsChangeHandler<target>,
453
- captureBoolean?: boolean,
454
- ) {
455
- return on(TABS_CHANGE_EVENT, handler, captureBoolean)
456
- }
457
-
458
- export function Tabs(handle: Handle<TabsProps>) {
459
- return () => {
460
- let { children, ...contextProps } = handle.props
461
- return <tabs.Context {...contextProps}>{children}</tabs.Context>
462
- }
463
- }
464
-
465
- export function TabsList(handle: Handle<TabsListProps>) {
466
- return () => {
467
- let { children, mix, ...divProps } = handle.props
468
-
469
- return (
470
- <div {...divProps} mix={[listStyle, tabs.list(), mix]}>
471
- {children}
472
- </div>
473
- )
474
- }
475
- }
476
-
477
- export function Tab(handle: Handle<TabProps>) {
478
- return () => {
479
- let { children, disabled, mix, type, value, ...buttonProps } = handle.props
480
-
481
- return (
482
- <button
483
- {...buttonProps}
484
- disabled={disabled ? true : undefined}
485
- mix={[button.baseStyle, triggerStyle, tabs.trigger({ disabled, value }), mix]}
486
- type={type ?? 'button'}
487
- >
488
- {children}
489
- </button>
490
- )
491
- }
492
- }
493
-
494
- export function TabsPanel(handle: Handle<TabsPanelProps>) {
495
- return () => {
496
- let { children, mix, value, ...divProps } = handle.props
497
-
498
- return (
499
- <div {...divProps} mix={[tabs.panel({ value }), mix]}>
500
- {children}
501
- </div>
502
- )
503
- }
504
- }
@@ -1,103 +0,0 @@
1
- # theme
2
-
3
- `theme` provides Remix UI design tokens, theme creation, glyph contracts, and the built-in `RMX_01` preset. Use it to install CSS custom properties once and consume typed token references in component styles.
4
-
5
- ## Usage
6
-
7
- ```tsx
8
- import { createTheme, theme } from 'remix/ui/theme'
9
- import { css } from 'remix/ui'
10
-
11
- let Theme = createTheme({
12
- space: {
13
- none: '0px',
14
- px: '1px',
15
- xs: '2px',
16
- sm: '4px',
17
- md: '8px',
18
- lg: '12px',
19
- xl: '16px',
20
- xxl: '24px',
21
- },
22
- radius: { none: '0px', sm: '4px', md: '8px', lg: '12px', xl: '16px', full: '9999px' },
23
- fontFamily: { sans: 'Inter, sans-serif', mono: 'monospace' },
24
- fontSize: {
25
- xxxs: '10px',
26
- xxs: '11px',
27
- xs: '12px',
28
- sm: '14px',
29
- md: '16px',
30
- lg: '18px',
31
- xl: '20px',
32
- xxl: '28px',
33
- },
34
- lineHeight: { tight: '1.2', normal: '1.5', relaxed: '1.7' },
35
- letterSpacing: { tight: '-0.02em', normal: '0', meta: '0.06em', wide: '0.08em' },
36
- fontWeight: { normal: '400', medium: '500', semibold: '600', bold: '700' },
37
- control: { height: { sm: '28px', md: '32px', lg: '36px' } },
38
- surface: { lvl0: '#fff', lvl1: '#f8fafc', lvl2: '#f5f5f5', lvl3: '#f1f5f9', lvl4: '#e9eef6' },
39
- shadow: { xs: 'none', sm: 'none', md: 'none', lg: 'none', xl: 'none' },
40
- colors: {
41
- text: { primary: '#111827', secondary: '#374151', muted: '#6b7280', link: '#2563eb' },
42
- border: { subtle: '#e5e7eb', default: '#d1d5db', strong: '#9ca3af' },
43
- focus: { ring: '#3b82f6' },
44
- overlay: { scrim: 'rgb(0 0 0 / 0.45)' },
45
- action: {
46
- primary: {
47
- background: '#2563eb',
48
- backgroundHover: '#1d4ed8',
49
- backgroundActive: '#1e40af',
50
- foreground: '#fff',
51
- border: '#2563eb',
52
- },
53
- secondary: {
54
- background: '#fff',
55
- backgroundHover: '#f8fafc',
56
- backgroundActive: '#f1f5f9',
57
- foreground: '#111827',
58
- border: '#d1d5db',
59
- },
60
- danger: {
61
- background: '#dc2626',
62
- backgroundHover: '#b91c1c',
63
- backgroundActive: '#991b1b',
64
- foreground: '#fff',
65
- border: '#dc2626',
66
- },
67
- },
68
- },
69
- })
70
-
71
- let card = css({
72
- backgroundColor: theme.surface.lvl0,
73
- color: theme.colors.text.primary,
74
- })
75
-
76
- function Layout() {
77
- return (
78
- <body>
79
- <Theme />
80
- <article mix={card}>Project status</article>
81
- </body>
82
- )
83
- }
84
- ```
85
-
86
- ## `theme.*`
87
-
88
- - `theme`: typed CSS variable reference contract, such as `theme.space.md` and `theme.colors.text.primary`.
89
- - `createTheme(values, options?)`: creates a style component with `cssText`, `selector`, `values`, `vars`, and `Style`.
90
- - `RMX_01`: built-in theme component.
91
- - `RMX_01_GLYPHS`: built-in glyph sheet component.
92
- - `glyphContract` and `glyphNames`: stable glyph ids and supported glyph names.
93
- - `ThemeValues`, `ThemeVars`, `ThemeComponent`, `ThemeStyleProps`, `CreateThemeOptions`, and `ThemeMix`: public TypeScript types for custom themes.
94
- - `GlyphName`, `GlyphSymbol`, and `GlyphValues`: public TypeScript types for glyph contracts.
95
-
96
- ## Behavior Notes
97
-
98
- - `theme` values are CSS variable references, not raw token values.
99
- - `createTheme` serializes token values into CSS custom properties and renders a `<style data-rmx-theme>` tag.
100
- - The default selector is `:root`; pass `selector` for scoped themes.
101
- - The base reset is included by default, emitted in `rmx-reset`, and can be disabled with `reset: false`.
102
- - The built-in components consume this token contract through their style mixins.
103
- - Render `<RMX_01 />` and `<RMX_01_GLYPHS />` once when using the built-in theme and glyph preset.