@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
@@ -0,0 +1,348 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo, useState } from 'react';
7
+
8
+ import { random } from '@dxos/random';
9
+ import { mx } from '@dxos/ui-theme';
10
+
11
+ import {
12
+ Avatar,
13
+ Button,
14
+ Card,
15
+ Dialog,
16
+ DropdownMenu,
17
+ Icon,
18
+ IconButton,
19
+ Input,
20
+ Main,
21
+ Message,
22
+ Panel,
23
+ ScrollArea,
24
+ Select,
25
+ Tag,
26
+ Toolbar,
27
+ useSidebars,
28
+ } from '../components';
29
+ import { withLayout, withTheme } from '../testing';
30
+
31
+ random.seed(1);
32
+
33
+ /**
34
+ * Kitchen-sink app frame built only from `@dxos/react-ui` primitives at their default props, so
35
+ * every surface shown is the one the app actually paints — the review harness for the elevation
36
+ * ladder (`theme/surfaces.css`) and the aspects derived from it.
37
+ *
38
+ * Reading the frame outward: the sidebars and topbar are `chrome` (below the canvas), the content
39
+ * region is `base`, cards are `raised` (above the canvas), the dialog is `overlay`, and the popover
40
+ * is `popup`. Toolbars and inputs take no level of their own — they step off whichever surface
41
+ * hosts them, which is why the toolbar in the sidebar and the toolbar on the canvas differ.
42
+ */
43
+
44
+ const NavigationToggle = ({ close }: { close?: boolean }) => {
45
+ const { toggleNavigationSidebar } = useSidebars('StoryElevation__NavigationToggle');
46
+ return (
47
+ <IconButton
48
+ icon={close ? 'ph--caret-left--regular' : 'ph--sidebar-simple--regular'}
49
+ iconOnly
50
+ label='Toggle navigation sidebar'
51
+ onClick={toggleNavigationSidebar}
52
+ />
53
+ );
54
+ };
55
+
56
+ const ComplementaryToggle = ({ close }: { close?: boolean }) => {
57
+ const { toggleComplementarySidebar } = useSidebars('StoryElevation__ComplementaryToggle');
58
+ return (
59
+ <IconButton
60
+ icon={close ? 'ph--caret-right--regular' : 'ph--sidebar-simple--regular'}
61
+ iconOnly
62
+ label='Toggle complementary sidebar'
63
+ onClick={toggleComplementarySidebar}
64
+ />
65
+ );
66
+ };
67
+
68
+ const NavigationCard = () => (
69
+ <Card.Root fullWidth>
70
+ <Card.Header>
71
+ <Card.Block>
72
+ <Icon icon='ph--folder--regular' />
73
+ </Card.Block>
74
+ <Card.Title>Workspace</Card.Title>
75
+ <Card.Menu items={[{ label: 'Rename', icon: 'ph--pencil--regular', onClick: () => {} }]} />
76
+ </Card.Header>
77
+ <Card.Body>
78
+ <Card.Action icon='ph--article--regular' label='Documents' annotation='12' onClick={() => {}} />
79
+ <Card.Action icon='ph--table--regular' label='Tables' annotation='3' onClick={() => {}} />
80
+ <Card.Action icon='ph--chats-circle--regular' label='Threads' annotation='8' onClick={() => {}} />
81
+ <Card.Link label='dxos.org' href='https://dxos.org' />
82
+ </Card.Body>
83
+ </Card.Root>
84
+ );
85
+
86
+ const ContactCard = () => (
87
+ <Card.Root fullWidth>
88
+ <Card.Header>
89
+ <Card.DragHandle />
90
+ <Card.Title>Card on the canvas</Card.Title>
91
+ <Card.ActionIconButton action='close' onClick={() => {}} />
92
+ </Card.Header>
93
+ <Card.Body>
94
+ <Card.Row>
95
+ <Card.Block>
96
+ <Icon icon='ph--user--regular' />
97
+ </Card.Block>
98
+ <Card.Text>Card.Text sitting in the content track.</Card.Text>
99
+ </Card.Row>
100
+ <Card.Row>
101
+ <Card.Block>
102
+ <Icon icon='ph--tag--regular' />
103
+ </Card.Block>
104
+ <Card.Text>
105
+ <Tag hue='blue'>design</Tag> <Tag hue='emerald'>theme</Tag>
106
+ </Card.Text>
107
+ </Card.Row>
108
+ <Card.Section title='Inputs'>
109
+ <Input.Root>
110
+ <Input.Label>Text</Input.Label>
111
+ <Input.TextInput placeholder='Input.TextInput' />
112
+ </Input.Root>
113
+ <Input.Root>
114
+ <Input.Label>Switch</Input.Label>
115
+ <Input.Block>
116
+ <Input.Switch />
117
+ </Input.Block>
118
+ </Input.Root>
119
+ <Input.Root>
120
+ <Input.Label>Checkbox</Input.Label>
121
+ <Input.Block>
122
+ <Input.Checkbox />
123
+ </Input.Block>
124
+ </Input.Root>
125
+ </Card.Section>
126
+ <Card.Row>
127
+ <Card.Text variant='description'>Card.Text with the description variant.</Card.Text>
128
+ </Card.Row>
129
+ </Card.Body>
130
+ </Card.Root>
131
+ );
132
+
133
+ const CompanionCard = ({ index }: { index: number }) => {
134
+ const text = useMemo(() => random.lorem.paragraph(), []);
135
+ return (
136
+ <Card.Root fullWidth>
137
+ <Card.Header>
138
+ <Card.Block>
139
+ <Avatar.Root>
140
+ <Avatar.Content fallback={`${index}`} size={6} variant='circle' />
141
+ </Avatar.Root>
142
+ </Card.Block>
143
+ <Card.Title>{`Companion card ${index}`}</Card.Title>
144
+ <Card.Menu items={[{ label: 'Dismiss', icon: 'ph--x--regular', onClick: () => {} }]} />
145
+ </Card.Header>
146
+ <Card.Body>
147
+ <Card.Row>
148
+ <Card.Text variant='description'>{text}</Card.Text>
149
+ </Card.Row>
150
+ </Card.Body>
151
+ </Card.Root>
152
+ );
153
+ };
154
+
155
+ const SettingsDialog = ({ open, onOpenChange }: { open: boolean; onOpenChange: (open: boolean) => void }) => (
156
+ <Dialog.Root open={open} onOpenChange={onOpenChange} modal>
157
+ <Dialog.Overlay>
158
+ <Dialog.Content>
159
+ <Dialog.Header>
160
+ <Dialog.Title>Dialog on the modal surface</Dialog.Title>
161
+ <Dialog.Close asChild>
162
+ <Dialog.ActionIconButton action='close' />
163
+ </Dialog.Close>
164
+ </Dialog.Header>
165
+ <Dialog.Body>
166
+ <Dialog.Description>Nested surfaces inside a dialog: card, input, popover.</Dialog.Description>
167
+ <ContactCard />
168
+ </Dialog.Body>
169
+ <Dialog.ActionBar>
170
+ <Dialog.Close asChild>
171
+ <Button variant='primary'>Done</Button>
172
+ </Dialog.Close>
173
+ </Dialog.ActionBar>
174
+ </Dialog.Content>
175
+ </Dialog.Overlay>
176
+ </Dialog.Root>
177
+ );
178
+
179
+ /**
180
+ * The narrow outer rails. In the app these are separate elements beside the L1/R1 sidebars
181
+ * (`L0Menu`, the companion tab strip), and they are the only consumers of `dx-l0-surface` /
182
+ * `dx-r0-surface` — so without them here nothing guards the rails collapsing back onto the
183
+ * sidebar tone.
184
+ */
185
+ const Rail = ({ side }: { side: 'l0' | 'r0' }) => (
186
+ <div
187
+ role='none'
188
+ className={mx(
189
+ 'shrink-0 grid grid-rows-[1fr_min-content] place-items-center py-2 w-(--dx-rail-size)',
190
+ side === 'l0' ? 'dx-l0-surface' : 'dx-r0-surface',
191
+ )}
192
+ >
193
+ <div className='grid gap-1 place-items-center'>
194
+ <IconButton iconOnly icon='ph--house--regular' label='Home' variant='ghost' />
195
+ <IconButton iconOnly icon='ph--folder--regular' label='Collections' variant='ghost' />
196
+ </div>
197
+ <IconButton iconOnly icon='ph--gear--regular' label='Settings' variant='ghost' />
198
+ </div>
199
+ );
200
+
201
+ const AppFrame = () => {
202
+ const [dialogOpen, setDialogOpen] = useState(false);
203
+
204
+ return (
205
+ <Main.Root defaultNavigationSidebarState='expanded' defaultComplementarySidebarState='expanded'>
206
+ <Main.Overlay />
207
+
208
+ <Main.NavigationSidebar label='Navigation' classNames='flex flex-row'>
209
+ <Rail side='l0' />
210
+ <Panel.Root>
211
+ <Panel.Toolbar asChild>
212
+ <Toolbar.Root>
213
+ <Toolbar.Text>Navigation</Toolbar.Text>
214
+ <Toolbar.Separator />
215
+ <NavigationToggle close />
216
+ </Toolbar.Root>
217
+ </Panel.Toolbar>
218
+ <Panel.Content asChild>
219
+ <ScrollArea.Root centered thin classNames='py-trim-sm'>
220
+ <ScrollArea.Viewport>
221
+ <NavigationCard />
222
+ </ScrollArea.Viewport>
223
+ </ScrollArea.Root>
224
+ </Panel.Content>
225
+ </Panel.Root>
226
+ </Main.NavigationSidebar>
227
+
228
+ <Main.Content classNames='w-full'>
229
+ <Panel.Root>
230
+ <Panel.Toolbar asChild>
231
+ <Toolbar.Root>
232
+ <NavigationToggle />
233
+ <Toolbar.Separator />
234
+ <Toolbar.IconButton icon='ph--plus--regular' variant='primary' label='Add' />
235
+ <Input.Root>
236
+ <Input.Label srOnly>Search</Input.Label>
237
+ <Input.TextInput placeholder='Search' />
238
+ </Input.Root>
239
+ <Select.Root defaultValue='all'>
240
+ <Select.TriggerButton placeholder='Filter' />
241
+ <Select.Portal>
242
+ <Select.Content>
243
+ <Select.Viewport>
244
+ <Select.Option value='all'>All</Select.Option>
245
+ <Select.Option value='mine'>Mine</Select.Option>
246
+ </Select.Viewport>
247
+ <Select.Arrow />
248
+ </Select.Content>
249
+ </Select.Portal>
250
+ </Select.Root>
251
+ <DropdownMenu.Root>
252
+ <DropdownMenu.Trigger asChild>
253
+ <Toolbar.IconButton icon='ph--dots-three-vertical--regular' iconOnly label='Menu' />
254
+ </DropdownMenu.Trigger>
255
+ <DropdownMenu.Portal>
256
+ <DropdownMenu.Content>
257
+ <DropdownMenu.Viewport>
258
+ <DropdownMenu.Item onSelect={() => setDialogOpen(true)}>
259
+ <Icon icon='ph--gear--regular' />
260
+ Open dialog
261
+ </DropdownMenu.Item>
262
+ <DropdownMenu.Item>
263
+ <Icon icon='ph--copy--regular' />
264
+ Duplicate
265
+ </DropdownMenu.Item>
266
+ <DropdownMenu.Item>
267
+ <Icon icon='ph--trash--regular' />
268
+ Delete
269
+ </DropdownMenu.Item>
270
+ </DropdownMenu.Viewport>
271
+ <DropdownMenu.Arrow />
272
+ </DropdownMenu.Content>
273
+ </DropdownMenu.Portal>
274
+ </DropdownMenu.Root>
275
+ <Toolbar.Separator />
276
+ <ComplementaryToggle />
277
+ </Toolbar.Root>
278
+ </Panel.Toolbar>
279
+
280
+ <Panel.Content>
281
+ <Message.Root valence='warning'>
282
+ <Message.Content>
283
+ <Message.Title>Message.Root</Message.Title>
284
+ <Message.Body>A valence surface nested inside a card.</Message.Body>
285
+ </Message.Content>
286
+ </Message.Root>
287
+ <ScrollArea.Root centered>
288
+ <ScrollArea.Viewport classNames='flex flex-col gap-trim-md'>
289
+ <ContactCard />
290
+ </ScrollArea.Viewport>
291
+ </ScrollArea.Root>
292
+ </Panel.Content>
293
+
294
+ <Panel.Statusbar asChild>
295
+ <Toolbar.Root>
296
+ <Toolbar.IconButton variant='ghost' icon='ph--house--regular' iconOnly label='Home' />
297
+ <Toolbar.Separator />
298
+ <Toolbar.Text>Statusbar</Toolbar.Text>
299
+ <Toolbar.Separator />
300
+ <Toolbar.IconButton variant='ghost' icon='ph--alarm--regular' iconOnly label='Status' />
301
+ </Toolbar.Root>
302
+ </Panel.Statusbar>
303
+ </Panel.Root>
304
+ </Main.Content>
305
+
306
+ <Main.ComplementarySidebar label='Complementary' classNames='flex flex-row-reverse'>
307
+ <Rail side='r0' />
308
+ <Panel.Root>
309
+ <Panel.Toolbar asChild>
310
+ <Toolbar.Root>
311
+ <ComplementaryToggle close />
312
+ <Toolbar.Separator />
313
+ <Toolbar.Text>Companion</Toolbar.Text>
314
+ </Toolbar.Root>
315
+ </Panel.Toolbar>
316
+ <Panel.Content asChild>
317
+ <ScrollArea.Root centered padding>
318
+ <ScrollArea.Viewport classNames='flex flex-col items-center py-3 gap-3'>
319
+ {Array.from({ length: 20 }, (_, index) => (
320
+ <CompanionCard key={index} index={index + 1} />
321
+ ))}
322
+ </ScrollArea.Viewport>
323
+ </ScrollArea.Root>
324
+ </Panel.Content>
325
+ </Panel.Root>
326
+ </Main.ComplementarySidebar>
327
+
328
+ <SettingsDialog open={dialogOpen} onOpenChange={setDialogOpen} />
329
+ </Main.Root>
330
+ );
331
+ };
332
+
333
+ const DefaultStory = () => <AppFrame />;
334
+
335
+ const meta = {
336
+ title: 'ui/react-ui-core/playground/Elevation',
337
+ render: DefaultStory,
338
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
339
+ parameters: {
340
+ layout: 'fullscreen',
341
+ },
342
+ } satisfies Meta<typeof DefaultStory>;
343
+
344
+ export default meta;
345
+
346
+ type Story = StoryObj<typeof meta>;
347
+
348
+ export const Default: Story = {};
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { createContext } from 'react';
6
+
7
+ import { type Density } from '@dxos/ui-types';
8
+
9
+ export interface DensityContextValue {
10
+ density?: Density;
11
+ }
12
+
13
+ // Kept out of `DensityProvider.tsx`: react-refresh only fast-refreshes a module whose exports are
14
+ // all components, so a context exported beside one forces a full page reload on every edit.
15
+ export const DensityContext = createContext<DensityContextValue>({ density: 'md' });
@@ -2,20 +2,26 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { type PropsWithChildren, createContext } from 'react';
5
+ import React, { type PropsWithChildren } from 'react';
6
6
 
7
7
  import { type Density } from '@dxos/ui-types';
8
8
 
9
- export interface DensityContextValue {
10
- density?: Density;
11
- }
9
+ import { DensityContext } from './DensityContext';
12
10
 
13
11
  export type DensityProviderProps = PropsWithChildren<{
14
12
  density?: Density;
15
13
  }>;
16
14
 
17
- export const DensityContext = createContext<DensityContextValue>({ density: 'md' });
18
-
15
+ /**
16
+ * Provides density through React context only — controls opt in by reading it and emitting
17
+ * `data-density`, which applies the `--dx-control*` override for that element alone.
18
+ *
19
+ * It deliberately does NOT emit a `dx-density-*` class. Doing so set the knobs for the entire
20
+ * subtree, so a provider intended for one region (the deck's `lg` pane toolbar) silently resized
21
+ * unrelated descendants that read `--dx-control` — form labels, for instance. A region that wants
22
+ * subtree-wide density applies the class itself, where its scope is visible at the call site
23
+ * (see `Toolbar.Root`).
24
+ */
19
25
  export const DensityProvider = ({ density, children }: DensityProviderProps) => (
20
26
  <DensityContext.Provider value={{ density }}>{children}</DensityContext.Provider>
21
27
  );
@@ -2,4 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export * from './DensityContext';
5
6
  export * from './DensityProvider';
@@ -11,7 +11,7 @@ import { withLayout, withTheme } from '../../testing';
11
11
  import { Flex } from './Flex';
12
12
 
13
13
  const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
14
- <div data-hue={hue} className='flex w-full dx-panel p-2 text-sm font-mono border rounded-sm'>
14
+ <div data-hue={hue} className='flex w-full dx-callout p-2 text-sm font-mono border rounded-sm'>
15
15
  {label}
16
16
  </div>
17
17
  );
@@ -11,7 +11,7 @@ import { withLayout, withTheme } from '../../testing';
11
11
  import { Grid } from './Grid';
12
12
 
13
13
  const Cell = ({ label, hue }: { label: string; hue: ChromaticPalette }) => (
14
- <div data-hue={hue} className='dx-panel p-2 text-sm font-mono border rounded-sm'>
14
+ <div data-hue={hue} className='dx-callout p-2 text-sm font-mono border rounded-sm'>
15
15
  {label}
16
16
  </div>
17
17
  );
@@ -0,0 +1,42 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren, useEffect, useState } from 'react';
6
+
7
+ import {
8
+ type IconRegistry,
9
+ IconRegistryContext,
10
+ type IconSource,
11
+ NoopRegistry,
12
+ acquireRegistry,
13
+ defaultSources,
14
+ } from './icon-registry';
15
+
16
+ export type IconRegistryProviderProps = PropsWithChildren<{
17
+ /**
18
+ * Icon sets resolvable at runtime; defaults to Phosphor at `/phosphor`. Only the first
19
+ * mounted provider's sources apply, since the registry is shared across a document.
20
+ */
21
+ sources?: IconSource[];
22
+ }>;
23
+
24
+ /**
25
+ * Provides the shared icon registry to descendants (consumed by `useIconHref`), acquiring
26
+ * the refcounted document-level singleton on mount and releasing it on unmount.
27
+ */
28
+ export const IconRegistryProvider = ({ children, sources = defaultSources }: IconRegistryProviderProps) => {
29
+ const [registry, setRegistry] = useState<IconRegistry>(NoopRegistry);
30
+
31
+ useEffect(() => {
32
+ if (typeof document === 'undefined') {
33
+ return;
34
+ }
35
+ const { registry, release } = acquireRegistry(sources);
36
+ setRegistry(registry);
37
+ return release;
38
+ // Sources are read once when the shared registry is created; later changes are ignored by design.
39
+ }, []);
40
+
41
+ return <IconRegistryContext.Provider value={registry}>{children}</IconRegistryContext.Provider>;
42
+ };
@@ -11,6 +11,7 @@ import { type SafeAreaPadding, useSafeArea } from '../../hooks';
11
11
  import { hasIosKeyboard } from '../../util';
12
12
  import { DensityProvider } from '../DensityProvider';
13
13
  import { ElevationProvider } from '../ElevationProvider';
14
+ import { IconRegistryProvider } from './IconRegistry';
14
15
  import { TranslationsProvider, type TranslationsProviderProps } from './TranslationsProvider';
15
16
 
16
17
  export type ThemeContextValue = {
@@ -18,7 +19,6 @@ export type ThemeContextValue = {
18
19
  themeMode: ThemeMode;
19
20
  hasIosKeyboard: boolean;
20
21
  safeAreaPadding?: SafeAreaPadding;
21
- noCache?: boolean;
22
22
  platform?: 'mobile' | 'desktop';
23
23
  };
24
24
 
@@ -42,7 +42,6 @@ export const ThemeProvider = ({
42
42
  tx = (_path, _styleProps, ..._options) => undefined,
43
43
  themeMode = 'dark',
44
44
  rootDensity = 'md',
45
- noCache,
46
45
  platform,
47
46
  }: ThemeProviderProps) => {
48
47
  useEffect(() => {
@@ -56,23 +55,25 @@ export const ThemeProvider = ({
56
55
  const safeAreaPadding = useSafeArea();
57
56
  // Destructure all props explicitly so useMemo deps are stable primitives, not a new `rest` object every render.
58
57
  const contextValue = useMemo(
59
- () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, noCache, platform }),
60
- [tx, themeMode, safeAreaPadding, noCache, platform],
58
+ () => ({ tx, themeMode, hasIosKeyboard: hasIosKeyboard(), safeAreaPadding, platform }),
59
+ [tx, themeMode, safeAreaPadding, platform],
61
60
  );
62
61
 
63
62
  return (
64
63
  <ThemeContext.Provider value={contextValue}>
65
- <TranslationsProvider
66
- {...{
67
- fallback,
68
- resourceExtensions,
69
- appNs,
70
- }}
71
- >
72
- <ElevationProvider elevation='base'>
73
- <DensityProvider density={rootDensity}>{children}</DensityProvider>
74
- </ElevationProvider>
75
- </TranslationsProvider>
64
+ <IconRegistryProvider>
65
+ <TranslationsProvider
66
+ {...{
67
+ fallback,
68
+ resourceExtensions,
69
+ appNs,
70
+ }}
71
+ >
72
+ <ElevationProvider elevation='base'>
73
+ <DensityProvider density={rootDensity}>{children}</DensityProvider>
74
+ </ElevationProvider>
75
+ </TranslationsProvider>
76
+ </IconRegistryProvider>
76
77
  </ThemeContext.Provider>
77
78
  );
78
79
  };
@@ -0,0 +1,24 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { enUS as dtLocaleEnUs } from 'date-fns/locale';
6
+ import { createContext, useContext } from 'react';
7
+ import { useTranslation as useI18NextTranslation } from 'react-i18next';
8
+
9
+ // Kept out of `TranslationsProvider.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 const initialNs = 'dxos-common';
13
+ export const initialDtLocale = dtLocaleEnUs;
14
+
15
+ export const TranslationsContext = createContext({
16
+ appNs: initialNs,
17
+ dtLocale: initialDtLocale,
18
+ });
19
+
20
+ export const useTranslation = (...args: Parameters<typeof useI18NextTranslation>) => {
21
+ const result = useI18NextTranslation(...args);
22
+ const { dtLocale } = useContext(TranslationsContext);
23
+ return { ...result, dtLocale };
24
+ };
@@ -2,14 +2,13 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { type Locale, enUS as dtLocaleEnUs } from 'date-fns/locale';
6
- import React, { type ReactNode, Suspense, createContext, useContext, useEffect, useState } from 'react';
7
- import { I18nextProvider, useTranslation as useI18NextTranslation } from 'react-i18next';
5
+ import { type Locale } from 'date-fns/locale';
6
+ import React, { type ReactNode, Suspense, useEffect, useState } from 'react';
7
+ import { I18nextProvider } from 'react-i18next';
8
8
 
9
9
  import { type Resource, addResources, i18n } from '@dxos/i18n';
10
10
 
11
- const initialNs = 'dxos-common';
12
- const initialDtLocale = dtLocaleEnUs;
11
+ import { TranslationsContext, initialDtLocale, initialNs } from './TranslationsContext';
13
12
 
14
13
  export interface TranslationsProviderProps {
15
14
  children?: ReactNode;
@@ -21,17 +20,6 @@ export interface TranslationsProviderProps {
21
20
  dtLocale?: Locale;
22
21
  }
23
22
 
24
- export const TranslationsContext = createContext({
25
- appNs: initialNs,
26
- dtLocale: initialDtLocale,
27
- });
28
-
29
- export const useTranslation = (...args: Parameters<typeof useI18NextTranslation>) => {
30
- const result = useI18NextTranslation(...args);
31
- const { dtLocale } = useContext(TranslationsContext);
32
- return { ...result, dtLocale };
33
- };
34
-
35
23
  export const TranslationsProvider = ({
36
24
  fallback,
37
25
  resourceExtensions,