@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
@@ -1,7 +1,13 @@
1
- import type { ComponentHandle, Component } from './component.ts'
2
- import { Fragment, Frame } from './component.ts'
1
+ import type { ComponentHandle, Fragment, Frame, FrameHandle, FrameProps } from './component.ts'
3
2
  import { isRemixElement } from './core/vnode.ts'
4
- import type { ElementProps, RemixNode } from './jsx.ts'
3
+ import type { Frame as FrameInstance } from './frame.ts'
4
+ import type { RemixNode } from './jsx.ts'
5
+ import type { ElementFunction } from './element-function.ts'
6
+ import type { Key } from './key.ts'
7
+ import type { MixinRuntimeState, MixinRuntimeValue } from './mixins/mixin.ts'
8
+ import type { OnMixinDescriptor } from './mixins/on-mixin.ts'
9
+ import type { Scheduler } from './scheduler.ts'
10
+ import type { StyleManager } from '../style/index.ts'
5
11
 
6
12
  export { isRemixElement }
7
13
 
@@ -9,136 +15,234 @@ export const TEXT_NODE = Symbol('TEXT_NODE')
9
15
  export const NON_RENDER_NODE = Symbol('NON_RENDER_NODE')
10
16
  export const ROOT_VNODE = Symbol('ROOT_VNODE')
11
17
 
12
- export type VNodeType =
13
- | typeof ROOT_VNODE
14
- | string // host element
15
- | Function // component
16
- | typeof TEXT_NODE
17
- | typeof NON_RENDER_NODE
18
- | typeof Fragment
19
- | typeof Frame
20
-
21
- export type VNode<T extends VNodeType = VNodeType> = {
22
- type: T
23
- props?: ElementProps
24
- _mixedProps?: ElementProps
25
- key?: string
26
-
27
- // _prefixes assigned during reconciliation
28
- _parent?: VNode
29
- _children?: VNode[]
30
- _dom?: unknown
31
- _controller?: AbortController
32
- _mixState?: unknown
33
- _directEventDescriptors?: unknown
34
- _directEventState?: unknown
35
- _controlledState?: unknown
36
- _svg?: boolean
37
- // Range roots render between comment boundary markers
38
- _rangeStart?: Node
39
- _rangeEnd?: Node
40
- _pendingHydrationComponentId?: string
41
- _frameInstance?: unknown
42
- _frameFallbackRoot?: { render: (element: RemixNode) => void; dispose: () => void }
43
- _frameResolveToken?: number
44
- _frameResolveController?: AbortController
45
- _frameResolved?: boolean
18
+ export type VNodeKind = 'root' | 'empty' | 'text' | 'fragment' | 'host' | 'component' | 'frame'
46
19
 
47
- // TEXT_NODE
48
- _text?: string
49
-
50
- // Component
51
- _handle?: ComponentHandle
52
- _id?: string
53
- _content?: VNode
20
+ export type RuntimeElementProps = {
21
+ [name: string]: unknown
22
+ }
54
23
 
55
- // Mixin-persisted node removal state
56
- _persistedByMixins?: boolean
57
- _persistedParentByMixins?: ParentNode
58
- _persistedRemovalToken?: number
24
+ export type RuntimeHostProps = RuntimeElementProps & {
25
+ children?: RemixNode
26
+ innerHTML?: string
27
+ mix?: MixinRuntimeValue
59
28
  }
60
29
 
61
- export type FragmentNode = VNode & {
62
- type: typeof Fragment
63
- _children: VNode[]
30
+ type InputNodeBase<kind extends VNodeKind, type> = {
31
+ kind: kind
32
+ type: type
33
+ key?: Key
34
+ _parent?: never
64
35
  }
65
36
 
66
- export type TextNode = VNode & {
67
- type: typeof TEXT_NODE
37
+ export type NonRenderNode = InputNodeBase<'empty', typeof NON_RENDER_NODE>
38
+
39
+ export type TextNode = InputNodeBase<'text', typeof TEXT_NODE> & {
68
40
  _text: string
69
41
  }
70
42
 
71
- export type NonRenderNode = VNode & {
72
- type: typeof NON_RENDER_NODE
43
+ export type FragmentNode = InputNodeBase<'fragment', typeof Fragment> & {
44
+ _children: VNodeInput[]
45
+ }
46
+
47
+ export type HostNode = InputNodeBase<'host', string> & {
48
+ props: RuntimeHostProps
49
+ _children: VNodeInput[]
50
+ }
51
+
52
+ export type ComponentNode = InputNodeBase<'component', ElementFunction> & {
53
+ props: RuntimeElementProps
54
+ }
55
+
56
+ export type FrameNode = InputNodeBase<'frame', typeof Frame> & {
57
+ props: RuntimeElementProps & FrameProps
73
58
  }
74
59
 
75
- export type CommittedTextNode = TextNode & {
60
+ export type VNodeInput =
61
+ | NonRenderNode
62
+ | TextNode
63
+ | FragmentNode
64
+ | HostNode
65
+ | ComponentNode
66
+ | FrameNode
67
+
68
+ type MountedNodeBase = {
69
+ _parent: VNodeParent
70
+ _svg: boolean
71
+ }
72
+
73
+ type CommittedNodeBase<kind extends VNodeKind, type> = {
74
+ kind: kind
75
+ type: type
76
+ key?: Key
77
+ } & MountedNodeBase
78
+
79
+ export type CommittedNonRenderNode = CommittedNodeBase<'empty', typeof NON_RENDER_NODE>
80
+
81
+ export type CommittedTextNode = CommittedNodeBase<'text', typeof TEXT_NODE> & {
82
+ _text: string
76
83
  _dom: Text
77
84
  }
78
85
 
79
- export type HostNode = VNode & {
86
+ export type ControlledReflectionState = {
87
+ disposed: boolean
88
+ listenersAttached: boolean
89
+ pendingRestoreVersion: number
90
+ managesValue: boolean
91
+ managesChecked: boolean
92
+ hasControlledValue: boolean
93
+ controlledValue: unknown
94
+ hasControlledChecked: boolean
95
+ controlledChecked: unknown
96
+ onInput(): void
97
+ onChange(): void
98
+ }
99
+
100
+ export type DirectEventBinding = {
80
101
  type: string
81
- props: ElementProps
82
- _children: VNode[]
102
+ handler: (event: Event, signal: AbortSignal) => void | Promise<void>
103
+ capture: boolean
104
+ stableHandler: ((event: Event) => void) | null
105
+ reentry: AbortController | null
106
+ }
107
+
108
+ export type DirectEventState = {
109
+ bindings: DirectEventBinding[]
110
+ }
111
+
112
+ export type HostPersistenceState = {
113
+ parent: ParentNode
114
+ token: number
83
115
  }
84
116
 
85
- export type CommittedHostNode = HostNode & {
117
+ export type CommittedHostNode = CommittedNodeBase<'host', string> & {
118
+ props: RuntimeHostProps
119
+ _children: CommittedVNode[]
86
120
  _dom: Element
87
- _controller?: AbortController
121
+ _mixedProps: RuntimeHostProps
122
+ _mixState?: MixinRuntimeState
123
+ _directEventDescriptors?: OnMixinDescriptor[]
124
+ _directEventState?: DirectEventState
125
+ _controlledState?: ControlledReflectionState
126
+ _persistence?: HostPersistenceState
88
127
  }
89
128
 
90
- export type ComponentNode = VNode & {
91
- type: Function
92
- props: ElementProps
93
- _handle: ComponentHandle
129
+ export type CommittedFragmentNode = CommittedNodeBase<'fragment', typeof Fragment> & {
130
+ _children: CommittedVNode[]
94
131
  }
95
132
 
96
- export type CommittedComponentNode = VNode & {
97
- type: Function
98
- props: ElementProps
99
- _content: VNode
133
+ export type MountingComponentNode = CommittedNodeBase<'component', ElementFunction> & {
134
+ props: RuntimeElementProps
100
135
  _handle: ComponentHandle
136
+ _context: ReconcileContext
137
+ }
138
+
139
+ export type CommittedComponentNode = MountingComponentNode & {
140
+ _content: CommittedVNode
101
141
  }
102
142
 
103
- export function isFragmentNode(node: VNode): node is FragmentNode {
104
- return node.type === Fragment
143
+ export interface FrameFallbackRoot {
144
+ render(element: RemixNode): void
145
+ dispose(): void
105
146
  }
106
147
 
107
- export function isTextNode(node: VNode): node is TextNode {
108
- return node.type === TEXT_NODE
148
+ export type FrameMountState = {
149
+ instance: FrameInstance
150
+ fallbackRoot?: FrameFallbackRoot
151
+ resolveToken: number
152
+ resolveController?: AbortController
153
+ resolved: boolean
109
154
  }
110
155
 
111
- export function isNonRenderNode(node: VNode): node is NonRenderNode {
112
- return node.type === NON_RENDER_NODE
156
+ export type CommittedFrameNode = CommittedNodeBase<'frame', typeof Frame> & {
157
+ props: RuntimeElementProps & FrameProps
158
+ _rangeStart: Comment
159
+ _rangeEnd: Comment
160
+ _state: FrameMountState
161
+ }
162
+
163
+ export type CommittedVNode =
164
+ | CommittedNonRenderNode
165
+ | CommittedTextNode
166
+ | CommittedFragmentNode
167
+ | CommittedHostNode
168
+ | CommittedComponentNode
169
+ | CommittedFrameNode
170
+
171
+ export type RootVNode = {
172
+ kind: 'root'
173
+ type: typeof ROOT_VNODE
174
+ _children: CommittedVNode[]
175
+ _svg: boolean
176
+ _rangeStart?: Node
177
+ _rangeEnd?: Node
178
+ _pendingHydrationComponentId?: string
113
179
  }
114
180
 
115
- export function isCommittedTextNode(node: VNode): node is CommittedTextNode {
116
- return isTextNode(node) && node._dom instanceof Text
181
+ export interface ReconcileContext {
182
+ frame: FrameHandle
183
+ scheduler: Scheduler
184
+ styles: StyleManager
185
+ rootTarget: EventTarget
117
186
  }
118
187
 
119
- export function isHostNode(node: VNode): node is HostNode {
120
- return typeof node.type === 'string'
188
+ export type VNodeParent =
189
+ | RootVNode
190
+ | CommittedFragmentNode
191
+ | CommittedHostNode
192
+ | MountingComponentNode
193
+ | CommittedComponentNode
194
+
195
+ export type VNode = VNodeInput | CommittedVNode | RootVNode | MountingComponentNode
196
+
197
+ export function isFragmentNode(node: VNode): node is FragmentNode | CommittedFragmentNode {
198
+ return node.kind === 'fragment'
121
199
  }
122
200
 
123
- export function isCommittedHostNode(node: VNode): node is CommittedHostNode {
124
- return isHostNode(node) && node._dom instanceof Element
201
+ export function isTextNode(node: VNode): node is TextNode | CommittedTextNode {
202
+ return node.kind === 'text'
125
203
  }
126
204
 
127
- export function isComponentNode(node: VNode): node is ComponentNode {
128
- return typeof node.type === 'function' && node.type !== Frame
205
+ export function isNonRenderNode(node: VNode): node is NonRenderNode | CommittedNonRenderNode {
206
+ return node.kind === 'empty'
207
+ }
208
+
209
+ export function isCommittedTextNode(node: CommittedVNode): node is CommittedTextNode {
210
+ return node.kind === 'text'
211
+ }
212
+
213
+ export function isHostNode(node: VNode): node is HostNode | CommittedHostNode {
214
+ return node.kind === 'host'
215
+ }
216
+
217
+ export function isCommittedHostNode(node: CommittedVNode): node is CommittedHostNode {
218
+ return node.kind === 'host'
219
+ }
220
+
221
+ export function isComponentNode(
222
+ node: VNode,
223
+ ): node is ComponentNode | MountingComponentNode | CommittedComponentNode {
224
+ return node.kind === 'component'
129
225
  }
130
226
 
131
227
  export function isCommittedComponentNode(node: VNode): node is CommittedComponentNode {
132
- return isComponentNode(node) && node._content !== undefined
228
+ return node.kind === 'component' && '_content' in node
229
+ }
230
+
231
+ export function isFrameNode(node: VNode): node is FrameNode | CommittedFrameNode {
232
+ return node.kind === 'frame'
233
+ }
234
+
235
+ export function isCommittedFrameNode(node: CommittedVNode): node is CommittedFrameNode {
236
+ return node.kind === 'frame'
133
237
  }
134
238
 
135
- export function findContextFromAncestry(node: VNode, type: Component): unknown {
136
- let current: VNode | undefined = node
239
+ export function findContextFromAncestry(node: VNodeParent, type: ElementFunction): unknown {
240
+ let current: VNodeParent | undefined = node
137
241
  while (current) {
138
- if (current.type === type && isComponentNode(current)) {
242
+ if (current.kind === 'component' && current.type === type) {
139
243
  return current._handle.getContextValue()
140
244
  }
141
- current = current._parent
245
+ current = '_parent' in current ? current._parent : undefined
142
246
  }
143
247
  return undefined
144
248
  }
@@ -2,10 +2,11 @@
2
2
 
3
3
  `Select` is a button-triggered popup value picker backed by `listbox` and `popover`. Use it when the user should choose one stable string value from a finite set.
4
4
 
5
- ## Usage
5
+ ## Component Usage
6
6
 
7
7
  ```tsx
8
- import { Option, Select, onSelectChange } from 'remix/ui/select'
8
+ import { Option, Select } from 'remix/ui/select'
9
+ import { onSelectChange } from 'remix/ui/select/primitives'
9
10
 
10
11
  export function FrameworkSelect() {
11
12
  return (
@@ -44,34 +45,34 @@ Use `textValue` when closed-trigger typeahead should match a different string fr
44
45
  </Select>
45
46
  ```
46
47
 
48
+ ## Primitive Usage
49
+
47
50
  Use the lower-level primitives when the trigger or popup structure needs to be owned by another component. Keep the same provider, trigger, popover, list, option, and hidden-input relationship.
48
51
 
49
52
  ```tsx
50
53
  import type { Handle } from 'remix/ui'
51
- import * as button from 'remix/ui/button'
52
- import * as listbox from 'remix/ui/listbox'
53
54
  import * as popover from 'remix/ui/popover'
54
- import * as select from 'remix/ui/select'
55
+ import { triggerStyle } from 'remix/ui/select'
56
+ import * as select from 'remix/ui/select/primitives'
57
+ import { listStyle, optionStyle, surfaceStyle } from './select.styles'
55
58
 
56
59
  function SelectValue(handle: Handle) {
57
60
  let context = handle.context.get(select.Context)
58
61
 
59
- return () => <span mix={button.labelStyle}>{context.displayedLabel}</span>
62
+ return () => <span>{context.displayedLabel}</span>
60
63
  }
61
64
 
62
65
  function IssueTypeSelect() {
63
66
  return () => (
64
- <select.Context defaultLabel="Select a type" name="issueType">
65
- <button type="button" mix={[button.baseStyle, select.triggerStyle, select.trigger()]}>
67
+ <select.Context defaultLabel="Select a type" labelSwapDelayMs={100} name="issueType">
68
+ <button type="button" mix={[triggerStyle, select.trigger()]}>
66
69
  <SelectValue />
67
70
  </button>
68
71
  <popover.Context>
69
- <div mix={[popover.surfaceStyle, select.popover()]}>
70
- <div mix={[popover.contentStyle, listbox.listStyle, select.list()]}>
71
- <div mix={[listbox.optionStyle, select.option({ label: 'Bug', value: 'bug' })]}>
72
- Bug
73
- </div>
74
- <div mix={[listbox.optionStyle, select.option({ label: 'Feature', value: 'feature' })]}>
72
+ <div mix={[surfaceStyle, select.popover()]}>
73
+ <div mix={[listStyle, select.list()]}>
74
+ <div mix={[optionStyle, select.option({ label: 'Bug', value: 'bug' })]}>Bug</div>
75
+ <div mix={[optionStyle, select.option({ label: 'Feature', value: 'feature' })]}>
75
76
  Feature
76
77
  </div>
77
78
  </div>
@@ -83,15 +84,24 @@ function IssueTypeSelect() {
83
84
  }
84
85
  ```
85
86
 
86
- ## `select.*`
87
+ ## `remix/ui/select`
87
88
 
88
89
  - `Select`: composed trigger, popover, listbox, option list, and optional hidden input for form participation. Accepts `defaultLabel`, `defaultValue`, `disabled`, `name`, and button props.
89
- - `Option`: option wrapper that renders the standard check glyph and label slot. Accepts `label`, `value`, optional `disabled`, and optional `textValue`.
90
+ - `Option`: option component that renders the standard check indicator and label slot. Accepts `label`, `value`, optional `disabled`, and optional `textValue`.
91
+ - `triggerStyle`: standard select trigger style for custom trigger composition.
92
+ - `SelectProps` and `SelectOptionProps`: public TypeScript props for the composed APIs.
93
+
94
+ ## `remix/ui/select/primitives`
95
+
96
+ - `Context`: lower-level provider for custom composition. Accepts `defaultLabel`, `defaultValue`, `disabled`, `name`, and primitive-only `labelSwapDelayMs`; the label-swap delay defaults to `75` milliseconds.
97
+ - `trigger()`: wires the trigger button, open behavior, closed-trigger typeahead, and trigger ARIA attributes.
98
+ - `popover()`: wires the popover surface and keeps its min-width synced to the trigger before open.
99
+ - `list()`: wires the listbox root used inside the popover.
100
+ - `option(...)`: registers one selectable option. Accepts `label`, `value`, optional `disabled`, and optional `textValue`.
101
+ - `hiddenInput()`: mirrors the selected value into a hidden input for form participation.
90
102
  - `onSelectChange(...)`: event mixin for the bubbling `SelectChangeEvent`.
91
- - `Context`, `trigger()`, `popover()`, `list()`, `option(...)`, and `hiddenInput()`: lower-level composition primitives.
92
- - `triggerStyle`: standard select trigger style.
93
103
  - `SelectChangeEvent`: event with `value`, `label`, and `optionId`.
94
- - `SelectProps`, `SelectContextProps`, and `SelectOptionProps`: public TypeScript props for the composed and lower-level APIs.
104
+ - `SelectContextProps`, `SelectProps`, and `SelectOptionProps`: primitive prop types for custom composition.
95
105
 
96
106
  ## Behavior Notes
97
107
 
@@ -0,0 +1,159 @@
1
+ import { createElement, css } from '@remix-run/ui'
2
+ import type { CSSMixinDescriptor, Handle, Props, RemixNode } from '@remix-run/ui'
3
+
4
+ import * as popover from '@remix-run/ui/popover'
5
+ import * as select from '@remix-run/ui/select/primitives'
6
+ import type { SearchValue } from '../shared/typeahead.ts'
7
+ import { CheckIcon, ChevronVerticalIcon } from '../shared/icons.tsx'
8
+ import {
9
+ listboxIndicatorStyle,
10
+ listboxLabelStyle,
11
+ listboxListStyle,
12
+ listboxOptionStyle,
13
+ popoverSurfaceStyle,
14
+ } from '../shared/listbox-popover-styles.ts'
15
+
16
+ export interface SelectProps extends Omit<Props<'button'>, 'children' | 'name'> {
17
+ children?: RemixNode
18
+ defaultLabel: string
19
+ defaultValue?: string | null
20
+ disabled?: boolean
21
+ name?: string
22
+ }
23
+
24
+ export type SelectOptionProps = Props<'div'> & {
25
+ children?: RemixNode
26
+ disabled?: boolean
27
+ label: string
28
+ textValue?: SearchValue
29
+ value: string
30
+ }
31
+
32
+ const selectTriggerShadow =
33
+ '0 2px 3px -1px rgba(0, 0, 0, 0.04), 0 3px 4px -1.5px rgba(0, 0, 0, 0.04), 0 4px 5px -2px rgba(0, 0, 0, 0.04), 0 0 0 1px light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.2))'
34
+
35
+ const selectTriggerFocusShadow =
36
+ '0 2px 3px -1px rgba(0, 0, 0, 0.04), 0 3px 4px -1.5px rgba(0, 0, 0, 0.04), 0 4px 5px -2px rgba(0, 0, 0, 0.04), 0 0 0 1px light-dark(#3573F6, #6eaaff), 0 0 0 4px light-dark(rgba(53, 115, 246, 0.1), rgba(110, 170, 255, 0.18)), 0 6px 32px 4px light-dark(rgba(53, 115, 246, 0.08), rgba(110, 170, 255, 0.14)), inset 0 0 8px 1px light-dark(rgba(53, 115, 246, 0.05), rgba(110, 170, 255, 0.1))'
37
+
38
+ const selectTriggerCss: CSSMixinDescriptor = css({
39
+ appearance: 'none',
40
+ margin: 0,
41
+ boxSizing: 'border-box',
42
+ width: '100%',
43
+ minWidth: 0,
44
+ height: '32px',
45
+ paddingBlock: '6px',
46
+ paddingInlineStart: '12px',
47
+ paddingInlineEnd: '8px',
48
+ display: 'flex',
49
+ alignItems: 'center',
50
+ justifyContent: 'flex-start',
51
+ gap: '6px',
52
+ border: 0,
53
+ borderRadius: '8px',
54
+ background: 'light-dark(#FFFFFF, #1a1a1a)',
55
+ boxShadow: selectTriggerShadow,
56
+ color: 'light-dark(#101010, #ececec)',
57
+ fontFamily: '"Inter Variable", Inter, ui-sans-serif, system-ui, sans-serif',
58
+ fontStyle: 'normal',
59
+ fontWeight: 400,
60
+ fontSize: '13px',
61
+ lineHeight: '20px',
62
+ fontFeatureSettings: '"ss01" on, "cv01" on',
63
+ letterSpacing: 0,
64
+ textAlign: 'left',
65
+ textShadow: '0 1px 0 light-dark(#FFFFFF, rgb(0 0 0 / 0.35))',
66
+ whiteSpace: 'nowrap',
67
+ '&:hover, &:focus-visible, &[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible':
68
+ {
69
+ background: 'light-dark(#FFFFFF, #1a1a1a)',
70
+ color: 'light-dark(#101010, #ececec)',
71
+ },
72
+ '&:active': {
73
+ background: 'light-dark(#FFFFFF, #1a1a1a)',
74
+ },
75
+ '&:focus-visible': {
76
+ outline: 0,
77
+ boxShadow: selectTriggerFocusShadow,
78
+ },
79
+ '&[aria-expanded="true"]': {
80
+ boxShadow: selectTriggerFocusShadow,
81
+ },
82
+ '&:disabled': {
83
+ opacity: 0.55,
84
+ },
85
+ })
86
+
87
+ const triggerLabelCss: CSSMixinDescriptor = css({
88
+ display: 'inline-flex',
89
+ alignItems: 'center',
90
+ flex: '1 1 auto',
91
+ minWidth: 0,
92
+ overflow: 'hidden',
93
+ textOverflow: 'ellipsis',
94
+ })
95
+
96
+ const triggerIconCss: CSSMixinDescriptor = css({
97
+ display: 'inline-flex',
98
+ alignItems: 'center',
99
+ justifyContent: 'center',
100
+ width: '16px',
101
+ height: '16px',
102
+ color: 'light-dark(#707070, #b3b3b3)',
103
+ flex: 'none',
104
+ '& > svg': {
105
+ display: 'block',
106
+ width: '100%',
107
+ height: '100%',
108
+ },
109
+ })
110
+
111
+ export const triggerStyle = selectTriggerCss
112
+
113
+ function SelectLabel(handle: Handle): () => RemixNode {
114
+ let context = handle.context.get(select.Context)
115
+
116
+ return () => <span mix={triggerLabelCss}>{context.displayedLabel}</span>
117
+ }
118
+
119
+ export function Select(handle: Handle<SelectProps>): () => RemixNode {
120
+ return () => {
121
+ let { children, defaultLabel, defaultValue, disabled, name, mix, ...buttonProps } = handle.props
122
+
123
+ return (
124
+ <select.Context
125
+ defaultLabel={defaultLabel}
126
+ defaultValue={defaultValue}
127
+ disabled={disabled}
128
+ name={name}
129
+ >
130
+ <button type="button" {...buttonProps} mix={[triggerStyle, select.trigger(), mix]}>
131
+ <SelectLabel />
132
+ <ChevronVerticalIcon mix={triggerIconCss} />
133
+ </button>
134
+ <popover.Context>
135
+ <div mix={[popoverSurfaceStyle, select.popover()]}>
136
+ <div mix={[listboxListStyle, select.list()]}>{children}</div>
137
+ </div>
138
+ </popover.Context>
139
+ {name && <input mix={select.hiddenInput()} />}
140
+ </select.Context>
141
+ )
142
+ }
143
+ }
144
+
145
+ export function Option(handle: Handle<SelectOptionProps>): () => RemixNode {
146
+ return () => {
147
+ let { label, value, disabled, textValue, children, mix, ...divProps } = handle.props
148
+
149
+ return (
150
+ <div
151
+ {...divProps}
152
+ mix={[listboxOptionStyle, select.option({ value, label, disabled, textValue }), mix]}
153
+ >
154
+ <CheckIcon mix={listboxIndicatorStyle} />
155
+ <span mix={listboxLabelStyle}>{children ?? label}</span>
156
+ </div>
157
+ )
158
+ }
159
+ }