@dxos/react-ui 0.10.0 → 0.11.1

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 (354) hide show
  1. package/dist/lib/chunk-parse-stack.mjs +1566 -0
  2. package/dist/lib/chunk-parse-stack.mjs.map +1 -0
  3. package/dist/lib/index.mjs +5220 -0
  4. package/dist/lib/index.mjs.map +1 -0
  5. package/dist/lib/testing.mjs +144 -0
  6. package/dist/lib/testing.mjs.map +1 -0
  7. package/dist/lib/translations.mjs +38 -0
  8. package/dist/lib/translations.mjs.map +1 -0
  9. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -6
  10. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  11. package/dist/types/src/components/Avatars/AvatarContext.d.ts +9 -0
  12. package/dist/types/src/components/Avatars/AvatarContext.d.ts.map +1 -0
  13. package/dist/types/src/components/Avatars/index.d.ts +1 -0
  14. package/dist/types/src/components/Avatars/index.d.ts.map +1 -1
  15. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  16. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  17. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -1
  19. package/dist/types/src/components/Button/Button.d.ts +1 -6
  20. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/ButtonGroupContext.d.ts +9 -0
  22. package/dist/types/src/components/Button/ButtonGroupContext.d.ts.map +1 -0
  23. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Button/IconButton.theme.d.ts +1 -0
  26. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -1
  27. package/dist/types/src/components/Button/SystemIconButton.d.ts +1 -1
  28. package/dist/types/src/components/Button/SystemIconButton.d.ts.map +1 -1
  29. package/dist/types/src/components/Button/index.d.ts +1 -0
  30. package/dist/types/src/components/Button/index.d.ts.map +1 -1
  31. package/dist/types/src/components/Calendar/Calendar.d.ts +0 -2
  32. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/types/src/components/Calendar/index.d.ts +1 -0
  34. package/dist/types/src/components/Calendar/index.d.ts.map +1 -1
  35. package/dist/types/src/components/Calendar/parse-calendar-date.d.ts +3 -0
  36. package/dist/types/src/components/Calendar/parse-calendar-date.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.d.ts +42 -15
  38. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  39. package/dist/types/src/components/Card/Card.theme.d.ts +0 -1
  40. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -1
  41. package/dist/types/src/components/Carousel/Carousel.d.ts +2 -4
  42. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -1
  43. package/dist/types/src/components/Carousel/CarouselContext.d.ts +8 -0
  44. package/dist/types/src/components/Carousel/CarouselContext.d.ts.map +1 -0
  45. package/dist/types/src/components/Carousel/index.d.ts +1 -0
  46. package/dist/types/src/components/Carousel/index.d.ts.map +1 -1
  47. package/dist/types/src/components/Clipboard/ClipboardContext.d.ts +7 -0
  48. package/dist/types/src/components/Clipboard/ClipboardContext.d.ts.map +1 -0
  49. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts +0 -6
  50. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  51. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  52. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  53. package/dist/types/src/components/Column/Column.d.ts +7 -12
  54. package/dist/types/src/components/Column/Column.d.ts.map +1 -1
  55. package/dist/types/src/components/Column/Column.stories.d.ts +2 -2
  56. package/dist/types/src/components/Column/Column.theme.d.ts +0 -1
  57. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -1
  58. package/dist/types/src/components/Column/ColumnContext.d.ts +9 -0
  59. package/dist/types/src/components/Column/ColumnContext.d.ts.map +1 -0
  60. package/dist/types/src/components/Column/index.d.ts +1 -0
  61. package/dist/types/src/components/Column/index.d.ts.map +1 -1
  62. package/dist/types/src/components/Column/withColumn.d.ts +40 -4
  63. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -1
  64. package/dist/types/src/components/DatePicker/DatePicker.d.ts +0 -10
  65. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -1
  66. package/dist/types/src/components/DatePicker/DatePickerContext.d.ts +13 -0
  67. package/dist/types/src/components/DatePicker/DatePickerContext.d.ts.map +1 -0
  68. package/dist/types/src/components/DatePicker/index.d.ts +1 -0
  69. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -1
  70. package/dist/types/src/components/Dialog/AlertDialog.d.ts +3 -3
  71. package/dist/types/src/components/Dialog/Dialog.d.ts +3 -3
  72. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +5 -10
  73. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  74. package/dist/types/src/components/ErrorFallback/index.d.ts +1 -0
  75. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -1
  76. package/dist/types/src/components/ErrorFallback/parse-stack.d.ts +8 -0
  77. package/dist/types/src/components/ErrorFallback/parse-stack.d.ts.map +1 -0
  78. package/dist/types/src/components/Focus/Focus.d.ts +2 -10
  79. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  80. package/dist/types/src/components/Focus/FocusContext.d.ts +10 -0
  81. package/dist/types/src/components/Focus/FocusContext.d.ts.map +1 -0
  82. package/dist/types/src/components/Focus/index.d.ts +1 -0
  83. package/dist/types/src/components/Focus/index.d.ts.map +1 -1
  84. package/dist/types/src/components/Input/Input.d.ts +9 -10
  85. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  86. package/dist/types/src/components/Input/Input.stories.d.ts +7 -2
  87. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/Input/Input.theme.d.ts +13 -0
  89. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -1
  90. package/dist/types/src/components/Input/InputTriggerContext.d.ts +15 -0
  91. package/dist/types/src/components/Input/InputTriggerContext.d.ts.map +1 -0
  92. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -1
  93. package/dist/types/src/components/Input/index.d.ts +1 -0
  94. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +2 -35
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -1
  99. package/dist/types/src/components/Main/MainContext.d.ts +38 -0
  100. package/dist/types/src/components/Main/MainContext.d.ts.map +1 -0
  101. package/dist/types/src/components/Main/index.d.ts +1 -0
  102. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  103. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +1 -17
  104. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -1
  105. package/dist/types/src/components/MediaPlayer/index.d.ts +1 -0
  106. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -1
  107. package/dist/types/src/components/MediaPlayer/media-kind.d.ts +18 -0
  108. package/dist/types/src/components/MediaPlayer/media-kind.d.ts.map +1 -0
  109. package/dist/types/src/components/Menu/DropdownMenu.d.ts +6 -22
  110. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  111. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +1 -11
  112. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Menu/DropdownMenuContext.d.ts +27 -0
  114. package/dist/types/src/components/Menu/DropdownMenuContext.d.ts.map +1 -0
  115. package/dist/types/src/components/Menu/index.d.ts +1 -0
  116. package/dist/types/src/components/Menu/index.d.ts.map +1 -1
  117. package/dist/types/src/components/Message/Message.d.ts +11 -6
  118. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  119. package/dist/types/src/components/Message/Message.stories.d.ts +4 -1
  120. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -1
  122. package/dist/types/src/components/Message/index.d.ts +1 -0
  123. package/dist/types/src/components/Message/index.d.ts.map +1 -1
  124. package/dist/types/src/components/Message/message-icons.d.ts +3 -0
  125. package/dist/types/src/components/Message/message-icons.d.ts.map +1 -0
  126. package/dist/types/src/components/Panel/Panel.d.ts +4 -4
  127. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -1
  128. package/dist/types/src/components/Panel/Panel.theme.d.ts +1 -1
  129. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -1
  130. package/dist/types/src/components/Popover/Popover.d.ts +6 -10
  131. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  132. package/dist/types/src/components/Popover/PopoverContext.d.ts +29 -0
  133. package/dist/types/src/components/Popover/PopoverContext.d.ts.map +1 -0
  134. package/dist/types/src/components/Popover/index.d.ts +1 -0
  135. package/dist/types/src/components/Popover/index.d.ts.map +1 -1
  136. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  137. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  138. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +3 -16
  139. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  140. package/dist/types/src/components/ScrollContainer/ScrollContainerContext.d.ts +16 -0
  141. package/dist/types/src/components/ScrollContainer/ScrollContainerContext.d.ts.map +1 -0
  142. package/dist/types/src/components/ScrollContainer/index.d.ts +1 -0
  143. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -1
  144. package/dist/types/src/components/Slider/Slider.d.ts +25 -0
  145. package/dist/types/src/components/Slider/Slider.d.ts.map +1 -0
  146. package/dist/types/src/components/Slider/Slider.stories.d.ts +29 -0
  147. package/dist/types/src/components/Slider/Slider.stories.d.ts.map +1 -0
  148. package/dist/types/src/components/Slider/Slider.test.d.ts +2 -0
  149. package/dist/types/src/components/Slider/Slider.test.d.ts.map +1 -0
  150. package/dist/types/src/components/Slider/Slider.theme.d.ts +7 -0
  151. package/dist/types/src/components/Slider/Slider.theme.d.ts.map +1 -0
  152. package/dist/types/src/components/Slider/index.d.ts +2 -0
  153. package/dist/types/src/components/Slider/index.d.ts.map +1 -0
  154. package/dist/types/src/components/Splitter/Splitter.d.ts +3 -3
  155. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  156. package/dist/types/src/components/Toolbar/Toolbar.d.ts +4 -2
  157. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  158. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -1
  159. package/dist/types/src/components/Tooltip/TextTooltip.d.ts.map +1 -1
  160. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -23
  161. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/TooltipContext.d.ts +35 -0
  163. package/dist/types/src/components/Tooltip/TooltipContext.d.ts.map +1 -0
  164. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  165. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +1 -0
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  169. package/dist/types/src/hooks/useIconHref.d.ts +8 -0
  170. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  171. package/dist/types/src/hooks/useThemeContext.d.ts +2 -1
  172. package/dist/types/src/hooks/useThemeContext.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useThemeContext.test.d.ts +2 -0
  174. package/dist/types/src/hooks/useThemeContext.test.d.ts.map +1 -0
  175. package/dist/types/src/playground/Density.stories.d.ts +11 -0
  176. package/dist/types/src/playground/Density.stories.d.ts.map +1 -0
  177. package/dist/types/src/playground/Elevation.stories.d.ts +14 -0
  178. package/dist/types/src/playground/Elevation.stories.d.ts.map +1 -0
  179. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  180. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  181. package/dist/types/src/primitives/DensityProvider/DensityContext.d.ts +6 -0
  182. package/dist/types/src/primitives/DensityProvider/DensityContext.d.ts.map +1 -0
  183. package/dist/types/src/primitives/DensityProvider/DensityProvider.d.ts +10 -4
  184. package/dist/types/src/primitives/DensityProvider/DensityProvider.d.ts.map +1 -1
  185. package/dist/types/src/primitives/DensityProvider/index.d.ts +1 -0
  186. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -1
  187. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  188. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  189. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  190. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  191. package/dist/types/src/primitives/ThemeProvider/IconRegistry.d.ts +15 -0
  192. package/dist/types/src/primitives/ThemeProvider/IconRegistry.d.ts.map +1 -0
  193. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.d.ts +1 -2
  194. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  195. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
  196. package/dist/types/src/primitives/ThemeProvider/TranslationsContext.d.ts +112 -0
  197. package/dist/types/src/primitives/ThemeProvider/TranslationsContext.d.ts.map +1 -0
  198. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +0 -109
  199. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  200. package/dist/types/src/primitives/ThemeProvider/icon-registry.d.ts +34 -0
  201. package/dist/types/src/primitives/ThemeProvider/icon-registry.d.ts.map +1 -0
  202. package/dist/types/src/primitives/ThemeProvider/index.d.ts +3 -1
  203. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -1
  204. package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
  205. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  206. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -1
  207. package/dist/types/src/theme/index.d.ts +1 -0
  208. package/dist/types/src/theme/index.d.ts.map +1 -1
  209. package/dist/types/src/util/slots.d.ts +6 -3
  210. package/dist/types/src/util/slots.d.ts.map +1 -1
  211. package/dist/types/src/util/slots.stories.d.ts +14 -0
  212. package/dist/types/src/util/slots.stories.d.ts.map +1 -0
  213. package/dist/types/tsconfig.tsbuildinfo +1 -1
  214. package/package.json +25 -27
  215. package/src/components/Avatars/Avatar.tsx +1 -11
  216. package/src/components/Avatars/AvatarContext.ts +16 -0
  217. package/src/components/Avatars/index.ts +2 -0
  218. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +27 -25
  219. package/src/components/Breadcrumb/Breadcrumb.theme.ts +7 -5
  220. package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
  221. package/src/components/Button/Button.tsx +2 -11
  222. package/src/components/Button/ButtonGroupContext.ts +17 -0
  223. package/src/components/Button/IconButton.stories.tsx +2 -3
  224. package/src/components/Button/IconButton.theme.ts +15 -2
  225. package/src/components/Button/IconButton.tsx +6 -1
  226. package/src/components/Button/SystemIconButton.tsx +23 -16
  227. package/src/components/Button/index.ts +2 -0
  228. package/src/components/Calendar/Calendar.theme.ts +5 -5
  229. package/src/components/Calendar/Calendar.tsx +1 -3
  230. package/src/components/Calendar/index.ts +2 -0
  231. package/src/components/Calendar/parse-calendar-date.ts +9 -0
  232. package/src/components/Card/Card.theme.ts +48 -38
  233. package/src/components/Card/Card.tsx +77 -16
  234. package/src/components/Carousel/Carousel.tsx +4 -11
  235. package/src/components/Carousel/CarouselContext.ts +17 -0
  236. package/src/components/Carousel/index.ts +2 -0
  237. package/src/components/Clipboard/ClipboardContext.ts +20 -0
  238. package/src/components/Clipboard/ClipboardProvider.tsx +2 -12
  239. package/src/components/Clipboard/CopyButton.tsx +1 -1
  240. package/src/components/Clipboard/index.ts +1 -1
  241. package/src/components/Column/Column.stories.tsx +2 -2
  242. package/src/components/Column/Column.theme.ts +2 -11
  243. package/src/components/Column/Column.tsx +35 -57
  244. package/src/components/Column/ColumnContext.ts +22 -0
  245. package/src/components/Column/index.ts +2 -0
  246. package/src/components/Column/withColumn.ts +41 -4
  247. package/src/components/DatePicker/DatePicker.theme.ts +2 -2
  248. package/src/components/DatePicker/DatePicker.tsx +1 -14
  249. package/src/components/DatePicker/DatePickerContext.ts +21 -0
  250. package/src/components/DatePicker/index.ts +2 -0
  251. package/src/components/ErrorFallback/ErrorStack.tsx +8 -28
  252. package/src/components/ErrorFallback/index.ts +1 -0
  253. package/src/components/ErrorFallback/parse-stack.ts +33 -0
  254. package/src/components/Focus/Focus.stories.tsx +6 -6
  255. package/src/components/Focus/Focus.tsx +2 -30
  256. package/src/components/Focus/FocusContext.ts +22 -0
  257. package/src/components/Focus/index.ts +2 -0
  258. package/src/components/Image/Image.tsx +1 -1
  259. package/src/components/Input/Input.stories.tsx +63 -48
  260. package/src/components/Input/Input.theme.ts +33 -27
  261. package/src/components/Input/Input.tsx +46 -43
  262. package/src/components/Input/InputTriggerContext.ts +45 -0
  263. package/src/components/Input/SegmentedInput.tsx +2 -1
  264. package/src/components/Input/index.ts +2 -0
  265. package/src/components/Main/Main.stories.tsx +2 -1
  266. package/src/components/Main/Main.theme.ts +10 -1
  267. package/src/components/Main/Main.tsx +1 -115
  268. package/src/components/Main/MainContext.ts +126 -0
  269. package/src/components/Main/index.ts +2 -0
  270. package/src/components/MediaPlayer/MediaPlayer.tsx +16 -47
  271. package/src/components/MediaPlayer/index.ts +2 -0
  272. package/src/components/MediaPlayer/media-kind.ts +41 -0
  273. package/src/components/Menu/DropdownMenu.tsx +27 -44
  274. package/src/components/Menu/DropdownMenuContext.ts +35 -0
  275. package/src/components/Menu/Menu.theme.ts +3 -3
  276. package/src/components/Menu/index.ts +2 -0
  277. package/src/components/Message/Message.stories.tsx +32 -15
  278. package/src/components/Message/Message.theme.ts +8 -2
  279. package/src/components/Message/Message.tsx +47 -23
  280. package/src/components/Message/index.ts +2 -0
  281. package/src/components/Message/message-icons.ts +16 -0
  282. package/src/components/Panel/Panel.stories.tsx +15 -2
  283. package/src/components/Panel/Panel.theme.ts +15 -6
  284. package/src/components/Popover/Popover.theme.ts +1 -1
  285. package/src/components/Popover/Popover.tsx +22 -37
  286. package/src/components/Popover/PopoverContext.ts +32 -0
  287. package/src/components/Popover/index.ts +2 -0
  288. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  289. package/src/components/ScrollContainer/ScrollContainer.tsx +1 -18
  290. package/src/components/ScrollContainer/ScrollContainerContext.ts +25 -0
  291. package/src/components/ScrollContainer/index.ts +2 -0
  292. package/src/components/Select/Select.theme.ts +2 -2
  293. package/src/components/Slider/Slider.stories.tsx +107 -0
  294. package/src/components/Slider/Slider.test.tsx +105 -0
  295. package/src/components/Slider/Slider.theme.ts +38 -0
  296. package/src/components/Slider/Slider.tsx +64 -0
  297. package/src/components/Slider/index.ts +5 -0
  298. package/src/components/Status/Status.theme.ts +1 -1
  299. package/src/components/Status/Status.tsx +0 -1
  300. package/src/components/Tag/Tag.stories.tsx +1 -1
  301. package/src/components/Toolbar/Toolbar.theme.ts +14 -5
  302. package/src/components/Toolbar/Toolbar.tsx +5 -1
  303. package/src/components/Tooltip/TextTooltip.tsx +2 -1
  304. package/src/components/Tooltip/Tooltip.tsx +12 -35
  305. package/src/components/Tooltip/TooltipContext.ts +41 -0
  306. package/src/components/Tooltip/index.ts +2 -0
  307. package/src/components/index.ts +1 -0
  308. package/src/hooks/useIconHref.ts +26 -5
  309. package/src/hooks/useThemeContext.test.tsx +33 -0
  310. package/src/hooks/useThemeContext.ts +28 -3
  311. package/src/playground/Density.stories.tsx +41 -0
  312. package/src/playground/Elevation.stories.tsx +348 -0
  313. package/src/primitives/DensityProvider/DensityContext.ts +15 -0
  314. package/src/primitives/DensityProvider/DensityProvider.tsx +12 -6
  315. package/src/primitives/DensityProvider/index.ts +1 -0
  316. package/src/primitives/Flex/Flex.stories.tsx +1 -1
  317. package/src/primitives/Grid/Grid.stories.tsx +1 -1
  318. package/src/primitives/ThemeProvider/IconRegistry.tsx +42 -0
  319. package/src/primitives/ThemeProvider/ThemeProvider.tsx +16 -15
  320. package/src/primitives/ThemeProvider/TranslationsContext.ts +24 -0
  321. package/src/primitives/ThemeProvider/TranslationsProvider.tsx +4 -16
  322. package/src/primitives/ThemeProvider/icon-registry.ts +272 -0
  323. package/src/primitives/ThemeProvider/index.ts +9 -1
  324. package/src/testing/decorators/withLayout.tsx +4 -4
  325. package/src/testing/decorators/withLayoutVariants.tsx +3 -3
  326. package/src/testing/decorators/withTheme.tsx +1 -2
  327. package/src/theme/defaultTheme.ts +2 -0
  328. package/src/theme/index.ts +1 -0
  329. package/src/util/slots.stories.tsx +80 -0
  330. package/src/util/slots.ts +14 -5
  331. package/dist/lib/browser/chunk-CMHHVHX3.mjs +0 -46
  332. package/dist/lib/browser/chunk-CMHHVHX3.mjs.map +0 -7
  333. package/dist/lib/browser/chunk-GTHV4WYK.mjs +0 -1499
  334. package/dist/lib/browser/chunk-GTHV4WYK.mjs.map +0 -7
  335. package/dist/lib/browser/index.mjs +0 -5632
  336. package/dist/lib/browser/index.mjs.map +0 -7
  337. package/dist/lib/browser/meta.json +0 -1
  338. package/dist/lib/browser/testing/index.mjs +0 -133
  339. package/dist/lib/browser/testing/index.mjs.map +0 -7
  340. package/dist/lib/browser/translations.mjs +0 -9
  341. package/dist/lib/browser/translations.mjs.map +0 -7
  342. package/dist/lib/node-esm/chunk-3VSKWNCQ.mjs +0 -1501
  343. package/dist/lib/node-esm/chunk-3VSKWNCQ.mjs.map +0 -7
  344. package/dist/lib/node-esm/chunk-P4KFQGJI.mjs +0 -48
  345. package/dist/lib/node-esm/chunk-P4KFQGJI.mjs.map +0 -7
  346. package/dist/lib/node-esm/index.mjs +0 -5633
  347. package/dist/lib/node-esm/index.mjs.map +0 -7
  348. package/dist/lib/node-esm/meta.json +0 -1
  349. package/dist/lib/node-esm/testing/index.mjs +0 -134
  350. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  351. package/dist/lib/node-esm/translations.mjs +0 -10
  352. package/dist/lib/node-esm/translations.mjs.map +0 -7
  353. package/src/components/Column/AUDIT.md +0 -148
  354. package/src/components/Focus/AUDIT.md +0 -43
@@ -18,14 +18,7 @@ import { type ThemedClassName } from '../../util';
18
18
  import { IconButton } from '../Button';
19
19
  import { Column } from '../Column';
20
20
  import { Icon } from '../Icon';
21
-
22
- const messageIcons: Record<MessageValence, string> = {
23
- success: 'ph--check-circle--duotone',
24
- info: 'ph--info--duotone',
25
- warning: 'ph--warning--duotone',
26
- error: 'ph--warning-circle--duotone',
27
- neutral: 'ph--info--duotone',
28
- };
21
+ import { messageIcons } from './message-icons';
29
22
 
30
23
  type MessageRootProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
31
24
  valence?: MessageValence;
@@ -33,9 +26,11 @@ type MessageRootProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.d
33
26
  asChild?: boolean;
34
27
  titleId?: string;
35
28
  descriptionId?: string;
29
+ /** Overrides the default valence icon; consumed by {@link MessageTitle}. */
30
+ icon?: string;
36
31
  };
37
32
 
38
- type MessageContextValue = { titleId?: string; descriptionId: string; valence: MessageValence };
33
+ type MessageContextValue = { titleId?: string; descriptionId: string; valence: MessageValence; icon?: string };
39
34
 
40
35
  const MESSAGE_NAME = 'Message';
41
36
 
@@ -90,6 +85,7 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
90
85
  classNames,
91
86
  titleId: propsTitleId,
92
87
  descriptionId: propsDescriptionId,
88
+ icon,
93
89
  children,
94
90
  ...props
95
91
  },
@@ -101,7 +97,7 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
101
97
  const elevation = useElevationContext(propsElevation);
102
98
 
103
99
  return (
104
- <MessageProvider {...{ titleId, descriptionId, valence }}>
100
+ <MessageProvider {...{ titleId, descriptionId, valence, icon }}>
105
101
  <Column.Root
106
102
  asChild={asChild}
107
103
  role={valence === 'neutral' ? 'paragraph' : 'alert'}
@@ -121,6 +117,35 @@ const MessageRoot = forwardRef<HTMLDivElement, MessageRootProps>(
121
117
 
122
118
  MessageRoot.displayName = MESSAGE_NAME;
123
119
 
120
+ //
121
+ // Content
122
+ //
123
+
124
+ type MessageContentProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.div>> & {
125
+ asChild?: boolean;
126
+ };
127
+
128
+ const MESSAGE_CONTENT_NAME = 'Message.Content';
129
+
130
+ /**
131
+ * Optional padded wrapper around a message's title and body — supplies the inset that hosts
132
+ * otherwise had to add with their own wrapper `div`. Spans the root's tracks via subgrid so
133
+ * `Message.Title` still places its icon in the gutter.
134
+ */
135
+ const MessageContent = forwardRef<HTMLDivElement, MessageContentProps>(
136
+ ({ asChild, classNames, children, ...props }, forwardedRef) => {
137
+ const { tx } = useThemeContext();
138
+ const Comp = asChild ? Slot : Primitive.div;
139
+ return (
140
+ <Comp {...props} className={tx('message.content', {}, classNames)} ref={forwardedRef}>
141
+ {children}
142
+ </Comp>
143
+ );
144
+ },
145
+ );
146
+
147
+ MessageContent.displayName = MESSAGE_CONTENT_NAME;
148
+
124
149
  //
125
150
  // Title
126
151
  //
@@ -136,8 +161,8 @@ const MessageTitle = forwardRef<HTMLDivElement, MessageTitleProps>(
136
161
  ({ classNames, children, icon: iconProp, onClose }, forwardedRef) => {
137
162
  const { t } = useTranslation(translationKey);
138
163
  const { tx } = useThemeContext();
139
- const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
140
- const icon = iconProp ?? messageIcons[valence];
164
+ const { titleId, valence, icon: contextIcon } = useMessageContext(MESSAGE_TITLE_NAME);
165
+ const icon = iconProp ?? contextIcon ?? messageIcons[valence];
141
166
  return (
142
167
  <Column.Row classNames={tx('message.header', {}, classNames)} ref={forwardedRef}>
143
168
  {icon && (
@@ -168,29 +193,29 @@ const MessageTitle = forwardRef<HTMLDivElement, MessageTitleProps>(
168
193
  MessageTitle.displayName = MESSAGE_TITLE_NAME;
169
194
 
170
195
  //
171
- // Content
196
+ // Body
172
197
  //
173
198
 
174
- type MessageContentProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primitive.h2>>, 'id'> & {
199
+ type MessageBodyProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primitive.h2>>, 'id'> & {
175
200
  asChild?: boolean;
176
201
  };
177
202
 
178
- const MESSAGE_CONTENT_NAME = 'Message.Content';
203
+ const MESSAGE_BODY_NAME = 'Message.Body';
179
204
 
180
- const MessageContent = forwardRef<HTMLParagraphElement, MessageContentProps>(
205
+ const MessageBody = forwardRef<HTMLParagraphElement, MessageBodyProps>(
181
206
  ({ asChild, classNames, children, ...props }, forwardedRef) => {
182
207
  const { tx } = useThemeContext();
183
- const { descriptionId } = useMessageContext(MESSAGE_CONTENT_NAME);
208
+ const { descriptionId } = useMessageContext(MESSAGE_BODY_NAME);
184
209
  const Comp = asChild ? Slot : Primitive.p;
185
210
  return (
186
- <Comp {...props} className={tx('message.content', {}, classNames)} id={descriptionId} ref={forwardedRef}>
211
+ <Comp {...props} className={tx('message.body', {}, classNames)} id={descriptionId} ref={forwardedRef}>
187
212
  {children}
188
213
  </Comp>
189
214
  );
190
215
  },
191
216
  );
192
217
 
193
- MessageContent.displayName = MESSAGE_CONTENT_NAME;
218
+ MessageBody.displayName = MESSAGE_BODY_NAME;
194
219
 
195
220
  //
196
221
  // Message
@@ -198,12 +223,11 @@ MessageContent.displayName = MESSAGE_CONTENT_NAME;
198
223
 
199
224
  export const Message = {
200
225
  Root: MessageRoot,
201
- Title: MessageTitle,
202
226
  Content: MessageContent,
227
+ Title: MessageTitle,
228
+ Body: MessageBody,
203
229
  };
204
230
 
205
231
  export const Callout = Message;
206
232
 
207
- export type { MessageContentProps, MessageRootProps, MessageTitleProps };
208
-
209
- export { messageIcons };
233
+ export type { MessageBodyProps, MessageContentProps, MessageRootProps, MessageTitleProps };
@@ -2,4 +2,6 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ export { messageIcons } from './message-icons';
6
+
5
7
  export * from './Message';
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { type MessageValence } from '@dxos/ui-types';
6
+
7
+ // Kept out of `Message.tsx`: react-refresh only fast-refreshes a module whose exports are all
8
+ // components, so a context and its hook exported beside them force a full page reload on every edit.
9
+
10
+ export const messageIcons: Record<MessageValence, string> = {
11
+ success: 'ph--check-circle--duotone',
12
+ info: 'ph--info--duotone',
13
+ warning: 'ph--warning--duotone',
14
+ error: 'ph--warning-circle--duotone',
15
+ neutral: 'ph--info--duotone',
16
+ };
@@ -24,11 +24,24 @@ const List = composable<HTMLDivElement, ScrollAreaRootProps>((props, forwardedRe
24
24
  );
25
25
  });
26
26
 
27
+ /**
28
+ * Panel is the standard full-height surface layout: a CSS grid whose `auto 1fr auto`
29
+ * rows pin a toolbar and statusbar while the content region absorbs the remaining
30
+ * height, so a scroll container inside it scrolls rather than growing the page. Each
31
+ * region takes `asChild` to merge its grid slot onto a `Toolbar.Root` / `ScrollArea`
32
+ * instead of nesting an extra wrapper element.
33
+ *
34
+ * @idiom org.dxos.react-ui.panelLayout
35
+ * applies: Any full-height pane with a fixed toolbar/statusbar and a scrolling body
36
+ * instead-of: Hand-wiring flex columns with min-height:0 and a bespoke scroll container
37
+ * uses: {@link Panel.Root}, {@link Panel.Toolbar}, {@link Panel.Content}, {@link Panel.Statusbar}
38
+ * related: org.dxos.react-ui-menu.toolbarMenu
39
+ */
27
40
  const DefaultStory = () => {
28
41
  return (
29
- <Panel.Root className='dx-document'>
42
+ <Panel.Root classNames='dx-document'>
30
43
  <Panel.Toolbar asChild>
31
- <Toolbar.Root classNames='gap-2'>
44
+ <Toolbar.Root>
32
45
  <Toolbar.IconButton icon='ph--plus--regular' variant='primary' label='Add' />
33
46
  <Input.Root>
34
47
  <Input.TextInput placeholder='Search' />
@@ -5,7 +5,7 @@
5
5
  import { mx } from '@dxos/ui-theme';
6
6
  import { type ComponentFunction } from '@dxos/ui-types';
7
7
 
8
- type Size = 'lg' | 'md' | 'sm';
8
+ type Size = 'lg' | 'md';
9
9
 
10
10
  export type PanelStyleProps = {
11
11
  size?: Size;
@@ -14,7 +14,6 @@ export type PanelStyleProps = {
14
14
  const sizes: Record<Size, string> = {
15
15
  lg: 'h-(--dx-topbar-size)',
16
16
  md: 'h-(--dx-toolbar-size)',
17
- sm: 'h-(--dx-statusbar-size)',
18
17
  };
19
18
 
20
19
  const root: ComponentFunction<PanelStyleProps> = (_, ...etc) =>
@@ -25,14 +24,24 @@ const root: ComponentFunction<PanelStyleProps> = (_, ...etc) =>
25
24
  ...etc,
26
25
  );
27
26
 
28
- // Toolbars default to the bar surface (tier 5); callers can still override via the trailing classes.
27
+ // `bar` is an aspect, not a level: the toolbar steps off whichever surface hosts the panel, so a
28
+ // panel in a card and a panel on the canvas each get a bar that reads against their own host.
29
29
  const toolbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
30
- mx('[grid-area:toolbar]', 'shrink-0', 'bg-toolbar-surface', sizes[size], ...etc);
30
+ mx(
31
+ '[grid-area:toolbar]',
32
+ 'shrink-0',
33
+ // The shadow falls onto the content row, which paints after this one in DOM order and would
34
+ // cover it wherever the content has its own background — the editor did, the mailbox list did
35
+ // not, which is why the bar looked flat in one and raised in the other.
36
+ 'dx-toolbar-surface shadow-sm relative z-[1]',
37
+ sizes[size],
38
+ ...etc,
39
+ );
31
40
 
32
41
  const content: ComponentFunction<PanelStyleProps> = (_, ...etc) => mx('[grid-area:content] min-h-0', ...etc);
33
42
 
34
- const statusbar: ComponentFunction<PanelStyleProps> = ({ size = 'md' }, ...etc) =>
35
- mx('[grid-area:statusbar]', 'shrink-0', sizes[size], ...etc);
43
+ const statusbar: ComponentFunction<PanelStyleProps> = (_, ...etc) =>
44
+ mx('[grid-area:statusbar]', 'shrink-0', 'dx-toolbar-surface', ...etc);
36
45
 
37
46
  export const panelTheme = {
38
47
  root,
@@ -13,7 +13,7 @@ export type PopoverStyleProps = Partial<{
13
13
 
14
14
  const content: ComponentFunction<PopoverStyleProps> = ({ elevation }, ...etc) =>
15
15
  mx(
16
- 'dx-popover-surface overflow-hidden border border-separator rounded-sm',
16
+ 'dx-popover-surface overflow-hidden border-2 border-separator rounded-sm',
17
17
  surfaceShadow({ elevation: 'positioned' }),
18
18
  surfaceZIndex({ elevation, level: 'menu' }),
19
19
  'dx-focus-ring',
@@ -6,14 +6,11 @@
6
6
 
7
7
  import { composeEventHandlers } from '@radix-ui/primitive';
8
8
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
9
- import { createContextScope } from '@radix-ui/react-context';
10
- import { type Scope } from '@radix-ui/react-context';
11
9
  import { DismissableLayer } from '@radix-ui/react-dismissable-layer';
12
10
  import { useFocusGuards } from '@radix-ui/react-focus-guards';
13
11
  import { FocusScope } from '@radix-ui/react-focus-scope';
14
12
  import { useId } from '@radix-ui/react-id';
15
13
  import * as PopperPrimitive from '@radix-ui/react-popper';
16
- import { createPopperScope } from '@radix-ui/react-popper';
17
14
  import { Portal as PortalPrimitive } from '@radix-ui/react-portal';
18
15
  import { Presence } from '@radix-ui/react-presence';
19
16
  import { Primitive } from '@radix-ui/react-primitive';
@@ -38,33 +35,19 @@ import { RemoveScroll } from 'react-remove-scroll';
38
35
 
39
36
  import { useElevationContext, useSafeCollisionPadding, useThemeContext } from '../../hooks';
40
37
  import { type ThemedClassName } from '../../util';
38
+ import {
39
+ POPOVER_NAME,
40
+ PopoverProvider,
41
+ type PopoverScopedProps,
42
+ createPopoverContext,
43
+ usePopoverContext,
44
+ usePopperScope,
45
+ } from './PopoverContext';
41
46
 
42
47
  //
43
48
  // Context
44
49
  //
45
50
 
46
- type ScopedProps<P> = P & { __scopePopover?: Scope };
47
-
48
- const POPOVER_NAME = 'Popover';
49
-
50
- const [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [createPopperScope]);
51
-
52
- const usePopperScope = createPopperScope();
53
-
54
- type PopoverContextValue = {
55
- triggerRef: RefObject<HTMLButtonElement>;
56
- contentId: string;
57
- hasCustomAnchor: boolean;
58
- modal: boolean;
59
- open: boolean;
60
- onOpenChange(open: boolean): void;
61
- onOpenToggle(): void;
62
- onCustomAnchorAdd(): void;
63
- onCustomAnchorRemove(): void;
64
- };
65
-
66
- const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
67
-
68
51
  //
69
52
  // PopoverRoot
70
53
  //
@@ -77,7 +60,7 @@ type PopoverRootProps = {
77
60
  modal?: boolean;
78
61
  };
79
62
 
80
- const PopoverRoot: FC<PopoverRootProps> = (props: ScopedProps<PopoverRootProps>) => {
63
+ const PopoverRoot: FC<PopoverRootProps> = (props: PopoverScopedProps<PopoverRootProps>) => {
81
64
  const { __scopePopover, children, open: openProp, defaultOpen, onOpenChange, modal = false } = props;
82
65
  const popperScope = usePopperScope(__scopePopover);
83
66
  const triggerRef = useRef<HTMLButtonElement>(null);
@@ -121,7 +104,7 @@ type PopperAnchorProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Anchor>
121
104
  type PopoverAnchorProps = PopperAnchorProps;
122
105
 
123
106
  const PopoverAnchor = forwardRef<PopoverAnchorElement, PopoverAnchorProps>(
124
- (props: ScopedProps<PopoverAnchorProps>, forwardedRef) => {
107
+ (props: PopoverScopedProps<PopoverAnchorProps>, forwardedRef) => {
125
108
  const { __scopePopover, ...anchorProps } = props;
126
109
  const context = usePopoverContext(ANCHOR_NAME, __scopePopover);
127
110
  const popperScope = usePopperScope(__scopePopover);
@@ -151,7 +134,7 @@ type PopoverTriggerProps = PrimitiveButtonProps & {
151
134
  };
152
135
 
153
136
  const PopoverTrigger = forwardRef<PopoverTriggerElement, PopoverTriggerProps>(
154
- (props: ScopedProps<PopoverTriggerProps>, forwardedRef) => {
137
+ (props: PopoverScopedProps<PopoverTriggerProps>, forwardedRef) => {
155
138
  const { __scopePopover, asChild, ...triggerProps } = props;
156
139
  const context = usePopoverContext(TRIGGER_NAME, __scopePopover);
157
140
  const popperScope = usePopperScope(__scopePopover);
@@ -193,7 +176,7 @@ type PopoverVirtualTriggerProps = {
193
176
  virtualRef: RefObject<PopoverTriggerElement | null>;
194
177
  };
195
178
 
196
- const PopoverVirtualTrigger = (props: ScopedProps<PopoverVirtualTriggerProps>) => {
179
+ const PopoverVirtualTrigger = (props: PopoverScopedProps<PopoverVirtualTriggerProps>) => {
197
180
  const { __scopePopover, virtualRef } = props;
198
181
  const context = usePopoverContext(VIRTUAL_TRIGGER_NAME, __scopePopover);
199
182
  const popperScope = usePopperScope(__scopePopover);
@@ -232,7 +215,7 @@ type PopoverPortalProps = {
232
215
  forceMount?: true;
233
216
  };
234
217
 
235
- const PopoverPortal = (props: ScopedProps<PopoverPortalProps>) => {
218
+ const PopoverPortal = (props: PopoverScopedProps<PopoverPortalProps>) => {
236
219
  const { __scopePopover, forceMount, children, container } = props;
237
220
  const context = usePopoverContext(PORTAL_NAME, __scopePopover);
238
221
  return (
@@ -263,7 +246,7 @@ type PopoverContentProps = ThemedClassName<PopoverContentTypeProps> & {
263
246
  };
264
247
 
265
248
  const PopoverContent = forwardRef<PopoverContentTypeElement, PopoverContentProps>(
266
- (props: ScopedProps<PopoverContentProps>, forwardedRef) => {
249
+ (props: PopoverScopedProps<PopoverContentProps>, forwardedRef) => {
267
250
  const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);
268
251
  const { forceMount = portalContext.forceMount, ...contentProps } = props;
269
252
  const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);
@@ -289,7 +272,7 @@ export interface PopoverContentTypeProps extends Omit<
289
272
  > {}
290
273
 
291
274
  const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContentTypeProps>(
292
- (props: ScopedProps<PopoverContentTypeProps>, forwardedRef) => {
275
+ (props: PopoverScopedProps<PopoverContentTypeProps>, forwardedRef) => {
293
276
  const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);
294
277
  const contentRef = useRef<HTMLDivElement>(null);
295
278
  const composedRefs = useComposedRefs(forwardedRef, contentRef);
@@ -340,7 +323,7 @@ const PopoverContentModal = forwardRef<PopoverContentTypeElement, PopoverContent
340
323
  );
341
324
 
342
325
  const PopoverContentNonModal = forwardRef<PopoverContentTypeElement, PopoverContentTypeProps>(
343
- (props: ScopedProps<PopoverContentTypeProps>, forwardedRef) => {
326
+ (props: PopoverScopedProps<PopoverContentTypeProps>, forwardedRef) => {
344
327
  const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);
345
328
  const hasInteractedOutsideRef = useRef(false);
346
329
  const hasPointerDownOutsideRef = useRef(false);
@@ -424,7 +407,7 @@ type PopoverContentImplProps = Omit<PopperContentProps, 'onPlaced'> &
424
407
  };
425
408
 
426
409
  const PopoverContentImpl = forwardRef<PopoverContentImplElement, PopoverContentImplProps>(
427
- (props: ScopedProps<PopoverContentImplProps>, forwardedRef) => {
410
+ (props: PopoverScopedProps<PopoverContentImplProps>, forwardedRef) => {
428
411
  const {
429
412
  __scopePopover,
430
413
  trapFocus,
@@ -518,7 +501,7 @@ type PopoverCloseElement = ComponentRef<typeof Primitive.button>;
518
501
  type PopoverCloseProps = PrimitiveButtonProps;
519
502
 
520
503
  const PopoverClose = forwardRef<PopoverCloseElement, PopoverCloseProps>(
521
- (props: ScopedProps<PopoverCloseProps>, forwardedRef) => {
504
+ (props: PopoverScopedProps<PopoverCloseProps>, forwardedRef) => {
522
505
  const { __scopePopover, ...closeProps } = props;
523
506
  const context = usePopoverContext(CLOSE_NAME, __scopePopover);
524
507
  return (
@@ -545,7 +528,7 @@ type PopperArrowProps = ThemedClassName<ComponentPropsWithoutRef<typeof PopperPr
545
528
  type PopoverArrowProps = PopperArrowProps;
546
529
 
547
530
  const PopoverArrow = forwardRef<PopoverArrowElement, PopoverArrowProps>(
548
- (props: ScopedProps<PopoverArrowProps>, forwardedRef) => {
531
+ (props: PopoverScopedProps<PopoverArrowProps>, forwardedRef) => {
549
532
  const { __scopePopover, classNames, ...arrowProps } = props;
550
533
  const popperScope = usePopperScope(__scopePopover);
551
534
  const { tx } = useThemeContext();
@@ -608,7 +591,9 @@ export const Popover = {
608
591
  Viewport: PopoverViewport,
609
592
  };
610
593
 
611
- export { createPopoverScope };
594
+ // Type-only re-export (erased, so it does not affect the refresh boundary): keeps the inferred
595
+ // types of downstream composites nameable across package boundaries.
596
+ export type { PopoverScopedProps } from './PopoverContext';
612
597
 
613
598
  export type {
614
599
  PopoverAnchorProps,
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Scope, createContextScope } from '@radix-ui/react-context';
6
+ import { createPopperScope } from '@radix-ui/react-popper';
7
+ import { type RefObject } from 'react';
8
+
9
+ // Kept out of `Popover.tsx`: react-refresh only fast-refreshes a module whose exports are all
10
+ // components, so a context and its hook exported beside them force a full page reload on every edit.
11
+
12
+ export type PopoverScopedProps<P> = P & { __scopePopover?: Scope };
13
+
14
+ export const POPOVER_NAME = 'Popover';
15
+
16
+ export const [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [createPopperScope]);
17
+
18
+ export const usePopperScope = createPopperScope();
19
+
20
+ export type PopoverContextValue = {
21
+ triggerRef: RefObject<HTMLButtonElement>;
22
+ contentId: string;
23
+ hasCustomAnchor: boolean;
24
+ modal: boolean;
25
+ open: boolean;
26
+ onOpenChange(open: boolean): void;
27
+ onOpenToggle(): void;
28
+ onCustomAnchorAdd(): void;
29
+ onCustomAnchorRemove(): void;
30
+ };
31
+
32
+ export const [PopoverProvider, usePopoverContext] = createPopoverContext<PopoverContextValue>(POPOVER_NAME);
@@ -2,4 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export { createPopoverScope } from './PopoverContext';
6
+
5
7
  export * from './Popover';
@@ -35,7 +35,7 @@ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: Stor
35
35
  }, [running]);
36
36
 
37
37
  return (
38
- <Panel.Root className='dx-document'>
38
+ <Panel.Root classNames='dx-document'>
39
39
  <Panel.Toolbar asChild>
40
40
  <Toolbar.Root>
41
41
  <Button onClick={() => setRunning((running) => !running)}>{running ? 'Stop' : 'Start'}</Button>
@@ -2,7 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { createContext } from '@radix-ui/react-context';
6
5
  import React, {
7
6
  type PropsWithChildren,
8
7
  type RefObject,
@@ -25,6 +24,7 @@ import { composable, composableProps, slottable } from '../../util';
25
24
  import { type ThemedClassName } from '../../util';
26
25
  import { IconButton } from '../Button';
27
26
  import { ScrollArea, type ScrollAreaRootProps } from '../ScrollArea';
27
+ import { ScrollContainerProvider, useScrollContainerContext } from './ScrollContainerContext';
28
28
 
29
29
  const isBottom = (el: HTMLElement | null) => {
30
30
  return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
@@ -36,21 +36,6 @@ export interface ScrollController {
36
36
  scrollToBottom: (behavior?: ScrollBehavior) => void;
37
37
  }
38
38
 
39
- type ScrollContainerContextValue = {
40
- controller?: ScrollController;
41
- pinned?: boolean;
42
- overflow?: boolean;
43
- /** Called by Viewport to register/unregister the scroll element. */
44
- setViewport: (el: HTMLDivElement | null) => void;
45
- /** Called by Viewport on wheel events to update pinned state. */
46
- setPinned: (value: boolean) => void;
47
- /** Called by Viewport on scroll events to update overflow state. */
48
- setOverflow: (value: boolean) => void;
49
- };
50
-
51
- const [ScrollContainerProvider, useScrollContainerContext] =
52
- createContext<ScrollContainerContextValue>('ScrollContainer');
53
-
54
39
  //
55
40
  // Root
56
41
  //
@@ -328,8 +313,6 @@ ScrollContainerScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
328
313
  // ScrollContainer
329
314
  //
330
315
 
331
- export { useScrollContainerContext };
332
-
333
316
  export const ScrollContainer = {
334
317
  Root: ScrollContainerRoot,
335
318
  Content: ScrollContainerContent,
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+
7
+ import { type ScrollController } from './ScrollContainer';
8
+
9
+ // Kept out of `ScrollContainer.tsx`: react-refresh only fast-refreshes a module whose exports are all
10
+ // components, so a context and its hook exported beside them force a full page reload on every edit.
11
+
12
+ export type ScrollContainerContextValue = {
13
+ controller?: ScrollController;
14
+ pinned?: boolean;
15
+ overflow?: boolean;
16
+ /** Called by Viewport to register/unregister the scroll element. */
17
+ setViewport: (el: HTMLDivElement | null) => void;
18
+ /** Called by Viewport on wheel events to update pinned state. */
19
+ setPinned: (value: boolean) => void;
20
+ /** Called by Viewport on scroll events to update overflow state. */
21
+ setOverflow: (value: boolean) => void;
22
+ };
23
+
24
+ export const [ScrollContainerProvider, useScrollContainerContext] =
25
+ createContext<ScrollContainerContextValue>('ScrollContainer');
@@ -2,4 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ export { useScrollContainerContext } from './ScrollContainerContext';
6
+
5
7
  export * from './ScrollContainer';
@@ -26,7 +26,7 @@ const viewport: ComponentFunction<SelectStyleProps> = (_props, ...etc) => mx(...
26
26
 
27
27
  const item: ComponentFunction<SelectStyleProps> = (_props, ...etc) =>
28
28
  mx(
29
- 'flex items-center min-h-[2rem] px-2.5 py-1 gap-2',
29
+ 'flex items-center min-h-(--dx-control) px-(--dx-control-pad) py-1 gap-2',
30
30
  'text-base-fg leading-none select-none outline-hidden',
31
31
  '[&>svg]:invisible [&[data-state=checked]>svg]:visible',
32
32
  'dx-highlighted',
@@ -41,7 +41,7 @@ const separator: ComponentFunction<SelectStyleProps> = (_props, ...etc) =>
41
41
  mx('self-stretch border-b my-1 border-separator', ...etc);
42
42
 
43
43
  const scrollButton: ComponentFunction<SelectStyleProps> = (_props, ...etc) =>
44
- mx('dx-modal-surface flex items-center justify-center cursor-default h-6 w-full', ...etc);
44
+ mx('dx-modal-surface flex items-center justify-center cursor-default h-(--dx-control-sm) w-full', ...etc);
45
45
 
46
46
  export const selectTheme: Theme<SelectStyleProps> = {
47
47
  content,
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useState } from 'react';
7
+
8
+ import { withTheme } from '../../testing';
9
+ import { Slider } from './Slider';
10
+
11
+ const meta = {
12
+ title: 'ui/react-ui-core/components/Slider',
13
+ component: Slider,
14
+ decorators: [withTheme()],
15
+ parameters: {
16
+ layout: 'centered',
17
+ },
18
+ } satisfies Meta<typeof Slider>;
19
+
20
+ export default meta;
21
+
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ export const Default: Story = {
25
+ render: () => (
26
+ <div className='w-64'>
27
+ <Slider defaultValue={[50]} max={100} step={1} thumbLabels={['Value']} />
28
+ </div>
29
+ ),
30
+ };
31
+
32
+ export const Controlled: Story = {
33
+ render: () => {
34
+ const ControlledSlider = () => {
35
+ const [value, setValue] = useState([25]);
36
+ return (
37
+ <div className='flex flex-col gap-2 w-64'>
38
+ <Slider value={value} onValueChange={setValue} max={100} step={1} aria-label='Controlled value' />
39
+ <div className='text-sm text-description'>{value[0]}</div>
40
+ </div>
41
+ );
42
+ };
43
+ return <ControlledSlider />;
44
+ },
45
+ };
46
+
47
+ export const MinMaxStep: Story = {
48
+ render: () => (
49
+ <div className='w-64'>
50
+ <Slider defaultValue={[0.4]} min={0.2} max={0.7} step={0.01} aria-label='Min/max/step value' />
51
+ </div>
52
+ ),
53
+ };
54
+
55
+ export const Disabled: Story = {
56
+ render: () => (
57
+ <div className='w-64'>
58
+ <Slider defaultValue={[50]} max={100} step={1} disabled aria-label='Disabled value' />
59
+ </div>
60
+ ),
61
+ };
62
+
63
+ export const Vertical: Story = {
64
+ render: () => (
65
+ <div className='h-64'>
66
+ <Slider defaultValue={[50]} max={100} step={1} orientation='vertical' aria-label='Vertical value' />
67
+ </div>
68
+ ),
69
+ };
70
+
71
+ export const Range: Story = {
72
+ render: () => (
73
+ <div className='w-64'>
74
+ <Slider defaultValue={[25, 75]} max={100} step={1} thumbLabels={['Minimum', 'Maximum']} />
75
+ </div>
76
+ ),
77
+ };
78
+
79
+ /**
80
+ * Regression guard for the thumb-visibility bug (an invalid `is-*`/`bs-*` size utility collapsed
81
+ * the thumb to zero size). Exercises default/disabled/vertical/two-thumb side by side so a visual
82
+ * pass catches a missing knob in any state at a glance.
83
+ */
84
+ export const ThumbVisibility: Story = {
85
+ render: () => (
86
+ <div className='flex items-start gap-8'>
87
+ <div className='flex flex-col gap-2 w-48'>
88
+ <span className='text-sm text-description'>Default</span>
89
+ <Slider defaultValue={[50]} max={100} step={1} aria-label='Default value' />
90
+ </div>
91
+ <div className='flex flex-col gap-2 w-48'>
92
+ <span className='text-sm text-description'>Disabled</span>
93
+ <Slider defaultValue={[50]} max={100} step={1} disabled aria-label='Disabled value' />
94
+ </div>
95
+ <div className='flex flex-col gap-2 w-48'>
96
+ <span className='text-sm text-description'>Two-thumb</span>
97
+ <Slider defaultValue={[25, 75]} max={100} step={1} thumbLabels={['Minimum', 'Maximum']} />
98
+ </div>
99
+ <div className='flex flex-col gap-2 items-center'>
100
+ <span className='text-sm text-description'>Vertical</span>
101
+ <div className='h-48'>
102
+ <Slider defaultValue={[50]} max={100} step={1} orientation='vertical' aria-label='Vertical value' />
103
+ </div>
104
+ </div>
105
+ </div>
106
+ ),
107
+ };