@dxos/react-ui 0.10.0 → 0.11.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 (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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Low-level React components for DXOS, applying a theme to a core group of primitives",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -18,21 +18,18 @@
18
18
  "exports": {
19
19
  ".": {
20
20
  "source": "./src/index.ts",
21
- "browser": "./dist/lib/browser/index.mjs",
22
- "node": "./dist/lib/node-esm/index.mjs",
23
- "types": "./dist/types/src/index.d.ts"
21
+ "types": "./dist/types/src/index.d.ts",
22
+ "import": "./dist/lib/index.mjs"
24
23
  },
25
24
  "./testing": {
26
25
  "source": "./src/testing/index.ts",
27
- "browser": "./dist/lib/browser/testing/index.mjs",
28
- "node": "./dist/lib/node-esm/testing/index.mjs",
29
- "types": "./dist/types/src/testing/index.d.ts"
26
+ "types": "./dist/types/src/testing/index.d.ts",
27
+ "import": "./dist/lib/testing.mjs"
30
28
  },
31
29
  "./translations": {
32
30
  "source": "./src/translations.ts",
33
31
  "types": "./dist/types/src/translations.d.ts",
34
- "browser": "./dist/lib/browser/translations.mjs",
35
- "node": "./dist/lib/node-esm/translations.mjs"
32
+ "import": "./dist/lib/translations.mjs"
36
33
  }
37
34
  },
38
35
  "types": "dist/types/src/index.d.ts",
@@ -42,7 +39,6 @@
42
39
  ],
43
40
  "dependencies": {
44
41
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.1.0",
45
- "@effect-atom/atom-react": "^0.5.0",
46
42
  "@fluentui/react-tabster": "9.26.11",
47
43
  "@internationalized/date": "^3.12.1",
48
44
  "@radix-ui/primitive": "1.1.1",
@@ -66,6 +62,7 @@
66
62
  "@radix-ui/react-scroll-area": "1.2.10",
67
63
  "@radix-ui/react-select": "2.1.6",
68
64
  "@radix-ui/react-separator": "1.1.2",
65
+ "@radix-ui/react-slider": "1.4.7",
69
66
  "@radix-ui/react-slot": "1.1.2",
70
67
  "@radix-ui/react-switch": "1.1.3",
71
68
  "@radix-ui/react-toast": "1.2.6",
@@ -85,18 +82,18 @@
85
82
  "react-error-boundary": "^4.0.13",
86
83
  "react-i18next": "^11.18.6",
87
84
  "react-remove-scroll": "^2.6.0",
88
- "@dxos/async": "0.10.0",
89
- "@dxos/debug": "0.10.0",
90
- "@dxos/lit-ui": "0.10.0",
91
- "@dxos/react-error-boundary": "0.10.0",
92
- "@dxos/log": "0.10.0",
93
- "@dxos/react-hooks": "0.10.0",
94
- "@dxos/i18n": "0.10.0",
95
- "@dxos/invariant": "0.10.0",
96
- "@dxos/react-list": "0.10.0",
97
- "@dxos/react-input": "0.10.0",
98
- "@dxos/ui-types": "0.10.0",
99
- "@dxos/util": "0.10.0"
85
+ "@dxos/debug": "0.11.0",
86
+ "@dxos/i18n": "0.11.0",
87
+ "@dxos/invariant": "0.11.0",
88
+ "@dxos/lit-ui": "0.11.0",
89
+ "@dxos/log": "0.11.0",
90
+ "@dxos/react-error-boundary": "0.11.0",
91
+ "@dxos/react-hooks": "0.11.0",
92
+ "@dxos/react-input": "0.11.0",
93
+ "@dxos/util": "0.11.0",
94
+ "@dxos/ui-types": "0.11.0",
95
+ "@dxos/react-list": "0.11.0",
96
+ "@dxos/async": "0.11.0"
100
97
  },
101
98
  "devDependencies": {
102
99
  "@dnd-kit/core": "^6.0.5",
@@ -104,20 +101,21 @@
104
101
  "@dnd-kit/utilities": "^3.2.0",
105
102
  "@phosphor-icons/react": "2.1.10",
106
103
  "@tanstack/react-virtual": "^3.13.18",
104
+ "@testing-library/react": "^16.3.2",
107
105
  "@types/react": "~19.2.17",
108
106
  "@types/react-dom": "~19.2.3",
109
107
  "react": "~19.2.7",
110
108
  "react-dom": "~19.2.7",
111
109
  "tabster": "^8.5.5",
112
- "vite": "^8.0.16",
113
- "@dxos/random": "0.10.0",
114
- "@dxos/ui-theme": "0.10.0",
115
- "@dxos/util": "0.10.0"
110
+ "vite": "^8.1.4",
111
+ "@dxos/random": "0.11.0",
112
+ "@dxos/util": "0.11.0",
113
+ "@dxos/ui-theme": "0.11.0"
116
114
  },
117
115
  "peerDependencies": {
118
116
  "react": "~19.2.7",
119
117
  "react-dom": "~19.2.7",
120
- "@dxos/ui-theme": "0.10.0"
118
+ "@dxos/ui-theme": "^0.11.0"
121
119
  },
122
120
  "publishConfig": {
123
121
  "access": "public"
@@ -2,7 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { createContext } from '@radix-ui/react-context';
6
5
  import { Primitive } from '@radix-ui/react-primitive';
7
6
  import { Slot } from '@radix-ui/react-slot';
8
7
  import React, { type ComponentProps, type ComponentPropsWithRef, type PropsWithChildren, forwardRef } from 'react';
@@ -20,17 +19,10 @@ import { mx } from '@dxos/ui-theme';
20
19
 
21
20
  import { useIconHref, useThemeContext } from '../../hooks';
22
21
  import { type ThemedClassName } from '../../util';
22
+ import { type AvatarContextValue, AvatarProvider, useAvatarContext } from './AvatarContext';
23
23
 
24
24
  export type AvatarRootProps = PropsWithChildren<Partial<AvatarContextValue>>;
25
25
 
26
- type AvatarContextValue = {
27
- labelId: string;
28
- descriptionId: string;
29
- };
30
-
31
- const AVATAR_NAME = 'Avatar';
32
- const [AvatarProvider, useAvatarContext] = createContext<AvatarContextValue>(AVATAR_NAME);
33
-
34
26
  const AvatarRoot = ({ children, labelId: propsLabelId, descriptionId: propsDescriptionId }: AvatarRootProps) => {
35
27
  const labelId = useId('avatar__label', propsLabelId);
36
28
  const descriptionId = useId('avatar__description', propsDescriptionId);
@@ -98,8 +90,6 @@ export const Avatar = {
98
90
  Description: AvatarDescription,
99
91
  };
100
92
 
101
- export { useAvatarContext };
102
-
103
93
  export type {
104
94
  AvatarAnimation,
105
95
  AvatarContentProps,
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+
7
+ // Kept out of `Avatar.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 type AvatarContextValue = {
11
+ labelId: string;
12
+ descriptionId: string;
13
+ };
14
+
15
+ export const AVATAR_NAME = 'Avatar';
16
+ export const [AvatarProvider, useAvatarContext] = createContext<AvatarContextValue>(AVATAR_NAME);
@@ -2,4 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export { useAvatarContext } from './AvatarContext';
6
+
5
7
  export * from './Avatar';
@@ -5,35 +5,37 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { withTheme } from '../../testing';
8
+ import { withLayout, withTheme } from '../../testing';
9
9
  import { Button } from '../Button';
10
10
  import { Breadcrumb, type BreadcrumbRootProps } from './Breadcrumb';
11
11
 
12
12
  const DefaultStory = (props: BreadcrumbRootProps) => {
13
13
  return (
14
- <Breadcrumb.Root {...props}>
15
- <Breadcrumb.List>
16
- <Breadcrumb.ListItem>
17
- <Breadcrumb.Link asChild>
18
- <Button variant='ghost' classNames='px-0 text-base-fg font-normal'>
19
- Grocery
20
- </Button>
21
- </Breadcrumb.Link>
22
- <Breadcrumb.Separator />
23
- </Breadcrumb.ListItem>
24
- <Breadcrumb.ListItem>
25
- <Breadcrumb.Link href='#'>Produce</Breadcrumb.Link>
26
- <Breadcrumb.Separator />
27
- </Breadcrumb.ListItem>
28
- <Breadcrumb.ListItem>
29
- <Breadcrumb.Link href='#'>Veggies</Breadcrumb.Link>
30
- <Breadcrumb.Separator />
31
- </Breadcrumb.ListItem>
32
- <Breadcrumb.ListItem>
33
- <Breadcrumb.Current>Peppers</Breadcrumb.Current>
34
- </Breadcrumb.ListItem>
35
- </Breadcrumb.List>
36
- </Breadcrumb.Root>
14
+ <div>
15
+ <Breadcrumb.Root {...props}>
16
+ <Breadcrumb.List>
17
+ <Breadcrumb.ListItem>
18
+ <Breadcrumb.Link>
19
+ <Button variant='ghost' classNames='px-0 text-base-fg font-normal'>
20
+ Home
21
+ </Button>
22
+ </Breadcrumb.Link>
23
+ <Breadcrumb.Separator />
24
+ </Breadcrumb.ListItem>
25
+ <Breadcrumb.ListItem>
26
+ <Breadcrumb.Link href='#'>Mailbox</Breadcrumb.Link>
27
+ <Breadcrumb.Separator />
28
+ </Breadcrumb.ListItem>
29
+ <Breadcrumb.ListItem>
30
+ <Breadcrumb.Link href='#'>Work</Breadcrumb.Link>
31
+ <Breadcrumb.Separator />
32
+ </Breadcrumb.ListItem>
33
+ <Breadcrumb.ListItem>
34
+ <Breadcrumb.Current>All</Breadcrumb.Current>
35
+ </Breadcrumb.ListItem>
36
+ </Breadcrumb.List>
37
+ </Breadcrumb.Root>
38
+ </div>
37
39
  );
38
40
  };
39
41
 
@@ -41,7 +43,7 @@ const meta = {
41
43
  title: 'ui/react-ui-core/components/Breadcrumb',
42
44
  component: Breadcrumb.Root as any,
43
45
  render: DefaultStory,
44
- decorators: [withTheme()],
46
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
45
47
  } satisfies Meta<typeof DefaultStory>;
46
48
 
47
49
  export default meta;
@@ -7,15 +7,17 @@ import { type ComponentFunction, type Theme } from '@dxos/ui-types';
7
7
 
8
8
  export type breadcrumbStyleProps = {};
9
9
 
10
- const root: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('shrink-0 flex items-center', ...etc);
10
+ const root: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) =>
11
+ mx('flex items-center grow overflow-hidden', ...etc);
11
12
 
12
- const list: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('contents', ...etc);
13
+ const list: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) =>
14
+ mx('flex items-center min-w-0 grow overflow-x-auto scrollbar-none', ...etc);
13
15
 
14
- const listItem: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('contents', ...etc);
16
+ const listItem: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('flex items-center shrink-0', ...etc);
15
17
 
16
- const current: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx(...etc);
18
+ const current: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('whitespace-nowrap', ...etc);
17
19
 
18
- const separator: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('opacity-50', ...etc);
20
+ const separator: ComponentFunction<breadcrumbStyleProps> = (_props, ...etc) => mx('shrink-0 opacity-50', ...etc);
19
21
 
20
22
  export const breadcrumbTheme: Theme<breadcrumbStyleProps> = {
21
23
  root,
@@ -75,7 +75,7 @@ BreadcrumbCurrent.displayName = 'Breadcrumb.Current';
75
75
 
76
76
  type BreadcrumbSeparatorProps = ThemedClassName<ComponentPropsWithoutRef<typeof Primitive.span>>;
77
77
 
78
- function BreadcrumbSeparator({ children, classNames, ...props }: BreadcrumbSeparatorProps) {
78
+ function BreadcrumbSeparator({ classNames, children, ...props }: BreadcrumbSeparatorProps) {
79
79
  const { tx } = useThemeContext();
80
80
  return (
81
81
  <Primitive.span
@@ -84,7 +84,7 @@ function BreadcrumbSeparator({ children, classNames, ...props }: BreadcrumbSepar
84
84
  {...props}
85
85
  className={tx('breadcrumb.separator', {}, classNames)}
86
86
  >
87
- {children ?? <Icon icon='ph--dot--bold' />}
87
+ {children ?? <Icon icon='ph--caret-double-right--regular' />}
88
88
  </Primitive.span>
89
89
  );
90
90
  }
@@ -2,7 +2,6 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { createContext } from '@radix-ui/react-context';
6
5
  import { Primitive } from '@radix-ui/react-primitive';
7
6
  import { Slot } from '@radix-ui/react-slot';
8
7
  import React, { type ComponentPropsWithRef, forwardRef, memo } from 'react';
@@ -12,6 +11,7 @@ import { type Density, type Elevation } from '@dxos/ui-types';
12
11
  import { useDensityContext, useElevationContext, useThemeContext } from '../../hooks';
13
12
  import { type ThemedClassName } from '../../util';
14
13
  import { Icon } from '../Icon';
14
+ import { BUTTON_GROUP_NAME, BUTTON_NAME, ButtonGroupProvider, useButtonGroupContext } from './ButtonGroupContext';
15
15
 
16
16
  type ButtonProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.button>> & {
17
17
  variant?: 'default' | 'primary' | 'outline' | 'ghost' | 'destructive' | 'valence';
@@ -22,15 +22,6 @@ type ButtonProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.button
22
22
  caretDown?: boolean;
23
23
  };
24
24
 
25
- type ButtonGroupContextValue = { inGroup?: boolean };
26
-
27
- const BUTTON_GROUP_NAME = 'ButtonGroup';
28
- const BUTTON_NAME = 'Button';
29
-
30
- const [ButtonGroupProvider, useButtonGroupContext] = createContext<ButtonGroupContextValue>(BUTTON_GROUP_NAME, {
31
- inGroup: false,
32
- });
33
-
34
25
  const Button = memo(
35
26
  forwardRef<HTMLButtonElement, ButtonProps>(
36
27
  (
@@ -109,6 +100,6 @@ const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(
109
100
 
110
101
  ButtonGroup.displayName = BUTTON_GROUP_NAME;
111
102
 
112
- export { Button, BUTTON_GROUP_NAME, ButtonGroup, useButtonGroupContext };
103
+ export { Button, ButtonGroup };
113
104
 
114
105
  export type { ButtonGroupProps, ButtonProps };
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+
7
+ // Kept out of `Button.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 type ButtonGroupContextValue = { inGroup?: boolean };
11
+
12
+ export const BUTTON_GROUP_NAME = 'ButtonGroup';
13
+ export const BUTTON_NAME = 'Button';
14
+
15
+ export const [ButtonGroupProvider, useButtonGroupContext] = createContext<ButtonGroupContextValue>(BUTTON_GROUP_NAME, {
16
+ inGroup: false,
17
+ });
@@ -26,18 +26,17 @@ const DefaultStory = (props: IconButtonProps) => {
26
26
  );
27
27
  };
28
28
 
29
- const densities: Density[] = ['lg', 'md', 'sm', 'xs'];
29
+ const densities: Density[] = ['lg', 'md', 'sm'];
30
30
  const densityIconSize: Record<Density, IconButtonProps['size']> = {
31
31
  lg: 5,
32
32
  md: 4,
33
33
  sm: 4,
34
- xs: 4,
35
34
  };
36
35
 
37
36
  const DensitiesStory = (props: Omit<IconButtonProps, 'density' | 'size'>) => {
38
37
  return (
39
38
  <Tooltip.Provider>
40
- <div className='grid grid-cols-[auto_1fr_1fr_1fr] gap-4 items-center'>
39
+ <div className='grid grid-cols-[auto_1fr_1fr] gap-4 items-center'>
41
40
  <div />
42
41
  <div className='text-xs text-subdued uppercase'>iconOnly</div>
43
42
  <div className='text-xs text-subdued uppercase'>label + icon</div>
@@ -10,10 +10,23 @@ import { type ButtonStyleProps } from './Button.theme';
10
10
  export type IconButtonStyleProps = ButtonStyleProps & {
11
11
  iconOnly?: boolean;
12
12
  square?: boolean;
13
+ caretDown?: boolean;
13
14
  };
14
15
 
15
- const root: ComponentFunction<IconButtonStyleProps> = ({ iconOnly, square }, ...etc) => {
16
- return mx('px-1.5', !iconOnly && 'gap-1.5', square && 'aspect-square', ...etc);
16
+ // No padding utility here: `utilities` is the last cascade layer, so a `px-*` would override the
17
+ // density-driven `padding-inline` on `.dx-button` at every density.
18
+ //
19
+ // An icon-only button is square, but only while it really holds one glyph: `caretDown` adds a
20
+ // second (the dropdown caret), and squaring that composite crushes both into one control width —
21
+ // as it did to the markdown toolbar's view selector. `aspect-square` pins the inline size, which
22
+ // stops the button stretching to a wider grid cell, so it is paired with `justify-self-center`;
23
+ // without that it silently left-aligns (what pushed the R0 rail's sidebar toggle 4px off-centre).
24
+ const root: ComponentFunction<IconButtonStyleProps> = ({ iconOnly, square, caretDown }, ...etc) => {
25
+ return mx(
26
+ !iconOnly && 'gap-1.5',
27
+ (square || (iconOnly && !caretDown)) && 'aspect-square justify-self-center',
28
+ ...etc,
29
+ );
17
30
  };
18
31
 
19
32
  export const iconButtonTheme: Theme<IconButtonStyleProps> = {
@@ -50,7 +50,12 @@ const LabelledIconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
50
50
  ) => {
51
51
  const { tx } = useThemeContext();
52
52
  return (
53
- <Button {...props} classNames={tx('iconButton.root', { iconOnly, square }, classNames)} ref={forwardedRef}>
53
+ // `caretDown` stays in `props` so `Button` still renders the caret; the theme only reads it.
54
+ <Button
55
+ {...props}
56
+ classNames={tx('iconButton.root', { iconOnly, square, caretDown: props.caretDown }, classNames)}
57
+ ref={forwardedRef}
58
+ >
54
59
  {icon && !iconEnd && <Icon icon={icon} size={size} classNames={iconClassNames} />}
55
60
  <span className={iconOnly ? 'sr-only' : undefined}>{label}</span>
56
61
  {icon && iconEnd && <Icon icon={icon} size={size} classNames={iconClassNames} />}
@@ -203,33 +203,40 @@ UploadIconButton.displayName = 'SystemIconButton.Upload';
203
203
 
204
204
  type DownloadIconButtonProps = StaticPresetProps & {
205
205
  filename: string;
206
- onDownload: () => Blob | null;
206
+ // Blob may be produced asynchronously (e.g. serialized from a query) or synchronously.
207
+ onDownload: () => Blob | null | Promise<Blob | null>;
207
208
  };
208
209
 
209
210
  const DownloadIconButton = forwardRef<HTMLButtonElement, DownloadIconButtonProps>(
210
211
  ({ filename, onDownload, label, ...props }, forwardedRef) => {
211
212
  const { t } = useTranslation(translationKey);
212
- const handleDownload = useCallback(() => {
213
- const blob = onDownload();
214
- if (!blob) {
215
- return;
213
+ const handleDownload = useCallback(async () => {
214
+ try {
215
+ const blob = await onDownload();
216
+ if (!blob) {
217
+ return;
218
+ }
219
+
220
+ const url = URL.createObjectURL(blob);
221
+
222
+ // TODO(burdon): Use Domino.
223
+ const a = document.createElement('a');
224
+ a.href = url;
225
+ a.download = filename;
226
+ a.click();
227
+
228
+ URL.revokeObjectURL(url);
229
+ } catch {
230
+ // Best-effort: blob generation or the download click may fail; swallow to avoid an unhandled
231
+ // promise rejection (the click handler discards the returned promise with `void`).
216
232
  }
217
-
218
- const url = URL.createObjectURL(blob);
219
-
220
- const a = document.createElement('a');
221
- a.href = url;
222
- a.download = filename;
223
- a.click();
224
-
225
- URL.revokeObjectURL(url);
226
- }, [onDownload]);
233
+ }, [onDownload, filename]);
227
234
  return (
228
235
  <IconButton
229
236
  icon='ph--download-simple--regular'
230
237
  label={label ?? t('system-button.download.label')}
231
238
  {...props}
232
- onClick={handleDownload}
239
+ onClick={() => void handleDownload()}
233
240
  ref={forwardedRef}
234
241
  />
235
242
  );
@@ -2,6 +2,8 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ export { BUTTON_GROUP_NAME, useButtonGroupContext } from './ButtonGroupContext';
6
+
5
7
  export * from './Button';
6
8
  export * from './IconButton';
7
9
  export * from './MicButton';
@@ -15,7 +15,7 @@ export type CalendarStyleProps = Partial<{}>;
15
15
  //
16
16
 
17
17
  const root: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
18
- mx('relative w-fit h-fit self-start p-2 select-none bg-group-surface text-base-fg', ...etc);
18
+ mx('relative w-fit h-fit self-start p-2 select-none dx-group-surface text-base-fg', ...etc);
19
19
 
20
20
  const nav: ComponentFunction<CalendarStyleProps> = (_p, ...etc) => mx('flex items-center justify-between pb-1', ...etc);
21
21
 
@@ -24,7 +24,7 @@ const caption_label: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
24
24
 
25
25
  const button_previous: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
26
26
  mx(
27
- 'h-7 w-7 inline-flex items-center justify-center rounded-sm shrink-0',
27
+ 'size-(--dx-control-sm) inline-flex items-center justify-center rounded-sm shrink-0',
28
28
  'text-description hover:bg-hover-surface',
29
29
  'data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed',
30
30
  ...etc,
@@ -32,7 +32,7 @@ const button_previous: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
32
32
 
33
33
  const button_next: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
34
34
  mx(
35
- 'h-7 w-7 inline-flex items-center justify-center rounded-sm shrink-0',
35
+ 'size-(--dx-control-sm) inline-flex items-center justify-center rounded-sm shrink-0',
36
36
  'text-description hover:bg-hover-surface',
37
37
  'data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed',
38
38
  ...etc,
@@ -43,11 +43,11 @@ const month_grid: ComponentFunction<CalendarStyleProps> = (_p, ...etc) => mx('w-
43
43
  const weekdays: ComponentFunction<CalendarStyleProps> = (_p, ...etc) => mx('', ...etc);
44
44
 
45
45
  const weekday: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
46
- mx('w-9 h-7 text-xs font-thin text-description', ...etc);
46
+ mx('w-(--dx-control-md) h-(--dx-control-sm) text-xs font-thin text-description', ...etc);
47
47
 
48
48
  const day: ComponentFunction<CalendarStyleProps> = (_p, ...etc) =>
49
49
  mx(
50
- 'relative w-9 h-9 p-0 text-center text-sm rounded-sm inline-flex items-center justify-center cursor-pointer',
50
+ 'relative size-(--dx-control-md) p-0 text-center text-sm rounded-sm inline-flex items-center justify-center cursor-pointer',
51
51
  'outline-none',
52
52
  'data-[hovered]:bg-hover-surface',
53
53
  'data-[focus-visible]:outline-2 data-[focus-visible]:outline-primary-500',
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { CalendarDate, parseDate } from '@internationalized/date';
5
+ import { CalendarDate } from '@internationalized/date';
6
6
  import React, { type ComponentPropsWithoutRef, type ReactNode, forwardRef } from 'react';
7
7
  import {
8
8
  type DateValue,
@@ -191,6 +191,4 @@ export const Calendar = {
191
191
  Root: CalendarRoot,
192
192
  };
193
193
 
194
- // Re-export the iso parser for convenience.
195
- export { parseDate as parseCalendarDate };
196
194
  export type { ComponentPropsWithoutRef };
@@ -2,4 +2,6 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
+ export { parseCalendarDate } from './parse-calendar-date';
6
+
5
7
  export * from './Calendar';
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // Kept out of `Calendar.tsx`: react-refresh only fast-refreshes a module whose exports are all
6
+ // components, so a value exported beside them forces a full page reload on every edit.
7
+
8
+ /** The ISO date parser, re-exported for convenience alongside `Calendar`. */
9
+ export { parseDate as parseCalendarDate } from '@internationalized/date';