@remix-run/ui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/README.md +50 -164
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
  9. package/dist/anchor/index.js.map +1 -0
  10. package/dist/animation/demos/reordering.js +9 -6
  11. package/dist/animation/demos/reordering.js.map +1 -1
  12. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  13. package/dist/breadcrumbs/index.js.map +1 -0
  14. package/dist/button/index.d.ts +15 -0
  15. package/dist/button/index.js +128 -0
  16. package/dist/button/index.js.map +1 -0
  17. package/dist/checkbox/index.d.ts +14 -0
  18. package/dist/checkbox/index.js +125 -0
  19. package/dist/checkbox/index.js.map +1 -0
  20. package/dist/combobox/index.d.ts +21 -0
  21. package/dist/combobox/index.js +58 -0
  22. package/dist/combobox/index.js.map +1 -0
  23. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  24. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  25. package/dist/combobox/primitives.js.map +1 -0
  26. package/dist/input/index.d.ts +13 -0
  27. package/dist/input/index.js +121 -0
  28. package/dist/input/index.js.map +1 -0
  29. package/dist/listbox/flash-attribute.js.map +1 -0
  30. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  31. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  32. package/dist/listbox/index.js.map +1 -0
  33. package/dist/menu/hover-aim.js.map +1 -0
  34. package/dist/menu/index.d.ts +42 -0
  35. package/dist/menu/index.js +250 -0
  36. package/dist/menu/index.js.map +1 -0
  37. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +3 -32
  38. package/dist/{components/menu/menu.js → menu/primitives.js} +97 -314
  39. package/dist/menu/primitives.js.map +1 -0
  40. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
  41. package/dist/{components/popover/popover.js → popover/index.js} +5 -48
  42. package/dist/popover/index.js.map +1 -0
  43. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  44. package/dist/popover/outside-click.js.map +1 -0
  45. package/dist/popover/scroll-lock.d.ts +1 -0
  46. package/dist/{utils → popover}/scroll-lock.js +0 -18
  47. package/dist/popover/scroll-lock.js.map +1 -0
  48. package/dist/radio/index.d.ts +12 -0
  49. package/dist/radio/index.js +77 -0
  50. package/dist/radio/index.js.map +1 -0
  51. package/dist/runtime/reconcile.js +11 -5
  52. package/dist/runtime/reconcile.js.map +1 -1
  53. package/dist/runtime/vdom.js +3 -0
  54. package/dist/runtime/vdom.js.map +1 -1
  55. package/dist/select/index.d.ts +19 -0
  56. package/dist/select/index.js +95 -0
  57. package/dist/select/index.js.map +1 -0
  58. package/dist/select/keydown.js.map +1 -0
  59. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  60. package/dist/{components/select/select.js → select/primitives.js} +11 -63
  61. package/dist/select/primitives.js.map +1 -0
  62. package/dist/server/stream.js +2 -2
  63. package/dist/server/stream.js.map +1 -1
  64. package/dist/shared/focus-styles.d.ts +1 -0
  65. package/dist/shared/focus-styles.js +2 -0
  66. package/dist/shared/focus-styles.js.map +1 -0
  67. package/dist/shared/icons.d.ts +9 -0
  68. package/dist/shared/icons.js +42 -0
  69. package/dist/shared/icons.js.map +1 -0
  70. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  71. package/dist/shared/listbox-popover-styles.js +137 -0
  72. package/dist/shared/listbox-popover-styles.js.map +1 -0
  73. package/dist/shared/style-values.d.ts +78 -0
  74. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  75. package/dist/shared/style-values.js.map +1 -0
  76. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  77. package/dist/shared/typeahead.js.map +1 -0
  78. package/dist/shared/wait-for-css-transition.js.map +1 -0
  79. package/dist/shared/wait.js.map +1 -0
  80. package/dist/tabs/index.d.ts +32 -0
  81. package/dist/tabs/index.js +157 -0
  82. package/dist/tabs/index.js.map +1 -0
  83. package/dist/tabs/primitives.d.ts +57 -0
  84. package/dist/tabs/primitives.js +238 -0
  85. package/dist/tabs/primitives.js.map +1 -0
  86. package/dist/toggle/index.d.ts +9 -0
  87. package/dist/toggle/index.js +108 -0
  88. package/dist/toggle/index.js.map +1 -0
  89. package/dist/toggle/primitives.d.ts +29 -0
  90. package/dist/toggle/primitives.js +127 -0
  91. package/dist/toggle/primitives.js.map +1 -0
  92. package/package.json +73 -44
  93. package/src/{components/accordion → accordion}/README.md +50 -14
  94. package/src/accordion/index.tsx +285 -0
  95. package/src/accordion/primitives.tsx +512 -0
  96. package/src/{components/anchor → anchor}/README.md +37 -2
  97. package/src/animation/demos/reordering.tsx +9 -6
  98. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  99. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  100. package/src/button/README.md +44 -0
  101. package/src/button/index.ts +168 -0
  102. package/src/checkbox/README.md +59 -0
  103. package/src/checkbox/index.ts +162 -0
  104. package/src/{components/combobox → combobox}/README.md +58 -9
  105. package/src/combobox/index.tsx +112 -0
  106. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  107. package/src/input/README.md +52 -0
  108. package/src/input/index.ts +147 -0
  109. package/src/{components/listbox → listbox}/README.md +9 -41
  110. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  111. package/src/{components/menu → menu}/README.md +55 -14
  112. package/src/menu/index.tsx +354 -0
  113. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
  114. package/src/{components/popover → popover}/README.md +20 -39
  115. package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
  116. package/src/{utils → popover}/scroll-lock.ts +0 -28
  117. package/src/radio/README.md +53 -0
  118. package/src/radio/index.ts +100 -0
  119. package/src/runtime/demos/readme.demo.tsx +16 -14
  120. package/src/runtime/reconcile.ts +11 -5
  121. package/src/runtime/vdom.ts +3 -0
  122. package/src/{components/select → select}/README.md +29 -19
  123. package/src/select/index.tsx +159 -0
  124. package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
  125. package/src/server/stream.ts +3 -3
  126. package/src/shared/focus-styles.ts +2 -0
  127. package/src/shared/icons.tsx +62 -0
  128. package/src/shared/listbox-popover-styles.ts +146 -0
  129. package/src/shared/style-values.ts +165 -0
  130. package/src/tabs/README.md +141 -0
  131. package/src/tabs/index.tsx +244 -0
  132. package/src/tabs/primitives.ts +365 -0
  133. package/src/toggle/README.md +56 -0
  134. package/src/toggle/index.tsx +134 -0
  135. package/src/toggle/primitives.ts +192 -0
  136. package/dist/animation/demos/animation.demo.d.ts +0 -5
  137. package/dist/animation/demos/animation.demo.js +0 -92
  138. package/dist/animation/demos/animation.demo.js.map +0 -1
  139. package/dist/animation/demos/spring.demo.d.ts +0 -6
  140. package/dist/animation/demos/spring.demo.js +0 -304
  141. package/dist/animation/demos/spring.demo.js.map +0 -1
  142. package/dist/components/accordion/accordion.d.ts +0 -92
  143. package/dist/components/accordion/accordion.js +0 -335
  144. package/dist/components/accordion/accordion.js.map +0 -1
  145. package/dist/components/accordion/demos/card.demo.d.ts +0 -7
  146. package/dist/components/accordion/demos/card.demo.js +0 -59
  147. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  148. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
  149. package/dist/components/accordion/demos/multiple.demo.js +0 -20
  150. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  151. package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
  152. package/dist/components/accordion/demos/overview.demo.js +0 -20
  153. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  154. package/dist/components/anchor/anchor.js.map +0 -1
  155. package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
  156. package/dist/components/breadcrumbs/basic.demo.js +0 -15
  157. package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
  158. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  159. package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
  160. package/dist/components/breadcrumbs/separator.demo.js +0 -15
  161. package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
  162. package/dist/components/button/button.d.ts +0 -105
  163. package/dist/components/button/button.js +0 -207
  164. package/dist/components/button/button.js.map +0 -1
  165. package/dist/components/button/demos/aliases.demo.d.ts +0 -7
  166. package/dist/components/button/demos/aliases.demo.js +0 -19
  167. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  168. package/dist/components/button/demos/basic.demo.d.ts +0 -7
  169. package/dist/components/button/demos/basic.demo.js +0 -20
  170. package/dist/components/button/demos/basic.demo.js.map +0 -1
  171. package/dist/components/button/demos/states.demo.d.ts +0 -7
  172. package/dist/components/button/demos/states.demo.js +0 -30
  173. package/dist/components/button/demos/states.demo.js.map +0 -1
  174. package/dist/components/combobox/combobox.js.map +0 -1
  175. package/dist/components/combobox/overview.demo.d.ts +0 -7
  176. package/dist/components/combobox/overview.demo.js +0 -154
  177. package/dist/components/combobox/overview.demo.js.map +0 -1
  178. package/dist/components/glyph/glyph.d.ts +0 -14
  179. package/dist/components/glyph/glyph.js +0 -65
  180. package/dist/components/glyph/glyph.js.map +0 -1
  181. package/dist/components/listbox/listbox.js.map +0 -1
  182. package/dist/components/listbox/overview.demo.d.ts +0 -7
  183. package/dist/components/listbox/overview.demo.js +0 -65
  184. package/dist/components/listbox/overview.demo.js.map +0 -1
  185. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
  186. package/dist/components/menu/demos/bubbling.demo.js +0 -16
  187. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  188. package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
  189. package/dist/components/menu/demos/context-trigger.demo.js +0 -87
  190. package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
  191. package/dist/components/menu/demos/overview.demo.d.ts +0 -7
  192. package/dist/components/menu/demos/overview.demo.js +0 -33
  193. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  194. package/dist/components/menu/hover-aim.js.map +0 -1
  195. package/dist/components/menu/menu.js.map +0 -1
  196. package/dist/components/popover/overview.demo.d.ts +0 -7
  197. package/dist/components/popover/overview.demo.js +0 -65
  198. package/dist/components/popover/overview.demo.js.map +0 -1
  199. package/dist/components/popover/popover.js.map +0 -1
  200. package/dist/components/select/deconstructed.demo.d.ts +0 -7
  201. package/dist/components/select/deconstructed.demo.js +0 -54
  202. package/dist/components/select/deconstructed.demo.js.map +0 -1
  203. package/dist/components/select/overview.demo.d.ts +0 -6
  204. package/dist/components/select/overview.demo.js +0 -28
  205. package/dist/components/select/overview.demo.js.map +0 -1
  206. package/dist/components/select/select.js.map +0 -1
  207. package/dist/components/separator/separator.d.ts +0 -2
  208. package/dist/components/separator/separator.js +0 -15
  209. package/dist/components/separator/separator.js.map +0 -1
  210. package/dist/components/tabs/tabs.d.ts +0 -78
  211. package/dist/components/tabs/tabs.js +0 -339
  212. package/dist/components/tabs/tabs.js.map +0 -1
  213. package/dist/interactions/keydown/keydown.js.map +0 -1
  214. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  215. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  216. package/dist/runtime/demos/basic.demo.d.ts +0 -6
  217. package/dist/runtime/demos/basic.demo.js +0 -16
  218. package/dist/runtime/demos/basic.demo.js.map +0 -1
  219. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
  220. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
  221. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
  222. package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
  223. package/dist/runtime/demos/keyed-list.demo.js +0 -62
  224. package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
  225. package/dist/runtime/demos/readme.demo.d.ts +0 -5
  226. package/dist/runtime/demos/readme.demo.js +0 -396
  227. package/dist/runtime/demos/readme.demo.js.map +0 -1
  228. package/dist/theme/contract.d.ts +0 -61
  229. package/dist/theme/contract.js +0 -131
  230. package/dist/theme/contract.js.map +0 -1
  231. package/dist/theme/glyph-contract.d.ts +0 -11
  232. package/dist/theme/glyph-contract.js +0 -34
  233. package/dist/theme/glyph-contract.js.map +0 -1
  234. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  235. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  236. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  237. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  238. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  239. package/dist/theme/runtime.d.ts +0 -2
  240. package/dist/theme/runtime.js +0 -84
  241. package/dist/theme/runtime.js.map +0 -1
  242. package/dist/theme/theme.d.ts +0 -6
  243. package/dist/theme/theme.js +0 -5
  244. package/dist/theme/theme.js.map +0 -1
  245. package/dist/utils/flash-attribute.js.map +0 -1
  246. package/dist/utils/scroll-lock.d.ts +0 -3
  247. package/dist/utils/scroll-lock.js.map +0 -1
  248. package/dist/utils/wait-for-css-transition.js.map +0 -1
  249. package/dist/utils/wait.js.map +0 -1
  250. package/src/animation/demos/animation.demo.tsx +0 -194
  251. package/src/animation/demos/spring.demo.tsx +0 -385
  252. package/src/components/accordion/accordion.tsx +0 -565
  253. package/src/components/accordion/demos/card.demo.tsx +0 -114
  254. package/src/components/accordion/demos/multiple.demo.tsx +0 -57
  255. package/src/components/accordion/demos/overview.demo.tsx +0 -57
  256. package/src/components/breadcrumbs/basic.demo.tsx +0 -18
  257. package/src/components/breadcrumbs/separator.demo.tsx +0 -19
  258. package/src/components/button/README.md +0 -44
  259. package/src/components/button/button.tsx +0 -286
  260. package/src/components/button/demos/aliases.demo.tsx +0 -28
  261. package/src/components/button/demos/basic.demo.tsx +0 -31
  262. package/src/components/button/demos/states.demo.tsx +0 -53
  263. package/src/components/combobox/overview.demo.tsx +0 -200
  264. package/src/components/glyph/README.md +0 -72
  265. package/src/components/glyph/glyph.tsx +0 -110
  266. package/src/components/listbox/overview.demo.tsx +0 -102
  267. package/src/components/menu/demos/bubbling.demo.tsx +0 -35
  268. package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
  269. package/src/components/menu/demos/overview.demo.tsx +0 -77
  270. package/src/components/popover/overview.demo.tsx +0 -144
  271. package/src/components/select/deconstructed.demo.tsx +0 -96
  272. package/src/components/select/overview.demo.tsx +0 -52
  273. package/src/components/separator/separator.ts +0 -19
  274. package/src/components/tabs/README.md +0 -105
  275. package/src/components/tabs/tabs.tsx +0 -504
  276. package/src/runtime/demos/basic.demo.tsx +0 -21
  277. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
  278. package/src/runtime/demos/keyed-list.demo.tsx +0 -94
  279. package/src/theme/README.md +0 -103
  280. package/src/theme/contract.ts +0 -215
  281. package/src/theme/glyph-contract.ts +0 -59
  282. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  283. package/src/theme/presets/rmx-01/index.ts +0 -123
  284. package/src/theme/runtime.ts +0 -119
  285. package/src/theme/theme.ts +0 -15
  286. package/src/utils/scroll-lock/README.md +0 -33
  287. /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
  288. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  289. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  290. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  291. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  292. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  293. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  294. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  295. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  296. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  297. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  298. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  299. /package/dist/{utils → shared}/wait.d.ts +0 -0
  300. /package/dist/{utils → shared}/wait.js +0 -0
  301. /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
  302. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  303. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  304. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  305. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  306. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  307. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  308. /package/src/{utils → shared}/wait.ts +0 -0
@@ -1,94 +0,0 @@
1
- import { on, type Handle } from '@remix-run/ui'
2
-
3
- type ListItem = {
4
- id: string
5
- label: string
6
- }
7
-
8
- /**
9
- * @name Keyed List
10
- * @description Exercises keyed DOM reconciliation with shuffling, reversing, and per-item controls.
11
- */
12
- export default function App(handle: Handle) {
13
- let items: ListItem[] = [
14
- { id: 'a', label: 'Item A' },
15
- { id: 'b', label: 'Item B' },
16
- { id: 'c', label: 'Item C' },
17
- { id: 'd', label: 'Item D' },
18
- ]
19
-
20
- let shuffleInterval: ReturnType<typeof setInterval> | null = null
21
-
22
- let moveUp = (index: number) => {
23
- if (index === 0) return
24
- let newItems = [...items]
25
- ;[newItems[index - 1], newItems[index]] = [newItems[index], newItems[index - 1]]
26
- items = newItems
27
- handle.update()
28
- }
29
-
30
- let moveDown = (index: number) => {
31
- if (index === items.length - 1) return
32
- let newItems = [...items]
33
- ;[newItems[index], newItems[index + 1]] = [newItems[index + 1], newItems[index]]
34
- items = newItems
35
- handle.update()
36
- }
37
-
38
- let reverse = () => {
39
- items = [...items].reverse()
40
- handle.update()
41
- }
42
-
43
- let shuffle = () => {
44
- let newItems = [...items]
45
- for (let i = newItems.length - 1; i > 0; i--) {
46
- let j = Math.floor(Math.random() * (i + 1))
47
- ;[newItems[i], newItems[j]] = [newItems[j], newItems[i]]
48
- }
49
- items = newItems
50
- handle.update()
51
- }
52
-
53
- let toggleAutoShuffle = () => {
54
- if (shuffleInterval !== null) {
55
- clearInterval(shuffleInterval)
56
- shuffleInterval = null
57
- } else {
58
- shuffleInterval = setInterval(() => {
59
- shuffle()
60
- }, 1000)
61
- }
62
- handle.update()
63
- }
64
-
65
- return () => (
66
- <div>
67
- <div className="controls">
68
- <button mix={[on('click', reverse)]}>Reverse List</button>
69
- <button mix={[on('click', shuffle)]}>Shuffle List</button>
70
- <button mix={[on('click', toggleAutoShuffle)]}>
71
- {shuffleInterval !== null ? 'Stop Auto-Shuffle' : 'Start Auto-Shuffle'}
72
- </button>
73
- </div>
74
-
75
- {items.map((item, index) => (
76
- <div key={item.id} className="list-item">
77
- <input type="text" placeholder={item.label} defaultValue={item.label} />
78
- <button
79
- // disabled={index === 0}
80
- mix={[on('click', () => moveUp(index))]}
81
- >
82
-
83
- </button>
84
- <button
85
- // disabled={index === items.length - 1}
86
- mix={[on('click', () => moveDown(index))]}
87
- >
88
-
89
- </button>
90
- </div>
91
- ))}
92
- </div>
93
- )
94
- }
@@ -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.
@@ -1,215 +0,0 @@
1
- import type { css, Handle, MixinDescriptor, RemixElement } from '@remix-run/ui'
2
-
3
- export interface ThemeVariableTree {
4
- [key: string]: string | ThemeVariableTree
5
- }
6
-
7
- type ThemeVariableGroup<key extends string> = Readonly<Record<key, string>>
8
- type ThemeActionVariableGroup = ThemeVariableGroup<
9
- 'background' | 'backgroundHover' | 'backgroundActive' | 'foreground' | 'border'
10
- >
11
-
12
- type ThemeVariableNames = {
13
- readonly space: ThemeVariableGroup<'none' | 'px' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'>
14
- readonly radius: ThemeVariableGroup<'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'>
15
- readonly fontFamily: ThemeVariableGroup<'sans' | 'mono'>
16
- readonly fontSize: ThemeVariableGroup<'xxxs' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'>
17
- readonly lineHeight: ThemeVariableGroup<'tight' | 'normal' | 'relaxed'>
18
- readonly letterSpacing: ThemeVariableGroup<'tight' | 'normal' | 'meta' | 'wide'>
19
- readonly fontWeight: ThemeVariableGroup<'normal' | 'medium' | 'semibold' | 'bold'>
20
- readonly control: {
21
- readonly height: ThemeVariableGroup<'sm' | 'md' | 'lg'>
22
- }
23
- readonly surface: ThemeVariableGroup<'lvl0' | 'lvl1' | 'lvl2' | 'lvl3' | 'lvl4'>
24
- readonly shadow: ThemeVariableGroup<'xs' | 'sm' | 'md' | 'lg' | 'xl'>
25
- readonly colors: {
26
- readonly text: ThemeVariableGroup<'primary' | 'secondary' | 'muted' | 'link'>
27
- readonly border: ThemeVariableGroup<'subtle' | 'default' | 'strong'>
28
- readonly focus: ThemeVariableGroup<'ring'>
29
- readonly overlay: ThemeVariableGroup<'scrim'>
30
- readonly action: {
31
- readonly primary: ThemeActionVariableGroup
32
- readonly secondary: ThemeActionVariableGroup
33
- readonly danger: ThemeActionVariableGroup
34
- }
35
- }
36
- }
37
-
38
- const themeVariableNamesSource: ThemeVariableNames = {
39
- space: {
40
- none: '--rmx-space-none',
41
- px: '--rmx-space-px',
42
- xs: '--rmx-space-xs',
43
- sm: '--rmx-space-sm',
44
- md: '--rmx-space-md',
45
- lg: '--rmx-space-lg',
46
- xl: '--rmx-space-xl',
47
- xxl: '--rmx-space-xxl',
48
- },
49
- radius: {
50
- none: '--rmx-radius-none',
51
- sm: '--rmx-radius-sm',
52
- md: '--rmx-radius-md',
53
- lg: '--rmx-radius-lg',
54
- xl: '--rmx-radius-xl',
55
- full: '--rmx-radius-full',
56
- },
57
- fontFamily: {
58
- sans: '--rmx-font-family-sans',
59
- mono: '--rmx-font-family-mono',
60
- },
61
- fontSize: {
62
- xxxs: '--rmx-font-size-xxxs',
63
- xxs: '--rmx-font-size-xxs',
64
- xs: '--rmx-font-size-xs',
65
- sm: '--rmx-font-size-sm',
66
- md: '--rmx-font-size-md',
67
- lg: '--rmx-font-size-lg',
68
- xl: '--rmx-font-size-xl',
69
- xxl: '--rmx-font-size-xxl',
70
- },
71
- lineHeight: {
72
- tight: '--rmx-line-height-tight',
73
- normal: '--rmx-line-height-normal',
74
- relaxed: '--rmx-line-height-relaxed',
75
- },
76
- letterSpacing: {
77
- tight: '--rmx-letter-spacing-tight',
78
- normal: '--rmx-letter-spacing-normal',
79
- meta: '--rmx-letter-spacing-meta',
80
- wide: '--rmx-letter-spacing-wide',
81
- },
82
- fontWeight: {
83
- normal: '--rmx-font-weight-normal',
84
- medium: '--rmx-font-weight-medium',
85
- semibold: '--rmx-font-weight-semibold',
86
- bold: '--rmx-font-weight-bold',
87
- },
88
- control: {
89
- height: {
90
- sm: '--rmx-control-height-sm',
91
- md: '--rmx-control-height-md',
92
- lg: '--rmx-control-height-lg',
93
- },
94
- },
95
- surface: {
96
- lvl0: '--rmx-surface-lvl0',
97
- lvl1: '--rmx-surface-lvl1',
98
- lvl2: '--rmx-surface-lvl2',
99
- lvl3: '--rmx-surface-lvl3',
100
- lvl4: '--rmx-surface-lvl4',
101
- },
102
- shadow: {
103
- xs: '--rmx-shadow-xs',
104
- sm: '--rmx-shadow-sm',
105
- md: '--rmx-shadow-md',
106
- lg: '--rmx-shadow-lg',
107
- xl: '--rmx-shadow-xl',
108
- },
109
- colors: {
110
- text: {
111
- primary: '--rmx-color-text-primary',
112
- secondary: '--rmx-color-text-secondary',
113
- muted: '--rmx-color-text-muted',
114
- link: '--rmx-color-text-link',
115
- },
116
- border: {
117
- subtle: '--rmx-color-border-subtle',
118
- default: '--rmx-color-border-default',
119
- strong: '--rmx-color-border-strong',
120
- },
121
- focus: {
122
- ring: '--rmx-color-focus-ring',
123
- },
124
- overlay: {
125
- scrim: '--rmx-color-overlay-scrim',
126
- },
127
- action: {
128
- primary: {
129
- background: '--rmx-color-action-primary-background',
130
- backgroundHover: '--rmx-color-action-primary-background-hover',
131
- backgroundActive: '--rmx-color-action-primary-background-active',
132
- foreground: '--rmx-color-action-primary-foreground',
133
- border: '--rmx-color-action-primary-border',
134
- },
135
- secondary: {
136
- background: '--rmx-color-action-secondary-background',
137
- backgroundHover: '--rmx-color-action-secondary-background-hover',
138
- backgroundActive: '--rmx-color-action-secondary-background-active',
139
- foreground: '--rmx-color-action-secondary-foreground',
140
- border: '--rmx-color-action-secondary-border',
141
- },
142
- danger: {
143
- background: '--rmx-color-action-danger-background',
144
- backgroundHover: '--rmx-color-action-danger-background-hover',
145
- backgroundActive: '--rmx-color-action-danger-background-active',
146
- foreground: '--rmx-color-action-danger-foreground',
147
- border: '--rmx-color-action-danger-border',
148
- },
149
- },
150
- },
151
- } satisfies ThemeVariableTree
152
-
153
- export const themeVariableNames: ThemeVariableNames = themeVariableNamesSource
154
-
155
- type MapLeaves<source, leaf> = source extends string
156
- ? leaf
157
- : {
158
- [key in keyof source]: MapLeaves<source[key], leaf>
159
- }
160
-
161
- export type ThemeValue = string | number
162
- export type ThemeContract = MapLeaves<ThemeVariableNames, string>
163
- export type ThemeValues = MapLeaves<typeof themeVariableNames, ThemeValue>
164
- export type ThemeVars = Readonly<Record<string, string>>
165
- export type CreateThemeOptions = {
166
- selector?: string
167
- reset?: boolean
168
- }
169
- export type ThemeStyleProps = {
170
- nonce?: string
171
- }
172
-
173
- type ThemeRenderer = (handle: Handle<ThemeStyleProps>) => () => RemixElement
174
-
175
- export type ThemeComponent = ThemeRenderer & {
176
- Style: ThemeRenderer
177
- cssText: string
178
- selector: string
179
- values: ThemeValues
180
- vars: ThemeVars
181
- }
182
-
183
- export const theme: ThemeContract = createThemeContract(themeVariableNames)
184
-
185
- export type ThemeUtility = ReturnType<typeof css>
186
-
187
- type ThemeMixLeaf = MixinDescriptor<any, any, any>
188
- type PreviousThemeMixDepth = [0, 0, 1, 2, 3, 4]
189
- type NestedThemeMix<value, depth extends number = 4> = depth extends 0
190
- ? value | ReadonlyArray<value>
191
- : value | ReadonlyArray<NestedThemeMix<value, PreviousThemeMixDepth[depth]>>
192
-
193
- export type ThemeMix = NestedThemeMix<ThemeMixLeaf>
194
-
195
- function createThemeContract<tree extends ThemeVariableTree>(tree: tree): MapLeaves<tree, string> {
196
- return mapTreeLeaves(tree, (variableName) => `var(${variableName})`) as MapLeaves<tree, string>
197
- }
198
-
199
- function mapTreeLeaves(
200
- tree: ThemeVariableTree,
201
- mapLeaf: (value: string) => string,
202
- ): ThemeVariableTree {
203
- let output: ThemeVariableTree = {}
204
-
205
- for (let [key, value] of Object.entries(tree)) {
206
- if (typeof value === 'string') {
207
- output[key] = mapLeaf(value)
208
- continue
209
- }
210
-
211
- output[key] = mapTreeLeaves(value, mapLeaf)
212
- }
213
-
214
- return output
215
- }
@@ -1,59 +0,0 @@
1
- import type { RemixElement } from '@remix-run/ui'
2
-
3
- export const glyphNames = [
4
- 'add',
5
- 'alert',
6
- 'check',
7
- 'chevronDown',
8
- 'chevronVertical',
9
- 'chevronUp',
10
- 'chevronRight',
11
- 'close',
12
- 'copy',
13
- 'edit',
14
- 'expand',
15
- 'info',
16
- 'menu',
17
- 'open',
18
- 'search',
19
- 'spinner',
20
- 'trash',
21
- ] as const
22
-
23
- export type GlyphName = (typeof glyphNames)[number]
24
-
25
- export type GlyphSymbol = RemixElement
26
-
27
- export type GlyphValues = {
28
- readonly [key in GlyphName]: GlyphSymbol
29
- }
30
-
31
- export type GlyphContract = Readonly<Record<GlyphName, { id: string }>>
32
-
33
- const DEFAULT_GLYPH_ID_PREFIX = 'rmx-glyph'
34
-
35
- export const glyphContract: GlyphContract = Object.freeze(
36
- createGlyphContract(DEFAULT_GLYPH_ID_PREFIX),
37
- )
38
-
39
- function createGlyphIds(idPrefix: string): Record<GlyphName, string> {
40
- return Object.fromEntries(glyphNames.map((name) => [name, `${idPrefix}-${name}`])) as Record<
41
- GlyphName,
42
- string
43
- >
44
- }
45
-
46
- function createGlyphContract(idPrefix: string): GlyphContract {
47
- let ids = createGlyphIds(idPrefix)
48
-
49
- return Object.freeze(
50
- Object.fromEntries(
51
- glyphNames.map((name) => [
52
- name,
53
- {
54
- id: ids[name],
55
- },
56
- ]),
57
- ) as GlyphContract,
58
- )
59
- }