@remix-run/ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +50 -164
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +8 -1
  9. package/dist/{components/anchor/anchor.js → anchor/index.js} +31 -12
  10. package/dist/anchor/index.js.map +1 -0
  11. package/dist/animation/demos/aspect-ratio.d.ts +2 -0
  12. package/dist/animation/demos/aspect-ratio.js +69 -0
  13. package/dist/animation/demos/aspect-ratio.js.map +1 -0
  14. package/dist/animation/demos/bouncy-switch.d.ts +2 -0
  15. package/dist/animation/demos/bouncy-switch.js +36 -0
  16. package/dist/animation/demos/bouncy-switch.js.map +1 -0
  17. package/dist/animation/demos/color-interpolation.d.ts +1 -0
  18. package/dist/animation/demos/color-interpolation.js +53 -0
  19. package/dist/animation/demos/color-interpolation.js.map +1 -0
  20. package/dist/animation/demos/cube.d.ts +2 -0
  21. package/dist/animation/demos/cube.js +86 -0
  22. package/dist/animation/demos/cube.js.map +1 -0
  23. package/dist/animation/demos/default-animate.d.ts +2 -0
  24. package/dist/animation/demos/default-animate.js +89 -0
  25. package/dist/animation/demos/default-animate.js.map +1 -0
  26. package/dist/animation/demos/drag-release.d.ts +24 -0
  27. package/dist/animation/demos/drag-release.js +96 -0
  28. package/dist/animation/demos/drag-release.js.map +1 -0
  29. package/dist/animation/demos/enter.d.ts +1 -0
  30. package/dist/animation/demos/enter.js +19 -0
  31. package/dist/animation/demos/enter.js.map +1 -0
  32. package/dist/animation/demos/exit.d.ts +2 -0
  33. package/dist/animation/demos/exit.js +58 -0
  34. package/dist/animation/demos/exit.js.map +1 -0
  35. package/dist/animation/demos/flip-toggle.d.ts +2 -0
  36. package/dist/animation/demos/flip-toggle.js +37 -0
  37. package/dist/animation/demos/flip-toggle.js.map +1 -0
  38. package/dist/animation/demos/hold-to-confirm.d.ts +13 -0
  39. package/dist/animation/demos/hold-to-confirm.js +211 -0
  40. package/dist/animation/demos/hold-to-confirm.js.map +1 -0
  41. package/dist/animation/demos/html-content.d.ts +2 -0
  42. package/dist/animation/demos/html-content.js +30 -0
  43. package/dist/animation/demos/html-content.js.map +1 -0
  44. package/dist/animation/demos/interruptible-keyframes.d.ts +1 -0
  45. package/dist/animation/demos/interruptible-keyframes.js +48 -0
  46. package/dist/animation/demos/interruptible-keyframes.js.map +1 -0
  47. package/dist/animation/demos/keyframes.d.ts +1 -0
  48. package/dist/animation/demos/keyframes.js +24 -0
  49. package/dist/animation/demos/keyframes.js.map +1 -0
  50. package/dist/animation/demos/material-ripple.d.ts +2 -0
  51. package/dist/animation/demos/material-ripple.js +127 -0
  52. package/dist/animation/demos/material-ripple.js.map +1 -0
  53. package/dist/animation/demos/mixin-presence-list.d.ts +2 -0
  54. package/dist/animation/demos/mixin-presence-list.js +88 -0
  55. package/dist/animation/demos/mixin-presence-list.js.map +1 -0
  56. package/dist/animation/demos/mixin-reclaim.d.ts +2 -0
  57. package/dist/animation/demos/mixin-reclaim.js +90 -0
  58. package/dist/animation/demos/mixin-reclaim.js.map +1 -0
  59. package/dist/animation/demos/multi-state-badge.d.ts +2 -0
  60. package/dist/animation/demos/multi-state-badge.js +231 -0
  61. package/dist/animation/demos/multi-state-badge.js.map +1 -0
  62. package/dist/animation/demos/press.d.ts +2 -0
  63. package/dist/animation/demos/press.js +63 -0
  64. package/dist/animation/demos/press.js.map +1 -0
  65. package/dist/animation/demos/reordering.d.ts +2 -0
  66. package/dist/animation/demos/reordering.js +53 -0
  67. package/dist/animation/demos/reordering.js.map +1 -0
  68. package/dist/animation/demos/rolling-square.d.ts +2 -0
  69. package/dist/animation/demos/rolling-square.js +42 -0
  70. package/dist/animation/demos/rolling-square.js.map +1 -0
  71. package/dist/animation/demos/rotate.d.ts +1 -0
  72. package/dist/animation/demos/rotate.js +18 -0
  73. package/dist/animation/demos/rotate.js.map +1 -0
  74. package/dist/animation/demos/shared-layout.d.ts +2 -0
  75. package/dist/animation/demos/shared-layout.js +114 -0
  76. package/dist/animation/demos/shared-layout.js.map +1 -0
  77. package/dist/animation/demos/transition-options.d.ts +1 -0
  78. package/dist/animation/demos/transition-options.js +21 -0
  79. package/dist/animation/demos/transition-options.js.map +1 -0
  80. package/dist/animation/spring.d.ts +22 -0
  81. package/dist/animation/spring.js +22 -0
  82. package/dist/animation/spring.js.map +1 -1
  83. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  84. package/dist/breadcrumbs/index.js.map +1 -0
  85. package/dist/button/index.d.ts +15 -0
  86. package/dist/button/index.js +128 -0
  87. package/dist/button/index.js.map +1 -0
  88. package/dist/checkbox/index.d.ts +14 -0
  89. package/dist/checkbox/index.js +125 -0
  90. package/dist/checkbox/index.js.map +1 -0
  91. package/dist/combobox/index.d.ts +21 -0
  92. package/dist/combobox/index.js +58 -0
  93. package/dist/combobox/index.js.map +1 -0
  94. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  95. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  96. package/dist/combobox/primitives.js.map +1 -0
  97. package/dist/input/index.d.ts +13 -0
  98. package/dist/input/index.js +121 -0
  99. package/dist/input/index.js.map +1 -0
  100. package/dist/listbox/flash-attribute.js.map +1 -0
  101. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  102. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  103. package/dist/listbox/index.js.map +1 -0
  104. package/dist/menu/hover-aim.js.map +1 -0
  105. package/dist/menu/index.d.ts +42 -0
  106. package/dist/menu/index.js +250 -0
  107. package/dist/menu/index.js.map +1 -0
  108. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +6 -32
  109. package/dist/{components/menu/menu.js → menu/primitives.js} +117 -279
  110. package/dist/menu/primitives.js.map +1 -0
  111. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +3 -5
  112. package/dist/{components/popover/popover.js → popover/index.js} +15 -51
  113. package/dist/popover/index.js.map +1 -0
  114. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  115. package/dist/popover/outside-click.js.map +1 -0
  116. package/dist/popover/scroll-lock.d.ts +1 -0
  117. package/dist/{utils → popover}/scroll-lock.js +0 -18
  118. package/dist/popover/scroll-lock.js.map +1 -0
  119. package/dist/radio/index.d.ts +12 -0
  120. package/dist/radio/index.js +77 -0
  121. package/dist/radio/index.js.map +1 -0
  122. package/dist/runtime/client-entries.d.ts +1 -2
  123. package/dist/runtime/client-entries.js.map +1 -1
  124. package/dist/runtime/component.d.ts +2 -2
  125. package/dist/runtime/component.js +1 -1
  126. package/dist/runtime/component.js.map +1 -1
  127. package/dist/runtime/diff-dom.js +194 -21
  128. package/dist/runtime/diff-dom.js.map +1 -1
  129. package/dist/runtime/frame.d.ts +7 -0
  130. package/dist/runtime/frame.js +176 -41
  131. package/dist/runtime/frame.js.map +1 -1
  132. package/dist/runtime/jsx.d.ts +2 -3
  133. package/dist/runtime/jsx.js.map +1 -1
  134. package/dist/runtime/reconcile.js +11 -5
  135. package/dist/runtime/reconcile.js.map +1 -1
  136. package/dist/runtime/vdom.js +3 -0
  137. package/dist/runtime/vdom.js.map +1 -1
  138. package/dist/select/index.d.ts +19 -0
  139. package/dist/select/index.js +95 -0
  140. package/dist/select/index.js.map +1 -0
  141. package/dist/select/keydown.js.map +1 -0
  142. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  143. package/dist/{components/select/select.js → select/primitives.js} +12 -64
  144. package/dist/select/primitives.js.map +1 -0
  145. package/dist/server/stream.js +5 -4
  146. package/dist/server/stream.js.map +1 -1
  147. package/dist/shared/focus-styles.d.ts +1 -0
  148. package/dist/shared/focus-styles.js +2 -0
  149. package/dist/shared/focus-styles.js.map +1 -0
  150. package/dist/shared/icons.d.ts +9 -0
  151. package/dist/shared/icons.js +42 -0
  152. package/dist/shared/icons.js.map +1 -0
  153. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  154. package/dist/shared/listbox-popover-styles.js +137 -0
  155. package/dist/shared/listbox-popover-styles.js.map +1 -0
  156. package/dist/shared/style-values.d.ts +78 -0
  157. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  158. package/dist/shared/style-values.js.map +1 -0
  159. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  160. package/dist/shared/typeahead.js.map +1 -0
  161. package/dist/shared/wait-for-css-transition.js.map +1 -0
  162. package/dist/shared/wait.js.map +1 -0
  163. package/dist/style/style.js +27 -10
  164. package/dist/style/style.js.map +1 -1
  165. package/dist/tabs/index.d.ts +32 -0
  166. package/dist/tabs/index.js +157 -0
  167. package/dist/tabs/index.js.map +1 -0
  168. package/dist/tabs/primitives.d.ts +57 -0
  169. package/dist/tabs/primitives.js +238 -0
  170. package/dist/tabs/primitives.js.map +1 -0
  171. package/dist/toggle/index.d.ts +9 -0
  172. package/dist/toggle/index.js +108 -0
  173. package/dist/toggle/index.js.map +1 -0
  174. package/dist/toggle/primitives.d.ts +29 -0
  175. package/dist/toggle/primitives.js +127 -0
  176. package/dist/toggle/primitives.js.map +1 -0
  177. package/package.json +74 -45
  178. package/src/{components/accordion → accordion}/README.md +50 -14
  179. package/src/accordion/index.tsx +285 -0
  180. package/src/accordion/primitives.tsx +512 -0
  181. package/src/{components/anchor → anchor}/README.md +48 -5
  182. package/src/{components/anchor/anchor.ts → anchor/index.ts} +53 -12
  183. package/src/animation/demos/aspect-ratio.tsx +120 -0
  184. package/src/animation/demos/bouncy-switch.tsx +47 -0
  185. package/src/animation/demos/color-interpolation.tsx +73 -0
  186. package/src/animation/demos/cube.tsx +116 -0
  187. package/src/animation/demos/default-animate.tsx +129 -0
  188. package/src/animation/demos/drag-release.ts +118 -0
  189. package/src/animation/demos/enter.tsx +22 -0
  190. package/src/animation/demos/exit.tsx +79 -0
  191. package/src/animation/demos/flip-toggle.tsx +46 -0
  192. package/src/animation/demos/hold-to-confirm.tsx +317 -0
  193. package/src/animation/demos/html-content.tsx +41 -0
  194. package/src/animation/demos/interruptible-keyframes.tsx +62 -0
  195. package/src/animation/demos/keyframes.tsx +29 -0
  196. package/src/animation/demos/material-ripple.tsx +158 -0
  197. package/src/animation/demos/mixin-presence-list.tsx +121 -0
  198. package/src/animation/demos/mixin-reclaim.tsx +125 -0
  199. package/src/animation/demos/multi-state-badge.tsx +426 -0
  200. package/src/animation/demos/press.tsx +67 -0
  201. package/src/animation/demos/reordering.tsx +68 -0
  202. package/src/animation/demos/rolling-square.tsx +57 -0
  203. package/src/animation/demos/rotate.tsx +21 -0
  204. package/src/animation/demos/shared-layout.tsx +211 -0
  205. package/src/animation/demos/transition-options.tsx +24 -0
  206. package/src/animation/spring.ts +22 -0
  207. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  208. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  209. package/src/button/README.md +44 -0
  210. package/src/button/index.ts +168 -0
  211. package/src/checkbox/README.md +59 -0
  212. package/src/checkbox/index.ts +162 -0
  213. package/src/{components/combobox → combobox}/README.md +58 -9
  214. package/src/combobox/index.tsx +112 -0
  215. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  216. package/src/input/README.md +52 -0
  217. package/src/input/index.ts +147 -0
  218. package/src/{components/listbox → listbox}/README.md +9 -41
  219. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  220. package/src/menu/README.md +161 -0
  221. package/src/menu/index.tsx +354 -0
  222. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +117 -359
  223. package/src/{components/popover → popover}/README.md +20 -39
  224. package/src/{components/popover/popover.ts → popover/index.ts} +16 -61
  225. package/src/{utils → popover}/scroll-lock.ts +0 -28
  226. package/src/radio/README.md +53 -0
  227. package/src/radio/index.ts +100 -0
  228. package/src/runtime/client-entries.ts +1 -5
  229. package/src/runtime/component.ts +3 -3
  230. package/src/runtime/demos/readme.demo.tsx +704 -0
  231. package/src/runtime/diff-dom.ts +270 -20
  232. package/src/runtime/frame.ts +218 -41
  233. package/src/runtime/jsx.ts +6 -10
  234. package/src/runtime/reconcile.ts +11 -5
  235. package/src/runtime/vdom.ts +3 -0
  236. package/src/{components/select → select}/README.md +29 -19
  237. package/src/select/index.tsx +159 -0
  238. package/src/{components/select/select.tsx → select/primitives.tsx} +11 -99
  239. package/src/server/stream.ts +10 -5
  240. package/src/shared/focus-styles.ts +2 -0
  241. package/src/shared/icons.tsx +62 -0
  242. package/src/shared/listbox-popover-styles.ts +146 -0
  243. package/src/shared/style-values.ts +165 -0
  244. package/src/style/style.ts +29 -10
  245. package/src/tabs/README.md +141 -0
  246. package/src/tabs/index.tsx +244 -0
  247. package/src/tabs/primitives.ts +365 -0
  248. package/src/toggle/README.md +56 -0
  249. package/src/toggle/index.tsx +134 -0
  250. package/src/toggle/primitives.ts +192 -0
  251. package/dist/components/accordion/accordion.d.ts +0 -92
  252. package/dist/components/accordion/accordion.js +0 -335
  253. package/dist/components/accordion/accordion.js.map +0 -1
  254. package/dist/components/accordion/demos/card.demo.d.ts +0 -6
  255. package/dist/components/accordion/demos/card.demo.js +0 -58
  256. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  257. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -6
  258. package/dist/components/accordion/demos/multiple.demo.js +0 -19
  259. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  260. package/dist/components/accordion/demos/overview.demo.d.ts +0 -6
  261. package/dist/components/accordion/demos/overview.demo.js +0 -19
  262. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  263. package/dist/components/anchor/anchor.js.map +0 -1
  264. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  265. package/dist/components/breadcrumbs/demos/basic.demo.d.ts +0 -5
  266. package/dist/components/breadcrumbs/demos/basic.demo.js +0 -14
  267. package/dist/components/breadcrumbs/demos/basic.demo.js.map +0 -1
  268. package/dist/components/breadcrumbs/demos/separator.demo.d.ts +0 -5
  269. package/dist/components/breadcrumbs/demos/separator.demo.js +0 -14
  270. package/dist/components/breadcrumbs/demos/separator.demo.js.map +0 -1
  271. package/dist/components/button/button.d.ts +0 -105
  272. package/dist/components/button/button.js +0 -207
  273. package/dist/components/button/button.js.map +0 -1
  274. package/dist/components/button/demos/aliases.demo.d.ts +0 -6
  275. package/dist/components/button/demos/aliases.demo.js +0 -18
  276. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  277. package/dist/components/button/demos/basic.demo.d.ts +0 -6
  278. package/dist/components/button/demos/basic.demo.js +0 -19
  279. package/dist/components/button/demos/basic.demo.js.map +0 -1
  280. package/dist/components/button/demos/states.demo.d.ts +0 -6
  281. package/dist/components/button/demos/states.demo.js +0 -29
  282. package/dist/components/button/demos/states.demo.js.map +0 -1
  283. package/dist/components/combobox/combobox.js.map +0 -1
  284. package/dist/components/combobox/demos/overview.demo.d.ts +0 -6
  285. package/dist/components/combobox/demos/overview.demo.js +0 -153
  286. package/dist/components/combobox/demos/overview.demo.js.map +0 -1
  287. package/dist/components/glyph/glyph.d.ts +0 -14
  288. package/dist/components/glyph/glyph.js +0 -65
  289. package/dist/components/glyph/glyph.js.map +0 -1
  290. package/dist/components/listbox/demos/overview.demo.d.ts +0 -6
  291. package/dist/components/listbox/demos/overview.demo.js +0 -64
  292. package/dist/components/listbox/demos/overview.demo.js.map +0 -1
  293. package/dist/components/listbox/listbox.js.map +0 -1
  294. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -5
  295. package/dist/components/menu/demos/bubbling.demo.js +0 -15
  296. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  297. package/dist/components/menu/demos/overview.demo.d.ts +0 -6
  298. package/dist/components/menu/demos/overview.demo.js +0 -32
  299. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  300. package/dist/components/menu/hover-aim.js.map +0 -1
  301. package/dist/components/menu/menu.js.map +0 -1
  302. package/dist/components/popover/demos/overview.demo.d.ts +0 -6
  303. package/dist/components/popover/demos/overview.demo.js +0 -64
  304. package/dist/components/popover/demos/overview.demo.js.map +0 -1
  305. package/dist/components/popover/popover.js.map +0 -1
  306. package/dist/components/select/demos/deconstructed.demo.d.ts +0 -6
  307. package/dist/components/select/demos/deconstructed.demo.js +0 -53
  308. package/dist/components/select/demos/deconstructed.demo.js.map +0 -1
  309. package/dist/components/select/demos/overview.demo.d.ts +0 -5
  310. package/dist/components/select/demos/overview.demo.js +0 -27
  311. package/dist/components/select/demos/overview.demo.js.map +0 -1
  312. package/dist/components/select/select.js.map +0 -1
  313. package/dist/components/separator/separator.d.ts +0 -2
  314. package/dist/components/separator/separator.js +0 -15
  315. package/dist/components/separator/separator.js.map +0 -1
  316. package/dist/components/tabs/tabs.d.ts +0 -78
  317. package/dist/components/tabs/tabs.js +0 -339
  318. package/dist/components/tabs/tabs.js.map +0 -1
  319. package/dist/interactions/keydown/keydown.js.map +0 -1
  320. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  321. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  322. package/dist/theme/contract.d.ts +0 -61
  323. package/dist/theme/contract.js +0 -131
  324. package/dist/theme/contract.js.map +0 -1
  325. package/dist/theme/glyph-contract.d.ts +0 -11
  326. package/dist/theme/glyph-contract.js +0 -34
  327. package/dist/theme/glyph-contract.js.map +0 -1
  328. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  329. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  330. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  331. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  332. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  333. package/dist/theme/runtime.d.ts +0 -2
  334. package/dist/theme/runtime.js +0 -84
  335. package/dist/theme/runtime.js.map +0 -1
  336. package/dist/theme/theme.d.ts +0 -6
  337. package/dist/theme/theme.js +0 -5
  338. package/dist/theme/theme.js.map +0 -1
  339. package/dist/utils/flash-attribute.js.map +0 -1
  340. package/dist/utils/scroll-lock.d.ts +0 -3
  341. package/dist/utils/scroll-lock.js.map +0 -1
  342. package/dist/utils/wait-for-css-transition.js.map +0 -1
  343. package/dist/utils/wait.js.map +0 -1
  344. package/src/components/accordion/accordion.tsx +0 -565
  345. package/src/components/accordion/demos/card.demo.tsx +0 -113
  346. package/src/components/accordion/demos/multiple.demo.tsx +0 -56
  347. package/src/components/accordion/demos/overview.demo.tsx +0 -56
  348. package/src/components/breadcrumbs/demos/basic.demo.tsx +0 -17
  349. package/src/components/breadcrumbs/demos/separator.demo.tsx +0 -18
  350. package/src/components/button/README.md +0 -44
  351. package/src/components/button/button.tsx +0 -286
  352. package/src/components/button/demos/aliases.demo.tsx +0 -27
  353. package/src/components/button/demos/basic.demo.tsx +0 -30
  354. package/src/components/button/demos/states.demo.tsx +0 -52
  355. package/src/components/combobox/demos/overview.demo.tsx +0 -199
  356. package/src/components/glyph/README.md +0 -72
  357. package/src/components/glyph/glyph.tsx +0 -110
  358. package/src/components/listbox/demos/overview.demo.tsx +0 -101
  359. package/src/components/menu/README.md +0 -96
  360. package/src/components/menu/demos/bubbling.demo.tsx +0 -34
  361. package/src/components/menu/demos/overview.demo.tsx +0 -76
  362. package/src/components/popover/demos/overview.demo.tsx +0 -143
  363. package/src/components/select/demos/deconstructed.demo.tsx +0 -95
  364. package/src/components/select/demos/overview.demo.tsx +0 -51
  365. package/src/components/separator/separator.ts +0 -19
  366. package/src/components/tabs/README.md +0 -105
  367. package/src/components/tabs/tabs.tsx +0 -504
  368. package/src/theme/README.md +0 -103
  369. package/src/theme/contract.ts +0 -215
  370. package/src/theme/glyph-contract.ts +0 -59
  371. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  372. package/src/theme/presets/rmx-01/index.ts +0 -123
  373. package/src/theme/runtime.ts +0 -119
  374. package/src/theme/theme.ts +0 -15
  375. package/src/utils/scroll-lock/README.md +0 -33
  376. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  377. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  378. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  379. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  380. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  381. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  382. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  383. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  384. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  385. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  386. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  387. /package/dist/{utils → shared}/wait.d.ts +0 -0
  388. /package/dist/{utils → shared}/wait.js +0 -0
  389. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  390. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  391. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  392. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  393. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  394. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  395. /package/src/{utils → shared}/wait.ts +0 -0
@@ -1,30 +1,23 @@
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,
12
9
  type MixinFactory,
13
- type Props,
14
10
  type RemixNode,
15
11
  } from '@remix-run/ui'
16
- import { type AnchorOptions } from '../anchor/anchor.ts'
17
- import * as button from '../button/button.tsx'
18
- import { Glyph } from '../glyph/glyph.tsx'
19
- import * as popover from '../popover/popover.ts'
20
- import { theme } from '../../theme/theme.ts'
12
+ import { type AnchorOptions, type AnchorPoint } from '../anchor/index.ts'
13
+ import * as popover from '../popover/index.ts'
21
14
  import {
22
15
  hiddenTypeahead,
23
16
  matchNextItemBySearchText,
24
17
  type SearchValue,
25
- } from '../../interactions/typeahead/typeahead-mixin.ts'
26
- import { waitForCssTransition } from '../../utils/wait-for-css-transition.ts'
27
- import { wait } from '../../utils/wait.ts'
18
+ } from '../shared/typeahead.ts'
19
+ import { waitForCssTransition } from '../shared/wait-for-css-transition.ts'
20
+ import { wait } from '../shared/wait.ts'
28
21
  import { createHoverAim } from './hover-aim.ts'
29
22
 
30
23
  const MENU_SELECT_EVENT = 'rmx:menu-select' as const
@@ -37,182 +30,6 @@ type MenuSelectHandler<target extends HTMLElement> = (
37
30
  signal: AbortSignal,
38
31
  ) => void | Promise<void>
39
32
 
40
- const menuButtonCss: CSSMixinDescriptor = css({
41
- display: 'grid',
42
- gridTemplateColumns: 'minmax(0, 1fr) auto',
43
- alignItems: 'center',
44
- borderRadius: theme.radius.md,
45
- paddingInlineEnd: theme.space.sm,
46
- textAlign: 'left',
47
- '&[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible': {
48
- backgroundColor: theme.surface.lvl3,
49
- color: theme.colors.text.primary,
50
- },
51
- })
52
-
53
- const menuPopoverCss: CSSMixinDescriptor = css({
54
- '&[data-menu-submenu="true"][data-anchor-placement^="right"]': {
55
- marginLeft: `calc(${theme.space.xs} * -1)`,
56
- },
57
- '&[data-menu-submenu="true"][data-anchor-placement^="left"]': {
58
- marginLeft: theme.space.xs,
59
- },
60
- '&[data-close-animation="none"]:not(:popover-open)': {
61
- transition: 'none',
62
- transitionBehavior: 'normal',
63
- },
64
- })
65
-
66
- const menuListCss: CSSMixinDescriptor = css({
67
- display: 'flex',
68
- flexDirection: 'column',
69
- flex: '1 1 auto',
70
- minHeight: 0,
71
- paddingBlock: theme.space.xs,
72
- paddingInline: theme.space.none,
73
- overflow: 'auto',
74
- overscrollBehavior: 'contain',
75
- outline: 'none',
76
- userSelect: 'none',
77
- WebkitUserSelect: 'none',
78
- '--rmx-ui-item-inset': `calc(${theme.space.sm} + ${theme.space.xs})`,
79
- '--rmx-ui-item-indicator-gap': 'var(--rmx-menu-item-slot-gap)',
80
- '--rmx-ui-item-indicator-width': 'var(--rmx-menu-item-slot-width)',
81
- '--rmx-menu-item-slot-gap': theme.space.none,
82
- '--rmx-menu-item-slot-width': theme.space.none,
83
- '&:has(> [role="menuitemcheckbox"])': {
84
- '--rmx-menu-item-slot-gap': theme.space.xs,
85
- '--rmx-menu-item-slot-width': theme.fontSize.md,
86
- },
87
- '&:has(> [role="menuitemradio"])': {
88
- '--rmx-menu-item-slot-gap': theme.space.xs,
89
- '--rmx-menu-item-slot-width': theme.fontSize.md,
90
- },
91
- })
92
-
93
- const menuItemCss: CSSMixinDescriptor = css({
94
- display: 'flex',
95
- alignItems: 'center',
96
- width: '100%',
97
- minWidth: 0,
98
- minHeight: theme.control.height.md,
99
- boxSizing: 'border-box',
100
- position: 'relative',
101
- isolation: 'isolate',
102
- paddingInline: `calc(${theme.space.sm} + ${theme.space.xs})`,
103
- color: theme.colors.text.primary,
104
- fontFamily: theme.fontFamily.sans,
105
- fontSize: theme.fontSize.sm,
106
- fontWeight: theme.fontWeight.normal,
107
- lineHeight: theme.lineHeight.normal,
108
- textAlign: 'left',
109
- userSelect: 'none',
110
- WebkitUserSelect: 'none',
111
- '--rmx-menu-item-indicator-opacity': '0',
112
- '&::before': {
113
- content: '""',
114
- position: 'absolute',
115
- insetBlock: 0,
116
- insetInline: theme.space.xs,
117
- borderRadius: theme.radius.md,
118
- backgroundColor: 'transparent',
119
- pointerEvents: 'none',
120
- zIndex: -1,
121
- },
122
- '&:focus': {
123
- outline: 'none',
124
- },
125
- '&[data-highlighted="true"]': {
126
- color: theme.colors.action.primary.foreground,
127
- },
128
- '&[data-highlighted="true"]::before': {
129
- backgroundColor: theme.colors.action.primary.background,
130
- },
131
- '&[aria-haspopup="menu"][aria-expanded="true"]:not(:focus)': {
132
- color: theme.colors.text.primary,
133
- },
134
- '&[aria-haspopup="menu"][aria-expanded="true"]:not(:focus)::before': {
135
- backgroundColor: theme.surface.lvl2,
136
- },
137
- '&[data-submenu-state="selecting"], &[data-submenu-state="dismissing"]': {
138
- color: theme.colors.text.primary,
139
- },
140
- '&[data-submenu-state="selecting"]::before, &[data-submenu-state="dismissing"]::before': {
141
- backgroundColor: theme.surface.lvl2,
142
- },
143
- '&[data-menu-flash="true"]': {
144
- color: theme.colors.text.primary,
145
- },
146
- '&[data-menu-flash="true"]::before': {
147
- backgroundColor: 'transparent',
148
- },
149
- '&[aria-disabled="true"]': {
150
- opacity: 0.5,
151
- },
152
- '&[aria-checked="true"], &[aria-selected="true"]': {
153
- '--rmx-menu-item-indicator-opacity': '1',
154
- },
155
- })
156
-
157
- const menuItemSlotCss: CSSMixinDescriptor = css({
158
- display: 'inline-flex',
159
- alignItems: 'center',
160
- justifyContent: 'center',
161
- flex: '0 0 var(--rmx-menu-item-slot-width)',
162
- width: 'var(--rmx-menu-item-slot-width)',
163
- minWidth: 0,
164
- marginInlineEnd: 'var(--rmx-menu-item-slot-gap)',
165
- overflow: 'hidden',
166
- })
167
-
168
- const menuItemLabelCss: CSSMixinDescriptor = css({
169
- display: 'inline-flex',
170
- alignItems: 'center',
171
- flex: '1 1 auto',
172
- minWidth: 0,
173
- })
174
-
175
- const menuItemGlyphCss: CSSMixinDescriptor = css({
176
- display: 'inline-flex',
177
- alignItems: 'center',
178
- justifyContent: 'center',
179
- width: theme.fontSize.md,
180
- height: theme.fontSize.md,
181
- color: 'currentColor',
182
- flexShrink: 0,
183
- '& > svg': {
184
- display: 'block',
185
- width: '100%',
186
- height: '100%',
187
- },
188
- opacity: 'var(--rmx-menu-item-indicator-opacity)',
189
- })
190
-
191
- const menuTriggerGlyphCss: CSSMixinDescriptor = css({
192
- display: 'inline-flex',
193
- alignItems: 'center',
194
- justifyContent: 'center',
195
- width: theme.fontSize.md,
196
- height: theme.fontSize.md,
197
- color: 'currentColor',
198
- flexShrink: 0,
199
- marginInlineStart: 'auto',
200
- '& > svg': {
201
- display: 'block',
202
- width: '100%',
203
- height: '100%',
204
- },
205
- })
206
-
207
- export const buttonStyle = menuButtonCss
208
- export const popoverStyle = menuPopoverCss
209
- export const listStyle = menuListCss
210
- export const itemStyle = menuItemCss
211
- export const itemSlotStyle = menuItemSlotCss
212
- export const itemLabelStyle = menuItemLabelCss
213
- export const itemGlyphStyle = menuItemGlyphCss
214
- export const triggerGlyphStyle = menuTriggerGlyphCss
215
-
216
33
  declare global {
217
34
  interface HTMLElementEventMap {
218
35
  [MENU_SELECT_EVENT]: MenuSelectEvent
@@ -250,6 +67,8 @@ export interface MenuProviderProps {
250
67
 
251
68
  export interface MenuTriggerOptions extends AnchorOptions {}
252
69
 
70
+ export interface MenuContextTriggerOptions extends AnchorOptions {}
71
+
253
72
  export interface MenuItemOptions {
254
73
  checked?: boolean
255
74
  disabled?: boolean
@@ -962,7 +781,90 @@ const triggerMixin: MixinFactory<HTMLElement, [options?: MenuTriggerOptions], El
962
781
  createMixin<HTMLElement, [options?: MenuTriggerOptions], ElementProps>((handle) => {
963
782
  let context = handle.context.get(MenuProvider)
964
783
 
965
- return (options = {}) => [
784
+ return (options = {}, props = options as ElementProps) => {
785
+ if (props === options) {
786
+ options = {}
787
+ }
788
+
789
+ return [
790
+ attrs({
791
+ id: handle.id,
792
+ 'aria-controls': context.listId,
793
+ 'aria-expanded': context.isOpen ? 'true' : 'false',
794
+ 'aria-haspopup': 'menu',
795
+ }),
796
+ ref((node: HTMLElement, signal) => {
797
+ context.registerTrigger(node, handle.id)
798
+ signal.addEventListener('abort', () => {
799
+ context.unregisterTrigger(node)
800
+ })
801
+ }),
802
+ popover.anchor({
803
+ placement: 'bottom-start',
804
+ ...options,
805
+ }),
806
+ on('click', () => {
807
+ if (context.isOpen) {
808
+ void context.closeAll()
809
+ } else {
810
+ void context.open({ strategy: 'list' })
811
+ }
812
+ }),
813
+ on('keydown', (event) => {
814
+ switch (event.key) {
815
+ case 'ArrowDown':
816
+ event.preventDefault()
817
+ event.stopPropagation()
818
+ void context.open({ strategy: 'first' })
819
+ break
820
+ case 'ArrowUp':
821
+ event.preventDefault()
822
+ event.stopPropagation()
823
+ void context.open({ strategy: 'last' })
824
+ break
825
+ case 'Enter':
826
+ case ' ':
827
+ event.preventDefault()
828
+ event.stopPropagation()
829
+ void context.open({ strategy: 'list' })
830
+ }
831
+ }),
832
+ ]
833
+ }
834
+ })
835
+
836
+ const contextTriggerMixin: MixinFactory<
837
+ HTMLElement,
838
+ [options?: MenuContextTriggerOptions],
839
+ ElementProps
840
+ > = createMixin<HTMLElement, [options?: MenuContextTriggerOptions], ElementProps>((handle) => {
841
+ let context = handle.context.get(MenuProvider)
842
+ let popoverContext = handle.context.get(popover.Context)
843
+ let anchorPoint: AnchorPoint = { x: 0, y: 0, width: 0, height: 0 }
844
+
845
+ function setAnchorPoint(
846
+ { x, y, width = 0, height = 0 }: AnchorPoint,
847
+ options: MenuContextTriggerOptions,
848
+ ) {
849
+ anchorPoint.x = x
850
+ anchorPoint.y = y
851
+ anchorPoint.width = width
852
+ anchorPoint.height = height
853
+ popoverContext.anchor = {
854
+ target: anchorPoint,
855
+ options: {
856
+ placement: 'bottom-start',
857
+ ...options,
858
+ },
859
+ }
860
+ }
861
+
862
+ return (options = {}, props = options as ElementProps) => {
863
+ if (props === options) {
864
+ options = {}
865
+ }
866
+
867
+ return [
966
868
  attrs({
967
869
  id: handle.id,
968
870
  'aria-controls': context.listId,
@@ -975,38 +877,35 @@ const triggerMixin: MixinFactory<HTMLElement, [options?: MenuTriggerOptions], El
975
877
  context.unregisterTrigger(node)
976
878
  })
977
879
  }),
978
- popover.anchor({
979
- placement: 'bottom-start',
980
- ...options,
981
- }),
982
- on('click', () => {
983
- if (context.isOpen) {
984
- void context.closeAll()
985
- } else {
986
- void context.open({ strategy: 'list' })
987
- }
880
+ on('contextmenu', (event) => {
881
+ event.preventDefault()
882
+ event.stopPropagation()
883
+ setAnchorPoint({ x: event.clientX, y: event.clientY }, options)
884
+ void context.open({ strategy: 'list' })
988
885
  }),
989
886
  on('keydown', (event) => {
990
- switch (event.key) {
991
- case 'ArrowDown':
992
- event.preventDefault()
993
- event.stopPropagation()
994
- void context.open({ strategy: 'first' })
995
- break
996
- case 'ArrowUp':
997
- event.preventDefault()
998
- event.stopPropagation()
999
- void context.open({ strategy: 'last' })
1000
- break
1001
- case 'Enter':
1002
- case ' ':
1003
- event.preventDefault()
1004
- event.stopPropagation()
1005
- void context.open({ strategy: 'list' })
887
+ if (event.key !== 'ContextMenu' && !(event.shiftKey && event.key === 'F10')) {
888
+ return
1006
889
  }
890
+
891
+ event.preventDefault()
892
+ event.stopPropagation()
893
+
894
+ let rect = event.currentTarget.getBoundingClientRect()
895
+ setAnchorPoint(
896
+ {
897
+ x: rect.left,
898
+ y: rect.top,
899
+ width: rect.width,
900
+ height: rect.height,
901
+ },
902
+ options,
903
+ )
904
+ void context.open({ strategy: 'list' })
1007
905
  }),
1008
906
  ]
1009
- })
907
+ }
908
+ })
1010
909
 
1011
910
  const popoverMixin: MixinFactory<HTMLElement, [], ElementProps> = createMixin<
1012
911
  HTMLElement,
@@ -1386,14 +1285,8 @@ const submenuTriggerMixin: MixinFactory<
1386
1285
  }
1387
1286
  })
1388
1287
 
1389
- export interface MenuListProps extends Props<'div'> {}
1390
-
1391
- type MenuListChildProps = Omit<
1392
- JSX.LibraryManagedAttributes<typeof MenuList, MenuListProps>,
1393
- 'children'
1394
- >
1395
-
1396
1288
  export const Context = MenuProvider
1289
+ export const contextTrigger = contextTriggerMixin
1397
1290
  export const item = itemMixin
1398
1291
  export const list = listMixin
1399
1292
  export { popoverMixin as popover }
@@ -1402,6 +1295,7 @@ export const trigger = triggerMixin
1402
1295
 
1403
1296
  const menu = {
1404
1297
  Context,
1298
+ contextTrigger,
1405
1299
  item,
1406
1300
  list,
1407
1301
  popover: popoverMixin,
@@ -1415,139 +1309,3 @@ export function onMenuSelect<target extends HTMLElement>(
1415
1309
  ): ReturnType<typeof on<target, typeof MENU_SELECT_EVENT>> {
1416
1310
  return on(MENU_SELECT_EVENT, handler, captureBoolean)
1417
1311
  }
1418
-
1419
- export interface MenuProps extends Omit<Props<'button'>, 'children'> {
1420
- children?: RemixNode
1421
- label: RemixNode
1422
- menuLabel?: string
1423
- }
1424
-
1425
- export interface MenuItemProps
1426
- extends Omit<Props<'div'>, 'children' | 'name' | 'type' | 'value'>,
1427
- MenuItemOptions {
1428
- children?: RemixNode
1429
- }
1430
-
1431
- export interface SubmenuProps
1432
- extends Omit<Props<'div'>, 'children' | 'name' | 'type' | 'value'>,
1433
- Omit<SubmenuTriggerOptions, 'label'> {
1434
- children?: RemixNode
1435
- label: RemixNode
1436
- listProps?: MenuListChildProps
1437
- menuLabel?: string
1438
- }
1439
-
1440
- export function Menu(handle: Handle<MenuProps>): () => RemixNode {
1441
- let buttonRef: HTMLButtonElement | undefined
1442
-
1443
- return () => {
1444
- let { children, label, menuLabel, mix, type, ...buttonProps } = handle.props
1445
-
1446
- return (
1447
- <menu.Context label={menuLabel}>
1448
- <button
1449
- {...buttonProps}
1450
- type={type ?? 'button'}
1451
- mix={[
1452
- button.baseStyle,
1453
- button.ghostStyle,
1454
- buttonStyle,
1455
- menu.trigger(),
1456
- ref((node: HTMLButtonElement, signal) => {
1457
- buttonRef = node
1458
- signal.addEventListener('abort', () => {
1459
- if (buttonRef === node) {
1460
- buttonRef = undefined
1461
- }
1462
- })
1463
- }),
1464
- mix,
1465
- ]}
1466
- >
1467
- <span mix={button.labelStyle}>{label}</span>
1468
- <Glyph mix={button.iconStyle} name="chevronDown" />
1469
- </button>
1470
- <MenuList
1471
- mix={onMenuSelect((event) => {
1472
- if (!buttonRef) {
1473
- return
1474
- }
1475
-
1476
- event.stopPropagation()
1477
- buttonRef.dispatchEvent(new MenuSelectEvent(event.item))
1478
- })}
1479
- >
1480
- {children}
1481
- </MenuList>
1482
- </menu.Context>
1483
- )
1484
- }
1485
- }
1486
-
1487
- export function MenuList(handle: Handle<MenuListProps>): () => RemixNode {
1488
- return () => {
1489
- let { children, mix, ...divProps } = handle.props
1490
-
1491
- return (
1492
- <div mix={[popover.surfaceStyle, popoverStyle, menu.popover()]}>
1493
- <div {...divProps} mix={[listStyle, menu.list(), mix]}>
1494
- {children}
1495
- </div>
1496
- </div>
1497
- )
1498
- }
1499
- }
1500
-
1501
- export function MenuItem(handle: Handle<MenuItemProps>): () => RemixNode {
1502
- return () => {
1503
- let { checked, children, disabled, label, mix, name, searchValue, type, value, ...divProps } =
1504
- handle.props
1505
-
1506
- return (
1507
- <div
1508
- {...divProps}
1509
- mix={[
1510
- itemStyle,
1511
- menu.item({ checked, disabled, label, name, searchValue, type, value }),
1512
- mix,
1513
- ]}
1514
- >
1515
- <span mix={itemSlotStyle}>
1516
- <Glyph mix={itemGlyphStyle} name="check" />
1517
- </span>
1518
- <span mix={itemLabelStyle}>{children ?? label}</span>
1519
- </div>
1520
- )
1521
- }
1522
- }
1523
-
1524
- export function Submenu(handle: Handle<SubmenuProps>): () => RemixNode {
1525
- return () => {
1526
- let { children, disabled, label, listProps, menuLabel, mix, searchValue, value, ...divProps } =
1527
- handle.props
1528
-
1529
- return (
1530
- <menu.Context label={menuLabel}>
1531
- <div
1532
- {...divProps}
1533
- mix={[
1534
- itemStyle,
1535
- menu.submenuTrigger({
1536
- disabled,
1537
- searchValue,
1538
- value,
1539
- }),
1540
- mix,
1541
- ]}
1542
- >
1543
- <span mix={itemSlotStyle}>
1544
- <Glyph mix={itemGlyphStyle} name="check" />
1545
- </span>
1546
- <span mix={itemLabelStyle}>{label}</span>
1547
- <Glyph mix={triggerGlyphStyle} name="chevronRight" />
1548
- </div>
1549
- <MenuList {...listProps}>{children}</MenuList>
1550
- </menu.Context>
1551
- )
1552
- }
1553
- }
@@ -1,16 +1,15 @@
1
- # Popover
1
+ # popover
2
2
 
3
3
  `popover` is a low-level primitive for anchored, dismissible floating panels.
4
4
 
5
- Use it for custom surfaces like filters, inspectors, and view options. Higher-level widgets like `menu`, `select`, and `combobox` should build on top of it instead of exposing raw `popover.*` mixins directly.
5
+ Use it for custom surfaces like filters, inspectors, and view options. Higher-level widgets like menu, select, and combobox should build on top of it instead of exposing raw `popover.*` mixins directly.
6
6
 
7
- ## Usage
7
+ ## Primitive Usage
8
8
 
9
9
  ```tsx
10
- import { css, on, type Handle } from 'remix/ui'
11
- import { Button } from 'remix/ui/button'
12
- import { Glyph } from 'remix/ui/glyph'
13
- import { popover } from 'remix/ui/popover'
10
+ import { on, type Handle } from 'remix/ui'
11
+ import * as popover from 'remix/ui/popover'
12
+ import { panelStyle } from './popover.styles'
14
13
 
15
14
  export function ViewOptions(handle: Handle) {
16
15
  let open = false
@@ -27,21 +26,20 @@ export function ViewOptions(handle: Handle) {
27
26
 
28
27
  return () => (
29
28
  <popover.Context>
30
- <Button
31
- endIcon={<Glyph name="chevronDown" />}
29
+ <button
32
30
  mix={[
33
31
  popover.anchor({ placement: 'bottom-end' }),
34
32
  popover.focusOnHide(),
35
33
  on('click', openPopover),
36
34
  ]}
37
- tone="secondary"
35
+ type="button"
38
36
  >
39
37
  View options
40
- </Button>
38
+ </button>
41
39
 
42
40
  <div
43
41
  mix={[
44
- popover.surfaceStyle,
42
+ panelStyle,
45
43
  popover.surface({
46
44
  open,
47
45
  onHide() {
@@ -50,23 +48,17 @@ export function ViewOptions(handle: Handle) {
50
48
  }),
51
49
  ]}
52
50
  >
53
- <div mix={popover.contentStyle}>
54
- <Button mix={[popover.focusOnShow(), on('click', closePopover)]} tone="ghost">
55
- Close
56
- </Button>
57
- <div mix={panelBody}>Panel content</div>
58
- </div>
51
+ <button mix={[popover.focusOnShow(), on('click', closePopover)]} type="button">
52
+ Close
53
+ </button>
54
+ <div>Panel content</div>
59
55
  </div>
60
56
  </popover.Context>
61
57
  )
62
58
  }
63
-
64
- let panelBody = css({
65
- padding: '12px',
66
- })
67
59
  ```
68
60
 
69
- ## `popover.*`
61
+ ## `remix/ui/popover`
70
62
 
71
63
  ### `popover.Context`
72
64
 
@@ -76,10 +68,6 @@ Provides shared coordination for one popover instance. Render the anchor, any fo
76
68
 
77
69
  Registers the host element as the anchor for the current popover surface.
78
70
 
79
- - Accepts standard `AnchorOptions`.
80
- - The stored anchor controls where the surface is positioned when it opens.
81
- - Apply it to the button or other element the surface should attach to.
82
-
83
71
  ### `popover.surface({ open, onHide, ... })`
84
72
 
85
73
  Turns the host into the controlled popover surface.
@@ -99,13 +87,12 @@ Registers the element that should receive focus when the popover opens.
99
87
 
100
88
  Registers the element that should receive focus again when the popover closes.
101
89
 
102
- ### `popover.surfaceStyle`
103
-
104
- Default floating-surface presentation for popovers.
90
+ ### Primitive Types
105
91
 
106
- ### `popover.contentStyle`
107
-
108
- Default inner scroll container for popover content.
92
+ - `PopoverContext`: context object exposed by `popover.Context`.
93
+ - `PopoverProps`: provider props for one popover instance.
94
+ - `PopoverSurfaceOptions`: options accepted by `popover.surface(...)`.
95
+ - `PopoverHideRequest`: hide request passed to `onHide`.
109
96
 
110
97
  ## Behavior Notes
111
98
 
@@ -114,9 +101,3 @@ Default inner scroll container for popover content.
114
101
  - `popover.focusOnShow()` wins on open when present.
115
102
  - `popover.focusOnHide()` is used on close by default when focus restoration is enabled.
116
103
  - `closeOnAnchorClick: false` keeps anchor clicks inside the current session, which is useful for input-driven popovers like comboboxes.
117
-
118
- ## When To Use Something Else
119
-
120
- - Use `menu` for command surfaces.
121
- - Use `listbox` or `select` for committed value picking.
122
- - Use `combobox` for input-first popup selection.