@remix-run/ui 0.3.0 → 0.5.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 (434) hide show
  1. package/README.md +116 -157
  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/animate-layout-mixin.js +1 -1
  11. package/dist/animation/animate-layout-mixin.js.map +1 -1
  12. package/dist/animation/animate-mixins.js +2 -2
  13. package/dist/animation/animate-mixins.js.map +1 -1
  14. package/dist/animation/demos/color-interpolation.js +1 -1
  15. package/dist/animation/demos/color-interpolation.js.map +1 -1
  16. package/dist/animation/demos/drag-release.d.ts +1 -1
  17. package/dist/animation/demos/hold-to-confirm.d.ts +3 -3
  18. package/dist/animation/demos/material-ripple.js +1 -3
  19. package/dist/animation/demos/material-ripple.js.map +1 -1
  20. package/dist/animation/demos/reordering.js +9 -6
  21. package/dist/animation/demos/reordering.js.map +1 -1
  22. package/dist/animation/index.js +4 -4
  23. package/dist/animation/spring.js.map +1 -1
  24. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  25. package/dist/breadcrumbs/index.js.map +1 -0
  26. package/dist/button/index.d.ts +15 -0
  27. package/dist/button/index.js +128 -0
  28. package/dist/button/index.js.map +1 -0
  29. package/dist/checkbox/index.d.ts +14 -0
  30. package/dist/checkbox/index.js +127 -0
  31. package/dist/checkbox/index.js.map +1 -0
  32. package/dist/combobox/index.d.ts +21 -0
  33. package/dist/combobox/index.js +58 -0
  34. package/dist/combobox/index.js.map +1 -0
  35. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +4 -8
  36. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  37. package/dist/combobox/primitives.js.map +1 -0
  38. package/dist/dev/refresh.d.ts +1 -0
  39. package/dist/dev/refresh.js +2 -0
  40. package/dist/dev/refresh.js.map +1 -0
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +14 -14
  43. package/dist/input/index.d.ts +13 -0
  44. package/dist/input/index.js +121 -0
  45. package/dist/input/index.js.map +1 -0
  46. package/dist/jsx-runtime.js +2 -2
  47. package/dist/listbox/flash-attribute.js.map +1 -0
  48. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  49. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  50. package/dist/listbox/index.js.map +1 -0
  51. package/dist/menu/hover-aim.js.map +1 -0
  52. package/dist/menu/index.d.ts +42 -0
  53. package/dist/menu/index.js +250 -0
  54. package/dist/menu/index.js.map +1 -0
  55. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +4 -33
  56. package/dist/{components/menu/menu.js → menu/primitives.js} +98 -315
  57. package/dist/menu/primitives.js.map +1 -0
  58. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
  59. package/dist/{components/popover/popover.js → popover/index.js} +5 -48
  60. package/dist/popover/index.js.map +1 -0
  61. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  62. package/dist/popover/outside-click.js.map +1 -0
  63. package/dist/popover/scroll-lock.d.ts +1 -0
  64. package/dist/{utils → popover}/scroll-lock.js +0 -18
  65. package/dist/popover/scroll-lock.js.map +1 -0
  66. package/dist/radio/index.d.ts +12 -0
  67. package/dist/radio/index.js +77 -0
  68. package/dist/radio/index.js.map +1 -0
  69. package/dist/runtime/client-entry-boundary.d.ts +14 -0
  70. package/dist/runtime/client-entry-boundary.js +29 -0
  71. package/dist/runtime/client-entry-boundary.js.map +1 -0
  72. package/dist/runtime/component.d.ts +19 -4
  73. package/dist/runtime/component.js +39 -9
  74. package/dist/runtime/component.js.map +1 -1
  75. package/dist/runtime/core/attributes.js +36 -3
  76. package/dist/runtime/core/attributes.js.map +1 -1
  77. package/dist/runtime/core/children.d.ts +2 -0
  78. package/dist/runtime/core/children.js +26 -2
  79. package/dist/runtime/core/children.js.map +1 -1
  80. package/dist/runtime/core/props.js +2 -2
  81. package/dist/runtime/core/vnode.d.ts +3 -3
  82. package/dist/runtime/core/vnode.js +22 -1
  83. package/dist/runtime/core/vnode.js.map +1 -1
  84. package/dist/runtime/create-element.d.ts +2 -2
  85. package/dist/runtime/create-element.js +3 -2
  86. package/dist/runtime/create-element.js.map +1 -1
  87. package/dist/runtime/diff-dom.js +294 -219
  88. package/dist/runtime/diff-dom.js.map +1 -1
  89. package/dist/runtime/diff-props.js +3 -3
  90. package/dist/runtime/dom.d.ts +12 -0
  91. package/dist/runtime/element-function.d.ts +3 -0
  92. package/dist/runtime/element-function.js +2 -0
  93. package/dist/runtime/element-function.js.map +1 -0
  94. package/dist/runtime/form-navigation.d.ts +25 -0
  95. package/dist/runtime/form-navigation.js +132 -0
  96. package/dist/runtime/form-navigation.js.map +1 -0
  97. package/dist/runtime/frame-resolution.d.ts +5 -0
  98. package/dist/runtime/frame-resolution.js +10 -0
  99. package/dist/runtime/frame-resolution.js.map +1 -0
  100. package/dist/runtime/frame.d.ts +58 -15
  101. package/dist/runtime/frame.js +367 -114
  102. package/dist/runtime/frame.js.map +1 -1
  103. package/dist/runtime/jsx.d.ts +1 -1
  104. package/dist/runtime/jsx.js +1 -1
  105. package/dist/runtime/jsx.js.map +1 -1
  106. package/dist/runtime/key.d.ts +1 -0
  107. package/dist/runtime/key.js +2 -0
  108. package/dist/runtime/key.js.map +1 -0
  109. package/dist/runtime/mixins/attrs-mixin.js +2 -2
  110. package/dist/runtime/mixins/link-mixin.js +4 -3
  111. package/dist/runtime/mixins/link-mixin.js.map +1 -1
  112. package/dist/runtime/mixins/mixin.d.ts +15 -10
  113. package/dist/runtime/mixins/mixin.js +4 -4
  114. package/dist/runtime/mixins/mixin.js.map +1 -1
  115. package/dist/runtime/mixins/on-mixin.js +1 -1
  116. package/dist/runtime/mixins/ref-mixin.js +1 -1
  117. package/dist/runtime/navigation.d.ts +4 -1
  118. package/dist/runtime/navigation.js +157 -32
  119. package/dist/runtime/navigation.js.map +1 -1
  120. package/dist/runtime/reconcile.d.ts +11 -10
  121. package/dist/runtime/reconcile.js +557 -423
  122. package/dist/runtime/reconcile.js.map +1 -1
  123. package/dist/runtime/refresh.d.ts +28 -0
  124. package/dist/runtime/refresh.js +31 -0
  125. package/dist/runtime/refresh.js.map +1 -0
  126. package/dist/runtime/render.js +1 -1
  127. package/dist/runtime/render.js.map +1 -1
  128. package/dist/runtime/run.d.ts +3 -1
  129. package/dist/runtime/run.js +15 -7
  130. package/dist/runtime/run.js.map +1 -1
  131. package/dist/runtime/scheduler.js +8 -16
  132. package/dist/runtime/scheduler.js.map +1 -1
  133. package/dist/runtime/to-vnode.d.ts +2 -2
  134. package/dist/runtime/to-vnode.js +68 -20
  135. package/dist/runtime/to-vnode.js.map +1 -1
  136. package/dist/runtime/vdom.d.ts +4 -2
  137. package/dist/runtime/vdom.js +89 -41
  138. package/dist/runtime/vdom.js.map +1 -1
  139. package/dist/runtime/vnode.d.ts +138 -67
  140. package/dist/runtime/vnode.js +17 -12
  141. package/dist/runtime/vnode.js.map +1 -1
  142. package/dist/select/index.d.ts +19 -0
  143. package/dist/select/index.js +95 -0
  144. package/dist/select/index.js.map +1 -0
  145. package/dist/select/keydown.js.map +1 -0
  146. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +5 -7
  147. package/dist/{components/select/select.js → select/primitives.js} +11 -63
  148. package/dist/select/primitives.js.map +1 -0
  149. package/dist/server/stream.js +22 -29
  150. package/dist/server/stream.js.map +1 -1
  151. package/dist/shared/focus-styles.d.ts +1 -0
  152. package/dist/shared/focus-styles.js +2 -0
  153. package/dist/shared/focus-styles.js.map +1 -0
  154. package/dist/shared/icons.d.ts +9 -0
  155. package/dist/shared/icons.js +42 -0
  156. package/dist/shared/icons.js.map +1 -0
  157. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  158. package/dist/shared/listbox-popover-styles.js +137 -0
  159. package/dist/shared/listbox-popover-styles.js.map +1 -0
  160. package/dist/shared/style-values.d.ts +78 -0
  161. package/dist/shared/style-values.js +88 -0
  162. package/dist/shared/style-values.js.map +1 -0
  163. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  164. package/dist/shared/typeahead.js.map +1 -0
  165. package/dist/shared/wait-for-css-transition.js.map +1 -0
  166. package/dist/shared/wait.js.map +1 -0
  167. package/dist/style/css-mixin.js +3 -3
  168. package/dist/style/index.js +2 -2
  169. package/dist/style/style.js +25 -6
  170. package/dist/style/style.js.map +1 -1
  171. package/dist/style/stylesheet.d.ts +0 -1
  172. package/dist/style/stylesheet.js +13 -54
  173. package/dist/style/stylesheet.js.map +1 -1
  174. package/dist/tabs/index.d.ts +32 -0
  175. package/dist/tabs/index.js +157 -0
  176. package/dist/tabs/index.js.map +1 -0
  177. package/dist/tabs/primitives.d.ts +57 -0
  178. package/dist/tabs/primitives.js +238 -0
  179. package/dist/tabs/primitives.js.map +1 -0
  180. package/dist/test.js +1 -1
  181. package/dist/toggle/index.d.ts +9 -0
  182. package/dist/toggle/index.js +108 -0
  183. package/dist/toggle/index.js.map +1 -0
  184. package/dist/toggle/primitives.d.ts +29 -0
  185. package/dist/toggle/primitives.js +127 -0
  186. package/dist/toggle/primitives.js.map +1 -0
  187. package/package.json +81 -49
  188. package/src/{components/accordion → accordion}/README.md +50 -14
  189. package/src/accordion/index.tsx +285 -0
  190. package/src/accordion/primitives.tsx +512 -0
  191. package/src/{components/anchor → anchor}/README.md +37 -2
  192. package/src/animation/animate-mixins.ts +3 -3
  193. package/src/animation/demos/color-interpolation.tsx +1 -1
  194. package/src/animation/demos/reordering.tsx +9 -6
  195. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  196. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  197. package/src/button/README.md +44 -0
  198. package/src/button/index.ts +168 -0
  199. package/src/checkbox/README.md +59 -0
  200. package/src/checkbox/index.ts +164 -0
  201. package/src/{components/combobox → combobox}/README.md +58 -9
  202. package/src/combobox/index.tsx +112 -0
  203. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  204. package/src/dev/refresh.ts +1 -0
  205. package/src/index.ts +1 -1
  206. package/src/input/README.md +52 -0
  207. package/src/input/index.ts +147 -0
  208. package/src/{components/listbox → listbox}/README.md +9 -41
  209. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  210. package/src/{components/menu → menu}/README.md +55 -14
  211. package/src/menu/index.tsx +354 -0
  212. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
  213. package/src/{components/popover → popover}/README.md +20 -39
  214. package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
  215. package/src/{utils → popover}/scroll-lock.ts +0 -28
  216. package/src/radio/README.md +53 -0
  217. package/src/radio/index.ts +101 -0
  218. package/src/runtime/client-entry-boundary.ts +54 -0
  219. package/src/runtime/component.ts +65 -16
  220. package/src/runtime/core/attributes.ts +35 -1
  221. package/src/runtime/core/children.ts +24 -2
  222. package/src/runtime/core/vnode.ts +25 -4
  223. package/src/runtime/create-element.ts +6 -5
  224. package/src/runtime/demos/readme.demo.tsx +20 -18
  225. package/src/runtime/diff-dom.ts +358 -243
  226. package/src/runtime/dom.ts +331 -214
  227. package/src/runtime/element-function.ts +1 -0
  228. package/src/runtime/event-listeners.ts +1 -1
  229. package/src/runtime/form-navigation.ts +184 -0
  230. package/src/runtime/frame-resolution.ts +13 -0
  231. package/src/runtime/frame.ts +482 -124
  232. package/src/runtime/jsx.ts +3 -5
  233. package/src/runtime/key.ts +1 -0
  234. package/src/runtime/mixins/link-mixin.ts +1 -0
  235. package/src/runtime/mixins/mixin.ts +21 -18
  236. package/src/runtime/navigation.ts +204 -30
  237. package/src/runtime/reconcile.ts +769 -760
  238. package/src/runtime/refresh.ts +46 -0
  239. package/src/runtime/run.ts +12 -2
  240. package/src/runtime/scheduler.ts +9 -29
  241. package/src/runtime/to-vnode.ts +85 -23
  242. package/src/runtime/vdom.ts +91 -69
  243. package/src/runtime/vnode.ts +192 -88
  244. package/src/{components/select → select}/README.md +29 -19
  245. package/src/select/index.tsx +159 -0
  246. package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
  247. package/src/server/stream.ts +25 -31
  248. package/src/shared/focus-styles.ts +2 -0
  249. package/src/shared/icons.tsx +62 -0
  250. package/src/shared/listbox-popover-styles.ts +146 -0
  251. package/src/shared/style-values.ts +165 -0
  252. package/src/style/style.ts +25 -6
  253. package/src/style/stylesheet.ts +32 -57
  254. package/src/tabs/README.md +141 -0
  255. package/src/tabs/index.tsx +245 -0
  256. package/src/tabs/primitives.ts +365 -0
  257. package/src/test/README.md +151 -60
  258. package/src/toggle/README.md +56 -0
  259. package/src/toggle/index.tsx +136 -0
  260. package/src/toggle/primitives.ts +192 -0
  261. package/dist/animation/demos/animation.demo.d.ts +0 -5
  262. package/dist/animation/demos/animation.demo.js +0 -92
  263. package/dist/animation/demos/animation.demo.js.map +0 -1
  264. package/dist/animation/demos/spring.demo.d.ts +0 -6
  265. package/dist/animation/demos/spring.demo.js +0 -304
  266. package/dist/animation/demos/spring.demo.js.map +0 -1
  267. package/dist/components/accordion/accordion.d.ts +0 -92
  268. package/dist/components/accordion/accordion.js +0 -335
  269. package/dist/components/accordion/accordion.js.map +0 -1
  270. package/dist/components/accordion/demos/card.demo.d.ts +0 -7
  271. package/dist/components/accordion/demos/card.demo.js +0 -59
  272. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  273. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
  274. package/dist/components/accordion/demos/multiple.demo.js +0 -20
  275. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  276. package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
  277. package/dist/components/accordion/demos/overview.demo.js +0 -20
  278. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  279. package/dist/components/anchor/anchor.js.map +0 -1
  280. package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
  281. package/dist/components/breadcrumbs/basic.demo.js +0 -15
  282. package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
  283. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  284. package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
  285. package/dist/components/breadcrumbs/separator.demo.js +0 -15
  286. package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
  287. package/dist/components/button/button.d.ts +0 -105
  288. package/dist/components/button/button.js +0 -207
  289. package/dist/components/button/button.js.map +0 -1
  290. package/dist/components/button/demos/aliases.demo.d.ts +0 -7
  291. package/dist/components/button/demos/aliases.demo.js +0 -19
  292. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  293. package/dist/components/button/demos/basic.demo.d.ts +0 -7
  294. package/dist/components/button/demos/basic.demo.js +0 -20
  295. package/dist/components/button/demos/basic.demo.js.map +0 -1
  296. package/dist/components/button/demos/states.demo.d.ts +0 -7
  297. package/dist/components/button/demos/states.demo.js +0 -30
  298. package/dist/components/button/demos/states.demo.js.map +0 -1
  299. package/dist/components/combobox/combobox.js.map +0 -1
  300. package/dist/components/combobox/overview.demo.d.ts +0 -7
  301. package/dist/components/combobox/overview.demo.js +0 -154
  302. package/dist/components/combobox/overview.demo.js.map +0 -1
  303. package/dist/components/glyph/glyph.d.ts +0 -14
  304. package/dist/components/glyph/glyph.js +0 -65
  305. package/dist/components/glyph/glyph.js.map +0 -1
  306. package/dist/components/listbox/listbox.js.map +0 -1
  307. package/dist/components/listbox/overview.demo.d.ts +0 -7
  308. package/dist/components/listbox/overview.demo.js +0 -65
  309. package/dist/components/listbox/overview.demo.js.map +0 -1
  310. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
  311. package/dist/components/menu/demos/bubbling.demo.js +0 -16
  312. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  313. package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
  314. package/dist/components/menu/demos/context-trigger.demo.js +0 -87
  315. package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
  316. package/dist/components/menu/demos/overview.demo.d.ts +0 -7
  317. package/dist/components/menu/demos/overview.demo.js +0 -33
  318. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  319. package/dist/components/menu/hover-aim.js.map +0 -1
  320. package/dist/components/menu/menu.js.map +0 -1
  321. package/dist/components/popover/overview.demo.d.ts +0 -7
  322. package/dist/components/popover/overview.demo.js +0 -65
  323. package/dist/components/popover/overview.demo.js.map +0 -1
  324. package/dist/components/popover/popover.js.map +0 -1
  325. package/dist/components/select/deconstructed.demo.d.ts +0 -7
  326. package/dist/components/select/deconstructed.demo.js +0 -54
  327. package/dist/components/select/deconstructed.demo.js.map +0 -1
  328. package/dist/components/select/overview.demo.d.ts +0 -6
  329. package/dist/components/select/overview.demo.js +0 -28
  330. package/dist/components/select/overview.demo.js.map +0 -1
  331. package/dist/components/select/select.js.map +0 -1
  332. package/dist/components/separator/separator.d.ts +0 -2
  333. package/dist/components/separator/separator.js +0 -15
  334. package/dist/components/separator/separator.js.map +0 -1
  335. package/dist/components/tabs/tabs.d.ts +0 -78
  336. package/dist/components/tabs/tabs.js +0 -339
  337. package/dist/components/tabs/tabs.js.map +0 -1
  338. package/dist/interactions/keydown/keydown.js.map +0 -1
  339. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  340. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  341. package/dist/runtime/demos/basic.demo.d.ts +0 -6
  342. package/dist/runtime/demos/basic.demo.js +0 -16
  343. package/dist/runtime/demos/basic.demo.js.map +0 -1
  344. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
  345. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
  346. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
  347. package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
  348. package/dist/runtime/demos/keyed-list.demo.js +0 -62
  349. package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
  350. package/dist/runtime/demos/readme.demo.d.ts +0 -5
  351. package/dist/runtime/demos/readme.demo.js +0 -396
  352. package/dist/runtime/demos/readme.demo.js.map +0 -1
  353. package/dist/theme/contract.d.ts +0 -61
  354. package/dist/theme/contract.js +0 -131
  355. package/dist/theme/contract.js.map +0 -1
  356. package/dist/theme/glyph-contract.d.ts +0 -11
  357. package/dist/theme/glyph-contract.js +0 -34
  358. package/dist/theme/glyph-contract.js.map +0 -1
  359. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  360. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  361. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  362. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  363. package/dist/theme/presets/rmx-01/index.js +0 -119
  364. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  365. package/dist/theme/runtime.d.ts +0 -2
  366. package/dist/theme/runtime.js +0 -84
  367. package/dist/theme/runtime.js.map +0 -1
  368. package/dist/theme/theme.d.ts +0 -6
  369. package/dist/theme/theme.js +0 -5
  370. package/dist/theme/theme.js.map +0 -1
  371. package/dist/utils/flash-attribute.js.map +0 -1
  372. package/dist/utils/scroll-lock.d.ts +0 -3
  373. package/dist/utils/scroll-lock.js.map +0 -1
  374. package/dist/utils/wait-for-css-transition.js.map +0 -1
  375. package/dist/utils/wait.js.map +0 -1
  376. package/src/animation/demos/animation.demo.tsx +0 -194
  377. package/src/animation/demos/spring.demo.tsx +0 -385
  378. package/src/components/accordion/accordion.tsx +0 -565
  379. package/src/components/accordion/demos/card.demo.tsx +0 -114
  380. package/src/components/accordion/demos/multiple.demo.tsx +0 -57
  381. package/src/components/accordion/demos/overview.demo.tsx +0 -57
  382. package/src/components/breadcrumbs/basic.demo.tsx +0 -18
  383. package/src/components/breadcrumbs/separator.demo.tsx +0 -19
  384. package/src/components/button/README.md +0 -44
  385. package/src/components/button/button.tsx +0 -286
  386. package/src/components/button/demos/aliases.demo.tsx +0 -28
  387. package/src/components/button/demos/basic.demo.tsx +0 -31
  388. package/src/components/button/demos/states.demo.tsx +0 -53
  389. package/src/components/combobox/overview.demo.tsx +0 -200
  390. package/src/components/glyph/README.md +0 -72
  391. package/src/components/glyph/glyph.tsx +0 -110
  392. package/src/components/listbox/overview.demo.tsx +0 -102
  393. package/src/components/menu/demos/bubbling.demo.tsx +0 -35
  394. package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
  395. package/src/components/menu/demos/overview.demo.tsx +0 -77
  396. package/src/components/popover/overview.demo.tsx +0 -144
  397. package/src/components/select/deconstructed.demo.tsx +0 -96
  398. package/src/components/select/overview.demo.tsx +0 -52
  399. package/src/components/separator/separator.ts +0 -19
  400. package/src/components/tabs/README.md +0 -105
  401. package/src/components/tabs/tabs.tsx +0 -504
  402. package/src/runtime/demos/basic.demo.tsx +0 -21
  403. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
  404. package/src/runtime/demos/keyed-list.demo.tsx +0 -94
  405. package/src/theme/README.md +0 -103
  406. package/src/theme/contract.ts +0 -215
  407. package/src/theme/glyph-contract.ts +0 -59
  408. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  409. package/src/theme/presets/rmx-01/index.ts +0 -123
  410. package/src/theme/runtime.ts +0 -119
  411. package/src/theme/theme.ts +0 -15
  412. package/src/utils/scroll-lock/README.md +0 -33
  413. /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
  414. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  415. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  416. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  417. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  418. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  419. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  420. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  421. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  422. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  423. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  424. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  425. /package/dist/{utils → shared}/wait.d.ts +0 -0
  426. /package/dist/{utils → shared}/wait.js +0 -0
  427. /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
  428. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  429. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  430. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  431. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  432. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  433. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  434. /package/src/{utils → shared}/wait.ts +0 -0
@@ -2,12 +2,13 @@
2
2
 
3
3
  `Menu` renders a button-triggered menu with keyboard navigation, checked items, selection events, and nested submenus. Use it for action menus and command groups.
4
4
 
5
- ## Usage
5
+ ## Component Usage
6
6
 
7
7
  ```tsx
8
8
  import type { Handle } from 'remix/ui'
9
- import { Menu, MenuItem, Submenu, onMenuSelect } from 'remix/ui/menu'
10
- import { separatorStyle } from 'remix/ui/separator'
9
+ import { css } from 'remix/ui'
10
+ import { Menu, MenuItem, Submenu } from 'remix/ui/menu'
11
+ import { onMenuSelect } from 'remix/ui/menu/primitives'
11
12
 
12
13
  export function ViewMenu(handle: Handle) {
13
14
  let wordWrap = false
@@ -50,6 +51,12 @@ export function ViewMenu(handle: Handle) {
50
51
  </Menu>
51
52
  )
52
53
  }
54
+
55
+ let separatorStyle = css({
56
+ border: 0,
57
+ borderBlockStart: '1px solid #e5e7eb',
58
+ marginBlock: '4px',
59
+ })
53
60
  ```
54
61
 
55
62
  Use `label` or `searchValue` when the rendered item content is not the text that should be used for event labels or typeahead.
@@ -71,8 +78,8 @@ Use `menuLabel` when the menu surface needs a different accessible label from th
71
78
  Use `menu.contextTrigger()` with `menu.Context` and `MenuList` when a menu should open at the right-click location of an element.
72
79
 
73
80
  ```tsx
74
- import * as menu from 'remix/ui/menu'
75
81
  import { MenuItem, MenuList } from 'remix/ui/menu'
82
+ import * as menu from 'remix/ui/menu/primitives'
76
83
 
77
84
  export function FileContextMenu(handle: Handle) {
78
85
  return () => (
@@ -89,20 +96,54 @@ export function FileContextMenu(handle: Handle) {
89
96
  }
90
97
  ```
91
98
 
92
- Attach `onMenuSelect(...)` to `MenuList` or a shared ancestor when using lower-level context menu composition.
99
+ Attach `onMenuSelect(...)` from `remix/ui/menu/primitives` to `MenuList` or a shared ancestor when using lower-level context menu composition.
100
+
101
+ ## Primitive Usage
102
+
103
+ Use only the lower-level primitives when app code owns the trigger, surface, and item markup:
104
+
105
+ ```tsx
106
+ import * as menu from 'remix/ui/menu/primitives'
107
+ import { itemStyle, listStyle, popoverStyle, triggerStyle } from './menu.styles'
108
+
109
+ export function PrimitiveMenu() {
110
+ return (
111
+ <menu.Context label="Project actions">
112
+ <button mix={[triggerStyle, menu.trigger()]} type="button">
113
+ Actions
114
+ </button>
115
+ <div mix={[popoverStyle, menu.popover()]}>
116
+ <div mix={[listStyle, menu.list()]}>
117
+ <div mix={[itemStyle, menu.item({ name: 'rename' })]}>Rename</div>
118
+ <div mix={[itemStyle, menu.item({ disabled: true, name: 'archive' })]}>Archive</div>
119
+ </div>
120
+ </div>
121
+ </menu.Context>
122
+ )
123
+ }
124
+ ```
93
125
 
94
- ## `menu.*`
126
+ ## `remix/ui/menu`
95
127
 
96
128
  - `Menu`: composed trigger, popover, and list component for the common menu case.
97
- - `MenuItem`: menu item wrapper. Supports regular, checkbox, and radio item roles through `type`, `checked`, `name`, `value`, `label`, `disabled`, and `searchValue`.
98
- - `Submenu`: nested menu wrapper with its own trigger and child menu surface.
99
- - `MenuList`: lower-level list wrapper for custom composition.
129
+ - `MenuItem`: menu item component. Supports regular, checkbox, and radio item roles through `type`, `checked`, `name`, `value`, `label`, `disabled`, and `searchValue`.
130
+ - `Submenu`: nested menu component with its own trigger and child menu surface.
131
+ - `MenuList`: lower-level styled list component for custom composition inside `menu.Context`.
132
+ - `buttonStyle`, `popoverStyle`, `listStyle`, `itemStyle`, `itemSlotStyle`, `itemLabelStyle`, `itemIndicatorStyle`, and `triggerIndicatorStyle`: flat style mixins used by the component markup.
133
+ - `MenuProps`, `MenuItemProps`, `MenuListProps`, and `SubmenuProps`: public TypeScript props for the composed APIs.
134
+
135
+ ## `remix/ui/menu/primitives`
136
+
137
+ - `Context`: lower-level provider for custom menu composition.
138
+ - `trigger()`: wires a button-style trigger to open the root menu.
139
+ - `contextTrigger()`: opens the root menu from a `contextmenu` event at pointer coordinates, or from keyboard context-menu shortcuts.
140
+ - `popover()`: wires the menu popover surface.
141
+ - `list()`: wires the menu list root, focus handling, keyboard navigation, and typeahead.
142
+ - `item(...)`: registers one menu item. Supports regular, checkbox, and radio roles through `type`, `checked`, `name`, `value`, `label`, `disabled`, and `searchValue`.
143
+ - `submenuTrigger(...)`: registers a menu item that opens a child menu.
100
144
  - `onMenuSelect(...)`: event mixin for the bubbling `MenuSelectEvent`.
101
- - `MenuSelectEvent`: bubbling event class whose `item` describes the selected item.
102
- - `MenuSelectItem`: selected item shape with `checked`, `id`, `label`, `name`, `type`, and `value`.
103
- - `menu.Context`, `menu.trigger()`, `menu.contextTrigger()`, `menu.popover()`, `menu.list()`, `menu.item(...)`, and `menu.submenuTrigger(...)`: lower-level composition primitives.
104
- - `buttonStyle`, `popoverStyle`, `listStyle`, `itemStyle`, `itemSlotStyle`, `itemLabelStyle`, `itemGlyphStyle`, and `triggerGlyphStyle`: flat style mixins used by the wrappers.
105
- - `MenuProps`, `MenuItemProps`, `MenuListProps`, `MenuProviderProps`, `MenuTriggerOptions`, `MenuContextTriggerOptions`, `MenuItemOptions`, and `SubmenuProps`: public TypeScript props and option types.
145
+ - `MenuSelectEvent`: bubbling event whose `item` describes the selected item.
146
+ - `MenuSelectItem`, `MenuProviderProps`, `MenuTriggerOptions`, `MenuContextTriggerOptions`, `MenuItemOptions`, and `SubmenuTriggerOptions`: public TypeScript event, prop, and option types for the primitives.
106
147
 
107
148
  ## Behavior Notes
108
149
 
@@ -0,0 +1,354 @@
1
+ import { createElement, css, ref } from '@remix-run/ui'
2
+ import type { CSSMixinDescriptor, Handle, Props, RemixNode } from '@remix-run/ui'
3
+
4
+ import button from '@remix-run/ui/button'
5
+ import * as menu from '@remix-run/ui/menu/primitives'
6
+ import type { SearchValue } from '../shared/typeahead.ts'
7
+ import { CheckIcon, ChevronDownIcon, ChevronRightIcon } from '../shared/icons.tsx'
8
+ import { popoverSurfaceStyle } from '../shared/listbox-popover-styles.ts'
9
+ import { componentStyleValues as styles } from '../shared/style-values.ts'
10
+
11
+ const menuButtonCss: CSSMixinDescriptor = css({
12
+ display: 'grid',
13
+ gridTemplateColumns: 'minmax(0, 1fr) auto',
14
+ alignItems: 'center',
15
+ borderRadius: styles.radius.md,
16
+ paddingInlineEnd: styles.space.sm,
17
+ textAlign: 'left',
18
+ '&[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible': {
19
+ backgroundColor: styles.surface.lvl3,
20
+ color: styles.colors.text.primary,
21
+ },
22
+ })
23
+
24
+ const menuButtonLabelCss: CSSMixinDescriptor = css({
25
+ display: 'inline-flex',
26
+ alignItems: 'center',
27
+ minWidth: 0,
28
+ })
29
+
30
+ const menuButtonIconCss: CSSMixinDescriptor = css({
31
+ display: 'inline-flex',
32
+ alignItems: 'center',
33
+ justifyContent: 'center',
34
+ width: styles.fontSize.md,
35
+ height: styles.fontSize.md,
36
+ color: 'currentColor',
37
+ flexShrink: 0,
38
+ '& > svg': {
39
+ display: 'block',
40
+ width: '100%',
41
+ height: '100%',
42
+ },
43
+ })
44
+
45
+ const menuPopoverCss: CSSMixinDescriptor = css({
46
+ '&[data-menu-submenu="true"][data-anchor-placement^="right"]': {
47
+ marginLeft: `calc(${styles.space.xs} * -1)`,
48
+ },
49
+ '&[data-menu-submenu="true"][data-anchor-placement^="left"]': {
50
+ marginLeft: styles.space.xs,
51
+ },
52
+ '&[data-close-animation="none"]:not(:popover-open)': {
53
+ transition: 'none',
54
+ transitionBehavior: 'normal',
55
+ },
56
+ })
57
+
58
+ const menuListCss: CSSMixinDescriptor = css({
59
+ display: 'flex',
60
+ flexDirection: 'column',
61
+ flex: '1 1 auto',
62
+ minHeight: 0,
63
+ paddingBlock: styles.space.xs,
64
+ paddingInline: styles.space.none,
65
+ overflow: 'auto',
66
+ overscrollBehavior: 'contain',
67
+ outline: 'none',
68
+ userSelect: 'none',
69
+ WebkitUserSelect: 'none',
70
+ '--rmx-ui-item-inset': `calc(${styles.space.sm} + ${styles.space.xs})`,
71
+ '--rmx-ui-item-indicator-gap': 'var(--rmx-menu-item-slot-gap)',
72
+ '--rmx-ui-item-indicator-width': 'var(--rmx-menu-item-slot-width)',
73
+ '--rmx-menu-item-slot-gap': styles.space.none,
74
+ '--rmx-menu-item-slot-width': styles.space.none,
75
+ '&:has(> [role="menuitemcheckbox"])': {
76
+ '--rmx-menu-item-slot-gap': styles.space.xs,
77
+ '--rmx-menu-item-slot-width': styles.fontSize.md,
78
+ },
79
+ '&:has(> [role="menuitemradio"])': {
80
+ '--rmx-menu-item-slot-gap': styles.space.xs,
81
+ '--rmx-menu-item-slot-width': styles.fontSize.md,
82
+ },
83
+ })
84
+
85
+ const menuItemCss: CSSMixinDescriptor = css({
86
+ display: 'flex',
87
+ alignItems: 'center',
88
+ width: '100%',
89
+ minWidth: 0,
90
+ minHeight: styles.control.height.md,
91
+ boxSizing: 'border-box',
92
+ position: 'relative',
93
+ isolation: 'isolate',
94
+ paddingInline: `calc(${styles.space.sm} + ${styles.space.xs})`,
95
+ color: styles.colors.text.primary,
96
+ fontFamily: styles.fontFamily.sans,
97
+ fontSize: styles.fontSize.sm,
98
+ fontWeight: styles.fontWeight.normal,
99
+ lineHeight: styles.lineHeight.normal,
100
+ textAlign: 'left',
101
+ userSelect: 'none',
102
+ WebkitUserSelect: 'none',
103
+ '--rmx-menu-item-indicator-opacity': '0',
104
+ '&::before': {
105
+ content: '""',
106
+ position: 'absolute',
107
+ insetBlock: 0,
108
+ insetInline: styles.space.xs,
109
+ borderRadius: styles.radius.md,
110
+ backgroundColor: 'transparent',
111
+ pointerEvents: 'none',
112
+ zIndex: -1,
113
+ },
114
+ '&:focus': {
115
+ outline: 'none',
116
+ },
117
+ '&[data-highlighted="true"]': {
118
+ color: styles.colors.action.primary.foreground,
119
+ },
120
+ '&[data-highlighted="true"]::before': {
121
+ backgroundColor: styles.colors.action.primary.background,
122
+ },
123
+ '&[aria-haspopup="menu"][aria-expanded="true"]:not(:focus)': {
124
+ color: styles.colors.text.primary,
125
+ },
126
+ '&[aria-haspopup="menu"][aria-expanded="true"]:not(:focus)::before': {
127
+ backgroundColor: styles.surface.lvl2,
128
+ },
129
+ '&[data-submenu-state="selecting"], &[data-submenu-state="dismissing"]': {
130
+ color: styles.colors.text.primary,
131
+ },
132
+ '&[data-submenu-state="selecting"]::before, &[data-submenu-state="dismissing"]::before': {
133
+ backgroundColor: styles.surface.lvl2,
134
+ },
135
+ '&[data-menu-flash="true"]': {
136
+ color: styles.colors.text.primary,
137
+ },
138
+ '&[data-menu-flash="true"]::before': {
139
+ backgroundColor: 'transparent',
140
+ },
141
+ '&[aria-disabled="true"]': {
142
+ opacity: 0.5,
143
+ },
144
+ '&[aria-checked="true"], &[aria-selected="true"]': {
145
+ '--rmx-menu-item-indicator-opacity': '1',
146
+ },
147
+ })
148
+
149
+ const menuItemSlotCss: CSSMixinDescriptor = css({
150
+ display: 'inline-flex',
151
+ alignItems: 'center',
152
+ justifyContent: 'center',
153
+ flex: '0 0 var(--rmx-menu-item-slot-width)',
154
+ width: 'var(--rmx-menu-item-slot-width)',
155
+ minWidth: 0,
156
+ marginInlineEnd: 'var(--rmx-menu-item-slot-gap)',
157
+ overflow: 'hidden',
158
+ })
159
+
160
+ const menuItemLabelCss: CSSMixinDescriptor = css({
161
+ display: 'inline-flex',
162
+ alignItems: 'center',
163
+ flex: '1 1 auto',
164
+ minWidth: 0,
165
+ })
166
+
167
+ const menuItemIndicatorCss: CSSMixinDescriptor = css({
168
+ display: 'inline-flex',
169
+ alignItems: 'center',
170
+ justifyContent: 'center',
171
+ width: styles.fontSize.md,
172
+ height: styles.fontSize.md,
173
+ color: 'currentColor',
174
+ flexShrink: 0,
175
+ '& > svg': {
176
+ display: 'block',
177
+ width: '100%',
178
+ height: '100%',
179
+ },
180
+ opacity: 'var(--rmx-menu-item-indicator-opacity)',
181
+ })
182
+
183
+ const menuTriggerIndicatorCss: CSSMixinDescriptor = css({
184
+ display: 'inline-flex',
185
+ alignItems: 'center',
186
+ justifyContent: 'center',
187
+ width: styles.fontSize.md,
188
+ height: styles.fontSize.md,
189
+ color: 'currentColor',
190
+ flexShrink: 0,
191
+ marginInlineStart: 'auto',
192
+ '& > svg': {
193
+ display: 'block',
194
+ width: '100%',
195
+ height: '100%',
196
+ },
197
+ })
198
+
199
+ export const buttonStyle = menuButtonCss
200
+ export const popoverStyle = menuPopoverCss
201
+ export const listStyle = menuListCss
202
+ export const itemStyle = menuItemCss
203
+ export const itemSlotStyle = menuItemSlotCss
204
+ export const itemLabelStyle = menuItemLabelCss
205
+ export const itemIndicatorStyle = menuItemIndicatorCss
206
+ export const triggerIndicatorStyle = menuTriggerIndicatorCss
207
+
208
+ export interface MenuListProps extends Props<'div'> {}
209
+
210
+ type MenuListChildProps = Omit<
211
+ JSX.LibraryManagedAttributes<typeof MenuList, MenuListProps>,
212
+ 'children'
213
+ >
214
+
215
+ export interface MenuProps extends Omit<Props<'button'>, 'children'> {
216
+ children?: RemixNode
217
+ label: RemixNode
218
+ menuLabel?: string
219
+ }
220
+
221
+ export interface MenuItemProps extends Omit<Props<'div'>, 'children' | 'name' | 'type' | 'value'> {
222
+ checked?: boolean
223
+ children?: RemixNode
224
+ disabled?: boolean
225
+ label?: string
226
+ name: string
227
+ searchValue?: SearchValue
228
+ type?: 'checkbox' | 'radio'
229
+ value?: string
230
+ }
231
+
232
+ export interface SubmenuProps extends Omit<Props<'div'>, 'children' | 'name' | 'type' | 'value'> {
233
+ children?: RemixNode
234
+ disabled?: boolean
235
+ label: RemixNode
236
+ listProps?: MenuListChildProps
237
+ menuLabel?: string
238
+ searchValue?: SearchValue
239
+ value?: string
240
+ }
241
+
242
+ export function Menu(handle: Handle<MenuProps>): () => RemixNode {
243
+ let buttonRef: HTMLButtonElement | undefined
244
+
245
+ return () => {
246
+ let { children, label, menuLabel, mix, type, ...buttonProps } = handle.props
247
+
248
+ return (
249
+ <menu.Context label={menuLabel}>
250
+ <button
251
+ {...buttonProps}
252
+ type={type ?? 'button'}
253
+ mix={[
254
+ button(),
255
+ buttonStyle,
256
+ menu.trigger(),
257
+ ref((node: HTMLButtonElement, signal) => {
258
+ buttonRef = node
259
+ signal.addEventListener('abort', () => {
260
+ if (buttonRef === node) {
261
+ buttonRef = undefined
262
+ }
263
+ })
264
+ }),
265
+ mix,
266
+ ]}
267
+ >
268
+ <span mix={menuButtonLabelCss}>{label}</span>
269
+ <ChevronDownIcon mix={menuButtonIconCss} />
270
+ </button>
271
+ <MenuList
272
+ mix={menu.onMenuSelect((event) => {
273
+ if (!buttonRef) {
274
+ return
275
+ }
276
+
277
+ event.stopPropagation()
278
+ buttonRef.dispatchEvent(new menu.MenuSelectEvent(event.item))
279
+ })}
280
+ >
281
+ {children}
282
+ </MenuList>
283
+ </menu.Context>
284
+ )
285
+ }
286
+ }
287
+
288
+ export function MenuList(handle: Handle<MenuListProps>): () => RemixNode {
289
+ return () => {
290
+ let { children, mix, ...divProps } = handle.props
291
+
292
+ return (
293
+ <div mix={[popoverSurfaceStyle, popoverStyle, menu.popover()]}>
294
+ <div {...divProps} mix={[listStyle, menu.list(), mix]}>
295
+ {children}
296
+ </div>
297
+ </div>
298
+ )
299
+ }
300
+ }
301
+
302
+ export function MenuItem(handle: Handle<MenuItemProps>): () => RemixNode {
303
+ return () => {
304
+ let { checked, children, disabled, label, mix, name, searchValue, type, value, ...divProps } =
305
+ handle.props
306
+
307
+ return (
308
+ <div
309
+ {...divProps}
310
+ mix={[
311
+ itemStyle,
312
+ menu.item({ checked, disabled, label, name, searchValue, type, value }),
313
+ mix,
314
+ ]}
315
+ >
316
+ <span mix={itemSlotStyle}>
317
+ <CheckIcon mix={itemIndicatorStyle} />
318
+ </span>
319
+ <span mix={itemLabelStyle}>{children ?? label}</span>
320
+ </div>
321
+ )
322
+ }
323
+ }
324
+
325
+ export function Submenu(handle: Handle<SubmenuProps>): () => RemixNode {
326
+ return () => {
327
+ let { children, disabled, label, listProps, menuLabel, mix, searchValue, value, ...divProps } =
328
+ handle.props
329
+
330
+ return (
331
+ <menu.Context label={menuLabel}>
332
+ <div
333
+ {...divProps}
334
+ mix={[
335
+ itemStyle,
336
+ menu.submenuTrigger({
337
+ disabled,
338
+ searchValue,
339
+ value,
340
+ }),
341
+ mix,
342
+ ]}
343
+ >
344
+ <span mix={itemSlotStyle}>
345
+ <CheckIcon mix={itemIndicatorStyle} />
346
+ </span>
347
+ <span mix={itemLabelStyle}>{label}</span>
348
+ <ChevronRightIcon mix={triggerIndicatorStyle} />
349
+ </div>
350
+ <MenuList {...listProps}>{children}</MenuList>
351
+ </menu.Context>
352
+ )
353
+ }
354
+ }