@remix-run/ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +50 -164
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +8 -1
  9. package/dist/{components/anchor/anchor.js → anchor/index.js} +31 -12
  10. package/dist/anchor/index.js.map +1 -0
  11. package/dist/animation/demos/aspect-ratio.d.ts +2 -0
  12. package/dist/animation/demos/aspect-ratio.js +69 -0
  13. package/dist/animation/demos/aspect-ratio.js.map +1 -0
  14. package/dist/animation/demos/bouncy-switch.d.ts +2 -0
  15. package/dist/animation/demos/bouncy-switch.js +36 -0
  16. package/dist/animation/demos/bouncy-switch.js.map +1 -0
  17. package/dist/animation/demos/color-interpolation.d.ts +1 -0
  18. package/dist/animation/demos/color-interpolation.js +53 -0
  19. package/dist/animation/demos/color-interpolation.js.map +1 -0
  20. package/dist/animation/demos/cube.d.ts +2 -0
  21. package/dist/animation/demos/cube.js +86 -0
  22. package/dist/animation/demos/cube.js.map +1 -0
  23. package/dist/animation/demos/default-animate.d.ts +2 -0
  24. package/dist/animation/demos/default-animate.js +89 -0
  25. package/dist/animation/demos/default-animate.js.map +1 -0
  26. package/dist/animation/demos/drag-release.d.ts +24 -0
  27. package/dist/animation/demos/drag-release.js +96 -0
  28. package/dist/animation/demos/drag-release.js.map +1 -0
  29. package/dist/animation/demos/enter.d.ts +1 -0
  30. package/dist/animation/demos/enter.js +19 -0
  31. package/dist/animation/demos/enter.js.map +1 -0
  32. package/dist/animation/demos/exit.d.ts +2 -0
  33. package/dist/animation/demos/exit.js +58 -0
  34. package/dist/animation/demos/exit.js.map +1 -0
  35. package/dist/animation/demos/flip-toggle.d.ts +2 -0
  36. package/dist/animation/demos/flip-toggle.js +37 -0
  37. package/dist/animation/demos/flip-toggle.js.map +1 -0
  38. package/dist/animation/demos/hold-to-confirm.d.ts +13 -0
  39. package/dist/animation/demos/hold-to-confirm.js +211 -0
  40. package/dist/animation/demos/hold-to-confirm.js.map +1 -0
  41. package/dist/animation/demos/html-content.d.ts +2 -0
  42. package/dist/animation/demos/html-content.js +30 -0
  43. package/dist/animation/demos/html-content.js.map +1 -0
  44. package/dist/animation/demos/interruptible-keyframes.d.ts +1 -0
  45. package/dist/animation/demos/interruptible-keyframes.js +48 -0
  46. package/dist/animation/demos/interruptible-keyframes.js.map +1 -0
  47. package/dist/animation/demos/keyframes.d.ts +1 -0
  48. package/dist/animation/demos/keyframes.js +24 -0
  49. package/dist/animation/demos/keyframes.js.map +1 -0
  50. package/dist/animation/demos/material-ripple.d.ts +2 -0
  51. package/dist/animation/demos/material-ripple.js +127 -0
  52. package/dist/animation/demos/material-ripple.js.map +1 -0
  53. package/dist/animation/demos/mixin-presence-list.d.ts +2 -0
  54. package/dist/animation/demos/mixin-presence-list.js +88 -0
  55. package/dist/animation/demos/mixin-presence-list.js.map +1 -0
  56. package/dist/animation/demos/mixin-reclaim.d.ts +2 -0
  57. package/dist/animation/demos/mixin-reclaim.js +90 -0
  58. package/dist/animation/demos/mixin-reclaim.js.map +1 -0
  59. package/dist/animation/demos/multi-state-badge.d.ts +2 -0
  60. package/dist/animation/demos/multi-state-badge.js +231 -0
  61. package/dist/animation/demos/multi-state-badge.js.map +1 -0
  62. package/dist/animation/demos/press.d.ts +2 -0
  63. package/dist/animation/demos/press.js +63 -0
  64. package/dist/animation/demos/press.js.map +1 -0
  65. package/dist/animation/demos/reordering.d.ts +2 -0
  66. package/dist/animation/demos/reordering.js +53 -0
  67. package/dist/animation/demos/reordering.js.map +1 -0
  68. package/dist/animation/demos/rolling-square.d.ts +2 -0
  69. package/dist/animation/demos/rolling-square.js +42 -0
  70. package/dist/animation/demos/rolling-square.js.map +1 -0
  71. package/dist/animation/demos/rotate.d.ts +1 -0
  72. package/dist/animation/demos/rotate.js +18 -0
  73. package/dist/animation/demos/rotate.js.map +1 -0
  74. package/dist/animation/demos/shared-layout.d.ts +2 -0
  75. package/dist/animation/demos/shared-layout.js +114 -0
  76. package/dist/animation/demos/shared-layout.js.map +1 -0
  77. package/dist/animation/demos/transition-options.d.ts +1 -0
  78. package/dist/animation/demos/transition-options.js +21 -0
  79. package/dist/animation/demos/transition-options.js.map +1 -0
  80. package/dist/animation/spring.d.ts +22 -0
  81. package/dist/animation/spring.js +22 -0
  82. package/dist/animation/spring.js.map +1 -1
  83. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  84. package/dist/breadcrumbs/index.js.map +1 -0
  85. package/dist/button/index.d.ts +15 -0
  86. package/dist/button/index.js +128 -0
  87. package/dist/button/index.js.map +1 -0
  88. package/dist/checkbox/index.d.ts +14 -0
  89. package/dist/checkbox/index.js +125 -0
  90. package/dist/checkbox/index.js.map +1 -0
  91. package/dist/combobox/index.d.ts +21 -0
  92. package/dist/combobox/index.js +58 -0
  93. package/dist/combobox/index.js.map +1 -0
  94. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  95. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  96. package/dist/combobox/primitives.js.map +1 -0
  97. package/dist/input/index.d.ts +13 -0
  98. package/dist/input/index.js +121 -0
  99. package/dist/input/index.js.map +1 -0
  100. package/dist/listbox/flash-attribute.js.map +1 -0
  101. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  102. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  103. package/dist/listbox/index.js.map +1 -0
  104. package/dist/menu/hover-aim.js.map +1 -0
  105. package/dist/menu/index.d.ts +42 -0
  106. package/dist/menu/index.js +250 -0
  107. package/dist/menu/index.js.map +1 -0
  108. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +6 -32
  109. package/dist/{components/menu/menu.js → menu/primitives.js} +117 -279
  110. package/dist/menu/primitives.js.map +1 -0
  111. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +3 -5
  112. package/dist/{components/popover/popover.js → popover/index.js} +15 -51
  113. package/dist/popover/index.js.map +1 -0
  114. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  115. package/dist/popover/outside-click.js.map +1 -0
  116. package/dist/popover/scroll-lock.d.ts +1 -0
  117. package/dist/{utils → popover}/scroll-lock.js +0 -18
  118. package/dist/popover/scroll-lock.js.map +1 -0
  119. package/dist/radio/index.d.ts +12 -0
  120. package/dist/radio/index.js +77 -0
  121. package/dist/radio/index.js.map +1 -0
  122. package/dist/runtime/client-entries.d.ts +1 -2
  123. package/dist/runtime/client-entries.js.map +1 -1
  124. package/dist/runtime/component.d.ts +2 -2
  125. package/dist/runtime/component.js +1 -1
  126. package/dist/runtime/component.js.map +1 -1
  127. package/dist/runtime/diff-dom.js +194 -21
  128. package/dist/runtime/diff-dom.js.map +1 -1
  129. package/dist/runtime/frame.d.ts +7 -0
  130. package/dist/runtime/frame.js +176 -41
  131. package/dist/runtime/frame.js.map +1 -1
  132. package/dist/runtime/jsx.d.ts +2 -3
  133. package/dist/runtime/jsx.js.map +1 -1
  134. package/dist/runtime/reconcile.js +11 -5
  135. package/dist/runtime/reconcile.js.map +1 -1
  136. package/dist/runtime/vdom.js +3 -0
  137. package/dist/runtime/vdom.js.map +1 -1
  138. package/dist/select/index.d.ts +19 -0
  139. package/dist/select/index.js +95 -0
  140. package/dist/select/index.js.map +1 -0
  141. package/dist/select/keydown.js.map +1 -0
  142. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  143. package/dist/{components/select/select.js → select/primitives.js} +12 -64
  144. package/dist/select/primitives.js.map +1 -0
  145. package/dist/server/stream.js +5 -4
  146. package/dist/server/stream.js.map +1 -1
  147. package/dist/shared/focus-styles.d.ts +1 -0
  148. package/dist/shared/focus-styles.js +2 -0
  149. package/dist/shared/focus-styles.js.map +1 -0
  150. package/dist/shared/icons.d.ts +9 -0
  151. package/dist/shared/icons.js +42 -0
  152. package/dist/shared/icons.js.map +1 -0
  153. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  154. package/dist/shared/listbox-popover-styles.js +137 -0
  155. package/dist/shared/listbox-popover-styles.js.map +1 -0
  156. package/dist/shared/style-values.d.ts +78 -0
  157. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  158. package/dist/shared/style-values.js.map +1 -0
  159. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  160. package/dist/shared/typeahead.js.map +1 -0
  161. package/dist/shared/wait-for-css-transition.js.map +1 -0
  162. package/dist/shared/wait.js.map +1 -0
  163. package/dist/style/style.js +27 -10
  164. package/dist/style/style.js.map +1 -1
  165. package/dist/tabs/index.d.ts +32 -0
  166. package/dist/tabs/index.js +157 -0
  167. package/dist/tabs/index.js.map +1 -0
  168. package/dist/tabs/primitives.d.ts +57 -0
  169. package/dist/tabs/primitives.js +238 -0
  170. package/dist/tabs/primitives.js.map +1 -0
  171. package/dist/toggle/index.d.ts +9 -0
  172. package/dist/toggle/index.js +108 -0
  173. package/dist/toggle/index.js.map +1 -0
  174. package/dist/toggle/primitives.d.ts +29 -0
  175. package/dist/toggle/primitives.js +127 -0
  176. package/dist/toggle/primitives.js.map +1 -0
  177. package/package.json +74 -45
  178. package/src/{components/accordion → accordion}/README.md +50 -14
  179. package/src/accordion/index.tsx +285 -0
  180. package/src/accordion/primitives.tsx +512 -0
  181. package/src/{components/anchor → anchor}/README.md +48 -5
  182. package/src/{components/anchor/anchor.ts → anchor/index.ts} +53 -12
  183. package/src/animation/demos/aspect-ratio.tsx +120 -0
  184. package/src/animation/demos/bouncy-switch.tsx +47 -0
  185. package/src/animation/demos/color-interpolation.tsx +73 -0
  186. package/src/animation/demos/cube.tsx +116 -0
  187. package/src/animation/demos/default-animate.tsx +129 -0
  188. package/src/animation/demos/drag-release.ts +118 -0
  189. package/src/animation/demos/enter.tsx +22 -0
  190. package/src/animation/demos/exit.tsx +79 -0
  191. package/src/animation/demos/flip-toggle.tsx +46 -0
  192. package/src/animation/demos/hold-to-confirm.tsx +317 -0
  193. package/src/animation/demos/html-content.tsx +41 -0
  194. package/src/animation/demos/interruptible-keyframes.tsx +62 -0
  195. package/src/animation/demos/keyframes.tsx +29 -0
  196. package/src/animation/demos/material-ripple.tsx +158 -0
  197. package/src/animation/demos/mixin-presence-list.tsx +121 -0
  198. package/src/animation/demos/mixin-reclaim.tsx +125 -0
  199. package/src/animation/demos/multi-state-badge.tsx +426 -0
  200. package/src/animation/demos/press.tsx +67 -0
  201. package/src/animation/demos/reordering.tsx +68 -0
  202. package/src/animation/demos/rolling-square.tsx +57 -0
  203. package/src/animation/demos/rotate.tsx +21 -0
  204. package/src/animation/demos/shared-layout.tsx +211 -0
  205. package/src/animation/demos/transition-options.tsx +24 -0
  206. package/src/animation/spring.ts +22 -0
  207. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  208. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  209. package/src/button/README.md +44 -0
  210. package/src/button/index.ts +168 -0
  211. package/src/checkbox/README.md +59 -0
  212. package/src/checkbox/index.ts +162 -0
  213. package/src/{components/combobox → combobox}/README.md +58 -9
  214. package/src/combobox/index.tsx +112 -0
  215. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  216. package/src/input/README.md +52 -0
  217. package/src/input/index.ts +147 -0
  218. package/src/{components/listbox → listbox}/README.md +9 -41
  219. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  220. package/src/menu/README.md +161 -0
  221. package/src/menu/index.tsx +354 -0
  222. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +117 -359
  223. package/src/{components/popover → popover}/README.md +20 -39
  224. package/src/{components/popover/popover.ts → popover/index.ts} +16 -61
  225. package/src/{utils → popover}/scroll-lock.ts +0 -28
  226. package/src/radio/README.md +53 -0
  227. package/src/radio/index.ts +100 -0
  228. package/src/runtime/client-entries.ts +1 -5
  229. package/src/runtime/component.ts +3 -3
  230. package/src/runtime/demos/readme.demo.tsx +704 -0
  231. package/src/runtime/diff-dom.ts +270 -20
  232. package/src/runtime/frame.ts +218 -41
  233. package/src/runtime/jsx.ts +6 -10
  234. package/src/runtime/reconcile.ts +11 -5
  235. package/src/runtime/vdom.ts +3 -0
  236. package/src/{components/select → select}/README.md +29 -19
  237. package/src/select/index.tsx +159 -0
  238. package/src/{components/select/select.tsx → select/primitives.tsx} +11 -99
  239. package/src/server/stream.ts +10 -5
  240. package/src/shared/focus-styles.ts +2 -0
  241. package/src/shared/icons.tsx +62 -0
  242. package/src/shared/listbox-popover-styles.ts +146 -0
  243. package/src/shared/style-values.ts +165 -0
  244. package/src/style/style.ts +29 -10
  245. package/src/tabs/README.md +141 -0
  246. package/src/tabs/index.tsx +244 -0
  247. package/src/tabs/primitives.ts +365 -0
  248. package/src/toggle/README.md +56 -0
  249. package/src/toggle/index.tsx +134 -0
  250. package/src/toggle/primitives.ts +192 -0
  251. package/dist/components/accordion/accordion.d.ts +0 -92
  252. package/dist/components/accordion/accordion.js +0 -335
  253. package/dist/components/accordion/accordion.js.map +0 -1
  254. package/dist/components/accordion/demos/card.demo.d.ts +0 -6
  255. package/dist/components/accordion/demos/card.demo.js +0 -58
  256. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  257. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -6
  258. package/dist/components/accordion/demos/multiple.demo.js +0 -19
  259. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  260. package/dist/components/accordion/demos/overview.demo.d.ts +0 -6
  261. package/dist/components/accordion/demos/overview.demo.js +0 -19
  262. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  263. package/dist/components/anchor/anchor.js.map +0 -1
  264. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  265. package/dist/components/breadcrumbs/demos/basic.demo.d.ts +0 -5
  266. package/dist/components/breadcrumbs/demos/basic.demo.js +0 -14
  267. package/dist/components/breadcrumbs/demos/basic.demo.js.map +0 -1
  268. package/dist/components/breadcrumbs/demos/separator.demo.d.ts +0 -5
  269. package/dist/components/breadcrumbs/demos/separator.demo.js +0 -14
  270. package/dist/components/breadcrumbs/demos/separator.demo.js.map +0 -1
  271. package/dist/components/button/button.d.ts +0 -105
  272. package/dist/components/button/button.js +0 -207
  273. package/dist/components/button/button.js.map +0 -1
  274. package/dist/components/button/demos/aliases.demo.d.ts +0 -6
  275. package/dist/components/button/demos/aliases.demo.js +0 -18
  276. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  277. package/dist/components/button/demos/basic.demo.d.ts +0 -6
  278. package/dist/components/button/demos/basic.demo.js +0 -19
  279. package/dist/components/button/demos/basic.demo.js.map +0 -1
  280. package/dist/components/button/demos/states.demo.d.ts +0 -6
  281. package/dist/components/button/demos/states.demo.js +0 -29
  282. package/dist/components/button/demos/states.demo.js.map +0 -1
  283. package/dist/components/combobox/combobox.js.map +0 -1
  284. package/dist/components/combobox/demos/overview.demo.d.ts +0 -6
  285. package/dist/components/combobox/demos/overview.demo.js +0 -153
  286. package/dist/components/combobox/demos/overview.demo.js.map +0 -1
  287. package/dist/components/glyph/glyph.d.ts +0 -14
  288. package/dist/components/glyph/glyph.js +0 -65
  289. package/dist/components/glyph/glyph.js.map +0 -1
  290. package/dist/components/listbox/demos/overview.demo.d.ts +0 -6
  291. package/dist/components/listbox/demos/overview.demo.js +0 -64
  292. package/dist/components/listbox/demos/overview.demo.js.map +0 -1
  293. package/dist/components/listbox/listbox.js.map +0 -1
  294. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -5
  295. package/dist/components/menu/demos/bubbling.demo.js +0 -15
  296. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  297. package/dist/components/menu/demos/overview.demo.d.ts +0 -6
  298. package/dist/components/menu/demos/overview.demo.js +0 -32
  299. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  300. package/dist/components/menu/hover-aim.js.map +0 -1
  301. package/dist/components/menu/menu.js.map +0 -1
  302. package/dist/components/popover/demos/overview.demo.d.ts +0 -6
  303. package/dist/components/popover/demos/overview.demo.js +0 -64
  304. package/dist/components/popover/demos/overview.demo.js.map +0 -1
  305. package/dist/components/popover/popover.js.map +0 -1
  306. package/dist/components/select/demos/deconstructed.demo.d.ts +0 -6
  307. package/dist/components/select/demos/deconstructed.demo.js +0 -53
  308. package/dist/components/select/demos/deconstructed.demo.js.map +0 -1
  309. package/dist/components/select/demos/overview.demo.d.ts +0 -5
  310. package/dist/components/select/demos/overview.demo.js +0 -27
  311. package/dist/components/select/demos/overview.demo.js.map +0 -1
  312. package/dist/components/select/select.js.map +0 -1
  313. package/dist/components/separator/separator.d.ts +0 -2
  314. package/dist/components/separator/separator.js +0 -15
  315. package/dist/components/separator/separator.js.map +0 -1
  316. package/dist/components/tabs/tabs.d.ts +0 -78
  317. package/dist/components/tabs/tabs.js +0 -339
  318. package/dist/components/tabs/tabs.js.map +0 -1
  319. package/dist/interactions/keydown/keydown.js.map +0 -1
  320. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  321. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  322. package/dist/theme/contract.d.ts +0 -61
  323. package/dist/theme/contract.js +0 -131
  324. package/dist/theme/contract.js.map +0 -1
  325. package/dist/theme/glyph-contract.d.ts +0 -11
  326. package/dist/theme/glyph-contract.js +0 -34
  327. package/dist/theme/glyph-contract.js.map +0 -1
  328. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  329. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  330. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  331. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  332. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  333. package/dist/theme/runtime.d.ts +0 -2
  334. package/dist/theme/runtime.js +0 -84
  335. package/dist/theme/runtime.js.map +0 -1
  336. package/dist/theme/theme.d.ts +0 -6
  337. package/dist/theme/theme.js +0 -5
  338. package/dist/theme/theme.js.map +0 -1
  339. package/dist/utils/flash-attribute.js.map +0 -1
  340. package/dist/utils/scroll-lock.d.ts +0 -3
  341. package/dist/utils/scroll-lock.js.map +0 -1
  342. package/dist/utils/wait-for-css-transition.js.map +0 -1
  343. package/dist/utils/wait.js.map +0 -1
  344. package/src/components/accordion/accordion.tsx +0 -565
  345. package/src/components/accordion/demos/card.demo.tsx +0 -113
  346. package/src/components/accordion/demos/multiple.demo.tsx +0 -56
  347. package/src/components/accordion/demos/overview.demo.tsx +0 -56
  348. package/src/components/breadcrumbs/demos/basic.demo.tsx +0 -17
  349. package/src/components/breadcrumbs/demos/separator.demo.tsx +0 -18
  350. package/src/components/button/README.md +0 -44
  351. package/src/components/button/button.tsx +0 -286
  352. package/src/components/button/demos/aliases.demo.tsx +0 -27
  353. package/src/components/button/demos/basic.demo.tsx +0 -30
  354. package/src/components/button/demos/states.demo.tsx +0 -52
  355. package/src/components/combobox/demos/overview.demo.tsx +0 -199
  356. package/src/components/glyph/README.md +0 -72
  357. package/src/components/glyph/glyph.tsx +0 -110
  358. package/src/components/listbox/demos/overview.demo.tsx +0 -101
  359. package/src/components/menu/README.md +0 -96
  360. package/src/components/menu/demos/bubbling.demo.tsx +0 -34
  361. package/src/components/menu/demos/overview.demo.tsx +0 -76
  362. package/src/components/popover/demos/overview.demo.tsx +0 -143
  363. package/src/components/select/demos/deconstructed.demo.tsx +0 -95
  364. package/src/components/select/demos/overview.demo.tsx +0 -51
  365. package/src/components/separator/separator.ts +0 -19
  366. package/src/components/tabs/README.md +0 -105
  367. package/src/components/tabs/tabs.tsx +0 -504
  368. package/src/theme/README.md +0 -103
  369. package/src/theme/contract.ts +0 -215
  370. package/src/theme/glyph-contract.ts +0 -59
  371. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  372. package/src/theme/presets/rmx-01/index.ts +0 -123
  373. package/src/theme/runtime.ts +0 -119
  374. package/src/theme/theme.ts +0 -15
  375. package/src/utils/scroll-lock/README.md +0 -33
  376. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  377. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  378. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  379. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  380. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  381. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  382. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  383. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  384. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  385. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  386. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  387. /package/dist/{utils → shared}/wait.d.ts +0 -0
  388. /package/dist/{utils → shared}/wait.js +0 -0
  389. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  390. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  391. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  392. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  393. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  394. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  395. /package/src/{utils → shared}/wait.ts +0 -0
@@ -0,0 +1,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 rgba(0, 0, 0, 0.12)'
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 #3573F6, 0 0 0 4px rgba(53, 115, 246, 0.1), 0 6px 32px 4px rgba(53, 115, 246, 0.08), inset 0 0 8px 1px rgba(53, 115, 246, 0.05)'
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: '#FFFFFF',
55
+ boxShadow: selectTriggerShadow,
56
+ color: '#101010',
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 #FFFFFF',
66
+ whiteSpace: 'nowrap',
67
+ '&:hover, &:focus-visible, &[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible':
68
+ {
69
+ background: '#FFFFFF',
70
+ color: '#101010',
71
+ },
72
+ '&:active': {
73
+ background: '#FFFFFF',
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: '#707070',
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
+ }
@@ -1,11 +1,8 @@
1
1
  import {
2
2
  attrs,
3
- createElement,
4
3
  createMixin,
5
- css,
6
4
  on,
7
5
  ref,
8
- type CSSMixinDescriptor,
9
6
  type Dispatched,
10
7
  type ElementProps,
11
8
  type Handle,
@@ -14,19 +11,16 @@ import {
14
11
  type Props,
15
12
  type RemixNode,
16
13
  } from '@remix-run/ui'
17
- import * as button from '../button/button.tsx'
18
- import { Glyph } from '../glyph/glyph.tsx'
19
- import * as listbox from '../listbox/listbox.ts'
20
- import * as popover from '../popover/popover.ts'
21
- import { theme } from '../../theme/theme.ts'
22
- import { hiddenTypeahead } from '../../interactions/typeahead/typeahead-mixin.ts'
23
- import { onKeyDown } from '../../interactions/keydown/keydown.ts'
24
- import { waitForCssTransition } from '../../utils/wait-for-css-transition.ts'
25
- import { wait } from '../../utils/wait.ts'
26
- import type { AnchorOptions } from '../anchor/anchor.ts'
14
+ import * as listbox from '../listbox/index.ts'
15
+ import * as popover from '../popover/index.ts'
16
+ import { hiddenTypeahead } from '../shared/typeahead.ts'
17
+ import { waitForCssTransition } from '../shared/wait-for-css-transition.ts'
18
+ import { wait } from '../shared/wait.ts'
19
+ import { onKeyDown } from './keydown.ts'
20
+ import type { AnchorOptions } from '../anchor/index.ts'
27
21
 
28
22
  const SELECT_CHANGE_EVENT = 'rmx:select-change' as const
29
- const LABEL_SWAP_DELAY_MS = 75
23
+ const DEFAULT_LABEL_SWAP_DELAY_MS = 75
30
24
 
31
25
  type SelectChangeHandler<target extends HTMLElement> = (
32
26
  event: Dispatched<SelectChangeEvent, target>,
@@ -65,6 +59,7 @@ export interface SelectContextProps {
65
59
  defaultLabel: string
66
60
  defaultValue?: string | null
67
61
  disabled?: boolean
62
+ labelSwapDelayMs?: number
68
63
  name?: string
69
64
  }
70
65
 
@@ -156,7 +151,7 @@ function SelectProvider(handle: Handle<SelectContextProps, SelectContextValue>):
156
151
  popoverContextRef.hideFocusTarget = triggerRef ?? null
157
152
  popoverContextRef.anchor = triggerRef
158
153
  ? {
159
- node: triggerRef,
154
+ target: triggerRef,
160
155
  options: getPopoverAnchorOptions(),
161
156
  }
162
157
  : null
@@ -236,7 +231,7 @@ function SelectProvider(handle: Handle<SelectContextProps, SelectContextValue>):
236
231
  }
237
232
 
238
233
  await Promise.all([handle.update(), waitForCssTransition(surfaceRef, handle.signal)])
239
- await wait(LABEL_SWAP_DELAY_MS) // UX delay label swap for clear value change
234
+ await wait(handle.props.labelSwapDelayMs ?? DEFAULT_LABEL_SWAP_DELAY_MS)
240
235
  if (handle.signal.aborted) return
241
236
  displayedLabel = selectedLabel
242
237
  state = 'closed'
@@ -495,41 +490,6 @@ const hiddenInputMixin: MixinFactory<HTMLInputElement, [], ElementProps> = creat
495
490
  })
496
491
  })
497
492
 
498
- const selectTriggerCss: CSSMixinDescriptor = css({
499
- minHeight: theme.control.height.sm,
500
- width: '100%',
501
- paddingInline: theme.space.md,
502
- paddingInlineEnd: theme.space.sm,
503
- display: 'grid',
504
- gridTemplateColumns: 'minmax(0, 1fr) auto',
505
- alignItems: 'center',
506
- gap: theme.space.sm,
507
- borderRadius: theme.radius.md,
508
- backgroundImage: 'none',
509
- border: '0.5px solid transparent',
510
- boxShadow: 'none',
511
- fontSize: theme.fontSize.xs,
512
- textAlign: 'left',
513
- backgroundColor: theme.surface.lvl3,
514
- color: theme.colors.text.secondary,
515
- '&:hover, &:focus-visible, &[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible':
516
- {
517
- backgroundColor: theme.surface.lvl4,
518
- color: theme.colors.text.primary,
519
- },
520
- '&:active': {
521
- backgroundColor: theme.surface.lvl3,
522
- },
523
- '&:focus-visible': {
524
- outline: `2px solid ${theme.colors.focus.ring}`,
525
- outlineOffset: '2px',
526
- },
527
- '&:disabled': {
528
- opacity: 0.6,
529
- },
530
- })
531
-
532
- export const triggerStyle = selectTriggerCss
533
493
  export const Context = SelectProvider
534
494
  export const hiddenInput = hiddenInputMixin
535
495
  export const list = listMixin
@@ -552,51 +512,3 @@ export function onSelectChange<target extends HTMLElement>(
552
512
  ): ReturnType<typeof on<target, typeof SELECT_CHANGE_EVENT>> {
553
513
  return on(SELECT_CHANGE_EVENT, handler, captureBoolean)
554
514
  }
555
-
556
- function SelectLabel(handle: Handle): () => RemixNode {
557
- let context = getSelectContext(handle)
558
-
559
- return () => <span mix={button.labelStyle}>{context.displayedLabel}</span>
560
- }
561
-
562
- export function Select(handle: Handle<SelectProps>): () => RemixNode {
563
- return () => {
564
- let { children, defaultLabel, defaultValue, disabled, name, mix, ...buttonProps } = handle.props
565
-
566
- return (
567
- <select.Context
568
- defaultLabel={defaultLabel}
569
- defaultValue={defaultValue}
570
- disabled={disabled}
571
- name={name}
572
- >
573
- <button {...buttonProps} mix={[button.baseStyle, triggerStyle, select.trigger(), mix]}>
574
- <SelectLabel />
575
- <Glyph mix={button.iconStyle} name="chevronVertical" />
576
- </button>
577
- <popover.Context>
578
- <div mix={[popover.surfaceStyle, select.popover()]}>
579
- <div mix={[popover.contentStyle, listbox.listStyle, select.list()]}>{children}</div>
580
- </div>
581
- </popover.Context>
582
- {name && <input mix={select.hiddenInput()} />}
583
- </select.Context>
584
- )
585
- }
586
- }
587
-
588
- export function Option(handle: Handle<SelectOptionProps>): () => RemixNode {
589
- return () => {
590
- let { label, value, disabled, textValue, children, mix, ...divProps } = handle.props
591
-
592
- return (
593
- <div
594
- {...divProps}
595
- mix={[listbox.optionStyle, select.option({ value, label, disabled, textValue }), mix]}
596
- >
597
- <Glyph mix={listbox.glyphStyle} name="check" />
598
- <span mix={listbox.labelStyle}>{children ?? handle.props.label}</span>
599
- </div>
600
- )
601
- }
602
- }
@@ -438,7 +438,7 @@ function buildSegment(node: RemixNode, context: RenderContext, frameState: SsrFr
438
438
 
439
439
  if (typeof type === 'function') {
440
440
  if (type === Frame) {
441
- return buildFrameSegment(props, context, frameState)
441
+ return buildFrameSegment(node, context, frameState)
442
442
  }
443
443
  if (isEntry(type)) {
444
444
  return buildEntrySegment(type, props, context, frameState)
@@ -456,7 +456,12 @@ function buildSegment(node: RemixNode, context: RenderContext, frameState: SsrFr
456
456
  return staticSeg('')
457
457
  }
458
458
 
459
- function buildFrameSegment(props: any, context: RenderContext, frameState: SsrFrameState): Segment {
459
+ function buildFrameSegment(
460
+ node: RemixElement,
461
+ context: RenderContext,
462
+ frameState: SsrFrameState,
463
+ ): Segment {
464
+ let props = node.props
460
465
  let frameId = randomId('f')
461
466
 
462
467
  // Store frame data in context for aggregation
@@ -1047,17 +1052,17 @@ async function resolveClientEntries(
1047
1052
  ): Promise<void> {
1048
1053
  if (context.unresolvedHydrationData.size === 0) return
1049
1054
 
1050
- let resolvedEntries = new Map<string, ResolvedClientEntry>()
1055
+ let resolvedEntries = new Map<EntryComponent, ResolvedClientEntry>()
1051
1056
 
1052
1057
  for (let [hydrationId, unresolvedHydrationData] of context.unresolvedHydrationData) {
1053
1058
  let { entryId, component, props } = unresolvedHydrationData
1054
- let resolvedEntry = resolvedEntries.get(entryId)
1059
+ let resolvedEntry = resolvedEntries.get(component)
1055
1060
  if (!resolvedEntry) {
1056
1061
  resolvedEntry = resolveClientEntry
1057
1062
  ? await Promise.resolve(resolveClientEntry(entryId, component))
1058
1063
  : resolveDefaultClientEntry(entryId, component)
1059
1064
  validateResolvedClientEntry(entryId, resolvedEntry)
1060
- resolvedEntries.set(entryId, resolvedEntry)
1065
+ resolvedEntries.set(component, resolvedEntry)
1061
1066
  }
1062
1067
 
1063
1068
  context.hydrationData.set(hydrationId, {
@@ -0,0 +1,2 @@
1
+ export const controlFocusShadow =
2
+ '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 #3573F6, 0 0 0 4px rgba(53, 115, 246, 0.1), 0 6px 32px 4px rgba(53, 115, 246, 0.08), inset 0 0 8px 1px rgba(53, 115, 246, 0.05)'
@@ -0,0 +1,62 @@
1
+ import { createElement } from '@remix-run/ui'
2
+ import type { Handle, Props, RemixElement } from '@remix-run/ui'
3
+
4
+ type IconProps = Omit<Props<'svg'>, 'children'>
5
+
6
+ function icon(
7
+ handle: Handle<IconProps>,
8
+ children: RemixElement | readonly RemixElement[],
9
+ ): RemixElement {
10
+ let hiddenByDefault =
11
+ handle.props['aria-hidden'] === undefined &&
12
+ handle.props['aria-label'] === undefined &&
13
+ handle.props['aria-labelledby'] === undefined
14
+
15
+ return createElement(
16
+ 'svg',
17
+ {
18
+ ...handle.props,
19
+ 'aria-hidden': hiddenByDefault ? true : handle.props['aria-hidden'],
20
+ fill: handle.props.fill ?? 'none',
21
+ viewBox: handle.props.viewBox ?? '0 0 16 16',
22
+ xmlns: 'http://www.w3.org/2000/svg',
23
+ },
24
+ children,
25
+ )
26
+ }
27
+
28
+ function strokedPath(d: string): RemixElement {
29
+ return createElement('path', {
30
+ d,
31
+ fill: 'none',
32
+ stroke: 'currentColor',
33
+ strokeLinecap: 'round',
34
+ strokeLinejoin: 'round',
35
+ strokeWidth: '1.5',
36
+ })
37
+ }
38
+
39
+ export function AddIcon(handle: Handle<IconProps>): () => RemixElement {
40
+ return () => icon(handle, strokedPath('M8 3.25v9.5M3.25 8h9.5'))
41
+ }
42
+
43
+ export function CheckIcon(handle: Handle<IconProps>): () => RemixElement {
44
+ return () => icon(handle, strokedPath('m3.5 8.25 2.75 2.75L12.5 4.75'))
45
+ }
46
+
47
+ export function ChevronDownIcon(handle: Handle<IconProps>): () => RemixElement {
48
+ return () => icon(handle, strokedPath('m3.75 6.25 4.25 4 4.25-4'))
49
+ }
50
+
51
+ export function ChevronRightIcon(handle: Handle<IconProps>): () => RemixElement {
52
+ return () => icon(handle, strokedPath('m6 4 4 4-4 4'))
53
+ }
54
+
55
+ export function ChevronVerticalIcon(handle: Handle<IconProps>): () => RemixElement {
56
+ return () =>
57
+ icon(handle, [strokedPath('m3.75 6.5 4.25-4 4.25 4'), strokedPath('m3.75 9.5 4.25 4 4.25-4')])
58
+ }
59
+
60
+ export function SearchIcon(handle: Handle<IconProps>): () => RemixElement {
61
+ return () => icon(handle, strokedPath('M7.25 12.25a5 5 0 1 1 0-10 5 5 0 0 1 0 10Zm3.54-1.46 3 3'))
62
+ }
@@ -0,0 +1,146 @@
1
+ import { css, type CSSMixinDescriptor } from '@remix-run/ui'
2
+
3
+ import { componentStyleValues as styles } from './style-values.ts'
4
+
5
+ const popupViewportClampMaxHeight = '50dvh'
6
+
7
+ const popoverSurfaceTransitionCss: CSSMixinDescriptor = css({
8
+ opacity: 0,
9
+ '&:popover-open': {
10
+ opacity: 1,
11
+ },
12
+ '&:not(:popover-open)': {
13
+ pointerEvents: 'none',
14
+ transition: 'opacity 180ms ease-in, overlay 180ms ease-in, display 180ms ease-in',
15
+ transitionBehavior: 'allow-discrete',
16
+ },
17
+ })
18
+
19
+ const popoverSurfaceCss: CSSMixinDescriptor = css({
20
+ position: 'fixed',
21
+ inset: 'auto',
22
+ margin: 0,
23
+ padding: styles.space.none,
24
+ display: 'flex',
25
+ flexDirection: 'column',
26
+ minHeight: 0,
27
+ minWidth: '12rem',
28
+ maxWidth: `min(24rem, calc(100vw - (${styles.space.lg} * 2)))`,
29
+ maxHeight: popupViewportClampMaxHeight,
30
+ border: `1px solid ${styles.colors.border.subtle}`,
31
+ borderRadius: styles.radius.lg,
32
+ backgroundColor: styles.surface.lvl0,
33
+ color: styles.colors.text.primary,
34
+ overflow: 'hidden',
35
+ boxShadow: `${styles.shadow.xs}, ${styles.shadow.md}`,
36
+ '&::backdrop': {
37
+ background: 'transparent',
38
+ },
39
+ })
40
+
41
+ const listCss: CSSMixinDescriptor = css({
42
+ display: 'flex',
43
+ flexDirection: 'column',
44
+ flex: '1 1 auto',
45
+ minHeight: 0,
46
+ paddingBlock: styles.space.xs,
47
+ paddingInline: styles.space.none,
48
+ overflow: 'auto',
49
+ overscrollBehavior: 'contain',
50
+ outline: 'none',
51
+ userSelect: 'none',
52
+ WebkitUserSelect: 'none',
53
+ '--rmx-ui-item-inset': `calc(${styles.space.sm} + ${styles.space.xs})`,
54
+ '--rmx-ui-item-indicator-gap': styles.space.xs,
55
+ '--rmx-ui-item-indicator-width': styles.fontSize.md,
56
+ })
57
+
58
+ const itemCss: CSSMixinDescriptor = css({
59
+ display: 'flex',
60
+ alignItems: 'center',
61
+ width: '100%',
62
+ minWidth: 0,
63
+ minHeight: styles.control.height.md,
64
+ boxSizing: 'border-box',
65
+ position: 'relative',
66
+ isolation: 'isolate',
67
+ paddingInline: `calc(${styles.space.sm} + ${styles.space.xs})`,
68
+ color: styles.colors.text.primary,
69
+ fontFamily: styles.fontFamily.sans,
70
+ fontSize: styles.fontSize.sm,
71
+ fontWeight: styles.fontWeight.normal,
72
+ lineHeight: styles.lineHeight.normal,
73
+ textAlign: 'left',
74
+ userSelect: 'none',
75
+ WebkitUserSelect: 'none',
76
+ '&::before': {
77
+ content: '""',
78
+ position: 'absolute',
79
+ insetBlock: 0,
80
+ insetInline: styles.space.xs,
81
+ borderRadius: styles.radius.md,
82
+ backgroundColor: 'transparent',
83
+ pointerEvents: 'none',
84
+ zIndex: -1,
85
+ },
86
+ '&:focus': {
87
+ outline: 'none',
88
+ },
89
+ '&[data-highlighted="true"]': {
90
+ color: styles.colors.action.primary.foreground,
91
+ },
92
+ '&[data-highlighted="true"]::before': {
93
+ backgroundColor: styles.colors.action.primary.background,
94
+ },
95
+ '&[aria-disabled="true"]': {
96
+ opacity: 0.5,
97
+ },
98
+ scrollMarginBlock: styles.space.xs,
99
+ '--rmx-listbox-option-indicator-opacity': '0',
100
+ '&[hidden]': {
101
+ display: 'none',
102
+ },
103
+ '&[data-listbox-flash="true"], &[data-select-flash="true"], &[data-combobox-flash="true"]': {
104
+ color: styles.colors.text.primary,
105
+ },
106
+ '&[data-listbox-flash="true"]::before, &[data-select-flash="true"]::before, &[data-combobox-flash="true"]::before':
107
+ {
108
+ backgroundColor: 'transparent',
109
+ },
110
+ '&[aria-selected="true"]': {
111
+ '--rmx-listbox-option-indicator-opacity': '1',
112
+ },
113
+ })
114
+
115
+ const itemIndicatorCss: CSSMixinDescriptor = css({
116
+ display: 'inline-flex',
117
+ alignItems: 'center',
118
+ justifyContent: 'center',
119
+ flex: '0 0 var(--rmx-ui-item-indicator-width)',
120
+ width: 'var(--rmx-ui-item-indicator-width)',
121
+ minWidth: 0,
122
+ height: 'var(--rmx-ui-item-indicator-width)',
123
+ marginInlineEnd: 'var(--rmx-ui-item-indicator-gap)',
124
+ overflow: 'hidden',
125
+ color: 'currentColor',
126
+ opacity: 'var(--rmx-listbox-option-indicator-opacity)',
127
+ '& > svg': {
128
+ display: 'block',
129
+ width: '100%',
130
+ height: '100%',
131
+ },
132
+ })
133
+
134
+ const itemLabelCss: CSSMixinDescriptor = css({
135
+ display: 'inline-flex',
136
+ alignItems: 'center',
137
+ flex: '1 1 auto',
138
+ minWidth: 0,
139
+ WebkitUserSelect: 'none',
140
+ })
141
+
142
+ export const popoverSurfaceStyle = [popoverSurfaceCss, popoverSurfaceTransitionCss] as const
143
+ export const listboxIndicatorStyle = itemIndicatorCss
144
+ export const listboxLabelStyle = itemLabelCss
145
+ export const listboxListStyle = listCss
146
+ export const listboxOptionStyle = itemCss