@dxos/react-ui 0.8.3 → 0.8.4-main.1c7ec43d41

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 (490) hide show
  1. package/dist/lib/browser/chunk-BDBC6H6V.mjs +848 -0
  2. package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4120 -62
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +112 -61
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/translations.mjs +18 -0
  9. package/dist/lib/browser/translations.mjs.map +7 -0
  10. package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs +850 -0
  11. package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +4120 -62
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/testing/index.mjs +112 -61
  16. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/translations.mjs +20 -0
  18. package/dist/lib/node-esm/translations.mjs.map +7 -0
  19. package/dist/types/src/components/Avatars/Avatar.d.ts +2 -2
  20. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  21. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  22. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  23. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  24. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  26. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  27. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  28. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +4 -4
  30. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  32. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  33. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +5 -4
  34. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/IconButton.stories.d.ts +16 -0
  36. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  37. package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +2 -2
  38. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  39. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  40. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  42. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  43. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  44. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  46. package/dist/types/src/components/Card/Card.d.ts +124 -0
  47. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  48. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  49. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/Card/index.d.ts +2 -0
  51. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  52. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  53. package/dist/types/src/components/Clipboard/CopyButton.d.ts +5 -6
  54. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  55. package/dist/types/src/components/Clipboard/index.d.ts +11 -3
  56. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  57. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  58. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  59. package/dist/types/src/components/Dialog/AlertDialog.d.ts +51 -0
  60. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  61. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  62. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/Dialog/Dialog.d.ts +64 -0
  64. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  65. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +25 -0
  66. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  67. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  68. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  69. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  70. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  71. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  72. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  73. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  74. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  75. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  76. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  77. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  78. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  79. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  80. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  81. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  82. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  83. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  84. package/dist/types/src/components/Focus/index.d.ts +2 -0
  85. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  86. package/dist/types/src/components/Icon/Icon.d.ts +6 -2
  87. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  88. package/dist/types/src/components/Icon/Icon.stories.d.ts +25 -0
  89. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/Image/Image.d.ts +15 -0
  91. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  92. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  93. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/Image/index.d.ts +2 -0
  95. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  96. package/dist/types/src/components/Input/Input.d.ts +19 -24
  97. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  98. package/dist/types/src/components/Input/Input.stories.d.ts +17 -18
  99. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  101. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/{Lists → List}/List.d.ts +8 -6
  103. package/dist/types/src/components/List/List.d.ts.map +1 -0
  104. package/dist/types/src/components/List/List.stories.d.ts +16 -0
  105. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  107. package/dist/types/src/components/{Lists → List}/Tree.d.ts +3 -3
  108. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  109. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  110. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  112. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +6 -10
  113. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  114. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  115. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  116. package/dist/types/src/components/List/index.d.ts.map +1 -0
  117. package/dist/types/src/components/Main/Main.d.ts +25 -31
  118. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  119. package/dist/types/src/components/Main/Main.stories.d.ts +6 -10
  120. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  122. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  123. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  124. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  125. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  126. package/dist/types/src/components/Menu/DropdownMenu.d.ts +121 -0
  127. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  128. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  129. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  130. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  131. package/dist/types/src/components/Message/Message.d.ts +2 -2
  132. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  133. package/dist/types/src/components/Message/Message.stories.d.ts +12 -22
  134. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/Popover/Popover.d.ts +42 -25
  136. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  137. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  138. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  140. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  141. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +50 -27
  142. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +68 -0
  144. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  145. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +23 -0
  146. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  148. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  149. package/dist/types/src/components/Select/Select.d.ts +10 -10
  150. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  151. package/dist/types/src/components/Select/Select.stories.d.ts +7 -12
  152. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  154. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  155. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  156. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  157. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  158. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  160. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  161. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  162. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  163. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  164. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  165. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  166. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  167. package/dist/types/src/components/Status/Status.d.ts +3 -4
  168. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  169. package/dist/types/src/components/Status/Status.stories.d.ts +6 -10
  170. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  171. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  172. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  173. package/dist/types/src/components/Tag/Tag.stories.d.ts +8 -13
  174. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +4 -4
  176. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  177. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  178. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  179. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +55 -63
  180. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  181. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  182. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  183. package/dist/types/src/components/Toast/Toast.d.ts +20 -20
  184. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  185. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  186. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  187. package/dist/types/src/components/Toolbar/Toolbar.d.ts +41 -23
  188. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  189. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  190. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  191. package/dist/types/src/components/Tooltip/Tooltip.d.ts +11 -13
  192. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  193. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +10 -63
  194. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  195. package/dist/types/src/components/index.d.ts +14 -8
  196. package/dist/types/src/components/index.d.ts.map +1 -1
  197. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  198. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  199. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  200. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  201. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  202. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  203. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  204. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  205. package/dist/types/src/hooks/index.d.ts +1 -0
  206. package/dist/types/src/hooks/index.d.ts.map +1 -1
  207. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  208. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  209. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  210. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  211. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  212. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  213. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  214. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  215. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  216. package/dist/types/src/index.d.ts +3 -2
  217. package/dist/types/src/index.d.ts.map +1 -1
  218. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  219. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  220. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  221. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  222. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  223. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  224. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  225. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  226. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  227. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  228. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  229. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  230. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  231. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  232. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  233. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  234. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  235. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  236. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  237. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  238. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  239. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  240. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  241. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  242. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  243. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  244. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  245. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  246. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  247. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  248. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  249. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  250. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  251. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  252. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  253. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  254. package/dist/types/src/primitives/index.d.ts +6 -0
  255. package/dist/types/src/primitives/index.d.ts.map +1 -0
  256. package/dist/types/src/testing/Loading.d.ts +9 -0
  257. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  258. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  259. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  260. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  261. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  262. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  263. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  264. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  265. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  266. package/dist/types/src/testing/index.d.ts +1 -0
  267. package/dist/types/src/testing/index.d.ts.map +1 -1
  268. package/dist/types/src/translations.d.ts +11 -0
  269. package/dist/types/src/translations.d.ts.map +1 -0
  270. package/dist/types/src/util/index.d.ts +2 -1
  271. package/dist/types/src/util/index.d.ts.map +1 -1
  272. package/dist/types/src/util/usePx.d.ts +8 -0
  273. package/dist/types/src/util/usePx.d.ts.map +1 -0
  274. package/dist/types/tsconfig.tsbuildinfo +1 -1
  275. package/package.json +54 -39
  276. package/src/components/Avatars/Avatar.stories.tsx +23 -16
  277. package/src/components/Avatars/Avatar.tsx +10 -18
  278. package/src/components/Avatars/AvatarGroup.stories.tsx +11 -8
  279. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +19 -15
  280. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -40
  281. package/src/components/{Buttons → Button}/Button.stories.tsx +11 -13
  282. package/src/components/{Buttons → Button}/Button.tsx +13 -26
  283. package/src/components/{Buttons → Button}/IconButton.stories.tsx +18 -13
  284. package/src/components/{Buttons → Button}/IconButton.tsx +22 -16
  285. package/src/components/Button/Toggle.stories.tsx +36 -0
  286. package/src/components/{Buttons → Button}/Toggle.tsx +4 -4
  287. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +14 -12
  288. package/src/components/Button/ToggleGroup.tsx +50 -0
  289. package/src/components/Card/Card.stories.tsx +151 -0
  290. package/src/components/Card/Card.tsx +513 -0
  291. package/src/components/Card/index.ts +5 -0
  292. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  293. package/src/components/Clipboard/CopyButton.tsx +19 -21
  294. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  295. package/src/components/Dialog/AlertDialog.stories.tsx +68 -0
  296. package/src/components/Dialog/AlertDialog.tsx +213 -0
  297. package/src/components/Dialog/Dialog.stories.tsx +177 -0
  298. package/src/components/Dialog/Dialog.tsx +285 -0
  299. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  300. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  301. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  302. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  303. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  304. package/src/components/ErrorFallback/index.ts +9 -0
  305. package/src/components/Focus/AUDIT.md +43 -0
  306. package/src/components/Focus/Focus.stories.tsx +230 -0
  307. package/src/components/Focus/Focus.tsx +201 -0
  308. package/src/components/Focus/index.ts +5 -0
  309. package/src/components/Icon/Icon.stories.tsx +143 -0
  310. package/src/components/Icon/Icon.tsx +15 -4
  311. package/src/components/Image/Image.stories.tsx +86 -0
  312. package/src/components/Image/Image.tsx +246 -0
  313. package/src/components/Image/index.ts +5 -0
  314. package/src/components/Input/Input.stories.tsx +27 -49
  315. package/src/components/Input/Input.tsx +51 -87
  316. package/src/components/Link/Link.stories.tsx +11 -8
  317. package/src/components/Link/Link.tsx +2 -2
  318. package/src/components/{Lists → List}/List.stories.tsx +45 -47
  319. package/src/components/{Lists → List}/List.tsx +30 -35
  320. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
  321. package/src/components/{Lists → List}/Tree.stories.tsx +15 -13
  322. package/src/components/{Lists → List}/Tree.tsx +3 -3
  323. package/src/components/{Lists → List}/TreeDropIndicator.tsx +7 -7
  324. package/src/components/{Lists → List}/Treegrid.stories.tsx +39 -34
  325. package/src/components/List/Treegrid.tsx +188 -0
  326. package/src/components/Main/Main.stories.tsx +52 -27
  327. package/src/components/Main/Main.tsx +176 -105
  328. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +12 -10
  329. package/src/components/{Menus → Menu}/ContextMenu.tsx +10 -33
  330. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +13 -11
  331. package/src/components/{Menus → Menu}/DropdownMenu.tsx +157 -120
  332. package/src/components/Message/Message.stories.tsx +36 -18
  333. package/src/components/Message/Message.tsx +59 -33
  334. package/src/components/Popover/Popover.stories.tsx +18 -16
  335. package/src/components/Popover/Popover.tsx +125 -103
  336. package/src/components/ScrollArea/ScrollArea.stories.tsx +224 -32
  337. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  338. package/src/components/ScrollArea/index.ts +1 -1
  339. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +91 -0
  340. package/src/components/ScrollContainer/ScrollContainer.tsx +347 -0
  341. package/src/components/ScrollContainer/index.ts +5 -0
  342. package/src/components/Select/Select.stories.tsx +19 -17
  343. package/src/components/Select/Select.tsx +16 -32
  344. package/src/components/Separator/Separator.tsx +5 -8
  345. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  346. package/src/components/Skeleton/Skeleton.tsx +26 -0
  347. package/src/components/Skeleton/index.ts +5 -0
  348. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  349. package/src/components/Splitter/Splitter.tsx +127 -0
  350. package/src/components/Splitter/index.ts +5 -0
  351. package/src/components/Status/Status.stories.tsx +29 -23
  352. package/src/components/Status/Status.tsx +10 -7
  353. package/src/components/Tag/Tag.stories.tsx +16 -13
  354. package/src/components/Tag/Tag.tsx +3 -8
  355. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  356. package/src/components/ThemeProvider/ThemeProvider.tsx +12 -12
  357. package/src/components/ThemeProvider/TranslationsProvider.tsx +4 -19
  358. package/src/components/ThemeProvider/index.ts +3 -1
  359. package/src/components/Toast/Toast.stories.tsx +13 -11
  360. package/src/components/Toast/Toast.tsx +23 -42
  361. package/src/components/Toolbar/Toolbar.stories.tsx +22 -21
  362. package/src/components/Toolbar/Toolbar.tsx +188 -13
  363. package/src/components/Tooltip/Tooltip.stories.tsx +35 -30
  364. package/src/components/Tooltip/Tooltip.tsx +44 -41
  365. package/src/components/index.ts +15 -9
  366. package/src/exemplars/generics.stories.tsx +41 -0
  367. package/src/exemplars/slot.stories.tsx +117 -0
  368. package/src/exemplars/tabster.stories.tsx +127 -0
  369. package/src/exemplars/virtualizer.stories.tsx +137 -0
  370. package/src/hooks/index.ts +1 -0
  371. package/src/hooks/useDensityContext.ts +3 -3
  372. package/src/hooks/useElevationContext.ts +1 -1
  373. package/src/hooks/useSafeArea.ts +3 -2
  374. package/src/hooks/useSafeCollisionPadding.ts +1 -1
  375. package/src/hooks/useVisualViewport.ts +4 -4
  376. package/src/index.ts +3 -2
  377. package/src/playground/Controls.stories.tsx +20 -24
  378. package/src/playground/Custom.stories.tsx +20 -34
  379. package/src/playground/Typography.stories.tsx +11 -9
  380. package/src/primitives/Column/AUDIT.md +148 -0
  381. package/src/primitives/Column/Column.stories.tsx +181 -0
  382. package/src/primitives/Column/Column.tsx +165 -0
  383. package/src/primitives/Column/index.ts +5 -0
  384. package/src/primitives/Container/Container.stories.tsx +29 -0
  385. package/src/primitives/Container/Container.tsx +19 -0
  386. package/src/primitives/Container/index.ts +5 -0
  387. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  388. package/src/primitives/Flex/Flex.tsx +27 -0
  389. package/src/primitives/Flex/index.ts +5 -0
  390. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  391. package/src/primitives/Grid/Grid.tsx +30 -0
  392. package/src/primitives/Grid/index.ts +5 -0
  393. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  394. package/src/primitives/Panel/Panel.tsx +120 -0
  395. package/src/primitives/Panel/index.ts +5 -0
  396. package/src/primitives/index.ts +9 -0
  397. package/src/testing/Loading.tsx +47 -0
  398. package/src/testing/decorators/index.ts +2 -1
  399. package/src/testing/decorators/withLayout.tsx +77 -0
  400. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  401. package/src/testing/decorators/withTheme.tsx +37 -0
  402. package/src/testing/index.ts +2 -0
  403. package/src/translations.ts +19 -0
  404. package/src/util/index.ts +3 -1
  405. package/src/util/usePx.ts +62 -0
  406. package/README.yml +0 -1
  407. package/dist/lib/browser/chunk-WXW6KSRL.mjs +0 -4376
  408. package/dist/lib/browser/chunk-WXW6KSRL.mjs.map +0 -7
  409. package/dist/lib/node/chunk-3E3QKWX4.cjs +0 -4363
  410. package/dist/lib/node/chunk-3E3QKWX4.cjs.map +0 -7
  411. package/dist/lib/node/index.cjs +0 -175
  412. package/dist/lib/node/index.cjs.map +0 -7
  413. package/dist/lib/node/meta.json +0 -1
  414. package/dist/lib/node/testing/index.cjs +0 -114
  415. package/dist/lib/node/testing/index.cjs.map +0 -7
  416. package/dist/lib/node-esm/chunk-EQ7EG74H.mjs +0 -4378
  417. package/dist/lib/node-esm/chunk-EQ7EG74H.mjs.map +0 -7
  418. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  419. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  420. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  421. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  422. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  423. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  424. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  425. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  426. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  427. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  428. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  429. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  430. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  431. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  432. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  433. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  434. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  435. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  436. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +0 -31
  437. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  438. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  439. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  440. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  441. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  442. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  443. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  444. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  445. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  446. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  447. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  448. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  449. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  450. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  451. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  452. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  453. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  454. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  455. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  456. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  457. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  458. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  459. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  460. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -112
  461. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  462. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  463. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  464. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  465. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  466. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  467. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  468. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  469. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  470. package/src/components/AnchoredOverflow/index.ts +0 -5
  471. package/src/components/Buttons/Toggle.stories.tsx +0 -33
  472. package/src/components/Buttons/ToggleGroup.tsx +0 -41
  473. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -66
  474. package/src/components/Dialogs/AlertDialog.tsx +0 -172
  475. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  476. package/src/components/Dialogs/Dialog.tsx +0 -159
  477. package/src/components/Lists/Treegrid.tsx +0 -152
  478. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  479. package/src/testing/decorators/withTheme.ts +0 -22
  480. package/src/util/ThemedClassName.ts +0 -7
  481. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  482. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  483. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  484. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  485. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  486. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  487. /package/src/components/{Buttons → Button}/index.ts +0 -0
  488. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  489. /package/src/components/{Lists → List}/index.ts +0 -0
  490. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -1,100 +1,4144 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- AlertDialog,
4
- AnchoredOverflow,
5
- Avatar,
6
- BUTTON_GROUP_NAME,
7
- Breadcrumb,
8
- Button,
9
- ButtonGroup,
10
- Callout,
11
- Clipboard,
12
- ContextMenu,
13
3
  DensityContext,
14
4
  DensityProvider,
15
- Dialog,
16
- DropdownMenu,
17
5
  ElevationContext,
18
6
  ElevationProvider,
19
- Icon,
20
- IconButton,
21
- Input,
22
- LIST_ITEM_NAME,
23
- LIST_NAME,
24
- Link,
25
- List,
26
- ListItem,
27
- Main,
28
- Message,
29
- Popover,
30
- ScrollArea,
31
- Select,
32
- Separator,
33
- Status,
34
- Tag,
7
+ ErrorStack,
35
8
  ThemeContext,
36
9
  ThemeProvider,
37
- Toast,
38
- Toggle,
39
- ToggleGroup,
40
- ToggleGroupItem,
41
- Toolbar,
42
10
  Tooltip,
43
- Tree,
44
- TreeItem,
45
- Treegrid,
46
- createDropdownMenuScope,
47
- createPopoverScope,
11
+ TranslationsContext,
48
12
  createTooltipScope,
49
13
  hasIosKeyboard,
50
14
  initialSafeArea,
51
- isLabel,
52
- messageIcons,
53
- toLocalizedString,
54
- useAvatarContext,
55
- useButtonGroupContext,
56
- useClipboard,
57
- useDensityContext,
58
- useDropdownMenuContext,
59
- useDropdownMenuMenuScope,
15
+ parseCaptureOwnerStack,
60
16
  useElevationContext,
61
- useIconHref,
62
- useLandmarkMover,
63
- useListContext,
64
- useListItemContext,
65
- useMainContext,
66
17
  useSafeArea,
67
- useSidebars,
68
18
  useThemeContext,
69
19
  useTooltipContext,
70
- useTranslation,
71
- useTranslationsContext,
72
- useVisualViewport
73
- } from "./chunk-EQ7EG74H.mjs";
20
+ useTranslation
21
+ } from "./chunk-3JSJK2ZY.mjs";
74
22
 
75
- // packages/ui/react-ui/src/index.ts
23
+ // src/index.ts
76
24
  import { Trans } from "react-i18next";
77
25
  export * from "@dxos/react-hooks";
78
- export * from "@dxos/react-ui-types";
26
+ export * from "@dxos/ui-types";
27
+
28
+ // src/components/ThemeProvider/index.ts
29
+ import { isLabel, toLocalizedString } from "@dxos/ui-types/translations";
30
+
31
+ // src/hooks/useDensityContext.ts
32
+ import { useContext } from "react";
33
+ var useDensityContext = (densityProp) => {
34
+ const { density } = useContext(DensityContext);
35
+ return densityProp ?? density;
36
+ };
37
+
38
+ // src/hooks/useIconHref.ts
39
+ var ICONS_URL = "/icons.svg";
40
+ var useIconHref = (icon) => {
41
+ const { noCache } = useThemeContext();
42
+ const url = noCache ? `${ICONS_URL}?nocache=${(/* @__PURE__ */ new Date()).getMinutes()}` : ICONS_URL;
43
+ return icon ? `${url}#${icon}` : void 0;
44
+ };
45
+
46
+ // src/hooks/useSafeCollisionPadding.ts
47
+ import { useMemo } from "react";
48
+ var propIsNumber = (prop) => Number.isFinite(prop);
49
+ var propsIsRecord = (prop) => !!(prop && typeof prop === "object");
50
+ var safePadding = (propsPadding, safePadding2, side) => {
51
+ return (propIsNumber(safePadding2[side]) ? safePadding2[side] : 0) + (propIsNumber(propsPadding) ? propsPadding : propsIsRecord(propsPadding) ? propsPadding[side] ?? 0 : 0);
52
+ };
53
+ var useSafeCollisionPadding = (collisionPadding) => {
54
+ const { safeAreaPadding } = useThemeContext();
55
+ return useMemo(() => ({
56
+ top: safePadding(collisionPadding, safeAreaPadding, "top"),
57
+ right: safePadding(collisionPadding, safeAreaPadding, "right"),
58
+ bottom: safePadding(collisionPadding, safeAreaPadding, "bottom"),
59
+ left: safePadding(collisionPadding, safeAreaPadding, "left")
60
+ }), [
61
+ collisionPadding,
62
+ safeAreaPadding
63
+ ]);
64
+ };
65
+
66
+ // src/hooks/useTranslationsContext.ts
67
+ import { useContext as useContext2 } from "react";
68
+ var useTranslationsContext = () => useContext2(TranslationsContext);
69
+
70
+ // src/hooks/useVisualViewport.ts
71
+ import { useCallback, useState } from "react";
72
+ import { useViewportResize } from "@dxos/react-hooks";
73
+ var useVisualViewport = (deps) => {
74
+ const [width, setWidth] = useState(null);
75
+ const [height, setHeight] = useState(null);
76
+ const handleResize = useCallback(() => {
77
+ if (window.visualViewport) {
78
+ setWidth(window.visualViewport.width);
79
+ setHeight(window.visualViewport.height);
80
+ }
81
+ }, []);
82
+ useViewportResize(handleResize, deps);
83
+ return {
84
+ width,
85
+ height
86
+ };
87
+ };
88
+
89
+ // src/util/usePx.ts
90
+ import { useCallback as useCallback2, useEffect, useMemo as useMemo2, useState as useState2 } from "react";
91
+ var getDocumentElementFontSize = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
92
+ var usePx = (rem) => {
93
+ const [fontSize, setFontSize] = useState2(() => {
94
+ if (typeof document !== "undefined") {
95
+ return getDocumentElementFontSize();
96
+ }
97
+ return 16;
98
+ });
99
+ const updateFontSize = useCallback2(() => {
100
+ setFontSize(getDocumentElementFontSize());
101
+ }, []);
102
+ useEffect(() => {
103
+ if (typeof document === "undefined") {
104
+ return;
105
+ }
106
+ const resizeObserver = new ResizeObserver(updateFontSize);
107
+ resizeObserver.observe(document.documentElement);
108
+ const mediaQueryList = window.matchMedia("all");
109
+ const handleMediaChange = () => {
110
+ updateFontSize();
111
+ };
112
+ if (mediaQueryList.addEventListener) {
113
+ mediaQueryList.addEventListener("change", handleMediaChange);
114
+ } else {
115
+ mediaQueryList.addListener(handleMediaChange);
116
+ }
117
+ return () => {
118
+ resizeObserver.disconnect();
119
+ if (mediaQueryList.removeEventListener) {
120
+ mediaQueryList.removeEventListener("change", handleMediaChange);
121
+ } else {
122
+ mediaQueryList.removeListener(handleMediaChange);
123
+ }
124
+ };
125
+ }, []);
126
+ return useMemo2(() => rem * fontSize, [
127
+ fontSize
128
+ ]);
129
+ };
130
+
131
+ // src/components/Avatars/Avatar.tsx
132
+ import { createContext } from "@radix-ui/react-context";
133
+ import { Primitive } from "@radix-ui/react-primitive";
134
+ import { Slot } from "@radix-ui/react-slot";
135
+ import React, { forwardRef } from "react";
136
+ import "@dxos/lit-ui/dx-avatar.pcss";
137
+ import { DxAvatar } from "@dxos/lit-ui/react";
138
+ import { useId } from "@dxos/react-hooks";
139
+ import { mx } from "@dxos/ui-theme";
140
+ var AVATAR_NAME = "Avatar";
141
+ var [AvatarProvider, useAvatarContext] = createContext(AVATAR_NAME);
142
+ var AvatarRoot = ({ children, labelId: propsLabelId, descriptionId: propsDescriptionId }) => {
143
+ const labelId = useId("avatar__label", propsLabelId);
144
+ const descriptionId = useId("avatar__description", propsDescriptionId);
145
+ return /* @__PURE__ */ React.createElement(AvatarProvider, {
146
+ labelId,
147
+ descriptionId
148
+ }, children);
149
+ };
150
+ var AvatarContent = /* @__PURE__ */ forwardRef(({ icon, classNames, ...props }, forwardedRef) => {
151
+ const href = useIconHref(icon);
152
+ const { labelId, descriptionId } = useAvatarContext("AvatarContent");
153
+ return /* @__PURE__ */ React.createElement(DxAvatar, {
154
+ ...props,
155
+ icon: href,
156
+ "aria-labelledby": labelId,
157
+ "aria-describedby": descriptionId,
158
+ rootClassName: mx(classNames),
159
+ ref: forwardedRef
160
+ });
161
+ });
162
+ var AvatarLabel = /* @__PURE__ */ forwardRef(({ asChild, srOnly, classNames, ...props }, forwardedRef) => {
163
+ const Comp = asChild ? Slot : Primitive.span;
164
+ const { tx } = useThemeContext();
165
+ const { labelId } = useAvatarContext("AvatarLabel");
166
+ return /* @__PURE__ */ React.createElement(Comp, {
167
+ ...props,
168
+ id: labelId,
169
+ ref: forwardedRef,
170
+ className: tx("avatar.label", {
171
+ srOnly
172
+ }, classNames)
173
+ });
174
+ });
175
+ var AvatarDescription = /* @__PURE__ */ forwardRef(({ asChild, srOnly, classNames, ...props }, forwardedRef) => {
176
+ const Comp = asChild ? Slot : Primitive.span;
177
+ const { tx } = useThemeContext();
178
+ const { descriptionId } = useAvatarContext("AvatarDescription");
179
+ return /* @__PURE__ */ React.createElement(Comp, {
180
+ ...props,
181
+ id: descriptionId,
182
+ ref: forwardedRef,
183
+ className: tx("avatar.description", {
184
+ srOnly
185
+ }, classNames)
186
+ });
187
+ });
188
+ var Avatar = {
189
+ Root: AvatarRoot,
190
+ Content: AvatarContent,
191
+ Label: AvatarLabel,
192
+ Description: AvatarDescription
193
+ };
194
+
195
+ // src/components/Breadcrumb/Breadcrumb.tsx
196
+ import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
197
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
198
+ import React4, { forwardRef as forwardRef4 } from "react";
199
+
200
+ // src/components/Icon/Icon.tsx
201
+ import React2, { forwardRef as forwardRef2, memo, useMemo as useMemo3 } from "react";
202
+ var Icon = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ classNames, icon, size, synchronized, style, ...props }, forwardedRef) => {
203
+ const { tx } = useThemeContext();
204
+ const spinDelay = useMemo3(() => synchronized ? `${-(Date.now() % 1e3)}ms` : void 0, [
205
+ synchronized
206
+ ]);
207
+ const href = useIconHref(icon);
208
+ return /* @__PURE__ */ React2.createElement("svg", {
209
+ ...props,
210
+ style: {
211
+ ...style,
212
+ animationDelay: spinDelay
213
+ },
214
+ className: tx("icon.root", {
215
+ size
216
+ }, classNames),
217
+ ref: forwardedRef
218
+ }, /* @__PURE__ */ React2.createElement("use", {
219
+ href
220
+ }));
221
+ }));
222
+
223
+ // src/components/Link/Link.tsx
224
+ import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
225
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
226
+ import React3, { forwardRef as forwardRef3 } from "react";
227
+ var Link = /* @__PURE__ */ forwardRef3(({ asChild, variant, classNames, ...props }, forwardedRef) => {
228
+ const { tx } = useThemeContext();
229
+ const Comp = asChild ? Slot2 : Primitive2.a;
230
+ return /* @__PURE__ */ React3.createElement(Comp, {
231
+ ...props,
232
+ className: tx("link.root", {
233
+ variant
234
+ }, classNames),
235
+ ref: forwardedRef
236
+ });
237
+ });
238
+
239
+ // src/components/Breadcrumb/Breadcrumb.tsx
240
+ var BreadcrumbRoot = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
241
+ const { tx } = useThemeContext();
242
+ const Comp = asChild ? Slot3 : Primitive3.div;
243
+ return /* @__PURE__ */ React4.createElement(Comp, {
244
+ role: "navigation",
245
+ ...props,
246
+ className: tx("breadcrumb.root", {}, classNames),
247
+ ref: forwardedRef
248
+ });
249
+ });
250
+ var BreadcrumbList = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
251
+ const { tx } = useThemeContext();
252
+ const Comp = asChild ? Slot3 : Primitive3.ol;
253
+ return /* @__PURE__ */ React4.createElement(Comp, {
254
+ role: "list",
255
+ ...props,
256
+ className: tx("breadcrumb.list", {}, classNames),
257
+ ref: forwardedRef
258
+ });
259
+ });
260
+ var BreadcrumbListItem = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
261
+ const { tx } = useThemeContext();
262
+ const Comp = asChild ? Slot3 : Primitive3.li;
263
+ return /* @__PURE__ */ React4.createElement(Comp, {
264
+ role: "listitem",
265
+ ...props,
266
+ className: tx("breadcrumb.listItem", {}, classNames),
267
+ ref: forwardedRef
268
+ });
269
+ });
270
+ var BreadcrumbLink = /* @__PURE__ */ forwardRef4(({ asChild, ...props }, forwardedRef) => {
271
+ const Comp = asChild ? Slot3 : Link;
272
+ return /* @__PURE__ */ React4.createElement(Comp, {
273
+ ...props,
274
+ ref: forwardedRef
275
+ });
276
+ });
277
+ var BreadcrumbCurrent = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
278
+ const { tx } = useThemeContext();
279
+ const Comp = asChild ? Slot3 : "h1";
280
+ return /* @__PURE__ */ React4.createElement(Comp, {
281
+ ...props,
282
+ "aria-current": "page",
283
+ className: tx("breadcrumb.current", {}, classNames),
284
+ ref: forwardedRef
285
+ });
286
+ });
287
+ var BreadcrumbSeparator = ({ children, classNames, ...props }) => {
288
+ const { tx } = useThemeContext();
289
+ return /* @__PURE__ */ React4.createElement(Primitive3.span, {
290
+ role: "separator",
291
+ "aria-hidden": "true",
292
+ ...props,
293
+ className: tx("breadcrumb.separator", {}, classNames)
294
+ }, children ?? /* @__PURE__ */ React4.createElement(Icon, {
295
+ icon: "ph--dot--bold"
296
+ }));
297
+ };
298
+ var Breadcrumb = {
299
+ Root: BreadcrumbRoot,
300
+ List: BreadcrumbList,
301
+ ListItem: BreadcrumbListItem,
302
+ Link: BreadcrumbLink,
303
+ Current: BreadcrumbCurrent,
304
+ Separator: BreadcrumbSeparator
305
+ };
306
+
307
+ // src/components/Button/Button.tsx
308
+ import { createContext as createContext2 } from "@radix-ui/react-context";
309
+ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
310
+ import { Slot as Slot4 } from "@radix-ui/react-slot";
311
+ import React5, { forwardRef as forwardRef5, memo as memo2 } from "react";
312
+ var BUTTON_GROUP_NAME = "ButtonGroup";
313
+ var BUTTON_NAME = "Button";
314
+ var [ButtonGroupProvider, useButtonGroupContext] = createContext2(BUTTON_GROUP_NAME, {
315
+ inGroup: false
316
+ });
317
+ var Button = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef5(({ classNames, children, density: densityProp, elevation: elevationProp, variant = "default", asChild, ...props }, ref) => {
318
+ const { inGroup } = useButtonGroupContext(BUTTON_NAME);
319
+ const { tx } = useThemeContext();
320
+ const elevation = useElevationContext(elevationProp);
321
+ const density = useDensityContext(densityProp);
322
+ const Comp = asChild ? Slot4 : Primitive4.button;
323
+ return /* @__PURE__ */ React5.createElement(Comp, {
324
+ ref,
325
+ ...props,
326
+ "data-variant": variant,
327
+ "data-density": density,
328
+ "data-props": inGroup ? "grouped" : "",
329
+ className: tx("button.root", {
330
+ variant,
331
+ inGroup,
332
+ disabled: props.disabled,
333
+ density,
334
+ elevation
335
+ }, classNames),
336
+ ...props.disabled && {
337
+ disabled: true
338
+ }
339
+ }, children);
340
+ }));
341
+ Button.displayName = BUTTON_NAME;
342
+ var ButtonGroup = /* @__PURE__ */ forwardRef5(({ children, elevation: propsElevation, classNames, asChild, ...props }, forwardedRef) => {
343
+ const { tx } = useThemeContext();
344
+ const elevation = useElevationContext(propsElevation);
345
+ const Comp = asChild ? Slot4 : Primitive4.div;
346
+ return /* @__PURE__ */ React5.createElement(Comp, {
347
+ role: "none",
348
+ ...props,
349
+ className: tx("button.group", {
350
+ elevation
351
+ }, classNames),
352
+ ref: forwardedRef
353
+ }, /* @__PURE__ */ React5.createElement(ButtonGroupProvider, {
354
+ inGroup: true
355
+ }, children));
356
+ });
357
+ ButtonGroup.displayName = BUTTON_GROUP_NAME;
358
+
359
+ // src/components/Button/IconButton.tsx
360
+ import React6, { forwardRef as forwardRef6 } from "react";
361
+ var IconButton = /* @__PURE__ */ forwardRef6((props, forwardedRef) => props.iconOnly ? /* @__PURE__ */ React6.createElement(IconOnlyButton, {
362
+ ...props,
363
+ ref: forwardedRef
364
+ }) : /* @__PURE__ */ React6.createElement(LabelledIconButton, {
365
+ ...props,
366
+ ref: forwardedRef
367
+ }));
368
+ var IconOnlyButton = /* @__PURE__ */ forwardRef6(({ noTooltip, tooltipSide, ...props }, forwardedRef) => {
369
+ if (noTooltip) {
370
+ return /* @__PURE__ */ React6.createElement(LabelledIconButton, {
371
+ ...props,
372
+ ref: forwardedRef
373
+ });
374
+ }
375
+ return /* @__PURE__ */ React6.createElement(Tooltip.Trigger, {
376
+ asChild: true,
377
+ content: props.label,
378
+ side: tooltipSide
379
+ }, /* @__PURE__ */ React6.createElement(LabelledIconButton, {
380
+ ...props,
381
+ ref: forwardedRef
382
+ }));
383
+ });
384
+ var LabelledIconButton = /* @__PURE__ */ forwardRef6(({ size, icon, iconOnly, square, iconEnd, iconClassNames, label, caretDown, noTooltip: _, classNames, ...props }, forwardedRef) => {
385
+ const { tx } = useThemeContext();
386
+ return /* @__PURE__ */ React6.createElement(Button, {
387
+ ...props,
388
+ classNames: tx("iconButton.root", {
389
+ iconOnly,
390
+ square
391
+ }, classNames),
392
+ ref: forwardedRef
393
+ }, icon && !iconEnd && /* @__PURE__ */ React6.createElement(Icon, {
394
+ icon,
395
+ size,
396
+ classNames: iconClassNames
397
+ }), /* @__PURE__ */ React6.createElement("span", {
398
+ className: iconOnly ? "sr-only" : void 0
399
+ }, label), icon && iconEnd && /* @__PURE__ */ React6.createElement(Icon, {
400
+ icon,
401
+ size,
402
+ classNames: iconClassNames
403
+ }), caretDown && /* @__PURE__ */ React6.createElement(Icon, {
404
+ size: 3,
405
+ icon: "ph--caret-down--bold"
406
+ }));
407
+ });
408
+
409
+ // src/components/Button/Toggle.tsx
410
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
411
+ import React7, { forwardRef as forwardRef7 } from "react";
412
+ var Toggle = /* @__PURE__ */ forwardRef7(({ defaultPressed, pressed, onPressedChange, ...props }, forwardedRef) => {
413
+ return /* @__PURE__ */ React7.createElement(TogglePrimitive.Root, {
414
+ defaultPressed,
415
+ pressed,
416
+ onPressedChange,
417
+ asChild: true
418
+ }, /* @__PURE__ */ React7.createElement(Button, {
419
+ ...props,
420
+ ref: forwardedRef
421
+ }));
422
+ });
423
+
424
+ // src/components/Button/ToggleGroup.tsx
425
+ import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
426
+ import React8, { forwardRef as forwardRef8 } from "react";
427
+ var ToggleGroup = /* @__PURE__ */ forwardRef8(({ classNames, children, ...props }, forwardedRef) => {
428
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Root, {
429
+ ...props,
430
+ asChild: true
431
+ }, /* @__PURE__ */ React8.createElement(ButtonGroup, {
432
+ classNames,
433
+ children,
434
+ ref: forwardedRef
435
+ }));
436
+ });
437
+ var ToggleGroupItem = /* @__PURE__ */ forwardRef8(({ variant, elevation, density, classNames, children, ...props }, forwardedRef) => {
438
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Item, {
439
+ ...props,
440
+ asChild: true
441
+ }, /* @__PURE__ */ React8.createElement(Button, {
442
+ variant,
443
+ elevation,
444
+ density,
445
+ classNames,
446
+ children,
447
+ ref: forwardedRef
448
+ }));
449
+ });
450
+ var ToggleGroupIconItem = /* @__PURE__ */ forwardRef8(({ variant, label, icon, size, elevation, density, classNames, ...props }, forwardedRef) => {
451
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Item, {
452
+ ...props,
453
+ asChild: true
454
+ }, /* @__PURE__ */ React8.createElement(IconButton, {
455
+ variant,
456
+ elevation,
457
+ density,
458
+ classNames,
459
+ label,
460
+ icon,
461
+ size,
462
+ ref: forwardedRef
463
+ }));
464
+ });
465
+
466
+ // src/components/Card/Card.tsx
467
+ import { Primitive as Primitive12 } from "@radix-ui/react-primitive";
468
+ import { Slot as Slot12 } from "@radix-ui/react-slot";
469
+ import DOMPurify from "dompurify";
470
+ import React19, { createContext as createContext3, forwardRef as forwardRef13, useContext as useContext3, useMemo as useMemo5 } from "react";
471
+ import { composable as composable3, composableProps as composableProps7, iconSize, mx as mx6, slottable as slottable6 } from "@dxos/ui-theme";
472
+
473
+ // src/primitives/Column/Column.tsx
474
+ import { Primitive as Primitive5 } from "@radix-ui/react-primitive";
475
+ import { Slot as Slot5 } from "@radix-ui/react-slot";
476
+ import React9 from "react";
477
+ import { composableProps, slottable } from "@dxos/ui-theme";
478
+ var COLUMN_ROOT_NAME = "Column.Root";
479
+ var gutterSizes = {
480
+ xs: "var(--dx-gutter-xs)",
481
+ sm: "var(--dx-gutter-sm)",
482
+ md: "var(--dx-gutter-md)",
483
+ lg: "var(--dx-gutter-lg)"
484
+ };
485
+ var ColumnRoot = slottable(({ children, asChild, role, gutter = "md", ...props }, forwardedRef) => {
486
+ const { className, ...rest } = composableProps(props);
487
+ const Comp = asChild ? Slot5 : Primitive5.div;
488
+ const { tx } = useThemeContext();
489
+ const gutterSize = gutterSizes[gutter];
490
+ return /* @__PURE__ */ React9.createElement(Comp, {
491
+ ...rest,
492
+ role: role ?? "none",
493
+ style: {
494
+ "--gutter": gutterSize,
495
+ "--dx-col": "2 / span 1",
496
+ gridTemplateColumns: [
497
+ gutterSize,
498
+ "minmax(0,1fr)",
499
+ gutterSize
500
+ ].join(" ")
501
+ },
502
+ className: tx("column.root", {
503
+ gutter
504
+ }, className),
505
+ ref: forwardedRef
506
+ }, children);
507
+ });
508
+ ColumnRoot.displayName = COLUMN_ROOT_NAME;
509
+ var COLUMN_ROW_NAME = "Column.Row";
510
+ var ColumnRow = slottable(({ children, asChild, role, ...props }, forwardedRef) => {
511
+ const { className, ...rest } = composableProps(props);
512
+ const Comp = asChild ? Slot5 : Primitive5.div;
513
+ const { tx } = useThemeContext();
514
+ return /* @__PURE__ */ React9.createElement(Comp, {
515
+ ...rest,
516
+ role: role ?? "none",
517
+ className: tx("column.row", {}, className),
518
+ ref: forwardedRef
519
+ }, children);
520
+ });
521
+ ColumnRow.displayName = COLUMN_ROW_NAME;
522
+ var COLUMN_BLEED_NAME = "Column.Bleed";
523
+ var ColumnBleed = slottable(({ children, asChild, ...props }, forwardedRef) => {
524
+ const { tx } = useThemeContext();
525
+ const { className, ...rest } = composableProps(props);
526
+ const Comp = asChild ? Slot5 : Primitive5.div;
527
+ return /* @__PURE__ */ React9.createElement(Comp, {
528
+ ...rest,
529
+ className: tx("column.bleed", {}, className),
530
+ ref: forwardedRef
531
+ }, children);
532
+ });
533
+ ColumnBleed.displayName = COLUMN_BLEED_NAME;
534
+ var COLUMN_CENTER_NAME = "Column.Center";
535
+ var ColumnCenter = slottable(({ children, asChild, ...props }, forwardedRef) => {
536
+ const { tx } = useThemeContext();
537
+ const { className, ...rest } = composableProps(props);
538
+ const Comp = asChild ? Slot5 : Primitive5.div;
539
+ return /* @__PURE__ */ React9.createElement(Comp, {
540
+ ...rest,
541
+ className: tx("column.center", {}, className),
542
+ ref: forwardedRef
543
+ }, children);
544
+ });
545
+ ColumnCenter.displayName = COLUMN_CENTER_NAME;
546
+ var Column = {
547
+ Root: ColumnRoot,
548
+ Row: ColumnRow,
549
+ Bleed: ColumnBleed,
550
+ Center: ColumnCenter
551
+ };
552
+
553
+ // src/primitives/Container/Container.tsx
554
+ import { Primitive as Primitive6 } from "@radix-ui/react-primitive";
555
+ import { Slot as Slot6 } from "@radix-ui/react-slot";
556
+ import React10 from "react";
557
+ import { composableProps as composableProps2, mx as mx2, slottable as slottable2 } from "@dxos/ui-theme";
558
+ var Container = slottable2(({ children, asChild, ...props }, forwardedRef) => {
559
+ const { className, ...rest } = composableProps2(props);
560
+ const Comp = asChild ? Slot6 : Primitive6.div;
561
+ return /* @__PURE__ */ React10.createElement(Comp, {
562
+ ...rest,
563
+ className: mx2("dx-container", className),
564
+ ref: forwardedRef
565
+ }, children);
566
+ });
567
+
568
+ // src/primitives/Flex/Flex.tsx
569
+ import { Primitive as Primitive7 } from "@radix-ui/react-primitive";
570
+ import { Slot as Slot7 } from "@radix-ui/react-slot";
571
+ import React11 from "react";
572
+ import { composableProps as composableProps3, mx as mx3, slottable as slottable3 } from "@dxos/ui-theme";
573
+ var Flex = slottable3(({ children, asChild, column, grow, ...props }, forwardedRef) => {
574
+ const { className, ...rest } = composableProps3(props);
575
+ const Comp = asChild ? Slot7 : Primitive7.div;
576
+ return /* @__PURE__ */ React11.createElement(Comp, {
577
+ ref: forwardedRef,
578
+ ...rest,
579
+ className: mx3("flex", column && "flex-col", grow && "flex-1 overflow-hidden", className)
580
+ }, children);
581
+ });
582
+
583
+ // src/primitives/Grid/Grid.tsx
584
+ import React12 from "react";
585
+ import { composable, composableProps as composableProps4, mx as mx4 } from "@dxos/ui-theme";
586
+ var Grid = composable(({ children, style, role, cols, rows, grow = true, ...props }, forwardedRef) => {
587
+ const { className, ...rest } = composableProps4(props);
588
+ return /* @__PURE__ */ React12.createElement("div", {
589
+ ref: forwardedRef,
590
+ ...rest,
591
+ role: role ?? "none",
592
+ className: mx4("grid overflow-hidden", grow && "dx-container", className),
593
+ style: {
594
+ gridTemplateColumns: cols ? `repeat(${cols}, 1fr)` : void 0,
595
+ gridTemplateRows: rows ? `repeat(${rows}, 1fr)` : void 0,
596
+ ...style
597
+ }
598
+ }, children);
599
+ });
600
+
601
+ // src/primitives/Panel/Panel.tsx
602
+ import { Primitive as Primitive8 } from "@radix-ui/react-primitive";
603
+ import { Slot as Slot8 } from "@radix-ui/react-slot";
604
+ import React13 from "react";
605
+ import { composableProps as composableProps5, slottable as slottable4 } from "@dxos/ui-theme";
606
+ var GRID_TEMPLATE_ROWS = "auto 1fr auto";
607
+ var GRID_TEMPLATE_AREAS = '"toolbar" "content" "statusbar"';
608
+ var PanelRoot = slottable4(({ children, asChild, role, style, ...props }, forwardedRef) => {
609
+ const { className, ...rest } = composableProps5(props);
610
+ const Comp = asChild ? Slot8 : Primitive8.div;
611
+ const { tx } = useThemeContext();
612
+ return /* @__PURE__ */ React13.createElement(Comp, {
613
+ ...rest,
614
+ role: role ?? "none",
615
+ style: {
616
+ gridTemplateRows: GRID_TEMPLATE_ROWS,
617
+ gridTemplateAreas: GRID_TEMPLATE_AREAS,
618
+ ...style
619
+ },
620
+ className: tx("panel.root", {}, className),
621
+ ref: forwardedRef
622
+ }, children);
623
+ });
624
+ PanelRoot.displayName = "Panel.Root";
625
+ var PanelToolbar = slottable4(({ children, asChild, size, ...props }, forwardedRef) => {
626
+ const { className, ...rest } = composableProps5(props);
627
+ const Comp = asChild ? Slot8 : Primitive8.div;
628
+ const { tx } = useThemeContext();
629
+ return /* @__PURE__ */ React13.createElement(Comp, {
630
+ ...rest,
631
+ "data-slot": "toolbar",
632
+ className: tx("panel.toolbar", {
633
+ size
634
+ }, className),
635
+ ref: forwardedRef
636
+ }, children);
637
+ });
638
+ PanelToolbar.displayName = "Panel.Toolbar";
639
+ var PanelContent = slottable4(({ children, asChild, ...props }, forwardedRef) => {
640
+ const { className, ...rest } = composableProps5(props);
641
+ const Comp = asChild ? Slot8 : Primitive8.div;
642
+ const { tx } = useThemeContext();
643
+ return /* @__PURE__ */ React13.createElement(Comp, {
644
+ ...rest,
645
+ "data-slot": "content",
646
+ className: tx("panel.content", {}, className),
647
+ ref: forwardedRef
648
+ }, children);
649
+ });
650
+ PanelContent.displayName = "Panel.Content";
651
+ var PanelStatusbar = slottable4(({ children, asChild, size, ...props }, forwardedRef) => {
652
+ const { className, ...rest } = composableProps5(props);
653
+ const Comp = asChild ? Slot8 : Primitive8.div;
654
+ const { tx } = useThemeContext();
655
+ return /* @__PURE__ */ React13.createElement(Comp, {
656
+ ...rest,
657
+ "data-slot": "statusbar",
658
+ className: tx("panel.statusbar", {
659
+ size
660
+ }, className),
661
+ ref: forwardedRef
662
+ }, children);
663
+ });
664
+ PanelStatusbar.displayName = "Panel.Statusbar";
665
+ var Panel = {
666
+ Root: PanelRoot,
667
+ Toolbar: PanelToolbar,
668
+ Content: PanelContent,
669
+ Statusbar: PanelStatusbar
670
+ };
671
+
672
+ // src/components/Image/Image.tsx
673
+ import React14, { useCallback as useCallback3, useRef, useState as useState3 } from "react";
674
+ import { mx as mx5 } from "@dxos/ui-theme";
675
+ var cache = /* @__PURE__ */ new Map();
676
+ var Image = ({ classNames, src, alt = "", fit = "contain", crossOrigin = "anonymous", sampleSize = 64, contrast = 0.9 }) => {
677
+ const [crossOriginState, setCrossOriginState] = useState3(crossOrigin);
678
+ const [dominantColor, setDominantColor] = useState3(void 0);
679
+ const [imageLoaded, setImageLoaded] = useState3(false);
680
+ const canvasRef = useRef(null);
681
+ const handleImageError = () => {
682
+ setCrossOriginState(void 0);
683
+ };
684
+ const handleImageLoad = useCallback3(({ target }) => {
685
+ const rgb = cache.get(src);
686
+ if (rgb) {
687
+ setDominantColor(rgb);
688
+ setImageLoaded(true);
689
+ return;
690
+ }
691
+ const img = target;
692
+ if (!canvasRef.current) {
693
+ return;
694
+ }
695
+ try {
696
+ const color = extractDominantColor(canvasRef.current, img, {
697
+ sampleSize,
698
+ contrast
699
+ });
700
+ if (color) {
701
+ const rgb2 = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
702
+ cache.set(src, rgb2);
703
+ setDominantColor(rgb2);
704
+ }
705
+ } catch {
706
+ setCrossOriginState(void 0);
707
+ }
708
+ setImageLoaded(true);
709
+ }, [
710
+ sampleSize,
711
+ contrast,
712
+ src
713
+ ]);
714
+ return /* @__PURE__ */ React14.createElement("div", {
715
+ // `isolate` (`isolation: isolate`) creates a new stacking context so
716
+ // the inner <img>'s `z-10` stays scoped to this wrapper. Without it
717
+ // the z-10 leaks into the parent's stacking context and elevates the
718
+ // image above any pseudo-element rings (e.g. Focus.Item's
719
+ // `dx-ring-pseudo` `::after`) painted on ancestors — most visibly,
720
+ // the focus ring on a Card containing a Card.Poster.
721
+ className: mx5(`relative flex w-full justify-center overflow-hidden transition-all duration-700 isolate`, classNames),
722
+ style: {
723
+ backgroundColor: dominantColor
724
+ }
725
+ }, /* @__PURE__ */ React14.createElement("canvas", {
726
+ ref: canvasRef,
727
+ style: {
728
+ display: "none"
729
+ },
730
+ "aria-hidden": "true"
731
+ }), /* @__PURE__ */ React14.createElement("div", {
732
+ className: "absolute inset-0 pointer-events-none",
733
+ style: {
734
+ background: dominantColor ? `radial-gradient(circle at center, transparent 30%, ${dominantColor} 100%)` : void 0,
735
+ transition: "opacity 0.7s ease-in-out",
736
+ opacity: 0.5
737
+ }
738
+ }), /* @__PURE__ */ React14.createElement("img", {
739
+ src,
740
+ alt,
741
+ crossOrigin: crossOriginState,
742
+ onError: handleImageError,
743
+ onLoad: handleImageLoad,
744
+ className: mx5("z-10 transition-opacity duration-500", fit === "cover" ? "w-full h-full object-cover" : "object-contain"),
745
+ style: {
746
+ opacity: imageLoaded ? 1 : 0
747
+ }
748
+ }));
749
+ };
750
+ var extractDominantColor = (canvas, img, { sampleSize = 64, contrast = 0.95 }) => {
751
+ const ctx = canvas.getContext("2d");
752
+ if (!ctx) {
753
+ return null;
754
+ }
755
+ canvas.width = sampleSize;
756
+ canvas.height = sampleSize;
757
+ ctx.drawImage(img, 0, 0, sampleSize, sampleSize);
758
+ const imageData = ctx.getImageData(0, 0, sampleSize, sampleSize);
759
+ const pixels = imageData.data;
760
+ if (isTransparent(pixels, sampleSize)) {
761
+ return null;
762
+ }
763
+ let r = 0;
764
+ let g = 0;
765
+ let b = 0;
766
+ let totalWeight = 0;
767
+ const cornerSize = Math.floor(sampleSize * 0.125);
768
+ for (let y = 0; y < sampleSize; y++) {
769
+ for (let x = 0; x < sampleSize; x++) {
770
+ const isInTopLeft = x < cornerSize && y < cornerSize;
771
+ const isInTopRight = x >= sampleSize - cornerSize && y < cornerSize;
772
+ const isInBottomLeft = x < cornerSize && y >= sampleSize - cornerSize;
773
+ const isInBottomRight = x >= sampleSize - cornerSize && y >= sampleSize - cornerSize;
774
+ if (!isInTopLeft && !isInTopRight && !isInBottomLeft && !isInBottomRight) {
775
+ continue;
776
+ }
777
+ const i = (y * sampleSize + x) * 4;
778
+ const red = pixels[i];
779
+ const green = pixels[i + 1];
780
+ const blue = pixels[i + 2];
781
+ const alpha = pixels[i + 3];
782
+ if (alpha === 0) {
783
+ continue;
784
+ }
785
+ const max = Math.max(red, green, blue);
786
+ const min = Math.min(red, green, blue);
787
+ const saturation = max === 0 ? 0 : (max - min) / max;
788
+ const weight = 1 + saturation * 2;
789
+ r += red * weight;
790
+ g += green * weight;
791
+ b += blue * weight;
792
+ totalWeight += weight;
793
+ }
794
+ }
795
+ if (totalWeight > 0) {
796
+ r = Math.round(Math.round(r / totalWeight) * contrast);
797
+ g = Math.round(Math.round(g / totalWeight) * contrast);
798
+ b = Math.round(Math.round(b / totalWeight) * contrast);
799
+ return [
800
+ r,
801
+ g,
802
+ b
803
+ ];
804
+ }
805
+ return null;
806
+ };
807
+ var isTransparent = (pixels, sampleSize, threshold = 0.5) => {
808
+ let edgeTransparentPixels = 0;
809
+ const edgePixels = sampleSize * 4 - 4;
810
+ for (let x = 0; x < sampleSize; x++) {
811
+ const topIndex = x * 4;
812
+ if (pixels[topIndex + 3] === 0) {
813
+ edgeTransparentPixels++;
814
+ }
815
+ const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
816
+ if (pixels[bottomIndex + 3] === 0) {
817
+ edgeTransparentPixels++;
818
+ }
819
+ }
820
+ for (let y = 1; y < sampleSize - 1; y++) {
821
+ const leftIndex = y * sampleSize * 4;
822
+ if (pixels[leftIndex + 3] === 0) {
823
+ edgeTransparentPixels++;
824
+ }
825
+ const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
826
+ if (pixels[rightIndex + 3] === 0) {
827
+ edgeTransparentPixels++;
828
+ }
829
+ }
830
+ return edgeTransparentPixels / edgePixels > threshold;
831
+ };
832
+
833
+ // src/components/Toolbar/Toolbar.tsx
834
+ import { Primitive as Primitive11 } from "@radix-ui/react-primitive";
835
+ import { Slot as Slot11 } from "@radix-ui/react-slot";
836
+ import * as ToolbarPrimitive from "@radix-ui/react-toolbar";
837
+ import React18, { forwardRef as forwardRef12 } from "react";
838
+ import { useTranslation as useTranslation2 } from "react-i18next";
839
+ import { composable as composable2, composableProps as composableProps6, slottable as slottable5 } from "@dxos/ui-theme";
840
+ import { translationKey } from "#translations";
841
+
842
+ // src/components/Menu/ContextMenu.tsx
843
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
844
+ import { Primitive as Primitive9 } from "@radix-ui/react-primitive";
845
+ import { Slot as Slot9 } from "@radix-ui/react-slot";
846
+ import React15, { forwardRef as forwardRef9 } from "react";
847
+ var ContextMenuRoot = ContextMenuPrimitive.ContextMenu;
848
+ var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
849
+ var ContextMenuPortal = ContextMenuPrimitive.Portal;
850
+ var ContextMenuContent = /* @__PURE__ */ forwardRef9(({ classNames, children, collisionPadding = 8, ...props }, forwardedRef) => {
851
+ const { tx } = useThemeContext();
852
+ const elevation = useElevationContext();
853
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
854
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Content, {
855
+ ...props,
856
+ "data-arrow-keys": "up down",
857
+ collisionPadding: safeCollisionPadding,
858
+ className: tx("menu.content", {
859
+ elevation
860
+ }, classNames),
861
+ ref: forwardedRef
862
+ }, children);
863
+ });
864
+ var ContextMenuViewport = /* @__PURE__ */ forwardRef9(({ classNames, asChild, children, ...props }, forwardedRef) => {
865
+ const { tx } = useThemeContext();
866
+ const Comp = asChild ? Slot9 : Primitive9.div;
867
+ return /* @__PURE__ */ React15.createElement(Comp, {
868
+ ...props,
869
+ className: tx("menu.viewport", {}, classNames),
870
+ ref: forwardedRef
871
+ }, children);
872
+ });
873
+ var ContextMenuArrow = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
874
+ const { tx } = useThemeContext();
875
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Arrow, {
876
+ ...props,
877
+ className: tx("menu.arrow", {}, classNames),
878
+ ref: forwardedRef
879
+ });
880
+ });
881
+ var ContextMenuGroup = ContextMenuPrimitive.Group;
882
+ var ContextMenuItemIndicator = ContextMenuPrimitive.ItemIndicator;
883
+ var ContextMenuItem = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
884
+ const { tx } = useThemeContext();
885
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Item, {
886
+ ...props,
887
+ className: tx("menu.item", {}, classNames),
888
+ ref: forwardedRef
889
+ });
890
+ });
891
+ var ContextMenuCheckboxItem = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
892
+ const { tx } = useThemeContext();
893
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.CheckboxItem, {
894
+ ...props,
895
+ className: tx("menu.item", {}, classNames),
896
+ ref: forwardedRef
897
+ });
898
+ });
899
+ var ContextMenuSeparator = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
900
+ const { tx } = useThemeContext();
901
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Separator, {
902
+ ...props,
903
+ className: tx("menu.separator", {}, classNames),
904
+ ref: forwardedRef
905
+ });
906
+ });
907
+ var ContextMenuGroupLabel = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
908
+ const { tx } = useThemeContext();
909
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Label, {
910
+ ...props,
911
+ className: tx("menu.groupLabel", {}, classNames),
912
+ ref: forwardedRef
913
+ });
914
+ });
915
+ var ContextMenu2 = {
916
+ Root: ContextMenuRoot,
917
+ Trigger: ContextMenuTrigger,
918
+ Portal: ContextMenuPortal,
919
+ Content: ContextMenuContent,
920
+ Viewport: ContextMenuViewport,
921
+ Arrow: ContextMenuArrow,
922
+ Group: ContextMenuGroup,
923
+ Item: ContextMenuItem,
924
+ CheckboxItem: ContextMenuCheckboxItem,
925
+ ItemIndicator: ContextMenuItemIndicator,
926
+ Separator: ContextMenuSeparator,
927
+ GroupLabel: ContextMenuGroupLabel
928
+ };
929
+
930
+ // src/components/Menu/DropdownMenu.tsx
931
+ import { composeEventHandlers } from "@radix-ui/primitive";
932
+ import { composeRefs } from "@radix-ui/react-compose-refs";
933
+ import { createContextScope } from "@radix-ui/react-context";
934
+ import { useId as useId2 } from "@radix-ui/react-id";
935
+ import * as MenuPrimitive from "@radix-ui/react-menu";
936
+ import { createMenuScope } from "@radix-ui/react-menu";
937
+ import { Primitive as Primitive10 } from "@radix-ui/react-primitive";
938
+ import { Slot as Slot10 } from "@radix-ui/react-slot";
939
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
940
+ import React16, { forwardRef as forwardRef10, useCallback as useCallback4, useEffect as useEffect2, useMemo as useMemo4, useRef as useRef2 } from "react";
941
+ var DROPDOWN_MENU_NAME = "DropdownMenu";
942
+ var [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(DROPDOWN_MENU_NAME, [
943
+ createMenuScope
944
+ ]);
945
+ var useMenuScope = createMenuScope();
946
+ var [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);
947
+ var DropdownMenuRoot = ({ __scopeDropdownMenu, children, dir, modal = true, open: openProp, defaultOpen, onOpenChange }) => {
948
+ const menuScope = useMenuScope(__scopeDropdownMenu);
949
+ const triggerRef = useRef2(null);
950
+ const [open = false, setOpen] = useControllableState({
951
+ prop: openProp,
952
+ defaultProp: defaultOpen,
953
+ onChange: onOpenChange
954
+ });
955
+ return /* @__PURE__ */ React16.createElement(DropdownMenuProvider, {
956
+ scope: __scopeDropdownMenu,
957
+ triggerId: useId2(),
958
+ triggerRef,
959
+ contentId: useId2(),
960
+ open,
961
+ onOpenChange: setOpen,
962
+ onOpenToggle: useCallback4(() => setOpen((prevOpen) => !prevOpen), [
963
+ setOpen
964
+ ]),
965
+ modal
966
+ }, /* @__PURE__ */ React16.createElement(MenuPrimitive.Root, {
967
+ ...menuScope,
968
+ dir,
969
+ modal,
970
+ open,
971
+ onOpenChange: setOpen
972
+ }, children));
973
+ };
974
+ DropdownMenuRoot.displayName = DROPDOWN_MENU_NAME;
975
+ var TRIGGER_NAME = "DropdownMenuTrigger";
976
+ var DropdownMenuTrigger = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
977
+ const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;
978
+ const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);
979
+ const menuScope = useMenuScope(__scopeDropdownMenu);
980
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Anchor, {
981
+ asChild: true,
982
+ ...menuScope
983
+ }, /* @__PURE__ */ React16.createElement(Primitive10.button, {
984
+ type: "button",
985
+ id: context.triggerId,
986
+ "aria-haspopup": "menu",
987
+ "aria-expanded": context.open,
988
+ "aria-controls": context.open ? context.contentId : void 0,
989
+ "data-state": context.open ? "open" : "closed",
990
+ "data-disabled": disabled ? "" : void 0,
991
+ disabled,
992
+ ...triggerProps,
993
+ ref: composeRefs(forwardedRef, context.triggerRef),
994
+ "data-arrow-keys": "down",
995
+ onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {
996
+ if (!disabled && event.button === 0 && event.ctrlKey === false) {
997
+ context.onOpenToggle();
998
+ if (!context.open) {
999
+ event.preventDefault();
1000
+ }
1001
+ }
1002
+ }),
1003
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
1004
+ if (disabled) {
1005
+ return;
1006
+ }
1007
+ if ([
1008
+ "Enter",
1009
+ " "
1010
+ ].includes(event.key)) {
1011
+ context.onOpenToggle();
1012
+ }
1013
+ if (event.key === "ArrowDown") {
1014
+ context.onOpenChange(true);
1015
+ }
1016
+ if ([
1017
+ "Enter",
1018
+ " ",
1019
+ "ArrowDown"
1020
+ ].includes(event.key)) {
1021
+ event.preventDefault();
1022
+ }
1023
+ })
1024
+ }));
1025
+ });
1026
+ DropdownMenuTrigger.displayName = TRIGGER_NAME;
1027
+ var VIRTUAL_TRIGGER_NAME = "DropdownMenuVirtualTrigger";
1028
+ var DropdownMenuVirtualTrigger = (props) => {
1029
+ const { __scopeDropdownMenu, virtualRef } = props;
1030
+ const context = useDropdownMenuContext(VIRTUAL_TRIGGER_NAME, __scopeDropdownMenu);
1031
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1032
+ useEffect2(() => {
1033
+ if (virtualRef.current) {
1034
+ context.triggerRef.current = virtualRef.current;
1035
+ }
1036
+ });
1037
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Anchor, {
1038
+ ...menuScope,
1039
+ virtualRef
1040
+ });
1041
+ };
1042
+ DropdownMenuVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
1043
+ var PORTAL_NAME = "DropdownMenuPortal";
1044
+ var DropdownMenuPortal = (props) => {
1045
+ const { __scopeDropdownMenu, ...portalProps } = props;
1046
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1047
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Portal, {
1048
+ ...menuScope,
1049
+ ...portalProps
1050
+ });
1051
+ };
1052
+ DropdownMenuPortal.displayName = PORTAL_NAME;
1053
+ var DropdownMenuViewport = /* @__PURE__ */ forwardRef10(({ classNames, asChild, children, ...props }, forwardedRef) => {
1054
+ const { tx } = useThemeContext();
1055
+ const Comp = asChild ? Slot10 : Primitive10.div;
1056
+ return /* @__PURE__ */ React16.createElement(Comp, {
1057
+ ...props,
1058
+ className: tx("menu.viewport", {}, classNames),
1059
+ ref: forwardedRef
1060
+ }, children);
1061
+ });
1062
+ var CONTENT_NAME = "DropdownMenuContent";
1063
+ var DropdownMenuContent = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1064
+ const { __scopeDropdownMenu, classNames, collisionPadding = 8, collisionBoundary, ...contentProps } = props;
1065
+ const { tx } = useThemeContext();
1066
+ const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);
1067
+ const elevation = useElevationContext();
1068
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1069
+ const hasInteractedOutsideRef = useRef2(false);
1070
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
1071
+ const computedCollisionBoundary = useMemo4(() => {
1072
+ const closestBoundary = context.triggerRef.current?.closest("[data-popover-collision-boundary]");
1073
+ return closestBoundary ? Array.isArray(collisionBoundary) ? [
1074
+ closestBoundary,
1075
+ ...collisionBoundary
1076
+ ] : collisionBoundary ? [
1077
+ closestBoundary,
1078
+ collisionBoundary
1079
+ ] : [
1080
+ closestBoundary
1081
+ ] : collisionBoundary;
1082
+ }, [
1083
+ context.open,
1084
+ collisionBoundary,
1085
+ context.triggerRef.current
1086
+ ]);
1087
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Content, {
1088
+ id: context.contentId,
1089
+ "aria-labelledby": context.triggerId,
1090
+ ...menuScope,
1091
+ ...contentProps,
1092
+ collisionBoundary: computedCollisionBoundary,
1093
+ collisionPadding: safeCollisionPadding,
1094
+ ref: forwardedRef,
1095
+ onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {
1096
+ if (!hasInteractedOutsideRef.current) {
1097
+ context.triggerRef.current?.focus();
1098
+ }
1099
+ hasInteractedOutsideRef.current = false;
1100
+ event.preventDefault();
1101
+ }),
1102
+ onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {
1103
+ const originalEvent = event.detail.originalEvent;
1104
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
1105
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
1106
+ if (!context.modal || isRightClick) {
1107
+ hasInteractedOutsideRef.current = true;
1108
+ }
1109
+ }),
1110
+ "data-arrow-keys": "up down",
1111
+ className: tx("menu.content", {
1112
+ elevation
1113
+ }, classNames),
1114
+ style: {
1115
+ ...props.style,
1116
+ // re-namespace exposed content custom properties
1117
+ ...{
1118
+ "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1119
+ "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
1120
+ "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
1121
+ "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
1122
+ "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
1123
+ }
1124
+ }
1125
+ });
1126
+ });
1127
+ DropdownMenuContent.displayName = CONTENT_NAME;
1128
+ var GROUP_NAME = "DropdownMenuGroup";
1129
+ var DropdownMenuGroup = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1130
+ const { __scopeDropdownMenu, ...groupProps } = props;
1131
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1132
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Group, {
1133
+ ...menuScope,
1134
+ ...groupProps,
1135
+ ref: forwardedRef
1136
+ });
1137
+ });
1138
+ DropdownMenuGroup.displayName = GROUP_NAME;
1139
+ var LABEL_NAME = "DropdownMenuLabel";
1140
+ var DropdownMenuGroupLabel = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1141
+ const { __scopeDropdownMenu, classNames, ...labelProps } = props;
1142
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1143
+ const { tx } = useThemeContext();
1144
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Label, {
1145
+ ...menuScope,
1146
+ ...labelProps,
1147
+ className: tx("menu.groupLabel", {}, classNames),
1148
+ ref: forwardedRef
1149
+ });
1150
+ });
1151
+ DropdownMenuGroupLabel.displayName = LABEL_NAME;
1152
+ var ITEM_NAME = "DropdownMenuItem";
1153
+ var DropdownMenuItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1154
+ const { __scopeDropdownMenu, classNames, ...itemProps } = props;
1155
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1156
+ const { tx } = useThemeContext();
1157
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Item, {
1158
+ ...menuScope,
1159
+ ...itemProps,
1160
+ className: tx("menu.item", {}, classNames),
1161
+ ref: forwardedRef
1162
+ });
1163
+ });
1164
+ DropdownMenuItem.displayName = ITEM_NAME;
1165
+ var CHECKBOX_ITEM_NAME = "DropdownMenuCheckboxItem";
1166
+ var DropdownMenuCheckboxItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1167
+ const { __scopeDropdownMenu, classNames, ...checkboxItemProps } = props;
1168
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1169
+ const { tx } = useThemeContext();
1170
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.CheckboxItem, {
1171
+ ...menuScope,
1172
+ ...checkboxItemProps,
1173
+ className: tx("menu.item", {}, classNames),
1174
+ ref: forwardedRef
1175
+ });
1176
+ });
1177
+ DropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
1178
+ var RADIO_GROUP_NAME = "DropdownMenuRadioGroup";
1179
+ var DropdownMenuRadioGroup = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1180
+ const { __scopeDropdownMenu, ...radioGroupProps } = props;
1181
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1182
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.RadioGroup, {
1183
+ ...menuScope,
1184
+ ...radioGroupProps,
1185
+ ref: forwardedRef
1186
+ });
1187
+ });
1188
+ DropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;
1189
+ var RADIO_ITEM_NAME = "DropdownMenuRadioItem";
1190
+ var DropdownMenuRadioItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1191
+ const { __scopeDropdownMenu, classNames, ...itemProps } = props;
1192
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1193
+ const { tx } = useThemeContext();
1194
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Item, {
1195
+ ...menuScope,
1196
+ ...itemProps,
1197
+ className: tx("menu.item", {}, classNames),
1198
+ ref: forwardedRef
1199
+ });
1200
+ });
1201
+ DropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;
1202
+ var INDICATOR_NAME = "DropdownMenuItemIndicator";
1203
+ var DropdownMenuItemIndicator = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1204
+ const { __scopeDropdownMenu, ...itemIndicatorProps } = props;
1205
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1206
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.ItemIndicator, {
1207
+ ...menuScope,
1208
+ ...itemIndicatorProps,
1209
+ ref: forwardedRef
1210
+ });
1211
+ });
1212
+ DropdownMenuItemIndicator.displayName = INDICATOR_NAME;
1213
+ var SEPARATOR_NAME = "DropdownMenuSeparator";
1214
+ var DropdownMenuSeparator = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1215
+ const { __scopeDropdownMenu, classNames, ...separatorProps } = props;
1216
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1217
+ const { tx } = useThemeContext();
1218
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Separator, {
1219
+ ...menuScope,
1220
+ ...separatorProps,
1221
+ className: tx("menu.separator", {}, classNames),
1222
+ ref: forwardedRef
1223
+ });
1224
+ });
1225
+ DropdownMenuSeparator.displayName = SEPARATOR_NAME;
1226
+ var ARROW_NAME = "DropdownMenuArrow";
1227
+ var DropdownMenuArrow = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1228
+ const { __scopeDropdownMenu, classNames, ...arrowProps } = props;
1229
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1230
+ const { tx } = useThemeContext();
1231
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Arrow, {
1232
+ ...menuScope,
1233
+ ...arrowProps,
1234
+ className: tx("menu.arrow", {}, classNames),
1235
+ ref: forwardedRef
1236
+ });
1237
+ });
1238
+ DropdownMenuArrow.displayName = ARROW_NAME;
1239
+ var DropdownMenuSub = (props) => {
1240
+ const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;
1241
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1242
+ const [open = false, setOpen] = useControllableState({
1243
+ prop: openProp,
1244
+ defaultProp: defaultOpen,
1245
+ onChange: onOpenChange
1246
+ });
1247
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Sub, {
1248
+ ...menuScope,
1249
+ open,
1250
+ onOpenChange: setOpen
1251
+ }, children);
1252
+ };
1253
+ var SUB_TRIGGER_NAME = "DropdownMenuSubTrigger";
1254
+ var DropdownMenuSubTrigger = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1255
+ const { __scopeDropdownMenu, ...subTriggerProps } = props;
1256
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1257
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.SubTrigger, {
1258
+ ...menuScope,
1259
+ ...subTriggerProps,
1260
+ ref: forwardedRef
1261
+ });
1262
+ });
1263
+ DropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;
1264
+ var SUB_CONTENT_NAME = "DropdownMenuSubContent";
1265
+ var DropdownMenuSubContent = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1266
+ const { __scopeDropdownMenu, ...subContentProps } = props;
1267
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1268
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.SubContent, {
1269
+ ...menuScope,
1270
+ ...subContentProps,
1271
+ ref: forwardedRef,
1272
+ style: {
1273
+ ...props.style,
1274
+ // re-namespace exposed content custom properties
1275
+ ...{
1276
+ "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1277
+ "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
1278
+ "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
1279
+ "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
1280
+ "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
1281
+ }
1282
+ }
1283
+ });
1284
+ });
1285
+ DropdownMenuSubContent.displayName = SUB_CONTENT_NAME;
1286
+ var DropdownMenu = {
1287
+ Root: DropdownMenuRoot,
1288
+ Trigger: DropdownMenuTrigger,
1289
+ VirtualTrigger: DropdownMenuVirtualTrigger,
1290
+ Portal: DropdownMenuPortal,
1291
+ Content: DropdownMenuContent,
1292
+ Viewport: DropdownMenuViewport,
1293
+ Group: DropdownMenuGroup,
1294
+ GroupLabel: DropdownMenuGroupLabel,
1295
+ Item: DropdownMenuItem,
1296
+ CheckboxItem: DropdownMenuCheckboxItem,
1297
+ RadioGroup: DropdownMenuRadioGroup,
1298
+ RadioItem: DropdownMenuRadioItem,
1299
+ ItemIndicator: DropdownMenuItemIndicator,
1300
+ Separator: DropdownMenuSeparator,
1301
+ Arrow: DropdownMenuArrow,
1302
+ Sub: DropdownMenuSub,
1303
+ SubTrigger: DropdownMenuSubTrigger,
1304
+ SubContent: DropdownMenuSubContent
1305
+ };
1306
+ var useDropdownMenuMenuScope = useMenuScope;
1307
+
1308
+ // src/components/Separator/Separator.tsx
1309
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
1310
+ import React17, { forwardRef as forwardRef11 } from "react";
1311
+ var Separator3 = /* @__PURE__ */ forwardRef11(({ classNames, orientation = "horizontal", subdued, ...props }, forwardedRef) => {
1312
+ const { tx } = useThemeContext();
1313
+ return /* @__PURE__ */ React17.createElement(SeparatorPrimitive.Root, {
1314
+ ...props,
1315
+ orientation,
1316
+ className: tx("separator.root", {
1317
+ orientation,
1318
+ subdued
1319
+ }, classNames),
1320
+ ref: forwardedRef
1321
+ });
1322
+ });
1323
+
1324
+ // src/components/Toolbar/Toolbar.tsx
1325
+ var ToolbarRoot = composable2(({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
1326
+ const { className, role, ...rest } = composableProps6(props);
1327
+ const { tx } = useThemeContext();
1328
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Root, {
1329
+ ...rest,
1330
+ ...role !== "none" && {
1331
+ role
1332
+ },
1333
+ orientation,
1334
+ "data-arrow-keys": orientation === "vertical" ? "up down" : "left right",
1335
+ className: tx("toolbar.root", {
1336
+ density,
1337
+ disabled,
1338
+ layoutManaged
1339
+ }, className),
1340
+ ref: forwardedRef
1341
+ }, children);
1342
+ });
1343
+ var ToolbarText = slottable5(({ children, asChild, ...props }, forwardedRef) => {
1344
+ const { className, ...rest } = composableProps6(props);
1345
+ const Comp = asChild ? Slot11 : Primitive11.div;
1346
+ const { tx } = useThemeContext();
1347
+ return /* @__PURE__ */ React18.createElement(Comp, {
1348
+ ...rest,
1349
+ className: tx("toolbar.text", {}, className),
1350
+ ref: forwardedRef
1351
+ }, children);
1352
+ });
1353
+ var ToolbarButton = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1354
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1355
+ asChild: true
1356
+ }, /* @__PURE__ */ React18.createElement(Button, {
1357
+ ...props,
1358
+ ref: forwardedRef
1359
+ }));
1360
+ });
1361
+ var ToolbarIconButton = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1362
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1363
+ asChild: true
1364
+ }, /* @__PURE__ */ React18.createElement(IconButton, {
1365
+ ...props,
1366
+ noTooltip: true,
1367
+ ref: forwardedRef
1368
+ }));
1369
+ });
1370
+ var ToolbarToggle = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1371
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1372
+ asChild: true
1373
+ }, /* @__PURE__ */ React18.createElement(Toggle, {
1374
+ ...props,
1375
+ ref: forwardedRef
1376
+ }));
1377
+ });
1378
+ var ToolbarLink = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1379
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Link, {
1380
+ asChild: true
1381
+ }, /* @__PURE__ */ React18.createElement(Link, {
1382
+ ...props,
1383
+ ref: forwardedRef
1384
+ }));
1385
+ });
1386
+ var ToolbarToggleGroup2 = /* @__PURE__ */ forwardRef12(({ classNames, children, elevation, ...props }, forwardedRef) => {
1387
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleGroup, {
1388
+ ...props,
1389
+ asChild: true
1390
+ }, /* @__PURE__ */ React18.createElement(ButtonGroup, {
1391
+ classNames,
1392
+ children,
1393
+ elevation,
1394
+ ref: forwardedRef
1395
+ }));
1396
+ });
1397
+ var ToolbarToggleGroupItem = /* @__PURE__ */ forwardRef12(({ variant, density, elevation, classNames, children, ...props }, forwardedRef) => {
1398
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleItem, {
1399
+ ...props,
1400
+ asChild: true
1401
+ }, /* @__PURE__ */ React18.createElement(Button, {
1402
+ variant,
1403
+ density,
1404
+ elevation,
1405
+ classNames,
1406
+ children,
1407
+ ref: forwardedRef
1408
+ }));
1409
+ });
1410
+ var ToolbarToggleGroupIconItem = /* @__PURE__ */ forwardRef12(({ variant, density, elevation, classNames, icon, label, iconOnly, ...props }, forwardedRef) => {
1411
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleItem, {
1412
+ ...props,
1413
+ asChild: true
1414
+ }, /* @__PURE__ */ React18.createElement(IconButton, {
1415
+ variant,
1416
+ density,
1417
+ elevation,
1418
+ classNames,
1419
+ icon,
1420
+ label,
1421
+ iconOnly,
1422
+ ref: forwardedRef
1423
+ }));
1424
+ });
1425
+ var ToolbarSeparator = /* @__PURE__ */ forwardRef12(({ variant = "gap", ...props }, forwardedRef) => {
1426
+ return variant === "line" ? /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Separator, {
1427
+ asChild: true
1428
+ }, /* @__PURE__ */ React18.createElement(Separator3, {
1429
+ orientation: "vertical",
1430
+ ...props,
1431
+ ref: forwardedRef
1432
+ })) : /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Separator, {
1433
+ className: "grow",
1434
+ ref: forwardedRef
1435
+ });
1436
+ });
1437
+ var ToolbarDragHandle = /* @__PURE__ */ forwardRef12(({ testId = "drag-handle", label }, forwardedRef) => {
1438
+ const { t } = useTranslation2(translationKey);
1439
+ return /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1440
+ "data-testid": testId,
1441
+ tabIndex: -1,
1442
+ noTooltip: true,
1443
+ iconOnly: true,
1444
+ icon: "ph--dots-six-vertical--regular",
1445
+ variant: "ghost",
1446
+ label: label ?? t("toolbar-drag-handle.label"),
1447
+ classNames: "dx-focus-ring-none cursor-pointer",
1448
+ disabled: !forwardedRef,
1449
+ ref: forwardedRef
1450
+ });
1451
+ });
1452
+ var ToolbarCloseIconButton = /* @__PURE__ */ forwardRef12(({ onClick, label }, forwardedRef) => {
1453
+ const { t } = useTranslation2(translationKey);
1454
+ return /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1455
+ iconOnly: true,
1456
+ icon: "ph--x--regular",
1457
+ variant: "ghost",
1458
+ label: label ?? t("toolbar-close.label"),
1459
+ classNames: "cursor-pointer",
1460
+ onClick,
1461
+ ref: forwardedRef
1462
+ });
1463
+ });
1464
+ var ToolbarMenu = ({ context, items }) => {
1465
+ const { t } = useTranslation2(translationKey);
1466
+ return /* @__PURE__ */ React18.createElement(DropdownMenu.Root, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Trigger, {
1467
+ disabled: !items?.length,
1468
+ asChild: true
1469
+ }, /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1470
+ iconOnly: true,
1471
+ variant: "ghost",
1472
+ icon: "ph--dots-three-vertical--regular",
1473
+ label: t("toolbar-menu.label")
1474
+ })), (items?.length ?? 0) > 0 && /* @__PURE__ */ React18.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Viewport, null, items?.map(({ label, onClick: onSelect }, index) => /* @__PURE__ */ React18.createElement(DropdownMenu.Item, {
1475
+ key: index,
1476
+ onSelect: () => onSelect(context)
1477
+ }, label))), /* @__PURE__ */ React18.createElement(DropdownMenu.Arrow, null))));
1478
+ };
1479
+ var Toolbar = {
1480
+ Root: ToolbarRoot,
1481
+ Text: ToolbarText,
1482
+ Button: ToolbarButton,
1483
+ IconButton: ToolbarIconButton,
1484
+ Link: ToolbarLink,
1485
+ Toggle: ToolbarToggle,
1486
+ ToggleGroup: ToolbarToggleGroup2,
1487
+ ToggleGroupItem: ToolbarToggleGroupItem,
1488
+ ToggleGroupIconItem: ToolbarToggleGroupIconItem,
1489
+ Separator: ToolbarSeparator,
1490
+ DragHandle: ToolbarDragHandle,
1491
+ CloseIconButton: ToolbarCloseIconButton,
1492
+ Menu: ToolbarMenu
1493
+ };
1494
+
1495
+ // src/components/Card/Card.tsx
1496
+ var CardContext = /* @__PURE__ */ createContext3({});
1497
+ var CARD_ROOT_NAME = "Card.Root";
1498
+ var CardRoot = composable3(({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
1499
+ const { className, ...rest } = composableProps7(props);
1500
+ const { tx } = useThemeContext();
1501
+ return /* @__PURE__ */ React19.createElement(Column.Root, {
1502
+ asChild: true,
1503
+ gutter: density === "coarse" ? "lg" : "md",
1504
+ classNames: tx("card.root", {
1505
+ border,
1506
+ fullWidth
1507
+ }, className),
1508
+ role: role ?? "group"
1509
+ }, /* @__PURE__ */ React19.createElement("div", {
1510
+ ...rest,
1511
+ ...id && {
1512
+ "data-object-id": id
1513
+ },
1514
+ ref: forwardedRef
1515
+ }, children));
1516
+ });
1517
+ CardRoot.displayName = CARD_ROOT_NAME;
1518
+ var CARD_TOOLBAR_NAME = "Card.Toolbar";
1519
+ var CardToolbar = composable3(({ children, classNames, ...props }, forwardedRef) => {
1520
+ const { tx } = useThemeContext();
1521
+ return /* @__PURE__ */ React19.createElement(Toolbar.Root, {
1522
+ ...props,
1523
+ style: iconSize(5),
1524
+ classNames: [
1525
+ tx("card.toolbar", {}),
1526
+ classNames
1527
+ ],
1528
+ ref: forwardedRef
1529
+ }, children);
1530
+ });
1531
+ CardToolbar.displayName = CARD_TOOLBAR_NAME;
1532
+ var CARD_DRAG_HANDLE_NAME = "Card.DragHandle";
1533
+ var CardDragHandle = /* @__PURE__ */ forwardRef13((props, forwardedRef) => {
1534
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1535
+ padding: true
1536
+ }, /* @__PURE__ */ React19.createElement(Toolbar.DragHandle, {
1537
+ ...props,
1538
+ ref: forwardedRef
1539
+ }));
1540
+ });
1541
+ CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
1542
+ var CARD_CLOSE_ICON_BUTTON_NAME = "Card.CloseIconButton";
1543
+ var CloseIconButton = /* @__PURE__ */ forwardRef13((props, forwardedRef) => {
1544
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1545
+ padding: true
1546
+ }, /* @__PURE__ */ React19.createElement(Toolbar.CloseIconButton, {
1547
+ ...props,
1548
+ ref: forwardedRef
1549
+ }));
1550
+ });
1551
+ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
1552
+ var CARD_MENU_NAME = "Card.Menu";
1553
+ var CardMenu = ({ context, items, ...props }) => {
1554
+ const { menuItems } = useContext3(CardContext) ?? {};
1555
+ const combinedItems = [
1556
+ ...items ?? [],
1557
+ ...menuItems ?? []
1558
+ ];
1559
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1560
+ padding: true
1561
+ }, /* @__PURE__ */ React19.createElement(Toolbar.Menu, {
1562
+ ...props,
1563
+ context,
1564
+ items: combinedItems
1565
+ }));
1566
+ };
1567
+ CardMenu.displayName = CARD_MENU_NAME;
1568
+ var CARD_ICON_NAME = "Card.Icon";
1569
+ var CardIcon = (props) => {
1570
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, null, /* @__PURE__ */ React19.createElement(Icon, props));
1571
+ };
1572
+ CardIcon.displayName = CARD_ICON_NAME;
1573
+ var CARD_ICON_BLOCK_NAME = "Card.IconBlock";
1574
+ var CardIconBlock = /* @__PURE__ */ forwardRef13(({ classNames, children, padding, ...props }, forwardedRef) => {
1575
+ const { tx } = useThemeContext();
1576
+ return /* @__PURE__ */ React19.createElement("div", {
1577
+ ...props,
1578
+ role: "none",
1579
+ className: tx("card.icon-block", {
1580
+ padding
1581
+ }, classNames),
1582
+ ref: forwardedRef
1583
+ }, children);
1584
+ });
1585
+ CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
1586
+ var CARD_TITLE_NAME = "Card.Title";
1587
+ var CardTitle = slottable6(({ children, asChild, ...props }, forwardedRef) => {
1588
+ const { tx } = useThemeContext();
1589
+ const { className, ...rest } = composableProps7(props, {
1590
+ role: "heading"
1591
+ });
1592
+ const Comp = asChild ? Slot12 : Primitive12.div;
1593
+ return /* @__PURE__ */ React19.createElement(Comp, {
1594
+ ...rest,
1595
+ className: tx("card.title", {}, className),
1596
+ ref: forwardedRef
1597
+ }, children);
1598
+ });
1599
+ CardTitle.displayName = CARD_TITLE_NAME;
1600
+ var CARD_CONTENT_NAME = "Card.Content";
1601
+ var CardContent = slottable6(({ children, asChild, ...props }, forwardedRef) => {
1602
+ const { className, ...rest } = composableProps7(props);
1603
+ const Comp = asChild ? Slot12 : Primitive12.div;
1604
+ const { tx } = useThemeContext();
1605
+ return /* @__PURE__ */ React19.createElement(Comp, {
1606
+ ...rest,
1607
+ className: tx("card.content", {}, className),
1608
+ ref: forwardedRef
1609
+ }, children);
1610
+ });
1611
+ CardContent.displayName = CARD_CONTENT_NAME;
1612
+ var CARD_ROW_NAME = "Card.Row";
1613
+ var CardRow = slottable6(({ children, asChild, icon, ...props }, forwardedRef) => {
1614
+ const { className, ...rest } = composableProps7(props);
1615
+ const Comp = asChild ? Slot12 : Primitive12.div;
1616
+ const { tx } = useThemeContext();
1617
+ return /* @__PURE__ */ React19.createElement(Comp, {
1618
+ ...rest,
1619
+ className: tx("card.row", {}, className),
1620
+ ref: forwardedRef
1621
+ }, icon && /* @__PURE__ */ React19.createElement(CardIcon, {
1622
+ classNames: "text-subdued",
1623
+ icon,
1624
+ size: 4
1625
+ }) || /* @__PURE__ */ React19.createElement("div", null), children);
1626
+ });
1627
+ CardRow.displayName = CARD_ROW_NAME;
1628
+ var CARD_SECTION_NAME = "Card.Section";
1629
+ var CardSection = slottable6(({ children, asChild, role, ...props }, forwardedRef) => {
1630
+ const { className, ...rest } = composableProps7(props);
1631
+ const Comp = asChild ? Slot12 : Primitive12.div;
1632
+ return /* @__PURE__ */ React19.createElement(Comp, {
1633
+ ...rest,
1634
+ role: role ?? "none",
1635
+ className: mx6("col-span-full", className),
1636
+ ref: forwardedRef
1637
+ }, children);
1638
+ });
1639
+ CardSection.displayName = CARD_SECTION_NAME;
1640
+ var CARD_HEADING_NAME = "Card.Heading";
1641
+ var CardHeading = slottable6(({ children, asChild, role, variant = "default", ...props }, forwardedRef) => {
1642
+ const { className, ...rest } = composableProps7(props);
1643
+ const Comp = asChild ? Slot12 : Primitive12.div;
1644
+ const { tx } = useThemeContext();
1645
+ return /* @__PURE__ */ React19.createElement(Comp, {
1646
+ ...rest,
1647
+ role: role ?? "heading",
1648
+ className: tx("card.heading", {
1649
+ variant
1650
+ }, className),
1651
+ ref: forwardedRef
1652
+ }, children);
1653
+ });
1654
+ CardHeading.displayName = CARD_HEADING_NAME;
1655
+ var CARD_TEXT_NAME = "Card.Text";
1656
+ var CardText = slottable6(({ children, asChild, role, truncate, variant = "default", ...props }, forwardedRef) => {
1657
+ const { className, ...rest } = composableProps7(props);
1658
+ const Comp = asChild ? Slot12 : Primitive12.div;
1659
+ const { tx } = useThemeContext();
1660
+ return /* @__PURE__ */ React19.createElement(Comp, {
1661
+ ...rest,
1662
+ role: role ?? "none",
1663
+ className: tx("card.text", {
1664
+ variant
1665
+ }, className),
1666
+ ref: forwardedRef
1667
+ }, /* @__PURE__ */ React19.createElement("span", {
1668
+ className: tx("card.text-span", {
1669
+ variant,
1670
+ truncate
1671
+ })
1672
+ }, children));
1673
+ });
1674
+ CardText.displayName = CARD_TEXT_NAME;
1675
+ var CARD_HTML_NAME = "Card.Html";
1676
+ var CardHtml = ({ html, variant = "default", ...props }) => {
1677
+ const { tx } = useThemeContext();
1678
+ const sanitized = useMemo5(() => DOMPurify.sanitize(html), [
1679
+ html
1680
+ ]);
1681
+ return /* @__PURE__ */ React19.createElement("div", {
1682
+ ...props,
1683
+ role: "none",
1684
+ className: tx("card.text", {
1685
+ variant
1686
+ }),
1687
+ // eslint-disable-next-line react/no-danger
1688
+ dangerouslySetInnerHTML: {
1689
+ __html: sanitized
1690
+ }
1691
+ });
1692
+ };
1693
+ CardHtml.displayName = CARD_HTML_NAME;
1694
+ var CARD_POSTER_NAME = "Card.Poster";
1695
+ var CardPoster = (props) => {
1696
+ const { tx } = useThemeContext();
1697
+ const aspect = props.aspect === "auto" ? "aspect-auto" : "aspect-video";
1698
+ if (props.image) {
1699
+ return /* @__PURE__ */ React19.createElement("div", {
1700
+ role: "none",
1701
+ className: "col-span-full"
1702
+ }, /* @__PURE__ */ React19.createElement(Image, {
1703
+ classNames: [
1704
+ tx("card.poster", {}),
1705
+ aspect,
1706
+ props.classNames
1707
+ ],
1708
+ src: props.image,
1709
+ alt: props.alt,
1710
+ fit: props.fit
1711
+ }));
1712
+ }
1713
+ if (props.icon) {
1714
+ return /* @__PURE__ */ React19.createElement("div", {
1715
+ role: "image",
1716
+ className: tx("card.poster-icon", {}, [
1717
+ aspect,
1718
+ props.classNames
1719
+ ]),
1720
+ "aria-label": props.alt
1721
+ }, /* @__PURE__ */ React19.createElement(Icon, {
1722
+ icon: props.icon,
1723
+ size: 10
1724
+ }));
1725
+ }
1726
+ };
1727
+ CardPoster.displayName = CARD_POSTER_NAME;
1728
+ var CARD_ACTION_NAME = "Card.Action";
1729
+ var CardAction = ({ icon, actionIcon = "ph--arrow-right--regular", label, onClick }) => {
1730
+ const { tx } = useThemeContext();
1731
+ return /* @__PURE__ */ React19.createElement(Button, {
1732
+ variant: "ghost",
1733
+ classNames: tx("card.action", {}),
1734
+ onClick
1735
+ }, icon ? /* @__PURE__ */ React19.createElement(CardIcon, {
1736
+ classNames: "text-subdued",
1737
+ icon,
1738
+ size: 4
1739
+ }) : /* @__PURE__ */ React19.createElement("div", null), /* @__PURE__ */ React19.createElement("span", {
1740
+ className: tx("card.action-label", {}, !actionIcon ? "col-span-2" : void 0)
1741
+ }, label), actionIcon && /* @__PURE__ */ React19.createElement(CardIcon, {
1742
+ icon: actionIcon,
1743
+ size: 4
1744
+ }));
1745
+ };
1746
+ CardAction.displayName = CARD_ACTION_NAME;
1747
+ var CARD_LINK_NAME = "Card.Link";
1748
+ var CardLink = ({ label, href }) => {
1749
+ const { tx } = useThemeContext();
1750
+ return /* @__PURE__ */ React19.createElement("a", {
1751
+ className: tx("card.link", {}),
1752
+ "data-variant": "ghost",
1753
+ href,
1754
+ target: "_blank",
1755
+ rel: "noreferrer"
1756
+ }, /* @__PURE__ */ React19.createElement(CardIcon, {
1757
+ classNames: "text-subdued",
1758
+ icon: "ph--link--regular"
1759
+ }), /* @__PURE__ */ React19.createElement("span", {
1760
+ className: tx("card.link-label", {})
1761
+ }, label), /* @__PURE__ */ React19.createElement(CardIcon, {
1762
+ classNames: "invisible group-hover:visible",
1763
+ icon: "ph--arrow-square-out--regular"
1764
+ }));
1765
+ };
1766
+ CardLink.displayName = CARD_LINK_NAME;
1767
+ var Card = {
1768
+ Root: CardRoot,
1769
+ // Toolbar
1770
+ Toolbar: CardToolbar,
1771
+ ToolbarIconButton: Toolbar.IconButton,
1772
+ ToolbarSeparator: Toolbar.Separator,
1773
+ // Toolbar blocks
1774
+ IconBlock: CardIconBlock,
1775
+ DragHandle: CardDragHandle,
1776
+ CloseIconButton,
1777
+ Menu: CardMenu,
1778
+ Icon: CardIcon,
1779
+ Title: CardTitle,
1780
+ // Content
1781
+ Content: CardContent,
1782
+ Row: CardRow,
1783
+ Section: CardSection,
1784
+ Heading: CardHeading,
1785
+ Text: CardText,
1786
+ Html: CardHtml,
1787
+ Poster: CardPoster,
1788
+ Action: CardAction,
1789
+ Link: CardLink
1790
+ };
1791
+
1792
+ // src/components/Clipboard/ClipboardProvider.tsx
1793
+ import React20, { createContext as createContext4, useCallback as useCallback5, useContext as useContext4, useState as useState4 } from "react";
1794
+ var ClipboardContext = /* @__PURE__ */ createContext4({
1795
+ textValue: "",
1796
+ setTextValue: async (_) => {
1797
+ }
1798
+ });
1799
+ var useClipboard = () => useContext4(ClipboardContext);
1800
+ var ClipboardProvider = ({ children }) => {
1801
+ const [textValue, setInternalTextValue] = useState4("");
1802
+ const setTextValue = useCallback5(async (nextValue) => {
1803
+ await navigator.clipboard.writeText(nextValue);
1804
+ return setInternalTextValue(nextValue);
1805
+ }, []);
1806
+ return /* @__PURE__ */ React20.createElement(ClipboardContext.Provider, {
1807
+ value: {
1808
+ textValue,
1809
+ setTextValue
1810
+ }
1811
+ }, children);
1812
+ };
1813
+
1814
+ // src/components/Clipboard/CopyButton.tsx
1815
+ import React21 from "react";
1816
+ import { mx as mx7, osTranslations } from "@dxos/ui-theme";
1817
+ var inactiveLabelStyles = "invisible h-px -mb-px overflow-hidden";
1818
+ var CopyButton = ({ classNames, value, size = 5, ...props }) => {
1819
+ const { t } = useTranslation(osTranslations);
1820
+ const { textValue, setTextValue } = useClipboard();
1821
+ const isCopied = textValue === value;
1822
+ return /* @__PURE__ */ React21.createElement(Button, {
1823
+ ...props,
1824
+ classNames: [
1825
+ "inline-flex flex-col justify-center",
1826
+ classNames
1827
+ ],
1828
+ onClick: () => setTextValue(value),
1829
+ "data-testid": "copy-invitation"
1830
+ }, /* @__PURE__ */ React21.createElement("div", {
1831
+ role: "none",
1832
+ className: mx7("flex gap-1 items-center", isCopied && inactiveLabelStyles)
1833
+ }, /* @__PURE__ */ React21.createElement("span", {
1834
+ className: "px-1"
1835
+ }, t("copy.label")), /* @__PURE__ */ React21.createElement(Icon, {
1836
+ icon: "ph--copy--regular",
1837
+ size
1838
+ })), /* @__PURE__ */ React21.createElement("div", {
1839
+ role: "none",
1840
+ className: mx7("flex gap-1 items-center", !isCopied && inactiveLabelStyles)
1841
+ }, /* @__PURE__ */ React21.createElement("span", {
1842
+ className: "px-1"
1843
+ }, t("copy-success.label")), /* @__PURE__ */ React21.createElement(Icon, {
1844
+ icon: "ph--check--regular",
1845
+ size
1846
+ })));
1847
+ };
1848
+ var CopyButtonIconOnly = ({ __scopeTooltip, value, classNames, size, variant, ...props }) => {
1849
+ const { t } = useTranslation(osTranslations);
1850
+ const { textValue, setTextValue } = useClipboard();
1851
+ const isCopied = textValue === value;
1852
+ const label = isCopied ? t("copy-success.label") : props.label ?? t("copy.label");
1853
+ const { onOpen } = useTooltipContext("CopyButton", __scopeTooltip);
1854
+ return /* @__PURE__ */ React21.createElement(IconButton, {
1855
+ iconOnly: true,
1856
+ label,
1857
+ icon: "ph--copy--regular",
1858
+ size,
1859
+ variant,
1860
+ classNames: [
1861
+ "inline-flex flex-col justify-center",
1862
+ classNames
1863
+ ],
1864
+ onClick: () => setTextValue(value).then(onOpen),
1865
+ "data-testid": "copy-invitation"
1866
+ });
1867
+ };
1868
+
1869
+ // src/components/Clipboard/index.ts
1870
+ var Clipboard = {
1871
+ Button: CopyButton,
1872
+ IconButton: CopyButtonIconOnly,
1873
+ Provider: ClipboardProvider
1874
+ };
1875
+
1876
+ // src/components/Dialog/Dialog.tsx
1877
+ import { createContext as createContext5 } from "@radix-ui/react-context";
1878
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
1879
+ import { Primitive as Primitive13 } from "@radix-ui/react-primitive";
1880
+ import { Slot as Slot13 } from "@radix-ui/react-slot";
1881
+ import React22, { forwardRef as forwardRef14 } from "react";
1882
+ import { useTranslation as useTranslation3 } from "react-i18next";
1883
+ import { composableProps as composableProps8, osTranslations as osTranslations2, slottable as slottable7 } from "@dxos/ui-theme";
1884
+ var DialogRoot = (props) => /* @__PURE__ */ React22.createElement(ElevationProvider, {
1885
+ elevation: "dialog"
1886
+ }, /* @__PURE__ */ React22.createElement(DialogPrimitive.Root, {
1887
+ // NOTE: Radix warning unless set to undefined.
1888
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
1889
+ "aria-describedby": void 0,
1890
+ ...props
1891
+ }));
1892
+ var DialogTrigger = DialogPrimitive.Trigger;
1893
+ var DialogPortal = DialogPrimitive.Portal;
1894
+ var DIALOG_OVERLAY_NAME = "DialogOverlay";
1895
+ var [OverlayLayoutProvider, useOverlayLayoutContext] = createContext5(DIALOG_OVERLAY_NAME, {});
1896
+ var DialogOverlay = /* @__PURE__ */ forwardRef14(({ classNames, children, blockAlign, ...props }, forwardedRef) => {
1897
+ const { tx } = useThemeContext();
1898
+ return /* @__PURE__ */ React22.createElement(DialogPrimitive.Overlay, {
1899
+ ...props,
1900
+ "data-block-align": blockAlign,
1901
+ className: tx("dialog.overlay", {}, classNames),
1902
+ ref: forwardedRef
1903
+ }, /* @__PURE__ */ React22.createElement(OverlayLayoutProvider, {
1904
+ inOverlayLayout: true
1905
+ }, children));
1906
+ });
1907
+ DialogOverlay.displayName = DIALOG_OVERLAY_NAME;
1908
+ var DIALOG_CONTENT_NAME = "DialogContent";
1909
+ var DialogContent = /* @__PURE__ */ forwardRef14(({ classNames, children, size = "md", inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
1910
+ const { tx } = useThemeContext();
1911
+ const { inOverlayLayout } = useOverlayLayoutContext(DIALOG_CONTENT_NAME);
1912
+ return /* @__PURE__ */ React22.createElement(DialogPrimitive.Content, {
1913
+ ...props,
1914
+ // NOTE: Radix warning unless set to undefined.
1915
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
1916
+ "aria-describedby": void 0,
1917
+ className: tx("dialog.content", {
1918
+ size,
1919
+ inOverlayLayout: propsInOverlayLayout || inOverlayLayout
1920
+ }, classNames),
1921
+ ref: forwardedRef
1922
+ }, /* @__PURE__ */ React22.createElement(Column.Root, {
1923
+ classNames: "dx-expander",
1924
+ gutter: "sm"
1925
+ }, children));
1926
+ });
1927
+ DialogContent.displayName = DIALOG_CONTENT_NAME;
1928
+ var DialogHeader = slottable7(({ children, asChild, ...props }, forwardedRef) => {
1929
+ const { className, ...rest } = composableProps8(props);
1930
+ const Comp = asChild ? Slot13 : Primitive13.div;
1931
+ const { tx } = useThemeContext();
1932
+ return /* @__PURE__ */ React22.createElement(Comp, {
1933
+ ...rest,
1934
+ className: tx("dialog.header", {}, className),
1935
+ ref: forwardedRef
1936
+ }, children);
1937
+ });
1938
+ var DialogCloseIconButton = /* @__PURE__ */ forwardRef14(({ label, ...props }, forwardedRef) => {
1939
+ const { t } = useTranslation3(osTranslations2);
1940
+ return /* @__PURE__ */ React22.createElement(IconButton, {
1941
+ ...props,
1942
+ label: label ?? t("close-dialog.label"),
1943
+ icon: "ph--x--regular",
1944
+ iconOnly: true,
1945
+ size: 4,
1946
+ variant: "ghost",
1947
+ ref: forwardedRef
1948
+ });
1949
+ });
1950
+ var DialogBody = slottable7(({ children, asChild, ...props }, forwardedRef) => {
1951
+ const { className, ...rest } = composableProps8(props);
1952
+ const Comp = asChild ? Slot13 : Primitive13.div;
1953
+ const { tx } = useThemeContext();
1954
+ return /* @__PURE__ */ React22.createElement(Comp, {
1955
+ ...rest,
1956
+ className: tx("dialog.body", {}, className),
1957
+ ref: forwardedRef
1958
+ }, children);
1959
+ });
1960
+ var DialogTitle = /* @__PURE__ */ forwardRef14(({ classNames, srOnly, ...props }, forwardedRef) => {
1961
+ const { tx } = useThemeContext();
1962
+ return /* @__PURE__ */ React22.createElement(DialogPrimitive.Title, {
1963
+ ...props,
1964
+ className: tx("dialog.title", {
1965
+ srOnly
1966
+ }, classNames),
1967
+ ref: forwardedRef
1968
+ });
1969
+ });
1970
+ var DialogDescription = /* @__PURE__ */ forwardRef14(({ classNames, srOnly, ...props }, forwardedRef) => {
1971
+ const { tx } = useThemeContext();
1972
+ return /* @__PURE__ */ React22.createElement(DialogPrimitive.Description, {
1973
+ ...props,
1974
+ className: tx("dialog.description", {
1975
+ srOnly
1976
+ }, classNames),
1977
+ ref: forwardedRef
1978
+ });
1979
+ });
1980
+ var DialogActionBar = slottable7(({ children, asChild, ...props }, forwardedRef) => {
1981
+ const { className: classNames, ...rest } = composableProps8(props);
1982
+ const Comp = asChild ? Slot13 : Primitive13.div;
1983
+ const { tx } = useThemeContext();
1984
+ return /* @__PURE__ */ React22.createElement(Comp, {
1985
+ ...rest,
1986
+ className: tx("dialog.actionbar", {}, classNames),
1987
+ ref: forwardedRef
1988
+ }, children);
1989
+ });
1990
+ var DialogClose = DialogPrimitive.Close;
1991
+ var Dialog = {
1992
+ Root: DialogRoot,
1993
+ Trigger: DialogTrigger,
1994
+ Portal: DialogPortal,
1995
+ Overlay: DialogOverlay,
1996
+ Content: DialogContent,
1997
+ Header: DialogHeader,
1998
+ Body: DialogBody,
1999
+ Title: DialogTitle,
2000
+ Description: DialogDescription,
2001
+ ActionBar: DialogActionBar,
2002
+ Close: DialogClose,
2003
+ CloseIconButton: DialogCloseIconButton
2004
+ };
2005
+
2006
+ // src/components/Dialog/AlertDialog.tsx
2007
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
2008
+ import { createContext as createContext6 } from "@radix-ui/react-context";
2009
+ import React23, { forwardRef as forwardRef15 } from "react";
2010
+ var AlertDialogRoot = (props) => /* @__PURE__ */ React23.createElement(ElevationProvider, {
2011
+ elevation: "dialog"
2012
+ }, /* @__PURE__ */ React23.createElement(AlertDialogPrimitive.Root, props));
2013
+ var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2014
+ var AlertDialogPortal = AlertDialogPrimitive.Portal;
2015
+ var AlertDialogCancel = AlertDialogPrimitive.Cancel;
2016
+ var AlertDialogAction = AlertDialogPrimitive.Action;
2017
+ var ALERT_DIALOG_OVERLAY_NAME = "AlertDialogOverlay";
2018
+ var ALERT_DIALOG_CONTENT_NAME = "AlertDialogContent";
2019
+ var [OverlayLayoutProvider2, useOverlayLayoutContext2] = createContext6(ALERT_DIALOG_OVERLAY_NAME, {
2020
+ inOverlayLayout: false
2021
+ });
2022
+ var AlertDialogOverlay = /* @__PURE__ */ forwardRef15(({ classNames, children, blockAlign, ...props }, forwardedRef) => {
2023
+ const { tx } = useThemeContext();
2024
+ return /* @__PURE__ */ React23.createElement(AlertDialogPrimitive.Overlay, {
2025
+ ...props,
2026
+ "data-block-align": blockAlign,
2027
+ className: tx("dialog.overlay", {}, classNames),
2028
+ ref: forwardedRef
2029
+ }, /* @__PURE__ */ React23.createElement(OverlayLayoutProvider2, {
2030
+ inOverlayLayout: true
2031
+ }, children));
2032
+ });
2033
+ AlertDialogOverlay.displayName = ALERT_DIALOG_OVERLAY_NAME;
2034
+ var AlertDialogContent = /* @__PURE__ */ forwardRef15(({ classNames, children, size = "md", ...props }, forwardedRef) => {
2035
+ const { tx } = useThemeContext();
2036
+ const { inOverlayLayout } = useOverlayLayoutContext2(ALERT_DIALOG_CONTENT_NAME);
2037
+ return /* @__PURE__ */ React23.createElement(AlertDialogPrimitive.Content, {
2038
+ ...props,
2039
+ className: tx("dialog.content", {
2040
+ inOverlayLayout,
2041
+ size
2042
+ }, classNames),
2043
+ // NOTE: Radix warning unless set to undefined.
2044
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
2045
+ "aria-describedby": void 0,
2046
+ ref: forwardedRef
2047
+ }, /* @__PURE__ */ React23.createElement(Column.Root, {
2048
+ classNames: "dx-expander",
2049
+ gutter: "sm"
2050
+ }, children));
2051
+ });
2052
+ AlertDialogContent.displayName = ALERT_DIALOG_CONTENT_NAME;
2053
+ var AlertDialogTitle = /* @__PURE__ */ forwardRef15(({ classNames, srOnly, ...props }, forwardedRef) => {
2054
+ const { tx } = useThemeContext();
2055
+ return /* @__PURE__ */ React23.createElement(AlertDialogPrimitive.Title, {
2056
+ ...props,
2057
+ className: tx("dialog.title", {
2058
+ srOnly
2059
+ }, classNames),
2060
+ ref: forwardedRef
2061
+ });
2062
+ });
2063
+ var AlertDialogDescription = /* @__PURE__ */ forwardRef15(({ classNames, srOnly, ...props }, forwardedRef) => {
2064
+ const { tx } = useThemeContext();
2065
+ return /* @__PURE__ */ React23.createElement(AlertDialogPrimitive.Description, {
2066
+ ...props,
2067
+ className: tx("dialog.description", {
2068
+ srOnly
2069
+ }, classNames),
2070
+ ref: forwardedRef
2071
+ });
2072
+ });
2073
+ var AlertDialog = {
2074
+ Root: AlertDialogRoot,
2075
+ Trigger: AlertDialogTrigger,
2076
+ Portal: AlertDialogPortal,
2077
+ Overlay: AlertDialogOverlay,
2078
+ Content: AlertDialogContent,
2079
+ // Shared with Dialog.
2080
+ Header: Dialog.Header,
2081
+ Body: Dialog.Body,
2082
+ Title: AlertDialogTitle,
2083
+ Description: AlertDialogDescription,
2084
+ ActionBar: Dialog.ActionBar,
2085
+ CloseIconButton: Dialog.CloseIconButton,
2086
+ // AlertDialog-specific dismissal.
2087
+ Cancel: AlertDialogCancel,
2088
+ Action: AlertDialogAction
2089
+ };
2090
+
2091
+ // src/components/ErrorFallback/index.ts
2092
+ import { ErrorBoundary } from "@dxos/react-error-boundary";
2093
+
2094
+ // src/components/ErrorFallback/ErrorFallback.tsx
2095
+ import React24 from "react";
2096
+ import { safeStringify } from "@dxos/util";
2097
+ var ErrorFallback = ({ children, error, title, data }) => {
2098
+ const isDev = process.env.NODE_ENV === "development";
2099
+ const message = error instanceof Error ? error.message : String(error);
2100
+ return /* @__PURE__ */ React24.createElement("div", {
2101
+ role: "alert",
2102
+ "data-testid": "error-boundary-fallback",
2103
+ className: "flex flex-col p-4 gap-4 overflow-auto"
2104
+ }, /* @__PURE__ */ React24.createElement("h1", {
2105
+ className: "text-lg text-info-text"
2106
+ }, title ?? "Runtime Error"), /* @__PURE__ */ React24.createElement("p", null, message), isDev && error instanceof Error && /* @__PURE__ */ React24.createElement(Section, {
2107
+ title: "Stack",
2108
+ onClick: () => {
2109
+ const text = error instanceof Error ? error.stack ?? error.message : String(error);
2110
+ void navigator.clipboard.writeText(text);
2111
+ }
2112
+ }, /* @__PURE__ */ React24.createElement(ErrorStack, {
2113
+ error
2114
+ })), data && /* @__PURE__ */ React24.createElement(Section, {
2115
+ title: "Data",
2116
+ onClick: () => {
2117
+ void navigator.clipboard.writeText(JSON.stringify(data, void 0, 2));
2118
+ }
2119
+ }, /* @__PURE__ */ React24.createElement("pre", {
2120
+ className: "overflow-x-auto text-xs"
2121
+ }, safeStringify(data, void 0, 2))), children);
2122
+ };
2123
+ var Section = ({ children, title, onClick }) => {
2124
+ return /* @__PURE__ */ React24.createElement("div", {
2125
+ className: "flex flex-col gap-1"
2126
+ }, onClick && /* @__PURE__ */ React24.createElement("button", {
2127
+ type: "button",
2128
+ onClick,
2129
+ className: "flex items-center gap-1 text-xs text-subdued hover:text-primary-500 transition-colors",
2130
+ title: `Copy ${title}`
2131
+ }, /* @__PURE__ */ React24.createElement("h2", {
2132
+ className: "text-xs uppercase text-subdued"
2133
+ }, title)), children);
2134
+ };
2135
+
2136
+ // src/components/ErrorFallback/ThrowError.tsx
2137
+ import { useEffect as useEffect3, useState as useState5 } from "react";
2138
+ var ThrowError = ({ delay = 1e3, ...props }) => {
2139
+ const [error, setError] = useState5();
2140
+ useEffect3(() => {
2141
+ if (delay < 0) {
2142
+ return;
2143
+ }
2144
+ const t = setTimeout(() => {
2145
+ setError(generator({
2146
+ delay,
2147
+ ...props
2148
+ }));
2149
+ }, delay);
2150
+ return () => clearTimeout(t);
2151
+ }, [
2152
+ delay,
2153
+ generator
2154
+ ]);
2155
+ if (error) {
2156
+ throw error;
2157
+ }
2158
+ return null;
2159
+ };
2160
+ var generator = ({ error, delay }) => {
2161
+ return error?.() ?? new Error(`Error generated after ${delay}ms`);
2162
+ };
2163
+
2164
+ // src/components/Focus/Focus.tsx
2165
+ import { useArrowNavigationGroup, useFocusableGroup, useMergedTabsterAttributes_unstable } from "@fluentui/react-tabster";
2166
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
2167
+ import { Primitive as Primitive14 } from "@radix-ui/react-primitive";
2168
+ import { Slot as Slot14 } from "@radix-ui/react-slot";
2169
+ import React25, { createContext as createContext7, useCallback as useCallback6, useContext as useContext5, useRef as useRef3, useState as useState6 } from "react";
2170
+ import { composableProps as composableProps9, slottable as slottable8 } from "@dxos/ui-theme";
2171
+ var FOCUS_STATE_ATTR = "focus-state";
2172
+ var FocusContext = /* @__PURE__ */ createContext7({});
2173
+ var useFocus = () => useContext5(FocusContext);
2174
+ var Group3 = slottable8(({ children, asChild, orientation = "vertical", border = false, ...props }, forwardedRef) => {
2175
+ const Comp = asChild ? Slot14 : Primitive14.div;
2176
+ const { tx } = useThemeContext();
2177
+ const rootRef = useRef3(null);
2178
+ const focusableGroupAttrs = useFocusableGroup({
2179
+ tabBehavior: "limited-trap-focus"
2180
+ });
2181
+ const arrowNavigationAttrs = useArrowNavigationGroup({
2182
+ axis: orientation,
2183
+ memorizeCurrent: true
2184
+ });
2185
+ const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
2186
+ const [state, setState] = useState6();
2187
+ const [groupHasFocus, setGroupHasFocus] = useState6(false);
2188
+ const handleFocusIn = useCallback6(() => setGroupHasFocus(true), []);
2189
+ const handleFocusOut = useCallback6((event) => {
2190
+ const related = event.relatedTarget;
2191
+ if (!related || !rootRef.current?.contains(related)) {
2192
+ setGroupHasFocus(false);
2193
+ }
2194
+ }, []);
2195
+ const { className, ...rest } = composableProps9(props);
2196
+ return /* @__PURE__ */ React25.createElement(FocusContext.Provider, {
2197
+ value: {
2198
+ setFocus: setState,
2199
+ groupHasFocus
2200
+ }
2201
+ }, /* @__PURE__ */ React25.createElement(Comp, {
2202
+ ...rest,
2203
+ tabIndex: 0,
2204
+ className: tx("focus.group", {
2205
+ border
2206
+ }, className),
2207
+ ...tabsterAttrs,
2208
+ ...state && {
2209
+ [`data-${FOCUS_STATE_ATTR}`]: state
2210
+ },
2211
+ onBlur: handleFocusOut,
2212
+ onFocus: handleFocusIn,
2213
+ ref: useComposedRefs(rootRef, forwardedRef)
2214
+ }, children));
2215
+ });
2216
+ var Item4 = slottable8(({ children, asChild, current, border = false, onCurrentChange, onClick, onFocus, onBlur, ...props }, forwardedRef) => {
2217
+ const Comp = asChild ? Slot14 : Primitive14.div;
2218
+ const { tx } = useThemeContext();
2219
+ const focusableGroupAttrs = useFocusableGroup({
2220
+ ignoreDefaultKeydown: {
2221
+ Enter: true
2222
+ }
2223
+ });
2224
+ const [focused, setFocused] = useState6(false);
2225
+ const handleClick = useCallback6((event) => {
2226
+ onCurrentChange?.();
2227
+ onClick?.(event);
2228
+ }, [
2229
+ onCurrentChange,
2230
+ onClick
2231
+ ]);
2232
+ const handleKeyDown = useCallback6((event) => {
2233
+ if (event.key === "Enter") {
2234
+ onCurrentChange?.();
2235
+ }
2236
+ }, [
2237
+ onCurrentChange
2238
+ ]);
2239
+ const handleFocus = useCallback6((event) => {
2240
+ setFocused(true);
2241
+ onFocus?.(event);
2242
+ }, [
2243
+ onFocus
2244
+ ]);
2245
+ const handleBlur = useCallback6((event) => {
2246
+ setFocused(false);
2247
+ onBlur?.(event);
2248
+ }, [
2249
+ onBlur
2250
+ ]);
2251
+ const isCurrent = current ?? focused;
2252
+ const { className, ...rest } = composableProps9(props);
2253
+ return /* @__PURE__ */ React25.createElement(Comp, {
2254
+ ...rest,
2255
+ tabIndex: 0,
2256
+ className: tx("focus.item", {
2257
+ border
2258
+ }, className),
2259
+ ...focusableGroupAttrs,
2260
+ "aria-current": isCurrent || void 0,
2261
+ onClick: handleClick,
2262
+ onKeyDown: handleKeyDown,
2263
+ onFocus: handleFocus,
2264
+ onBlur: handleBlur,
2265
+ ref: forwardedRef
2266
+ }, children);
2267
+ });
2268
+ var Focus = {
2269
+ Group: Group3,
2270
+ Item: Item4
2271
+ };
2272
+
2273
+ // src/components/Input/Input.tsx
2274
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
2275
+ import { useControllableState as useControllableState2 } from "@radix-ui/react-use-controllable-state";
2276
+ import React26, { forwardRef as forwardRef16 } from "react";
2277
+ import { DescriptionAndValidation as DescriptionAndValidationPrimitive, Description as DescriptionPrimitive, INPUT_NAME, InputRoot, Label as LabelPrimitive, PinInput as PinInputPrimitive, TextArea as TextAreaPrimitive, TextInput as TextInputPrimitive, Validation as ValidationPrimitive, useInputContext } from "@dxos/react-input";
2278
+ import { mx as mx8 } from "@dxos/ui-theme";
2279
+ var Label3 = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2280
+ const { tx } = useThemeContext();
2281
+ return /* @__PURE__ */ React26.createElement(LabelPrimitive, {
2282
+ ...props,
2283
+ className: tx("input.label", {
2284
+ srOnly
2285
+ }, classNames),
2286
+ ref: forwardedRef
2287
+ }, children);
2288
+ });
2289
+ var Description3 = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2290
+ const { tx } = useThemeContext();
2291
+ return /* @__PURE__ */ React26.createElement(DescriptionPrimitive, {
2292
+ ...props,
2293
+ className: tx("input.description", {
2294
+ srOnly
2295
+ }, classNames),
2296
+ ref: forwardedRef
2297
+ }, children);
2298
+ });
2299
+ var Validation = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, children, srOnly, ...props }, forwardedRef) => {
2300
+ const { tx } = useThemeContext();
2301
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2302
+ return /* @__PURE__ */ React26.createElement(ValidationPrimitive, {
2303
+ ...props,
2304
+ className: tx("input.validation", {
2305
+ srOnly,
2306
+ validationValence
2307
+ }, classNames),
2308
+ ref: forwardedRef
2309
+ }, children);
2310
+ });
2311
+ var DescriptionAndValidation = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2312
+ const { tx } = useThemeContext();
2313
+ return /* @__PURE__ */ React26.createElement(DescriptionAndValidationPrimitive, {
2314
+ ...props,
2315
+ className: tx("input.descriptionAndValidation", {
2316
+ srOnly
2317
+ }, classNames),
2318
+ ref: forwardedRef
2319
+ }, children);
2320
+ });
2321
+ var PinInput = /* @__PURE__ */ forwardRef16(({ classNames, density: propsDensity, elevation: propsElevation, ...props }, forwardedRef) => {
2322
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2323
+ const { tx } = useThemeContext();
2324
+ const density = useDensityContext(propsDensity);
2325
+ const elevation = useElevationContext(propsElevation);
2326
+ return /* @__PURE__ */ React26.createElement(PinInputPrimitive, {
2327
+ ...props,
2328
+ ...props.autoFocus && !hasIosKeyboard2 && {
2329
+ autoFocus: true
2330
+ },
2331
+ className: tx("input.inputWithSegments", {
2332
+ disabled: props.disabled
2333
+ }, classNames) || "",
2334
+ segmentClassName: tx("input.segment", {
2335
+ disabled: props.disabled,
2336
+ density,
2337
+ elevation
2338
+ }) || "",
2339
+ ref: forwardedRef
2340
+ });
2341
+ });
2342
+ var TextInput = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, density: densityProp, elevation: elevationProp, variant, noAutoFill, ...props }, forwardedRef) => {
2343
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2344
+ const { tx } = useThemeContext();
2345
+ const density = useDensityContext(densityProp);
2346
+ const elevation = useElevationContext(elevationProp);
2347
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2348
+ return /* @__PURE__ */ React26.createElement(TextInputPrimitive, {
2349
+ ...props,
2350
+ "data-1p-ignore": noAutoFill,
2351
+ className: tx("input.input", {
2352
+ variant,
2353
+ disabled: props.disabled,
2354
+ density,
2355
+ elevation,
2356
+ validationValence
2357
+ }, classNames),
2358
+ ...props.autoFocus && !hasIosKeyboard2 && {
2359
+ autoFocus: true
2360
+ },
2361
+ ref: forwardedRef
2362
+ });
2363
+ });
2364
+ var TextArea = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, density: propsDensity, elevation: propsElevation, variant, ...props }, forwardedRef) => {
2365
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2366
+ const { tx } = useThemeContext();
2367
+ const density = useDensityContext(propsDensity);
2368
+ const elevation = useElevationContext(propsElevation);
2369
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2370
+ return /* @__PURE__ */ React26.createElement(TextAreaPrimitive, {
2371
+ ...props,
2372
+ className: tx("input.textArea", {
2373
+ variant,
2374
+ disabled: props.disabled,
2375
+ density,
2376
+ elevation,
2377
+ validationValence
2378
+ }, classNames),
2379
+ ...props.autoFocus && !hasIosKeyboard2 && {
2380
+ autoFocus: true
2381
+ },
2382
+ ref: forwardedRef
2383
+ });
2384
+ });
2385
+ var Checkbox = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, checked: propsChecked, defaultChecked: propsDefaultChecked, onCheckedChange: propsOnCheckedChange, size, ...props }, forwardedRef) => {
2386
+ const [checked, onCheckedChange] = useControllableState2({
2387
+ prop: propsChecked,
2388
+ defaultProp: propsDefaultChecked,
2389
+ onChange: propsOnCheckedChange
2390
+ });
2391
+ const { id, validationValence, descriptionId, errorMessageId } = useInputContext(INPUT_NAME, __inputScope);
2392
+ const { tx } = useThemeContext();
2393
+ return /* @__PURE__ */ React26.createElement(CheckboxPrimitive.Root, {
2394
+ ...props,
2395
+ checked,
2396
+ onCheckedChange,
2397
+ id,
2398
+ "aria-describedby": descriptionId,
2399
+ ...validationValence === "error" && {
2400
+ "aria-invalid": "true",
2401
+ "aria-errormessage": errorMessageId
2402
+ },
2403
+ className: tx("input.checkbox", {
2404
+ size
2405
+ }, "shrink-0", classNames),
2406
+ ref: forwardedRef
2407
+ }, /* @__PURE__ */ React26.createElement(Icon, {
2408
+ icon: checked === "indeterminate" ? "ph--minus--regular" : "ph--check--regular",
2409
+ classNames: tx("input.checkboxIndicator", {
2410
+ size,
2411
+ checked
2412
+ })
2413
+ }));
2414
+ });
2415
+ var Switch = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, checked: propsChecked, defaultChecked: propsDefaultChecked, onCheckedChange: propsOnCheckedChange, ...props }, forwardedRef) => {
2416
+ const [checked, onCheckedChange] = useControllableState2({
2417
+ prop: propsChecked,
2418
+ defaultProp: propsDefaultChecked ?? false,
2419
+ onChange: propsOnCheckedChange
2420
+ });
2421
+ const { id, validationValence, descriptionId, errorMessageId } = useInputContext(INPUT_NAME, __inputScope);
2422
+ return /* @__PURE__ */ React26.createElement("input", {
2423
+ type: "checkbox",
2424
+ className: mx8("dx-checkbox--switch dx-focus-ring", classNames),
2425
+ checked,
2426
+ onChange: (event) => {
2427
+ onCheckedChange(event.target.checked);
2428
+ },
2429
+ id,
2430
+ "aria-describedby": descriptionId,
2431
+ ...props,
2432
+ ...validationValence === "error" && {
2433
+ "aria-invalid": "true",
2434
+ "aria-errormessage": errorMessageId
2435
+ },
2436
+ ref: forwardedRef
2437
+ });
2438
+ });
2439
+ var Input = {
2440
+ Root: InputRoot,
2441
+ PinInput,
2442
+ TextInput,
2443
+ TextArea,
2444
+ Checkbox,
2445
+ Switch,
2446
+ Label: Label3,
2447
+ Description: Description3,
2448
+ Validation,
2449
+ DescriptionAndValidation
2450
+ };
2451
+
2452
+ // src/components/List/List.tsx
2453
+ import { Primitive as Primitive15 } from "@radix-ui/react-primitive";
2454
+ import { Slot as Slot15 } from "@radix-ui/react-slot";
2455
+ import React28, { forwardRef as forwardRef17 } from "react";
2456
+ import { LIST_ITEM_NAME, LIST_NAME, ListItemCollapsibleContent, List as ListPrimitive, ListItem as ListPrimitiveItem, ListItemHeading as ListPrimitiveItemHeading, ListItemOpenTrigger as ListPrimitiveItemOpenTrigger, useListContext, useListItemContext } from "@dxos/react-list";
2457
+ import { composable as composable4, composableProps as composableProps10 } from "@dxos/ui-theme";
2458
+
2459
+ // src/components/List/ListDropIndicator.tsx
2460
+ import React27 from "react";
2461
+ var edgeToOrientationMap = {
2462
+ top: "horizontal",
2463
+ bottom: "horizontal",
2464
+ left: "vertical",
2465
+ right: "vertical"
2466
+ };
2467
+ var orientationStyles = {
2468
+ horizontal: "h-(--line-thickness) left-[calc(var(--line-inset)+var(--terminal-radius))] right-(--line-inset) before:left-(--terminal-inset)",
2469
+ vertical: "w-(--line-thickness) top-[calc(var(--line-inset)+var(--terminal-radius))] bottom-(--line-inset) before:top-(--terminal-inset)"
2470
+ };
2471
+ var edgeStyles = {
2472
+ top: "top-(--line-offset) before:top-(--offset-terminal)",
2473
+ right: "right-(--line-offset) before:right-(--offset-terminal)",
2474
+ bottom: "bottom-(--line-offset) before:bottom-(--offset-terminal)",
2475
+ left: "left-(--line-offset) before:left-(--offset-terminal)"
2476
+ };
2477
+ var strokeSize = 2;
2478
+ var terminalSize = 8;
2479
+ var offsetToAlignTerminalWithLine = (strokeSize - terminalSize) / 2;
2480
+ var ListDropIndicator = ({ edge, gap = 0, lineInset = 0, terminalInset = lineInset - terminalSize }) => {
2481
+ const orientation = edgeToOrientationMap[edge];
2482
+ return /* @__PURE__ */ React27.createElement("div", {
2483
+ role: "none",
2484
+ style: {
2485
+ "--line-thickness": `${strokeSize}px`,
2486
+ "--line-offset": `calc(-0.5 * (${gap}px + ${strokeSize}px))`,
2487
+ "--line-inset": `${lineInset}px`,
2488
+ "--terminal-size": `${terminalSize}px`,
2489
+ "--terminal-radius": `${terminalSize / 2}px`,
2490
+ "--terminal-inset": `${terminalInset}px`,
2491
+ "--offset-terminal": `${offsetToAlignTerminalWithLine}px`
2492
+ },
2493
+ className: `absolute z-10 pointer-events-none bg-accent-surface before:content-[''] before:w-(--terminal-size) before:h-(--terminal-size) box-border before:absolute before:border-[length:--line-thickness] before:border-solid before:border-accent-surface before:rounded-full ${orientationStyles[orientation]} ${edgeStyles[edge]}`
2494
+ });
2495
+ };
2496
+
2497
+ // src/components/List/List.tsx
2498
+ var List = composable4(({ children, ...props }, forwardedRef) => {
2499
+ const { tx } = useThemeContext();
2500
+ const density = useDensityContext(props.density);
2501
+ const { className, ...rest } = composableProps10(props);
2502
+ return /* @__PURE__ */ React28.createElement(DensityProvider, {
2503
+ density
2504
+ }, /* @__PURE__ */ React28.createElement(ListPrimitive, {
2505
+ ...rest,
2506
+ className: tx("list.root", {}, className),
2507
+ ref: forwardedRef
2508
+ }, children));
2509
+ });
2510
+ var ListItemEndcap = /* @__PURE__ */ forwardRef17(({ children, classNames, asChild, ...props }, forwardedRef) => {
2511
+ const Comp = asChild ? Slot15 : Primitive15.div;
2512
+ const density = useDensityContext();
2513
+ const { tx } = useThemeContext();
2514
+ return /* @__PURE__ */ React28.createElement(Comp, {
2515
+ ...!asChild && {
2516
+ role: "none"
2517
+ },
2518
+ ...props,
2519
+ className: tx("list.item.endcap", {
2520
+ density
2521
+ }, classNames),
2522
+ ref: forwardedRef
2523
+ }, children);
2524
+ });
2525
+ var MockListItemOpenTrigger = ({ classNames, ...props }) => {
2526
+ const density = useDensityContext();
2527
+ const { tx } = useThemeContext();
2528
+ return /* @__PURE__ */ React28.createElement("div", {
2529
+ role: "none",
2530
+ ...props,
2531
+ className: tx("list.item.openTrigger", {
2532
+ density
2533
+ }, classNames)
2534
+ });
2535
+ };
2536
+ var ListItemHeading = /* @__PURE__ */ forwardRef17(({ children, classNames, ...props }, forwardedRef) => {
2537
+ const { tx } = useThemeContext();
2538
+ const density = useDensityContext();
2539
+ return /* @__PURE__ */ React28.createElement(ListPrimitiveItemHeading, {
2540
+ ...props,
2541
+ className: tx("list.item.heading", {
2542
+ density
2543
+ }, classNames),
2544
+ ref: forwardedRef
2545
+ }, /* @__PURE__ */ React28.createElement("span", null, children));
2546
+ });
2547
+ var ListItemOpenTrigger = /* @__PURE__ */ forwardRef17(({ __listItemScope, classNames, children, ...props }, forwardedRef) => {
2548
+ const { tx } = useThemeContext();
2549
+ const density = useDensityContext();
2550
+ const { open } = useListItemContext(LIST_ITEM_NAME, __listItemScope);
2551
+ return /* @__PURE__ */ React28.createElement(ListPrimitiveItemOpenTrigger, {
2552
+ ...props,
2553
+ className: tx("list.item.openTrigger", {
2554
+ density
2555
+ }, classNames),
2556
+ ref: forwardedRef
2557
+ }, children || /* @__PURE__ */ React28.createElement(Icon, {
2558
+ size: 3,
2559
+ icon: open ? "ph--caret-down--bold" : "ph--caret-right--bold",
2560
+ classNames: tx("list.item.openTriggerIcon", {})
2561
+ }));
2562
+ });
2563
+ var ListItemRoot = /* @__PURE__ */ forwardRef17(({ classNames, children, ...props }, forwardedRef) => {
2564
+ const { tx } = useThemeContext();
2565
+ const density = useDensityContext();
2566
+ return /* @__PURE__ */ React28.createElement(ListPrimitiveItem, {
2567
+ ...props,
2568
+ className: tx("list.item.root", {
2569
+ density,
2570
+ collapsible: props.collapsible
2571
+ }, classNames),
2572
+ ref: forwardedRef
2573
+ }, children);
2574
+ });
2575
+ var ListItem = {
2576
+ Root: ListItemRoot,
2577
+ Endcap: ListItemEndcap,
2578
+ Heading: ListItemHeading,
2579
+ OpenTrigger: ListItemOpenTrigger,
2580
+ CollapsibleContent: ListItemCollapsibleContent,
2581
+ MockOpenTrigger: MockListItemOpenTrigger,
2582
+ DropIndicator: ListDropIndicator
2583
+ };
2584
+
2585
+ // src/components/List/Tree.tsx
2586
+ import React30, { forwardRef as forwardRef18 } from "react";
2587
+
2588
+ // src/components/List/TreeDropIndicator.tsx
2589
+ import React29 from "react";
2590
+ var edgeToOrientationMap2 = {
2591
+ "reorder-above": "sibling",
2592
+ "reorder-below": "sibling",
2593
+ "make-child": "child",
2594
+ reparent: "child"
2595
+ };
2596
+ var orientationStyles2 = {
2597
+ // TODO(wittjosiah): Stop using left/right here.
2598
+ sibling: "h-(--line-thickness) left-(--horizontal-indent) right-0 bg-accent-surface before:left-(--negative-terminal-size)",
2599
+ child: "inset-0 border-[length:var(--line-thickness)] before:invisible"
2600
+ };
2601
+ var instructionStyles = {
2602
+ "reorder-above": "top-(--line-offset) before:top-(--offset-terminal)",
2603
+ "reorder-below": "bottom-(--line-offset) before:bottom-(--offset-terminal)",
2604
+ "make-child": "border-accent-surface",
2605
+ // TODO(wittjosiah): This is not occurring in the current implementation.
2606
+ reparent: ""
2607
+ };
2608
+ var strokeSize2 = 2;
2609
+ var terminalSize2 = 8;
2610
+ var offsetToAlignTerminalWithLine2 = (strokeSize2 - terminalSize2) / 2;
2611
+ var TreeDropIndicator = ({ instruction, gap = 0 }) => {
2612
+ const lineOffset = `calc(-0.5 * (${gap}px + ${strokeSize2}px))`;
2613
+ const isBlocked = instruction.type === "instruction-blocked";
2614
+ const desiredInstruction = isBlocked ? instruction.desired : instruction;
2615
+ const orientation = edgeToOrientationMap2[desiredInstruction.type];
2616
+ if (isBlocked) {
2617
+ return null;
2618
+ }
2619
+ return /* @__PURE__ */ React29.createElement("div", {
2620
+ style: {
2621
+ "--line-thickness": `${strokeSize2}px`,
2622
+ "--line-offset": `${lineOffset}`,
2623
+ "--terminal-size": `${terminalSize2}px`,
2624
+ "--terminal-radius": `${terminalSize2 / 2}px`,
2625
+ "--negative-terminal-size": `-${terminalSize2}px`,
2626
+ "--offset-terminal": `${offsetToAlignTerminalWithLine2}px`,
2627
+ "--horizontal-indent": `${desiredInstruction.currentLevel * desiredInstruction.indentPerLevel + 4}px`
2628
+ },
2629
+ className: `absolute z-10 pointer-events-none before:w-(--terminal-size) before:h-(--terminal-size) box-border before:absolute before:border-[length:--line-thickness] before:border-solid before:border-accent-surface before:rounded-full ${orientationStyles2[orientation]} ${instructionStyles[desiredInstruction.type]}`
2630
+ });
2631
+ };
2632
+
2633
+ // src/components/List/Tree.tsx
2634
+ var TreeRoot = /* @__PURE__ */ forwardRef18((props, forwardedRef) => {
2635
+ return /* @__PURE__ */ React30.createElement(List, {
2636
+ ...props,
2637
+ ref: forwardedRef
2638
+ });
2639
+ });
2640
+ var TreeBranch = /* @__PURE__ */ forwardRef18(({ __listScope, ...props }, forwardedRef) => {
2641
+ const { headingId } = useListItemContext(LIST_ITEM_NAME, __listScope);
2642
+ return /* @__PURE__ */ React30.createElement(List, {
2643
+ ...props,
2644
+ "aria-labelledby": headingId,
2645
+ ref: forwardedRef
2646
+ });
2647
+ });
2648
+ var TreeItemRoot = /* @__PURE__ */ forwardRef18((props, forwardedRef) => {
2649
+ return /* @__PURE__ */ React30.createElement(ListItem.Root, {
2650
+ role: "treeitem",
2651
+ ...props,
2652
+ ref: forwardedRef
2653
+ });
2654
+ });
2655
+ var TreeItemHeading = ListItem.Heading;
2656
+ var TreeItemOpenTrigger = ListItem.OpenTrigger;
2657
+ var MockTreeItemOpenTrigger = ListItem.MockOpenTrigger;
2658
+ var TreeItemBody = ListItem.CollapsibleContent;
2659
+ var Tree = {
2660
+ Root: TreeRoot,
2661
+ Branch: TreeBranch
2662
+ };
2663
+ var TreeItem = {
2664
+ Root: TreeItemRoot,
2665
+ Heading: TreeItemHeading,
2666
+ Body: TreeItemBody,
2667
+ OpenTrigger: TreeItemOpenTrigger,
2668
+ MockOpenTrigger: MockTreeItemOpenTrigger,
2669
+ DropIndicator: TreeDropIndicator
2670
+ };
2671
+
2672
+ // src/components/List/Treegrid.tsx
2673
+ import { useFocusFinders } from "@fluentui/react-tabster";
2674
+ import { createContextScope as createContextScope2 } from "@radix-ui/react-context";
2675
+ import { Primitive as Primitive16 } from "@radix-ui/react-primitive";
2676
+ import { Slot as Slot16 } from "@radix-ui/react-slot";
2677
+ import { useControllableState as useControllableState3 } from "@radix-ui/react-use-controllable-state";
2678
+ import React31, { forwardRef as forwardRef19, useCallback as useCallback7 } from "react";
2679
+ import { composable as composable5, composableProps as composableProps11 } from "@dxos/ui-theme";
2680
+ var TREEGRID_ROW_NAME = "TreegridRow";
2681
+ var [createTreegridRowContext, createTreegridRowScope] = createContextScope2(TREEGRID_ROW_NAME, []);
2682
+ var [TreegridRowProvider, useTreegridRowContext] = createTreegridRowContext(TREEGRID_ROW_NAME);
2683
+ var TREEGRID_PATH_SEPARATOR = "~";
2684
+ var TREEGRID_PARENT_OF_SEPARATOR = " ";
2685
+ var TreegridRoot = composable5(({ asChild, classNames, children, style, gridTemplateColumns, onKeyDown: onKeyDownProp, ...props }, forwardedRef) => {
2686
+ const { tx } = useThemeContext();
2687
+ const { className, role: _role, ...rest } = composableProps11(props, {
2688
+ classNames
2689
+ });
2690
+ const Comp = asChild ? Slot16 : Primitive16.div;
2691
+ const { findFirstFocusable } = useFocusFinders();
2692
+ const handleKeyDown = useCallback7((event) => {
2693
+ switch (event.key) {
2694
+ case "ArrowDown":
2695
+ case "ArrowUp": {
2696
+ const direction = event.key === "ArrowDown" ? "down" : "up";
2697
+ const target = event.target;
2698
+ const ancestorWithArrowKeys = target.closest(`[data-arrow-keys*="${direction}"], [data-arrow-keys="all"]`);
2699
+ if (!ancestorWithArrowKeys) {
2700
+ const currentRow = target.closest('[role="row"]');
2701
+ if (currentRow) {
2702
+ const treegrid = currentRow.closest('[role="treegrid"]');
2703
+ if (treegrid) {
2704
+ const rows = Array.from(treegrid.querySelectorAll('[role="row"]'));
2705
+ const currentIndex = rows.indexOf(currentRow);
2706
+ const nextIndex = direction === "down" ? currentIndex + 1 : currentIndex - 1;
2707
+ const targetRow = rows[nextIndex];
2708
+ if (targetRow) {
2709
+ const firstFocusable = findFirstFocusable(targetRow);
2710
+ if (firstFocusable) {
2711
+ event.preventDefault();
2712
+ firstFocusable.focus();
2713
+ }
2714
+ }
2715
+ }
2716
+ }
2717
+ }
2718
+ break;
2719
+ }
2720
+ }
2721
+ onKeyDownProp?.(event);
2722
+ }, [
2723
+ findFirstFocusable,
2724
+ onKeyDownProp
2725
+ ]);
2726
+ return /* @__PURE__ */ React31.createElement(Comp, {
2727
+ role: "treegrid",
2728
+ ...rest,
2729
+ className: tx("treegrid.root", {}, className),
2730
+ style: {
2731
+ ...style,
2732
+ gridTemplateColumns
2733
+ },
2734
+ onKeyDown: handleKeyDown,
2735
+ ref: forwardedRef
2736
+ }, children);
2737
+ });
2738
+ var TreegridRow = /* @__PURE__ */ forwardRef19(({ __treegridRowScope, asChild, classNames, children, id, parentOf, open: propsOpen, defaultOpen, onOpenChange: propsOnOpenChange, ...props }, forwardedRef) => {
2739
+ const { tx } = useThemeContext();
2740
+ const Comp = asChild ? Slot16 : Primitive16.div;
2741
+ const pathParts = id.split(TREEGRID_PATH_SEPARATOR);
2742
+ const level = pathParts.length - 1;
2743
+ const [open, onOpenChange] = useControllableState3({
2744
+ prop: propsOpen,
2745
+ onChange: propsOnOpenChange,
2746
+ defaultProp: defaultOpen
2747
+ });
2748
+ return /* @__PURE__ */ React31.createElement(TreegridRowProvider, {
2749
+ open,
2750
+ onOpenChange,
2751
+ scope: __treegridRowScope
2752
+ }, /* @__PURE__ */ React31.createElement(Comp, {
2753
+ role: "row",
2754
+ "aria-level": level,
2755
+ className: tx("treegrid.row", {
2756
+ level
2757
+ }, classNames),
2758
+ ...parentOf && {
2759
+ "aria-expanded": open,
2760
+ "aria-owns": parentOf
2761
+ },
2762
+ ...props,
2763
+ id,
2764
+ ref: forwardedRef
2765
+ }, children));
2766
+ });
2767
+ var TreegridCell = /* @__PURE__ */ forwardRef19(({ classNames, children, indent, ...props }, forwardedRef) => {
2768
+ const { tx } = useThemeContext();
2769
+ return /* @__PURE__ */ React31.createElement("div", {
2770
+ role: "gridcell",
2771
+ className: tx("treegrid.cell", {
2772
+ indent
2773
+ }, classNames),
2774
+ ...props,
2775
+ ref: forwardedRef
2776
+ }, children);
2777
+ });
2778
+ var Treegrid = {
2779
+ Root: TreegridRoot,
2780
+ Row: TreegridRow,
2781
+ Cell: TreegridCell
2782
+ };
2783
+
2784
+ // src/components/Main/Main.tsx
2785
+ import { useFocusableGroup as useFocusableGroup2 } from "@fluentui/react-tabster";
2786
+ import { createContext as createContext8 } from "@radix-ui/react-context";
2787
+ import { DialogContent as DialogContent2, Root as DialogRoot2, DialogTitle as DialogTitle2 } from "@radix-ui/react-dialog";
2788
+ import { Primitive as Primitive17 } from "@radix-ui/react-primitive";
2789
+ import { Slot as Slot17 } from "@radix-ui/react-slot";
2790
+ import { useControllableState as useControllableState4 } from "@radix-ui/react-use-controllable-state";
2791
+ import React32, { forwardRef as forwardRef20, useCallback as useCallback9, useEffect as useEffect5, useRef as useRef4, useState as useState8 } from "react";
2792
+ import { addEventListener } from "@dxos/async";
2793
+ import { log } from "@dxos/log";
2794
+ import { useForwardedRef, useMediaQuery } from "@dxos/react-hooks";
2795
+ import { osTranslations as osTranslations3 } from "@dxos/ui-theme";
2796
+
2797
+ // src/components/Main/useSwipeToDismiss.ts
2798
+ import { useCallback as useCallback8, useEffect as useEffect4, useState as useState7 } from "react";
2799
+ var useSwipeToDismiss = (ref, {
2800
+ onDismiss,
2801
+ dismissThreshold = 64,
2802
+ debounceThreshold = 8,
2803
+ offset = 0
2804
+ /* side = 'inline-start' */
2805
+ }) => {
2806
+ const $root = ref.current;
2807
+ const [motionState, setMotionState] = useState7(0);
2808
+ const [gestureStartX, setGestureStartX] = useState7(0);
2809
+ const setIdle = useCallback8(() => {
2810
+ setMotionState(0);
2811
+ $root?.style.removeProperty("inset-inline-start");
2812
+ $root?.style.setProperty("transition-duration", "200ms");
2813
+ }, [
2814
+ $root
2815
+ ]);
2816
+ const setFollowing = useCallback8(() => {
2817
+ setMotionState(2);
2818
+ $root?.style.setProperty("transition-duration", "0ms");
2819
+ }, [
2820
+ $root
2821
+ ]);
2822
+ const handlePointerDown = useCallback8(({ screenX }) => {
2823
+ if (motionState === 0) {
2824
+ setMotionState(1);
2825
+ setGestureStartX(screenX);
2826
+ }
2827
+ }, [
2828
+ motionState
2829
+ ]);
2830
+ const handlePointerMove = useCallback8(({ screenX }) => {
2831
+ if ($root) {
2832
+ const delta = Math.min(screenX - gestureStartX, 0);
2833
+ switch (motionState) {
2834
+ case 2:
2835
+ if (Math.abs(delta) > dismissThreshold) {
2836
+ setIdle();
2837
+ onDismiss?.();
2838
+ } else {
2839
+ $root.style.setProperty("inset-inline-start", `${offset + delta}px`);
2840
+ }
2841
+ break;
2842
+ case 1:
2843
+ if (Math.abs(delta) > debounceThreshold) {
2844
+ setFollowing();
2845
+ }
2846
+ break;
2847
+ }
2848
+ }
2849
+ }, [
2850
+ $root,
2851
+ motionState,
2852
+ gestureStartX
2853
+ ]);
2854
+ const handlePointerUp = useCallback8(() => {
2855
+ setIdle();
2856
+ }, [
2857
+ setIdle
2858
+ ]);
2859
+ useEffect4(() => {
2860
+ $root?.addEventListener("pointerdown", handlePointerDown);
2861
+ return () => {
2862
+ $root?.removeEventListener("pointerdown", handlePointerDown);
2863
+ };
2864
+ }, [
2865
+ $root,
2866
+ handlePointerDown
2867
+ ]);
2868
+ useEffect4(() => {
2869
+ $root && document.documentElement.addEventListener("pointermove", handlePointerMove);
2870
+ return () => {
2871
+ document.documentElement.removeEventListener("pointermove", handlePointerMove);
2872
+ };
2873
+ }, [
2874
+ $root,
2875
+ handlePointerMove
2876
+ ]);
2877
+ useEffect4(() => {
2878
+ $root && document.documentElement.addEventListener("pointerup", handlePointerUp);
2879
+ return () => {
2880
+ document.documentElement.removeEventListener("pointerup", handlePointerUp);
2881
+ };
2882
+ }, [
2883
+ $root,
2884
+ handlePointerUp
2885
+ ]);
2886
+ };
2887
+
2888
+ // src/components/Main/Main.tsx
2889
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui/src/components/Main/Main.tsx";
2890
+ var MAIN_NAME = "Main";
2891
+ var MAIN_ROOT_NAME = "MainRoot";
2892
+ var MAIN_OVERLAY_NAME = "MainOverlay";
2893
+ var NAVIGATION_SIDEBAR_NAME = "NavigationSidebar";
2894
+ var COMPLEMENTARY_SIDEBAR_NAME = "ComplementarySidebar";
2895
+ var handleOpenAutoFocus = (event) => {
2896
+ !document.body.hasAttribute("data-w-keyboard") && event.preventDefault();
2897
+ };
2898
+ var landmarkAttr = "data-main-landmark";
2899
+ var useLandmarkMover = (propsOnKeyDown, landmark) => {
2900
+ const handleKeyDown = useCallback9((event) => {
2901
+ const target = event.target;
2902
+ if (event.target === event.currentTarget && event.key === "Tab" && target.hasAttribute(landmarkAttr)) {
2903
+ event.preventDefault();
2904
+ const landmarks = Array.from(document.querySelectorAll(`[${landmarkAttr}]:not([inert])`)).map((el) => el.hasAttribute(landmarkAttr) ? parseInt(el.getAttribute(landmarkAttr)) : NaN).sort();
2905
+ const l = landmarks.length;
2906
+ const cursor = landmarks.indexOf(parseInt(target.getAttribute(landmarkAttr)));
2907
+ const nextLandmark = landmarks[(cursor + l + (event.getModifierState("Shift") ? -1 : 1)) % l];
2908
+ document.querySelector(`[${landmarkAttr}="${nextLandmark}"]`)?.focus();
2909
+ }
2910
+ propsOnKeyDown?.(event);
2911
+ }, [
2912
+ propsOnKeyDown
2913
+ ]);
2914
+ const focusableGroupAttrs = useFocusableGroup2({
2915
+ tabBehavior: "limited",
2916
+ ignoreDefaultKeydown: {
2917
+ Tab: true
2918
+ }
2919
+ });
2920
+ return {
2921
+ [landmarkAttr]: landmark,
2922
+ tabIndex: 0,
2923
+ onKeyDown: handleKeyDown,
2924
+ ...focusableGroupAttrs
2925
+ };
2926
+ };
2927
+ var [MainProvider, useMainContext] = createContext8(MAIN_NAME, {
2928
+ resizing: false,
2929
+ navigationSidebarState: "closed",
2930
+ setNavigationSidebarState: (_nextState) => {
2931
+ log.warn("Not initialized", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 67, S: void 0 });
2932
+ },
2933
+ complementarySidebarState: "closed",
2934
+ setComplementarySidebarState: (_nextState) => {
2935
+ log.warn("Not initialized", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 71, S: void 0 });
2936
+ }
2937
+ });
2938
+ var useSidebars = (consumerName) => {
2939
+ const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } = useMainContext(consumerName);
2940
+ return {
2941
+ navigationSidebarState,
2942
+ setNavigationSidebarState,
2943
+ toggleNavigationSidebar: useCallback9(() => setNavigationSidebarState(navigationSidebarState === "expanded" ? "closed" : "expanded"), [
2944
+ navigationSidebarState,
2945
+ setNavigationSidebarState
2946
+ ]),
2947
+ openNavigationSidebar: useCallback9(() => setNavigationSidebarState("expanded"), []),
2948
+ collapseNavigationSidebar: useCallback9(() => setNavigationSidebarState("collapsed"), []),
2949
+ closeNavigationSidebar: useCallback9(() => setNavigationSidebarState("closed"), []),
2950
+ complementarySidebarState,
2951
+ setComplementarySidebarState,
2952
+ toggleComplementarySidebar: useCallback9(() => setComplementarySidebarState(complementarySidebarState === "expanded" ? "closed" : "expanded"), [
2953
+ complementarySidebarState,
2954
+ setComplementarySidebarState
2955
+ ]),
2956
+ openComplementarySidebar: useCallback9(() => setComplementarySidebarState("expanded"), []),
2957
+ collapseComplementarySidebar: useCallback9(() => setComplementarySidebarState("collapsed"), []),
2958
+ closeComplementarySidebar: useCallback9(() => setComplementarySidebarState("closed"), [])
2959
+ };
2960
+ };
2961
+ var MainRoot = ({ navigationSidebarState: propsNavigationSidebarState, defaultNavigationSidebarState = "closed", onNavigationSidebarStateChange, complementarySidebarState: propsComplementarySidebarState, defaultComplementarySidebarState = "closed", onComplementarySidebarStateChange, children, ...props }) => {
2962
+ const [isLg] = useMediaQuery("lg");
2963
+ const [navigationSidebarState = isLg ? "expanded" : "collapsed", setNavigationSidebarState] = useControllableState4({
2964
+ prop: propsNavigationSidebarState,
2965
+ defaultProp: defaultNavigationSidebarState,
2966
+ onChange: onNavigationSidebarStateChange
2967
+ });
2968
+ const [complementarySidebarState = isLg ? "expanded" : "collapsed", setComplementarySidebarState] = useControllableState4({
2969
+ prop: propsComplementarySidebarState,
2970
+ defaultProp: defaultComplementarySidebarState,
2971
+ onChange: onComplementarySidebarStateChange
2972
+ });
2973
+ const [resizing, setResizing] = useState8(false);
2974
+ const resizeInterval = useRef4(null);
2975
+ useEffect5(() => addEventListener(window, "resize", () => {
2976
+ setResizing(true);
2977
+ if (resizeInterval.current) {
2978
+ clearTimeout(resizeInterval.current);
2979
+ }
2980
+ resizeInterval.current = setTimeout(() => {
2981
+ setResizing(false);
2982
+ resizeInterval.current = null;
2983
+ }, 3e3);
2984
+ }), []);
2985
+ return /* @__PURE__ */ React32.createElement(MainProvider, {
2986
+ ...props,
2987
+ navigationSidebarState,
2988
+ setNavigationSidebarState,
2989
+ complementarySidebarState,
2990
+ setComplementarySidebarState,
2991
+ resizing
2992
+ }, children);
2993
+ };
2994
+ MainRoot.displayName = MAIN_ROOT_NAME;
2995
+ var MainOverlay = /* @__PURE__ */ forwardRef20(({ classNames, ...props }, forwardedRef) => {
2996
+ const [isLg] = useMediaQuery("lg");
2997
+ const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } = useMainContext(MAIN_OVERLAY_NAME);
2998
+ const { tx } = useThemeContext();
2999
+ return /* @__PURE__ */ React32.createElement("div", {
3000
+ ...props,
3001
+ onClick: () => {
3002
+ setNavigationSidebarState("collapsed");
3003
+ setComplementarySidebarState("collapsed");
3004
+ },
3005
+ className: tx("main.overlay", {
3006
+ isLg,
3007
+ inlineStartSidebarOpen: navigationSidebarState,
3008
+ inlineEndSidebarOpen: complementarySidebarState
3009
+ }, classNames),
3010
+ "data-state": navigationSidebarState === "expanded" || complementarySidebarState === "expanded" ? "open" : "closed",
3011
+ "aria-hidden": "true",
3012
+ ref: forwardedRef
3013
+ });
3014
+ });
3015
+ MainOverlay.displayName = MAIN_OVERLAY_NAME;
3016
+ var MainSidebar = /* @__PURE__ */ forwardRef20(({ classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, side, label, ...props }, forwardedRef) => {
3017
+ const [isLg] = useMediaQuery("lg");
3018
+ const { tx } = useThemeContext();
3019
+ const { t } = useTranslation(osTranslations3);
3020
+ const ref = useForwardedRef(forwardedRef);
3021
+ const noopRef = useRef4(null);
3022
+ useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
3023
+ onDismiss: () => onStateChange?.("closed")
3024
+ });
3025
+ const handleKeyDown = useCallback9((event) => {
3026
+ const focusGroupParent = event.target.closest("[data-tabster]");
3027
+ if (event.key === "Escape" && focusGroupParent) {
3028
+ event.preventDefault();
3029
+ event.stopPropagation();
3030
+ focusGroupParent.focus();
3031
+ }
3032
+ props.onKeyDown?.(event);
3033
+ }, [
3034
+ props.onKeyDown
3035
+ ]);
3036
+ const Root14 = isLg ? Primitive17.div : DialogContent2;
3037
+ return /* @__PURE__ */ React32.createElement(DialogRoot2, {
3038
+ open: state !== "closed",
3039
+ "aria-label": toLocalizedString(label, t),
3040
+ modal: false
3041
+ }, !isLg && /* @__PURE__ */ React32.createElement(DialogTitle2, {
3042
+ className: "sr-only"
3043
+ }, toLocalizedString(label, t)), /* @__PURE__ */ React32.createElement(Root14, {
3044
+ ...!isLg && {
3045
+ forceMount: true,
3046
+ tabIndex: -1,
3047
+ onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus
3048
+ },
3049
+ ...state === "closed" && {
3050
+ inert: true
3051
+ },
3052
+ ...props,
3053
+ "data-side": side === "w-end" ? "ie" : "is",
3054
+ "data-state": state,
3055
+ "data-resizing": resizing ? "true" : "false",
3056
+ className: tx("main.sidebar", {}, classNames),
3057
+ onKeyDownCapture: handleKeyDown,
3058
+ ref
3059
+ }, children));
3060
+ });
3061
+ var MainNavigationSidebar = /* @__PURE__ */ forwardRef20((props, forwardedRef) => {
3062
+ const { navigationSidebarState, setNavigationSidebarState, resizing } = useMainContext(NAVIGATION_SIDEBAR_NAME);
3063
+ const mover = useLandmarkMover(props.onKeyDown, "0");
3064
+ return /* @__PURE__ */ React32.createElement(MainSidebar, {
3065
+ ...mover,
3066
+ ...props,
3067
+ state: navigationSidebarState,
3068
+ onStateChange: setNavigationSidebarState,
3069
+ resizing,
3070
+ side: "w-start",
3071
+ ref: forwardedRef
3072
+ });
3073
+ });
3074
+ MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
3075
+ var MainComplementarySidebar = /* @__PURE__ */ forwardRef20((props, forwardedRef) => {
3076
+ const { complementarySidebarState, setComplementarySidebarState, resizing } = useMainContext(COMPLEMENTARY_SIDEBAR_NAME);
3077
+ const mover = useLandmarkMover(props.onKeyDown, "2");
3078
+ return /* @__PURE__ */ React32.createElement(MainSidebar, {
3079
+ ...mover,
3080
+ ...props,
3081
+ state: complementarySidebarState,
3082
+ onStateChange: setComplementarySidebarState,
3083
+ resizing,
3084
+ side: "w-end",
3085
+ ref: forwardedRef
3086
+ });
3087
+ });
3088
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
3089
+ var MainContent = /* @__PURE__ */ forwardRef20(({ asChild, classNames, bounce, handlesFocus, children, role, ...props }, forwardedRef) => {
3090
+ const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
3091
+ const { tx } = useThemeContext();
3092
+ const Comp = asChild ? Slot17 : role ? Primitive17.div : "main";
3093
+ const mover = useLandmarkMover(props.onKeyDown, "1");
3094
+ return /* @__PURE__ */ React32.createElement(Comp, {
3095
+ ...handlesFocus && {
3096
+ ...mover
3097
+ },
3098
+ ...props,
3099
+ role,
3100
+ "data-sidebar-left-state": navigationSidebarState,
3101
+ "data-sidebar-right-state": complementarySidebarState,
3102
+ "data-handles-focus": handlesFocus,
3103
+ className: tx("main.content", {
3104
+ bounce,
3105
+ handlesFocus
3106
+ }, classNames),
3107
+ ref: forwardedRef
3108
+ }, children);
3109
+ });
3110
+ MainContent.displayName = MAIN_NAME;
3111
+ var Main = {
3112
+ Root: MainRoot,
3113
+ Overlay: MainOverlay,
3114
+ Content: MainContent,
3115
+ NavigationSidebar: MainNavigationSidebar,
3116
+ ComplementarySidebar: MainComplementarySidebar
3117
+ };
3118
+
3119
+ // src/components/Message/Message.tsx
3120
+ import { createContext as createContext9 } from "@radix-ui/react-context";
3121
+ import { Primitive as Primitive18 } from "@radix-ui/react-primitive";
3122
+ import { Slot as Slot18 } from "@radix-ui/react-slot";
3123
+ import React33, { forwardRef as forwardRef21 } from "react";
3124
+ import { useTranslation as useTranslation4 } from "react-i18next";
3125
+ import { useId as useId3 } from "@dxos/react-hooks";
3126
+ import { translationKey as translationKey2 } from "#translations";
3127
+ var messageIcons = {
3128
+ success: "ph--check-circle--duotone",
3129
+ info: "ph--info--duotone",
3130
+ warning: "ph--warning--duotone",
3131
+ error: "ph--warning-circle--duotone",
3132
+ neutral: "ph--info--duotone"
3133
+ };
3134
+ var MESSAGE_NAME = "Message";
3135
+ var [MessageProvider, useMessageContext] = createContext9(MESSAGE_NAME);
3136
+ var MessageRoot = /* @__PURE__ */ forwardRef21(({ asChild, valence = "neutral", elevation: propsElevation, classNames, titleId: propsTitleId, descriptionId: propsDescriptionId, children, ...props }, forwardedRef) => {
3137
+ const { tx } = useThemeContext();
3138
+ const titleId = useId3("message__title", propsTitleId);
3139
+ const descriptionId = useId3("message__description", propsDescriptionId);
3140
+ const elevation = useElevationContext(propsElevation);
3141
+ const Comp = asChild ? Slot18 : Primitive18.div;
3142
+ return /* @__PURE__ */ React33.createElement(MessageProvider, {
3143
+ titleId,
3144
+ descriptionId,
3145
+ valence
3146
+ }, /* @__PURE__ */ React33.createElement(Comp, {
3147
+ role: valence === "neutral" ? "paragraph" : "alert",
3148
+ ...props,
3149
+ className: tx("message.root", {
3150
+ valence,
3151
+ elevation
3152
+ }, classNames),
3153
+ "aria-labelledby": titleId,
3154
+ "aria-describedby": descriptionId,
3155
+ ref: forwardedRef
3156
+ }, children));
3157
+ });
3158
+ MessageRoot.displayName = MESSAGE_NAME;
3159
+ var MESSAGE_TITLE_NAME = "MessageTitle";
3160
+ var MessageTitle = /* @__PURE__ */ forwardRef21(({ classNames, children, icon: iconProp, onClose }, forwardedRef) => {
3161
+ const { t } = useTranslation4(translationKey2);
3162
+ const { tx } = useThemeContext();
3163
+ const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
3164
+ const icon = iconProp ?? messageIcons[valence];
3165
+ return /* @__PURE__ */ React33.createElement("div", {
3166
+ role: "none",
3167
+ className: tx("message.header", {}, classNames),
3168
+ id: titleId,
3169
+ ref: forwardedRef
3170
+ }, icon && /* @__PURE__ */ React33.createElement("div", {
3171
+ role: "none",
3172
+ className: tx("message.icon", {
3173
+ valence
3174
+ })
3175
+ }, /* @__PURE__ */ React33.createElement(Icon, {
3176
+ icon
3177
+ })), /* @__PURE__ */ React33.createElement("h2", {
3178
+ className: tx("message.title", {}, classNames)
3179
+ }, children), onClose && /* @__PURE__ */ React33.createElement(IconButton, {
3180
+ variant: "ghost",
3181
+ icon: "ph--x--regular",
3182
+ iconOnly: true,
3183
+ label: t("toolbar-close.label"),
3184
+ onClick: onClose
3185
+ }));
3186
+ });
3187
+ MessageTitle.displayName = MESSAGE_TITLE_NAME;
3188
+ var MESSAGE_CONTENT_NAME = "MessageContent";
3189
+ var MessageContent = /* @__PURE__ */ forwardRef21(({ asChild, classNames, children, ...props }, forwardedRef) => {
3190
+ const { tx } = useThemeContext();
3191
+ const { descriptionId } = useMessageContext(MESSAGE_CONTENT_NAME);
3192
+ const Comp = asChild ? Slot18 : Primitive18.p;
3193
+ return /* @__PURE__ */ React33.createElement(Comp, {
3194
+ ...props,
3195
+ className: tx("message.content", {}, classNames),
3196
+ id: descriptionId,
3197
+ ref: forwardedRef
3198
+ }, children);
3199
+ });
3200
+ MessageContent.displayName = MESSAGE_CONTENT_NAME;
3201
+ var Message = {
3202
+ Root: MessageRoot,
3203
+ Title: MessageTitle,
3204
+ Content: MessageContent
3205
+ };
3206
+ var Callout = Message;
3207
+
3208
+ // src/components/Popover/Popover.tsx
3209
+ import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
3210
+ import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
3211
+ import { createContextScope as createContextScope3 } from "@radix-ui/react-context";
3212
+ import { DismissableLayer } from "@radix-ui/react-dismissable-layer";
3213
+ import { useFocusGuards } from "@radix-ui/react-focus-guards";
3214
+ import { FocusScope } from "@radix-ui/react-focus-scope";
3215
+ import { useId as useId4 } from "@radix-ui/react-id";
3216
+ import * as PopperPrimitive from "@radix-ui/react-popper";
3217
+ import { createPopperScope } from "@radix-ui/react-popper";
3218
+ import { Portal as PortalPrimitive } from "@radix-ui/react-portal";
3219
+ import { Presence } from "@radix-ui/react-presence";
3220
+ import { Primitive as Primitive19 } from "@radix-ui/react-primitive";
3221
+ import { Slot as Slot19 } from "@radix-ui/react-slot";
3222
+ import { useControllableState as useControllableState5 } from "@radix-ui/react-use-controllable-state";
3223
+ import { hideOthers } from "aria-hidden";
3224
+ import React34, { forwardRef as forwardRef22, useCallback as useCallback10, useEffect as useEffect6, useMemo as useMemo6, useRef as useRef5, useState as useState9 } from "react";
3225
+ import { RemoveScroll } from "react-remove-scroll";
3226
+ var POPOVER_NAME = "Popover";
3227
+ var [createPopoverContext, createPopoverScope] = createContextScope3(POPOVER_NAME, [
3228
+ createPopperScope
3229
+ ]);
3230
+ var usePopperScope = createPopperScope();
3231
+ var [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);
3232
+ var PopoverRoot = (props) => {
3233
+ const { __scopePopover, children, open: openProp, defaultOpen, onOpenChange, modal = false } = props;
3234
+ const popperScope = usePopperScope(__scopePopover);
3235
+ const triggerRef = useRef5(null);
3236
+ const [hasCustomAnchor, setHasCustomAnchor] = useState9(false);
3237
+ const [open = false, setOpen] = useControllableState5({
3238
+ prop: openProp,
3239
+ defaultProp: defaultOpen,
3240
+ onChange: onOpenChange
3241
+ });
3242
+ return /* @__PURE__ */ React34.createElement(PopperPrimitive.Root, popperScope, /* @__PURE__ */ React34.createElement(PopoverProvider, {
3243
+ scope: __scopePopover,
3244
+ contentId: useId4(),
3245
+ triggerRef,
3246
+ open,
3247
+ onOpenChange: setOpen,
3248
+ onOpenToggle: useCallback10(() => setOpen((prevOpen) => !prevOpen), [
3249
+ setOpen
3250
+ ]),
3251
+ hasCustomAnchor,
3252
+ onCustomAnchorAdd: useCallback10(() => setHasCustomAnchor(true), []),
3253
+ onCustomAnchorRemove: useCallback10(() => setHasCustomAnchor(false), []),
3254
+ modal
3255
+ }, children));
3256
+ };
3257
+ PopoverRoot.displayName = POPOVER_NAME;
3258
+ var ANCHOR_NAME = "PopoverAnchor";
3259
+ var PopoverAnchor = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3260
+ const { __scopePopover, ...anchorProps } = props;
3261
+ const context = usePopoverContext(ANCHOR_NAME, __scopePopover);
3262
+ const popperScope = usePopperScope(__scopePopover);
3263
+ const { onCustomAnchorAdd, onCustomAnchorRemove } = context;
3264
+ useEffect6(() => {
3265
+ onCustomAnchorAdd();
3266
+ return () => onCustomAnchorRemove();
3267
+ }, [
3268
+ onCustomAnchorAdd,
3269
+ onCustomAnchorRemove
3270
+ ]);
3271
+ return /* @__PURE__ */ React34.createElement(PopperPrimitive.Anchor, {
3272
+ ...popperScope,
3273
+ ...anchorProps,
3274
+ ref: forwardedRef
3275
+ });
3276
+ });
3277
+ PopoverAnchor.displayName = ANCHOR_NAME;
3278
+ var TRIGGER_NAME2 = "PopoverTrigger";
3279
+ var PopoverTrigger = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3280
+ const { __scopePopover, asChild, ...triggerProps } = props;
3281
+ const context = usePopoverContext(TRIGGER_NAME2, __scopePopover);
3282
+ const popperScope = usePopperScope(__scopePopover);
3283
+ const composedTriggerRef = useComposedRefs2(forwardedRef, context.triggerRef);
3284
+ const Comp = asChild ? Slot19 : Primitive19.button;
3285
+ const trigger = /* @__PURE__ */ React34.createElement(Comp, {
3286
+ type: "button",
3287
+ "aria-haspopup": "dialog",
3288
+ "aria-expanded": context.open,
3289
+ "aria-controls": context.contentId,
3290
+ "data-state": getState(context.open),
3291
+ ...triggerProps,
3292
+ ref: composedTriggerRef,
3293
+ onClick: composeEventHandlers2(props.onClick, context.onOpenToggle)
3294
+ });
3295
+ return context.hasCustomAnchor ? trigger : /* @__PURE__ */ React34.createElement(PopperPrimitive.Anchor, {
3296
+ asChild: true,
3297
+ ...popperScope
3298
+ }, trigger);
3299
+ });
3300
+ PopoverTrigger.displayName = TRIGGER_NAME2;
3301
+ var VIRTUAL_TRIGGER_NAME2 = "PopoverVirtualTrigger";
3302
+ var PopoverVirtualTrigger = (props) => {
3303
+ const { __scopePopover, virtualRef } = props;
3304
+ const context = usePopoverContext(VIRTUAL_TRIGGER_NAME2, __scopePopover);
3305
+ const popperScope = usePopperScope(__scopePopover);
3306
+ useEffect6(() => {
3307
+ if (virtualRef.current) {
3308
+ context.triggerRef.current = virtualRef.current;
3309
+ }
3310
+ });
3311
+ return /* @__PURE__ */ React34.createElement(PopperPrimitive.Anchor, {
3312
+ ...popperScope,
3313
+ virtualRef
3314
+ });
3315
+ };
3316
+ PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME2;
3317
+ var PORTAL_NAME2 = "PopoverPortal";
3318
+ var [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME2, {
3319
+ forceMount: void 0
3320
+ });
3321
+ var PopoverPortal = (props) => {
3322
+ const { __scopePopover, forceMount, children, container } = props;
3323
+ const context = usePopoverContext(PORTAL_NAME2, __scopePopover);
3324
+ return /* @__PURE__ */ React34.createElement(PortalProvider, {
3325
+ scope: __scopePopover,
3326
+ forceMount
3327
+ }, /* @__PURE__ */ React34.createElement(Presence, {
3328
+ present: forceMount || context.open
3329
+ }, /* @__PURE__ */ React34.createElement(PortalPrimitive, {
3330
+ asChild: true,
3331
+ container
3332
+ }, children)));
3333
+ };
3334
+ PopoverPortal.displayName = PORTAL_NAME2;
3335
+ var CONTENT_NAME2 = "PopoverContent";
3336
+ var PopoverContent = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3337
+ const portalContext = usePortalContext(CONTENT_NAME2, props.__scopePopover);
3338
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
3339
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3340
+ return /* @__PURE__ */ React34.createElement(Presence, {
3341
+ present: forceMount || context.open
3342
+ }, context.modal ? /* @__PURE__ */ React34.createElement(PopoverContentModal, {
3343
+ ...contentProps,
3344
+ ref: forwardedRef
3345
+ }) : /* @__PURE__ */ React34.createElement(PopoverContentNonModal, {
3346
+ ...contentProps,
3347
+ ref: forwardedRef
3348
+ }));
3349
+ });
3350
+ PopoverContent.displayName = CONTENT_NAME2;
3351
+ var PopoverContentModal = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3352
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3353
+ const contentRef = useRef5(null);
3354
+ const composedRefs = useComposedRefs2(forwardedRef, contentRef);
3355
+ const isRightClickOutsideRef = useRef5(false);
3356
+ useEffect6(() => {
3357
+ const content = contentRef.current;
3358
+ if (content) {
3359
+ return hideOthers(content);
3360
+ }
3361
+ }, []);
3362
+ return /* @__PURE__ */ React34.createElement(RemoveScroll, {
3363
+ as: Slot19,
3364
+ allowPinchZoom: true
3365
+ }, /* @__PURE__ */ React34.createElement(PopoverContentImpl, {
3366
+ ...props,
3367
+ ref: composedRefs,
3368
+ // Make sure we're not trapping once it's been closed (closed !== unmounted when animating out).
3369
+ trapFocus: context.open,
3370
+ disableOutsidePointerEvents: true,
3371
+ onCloseAutoFocus: composeEventHandlers2(props.onCloseAutoFocus, (event) => {
3372
+ event.preventDefault();
3373
+ if (!isRightClickOutsideRef.current) {
3374
+ context.triggerRef.current?.focus();
3375
+ }
3376
+ }),
3377
+ onPointerDownOutside: composeEventHandlers2(props.onPointerDownOutside, (event) => {
3378
+ const originalEvent = event.detail.originalEvent;
3379
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
3380
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
3381
+ isRightClickOutsideRef.current = isRightClick;
3382
+ }, {
3383
+ checkForDefaultPrevented: false
3384
+ }),
3385
+ // When focus is trapped, a `focusout` event may still happen.
3386
+ // We make sure we don't trigger our `onDismiss` in such case.
3387
+ onFocusOutside: composeEventHandlers2(props.onFocusOutside, (event) => event.preventDefault(), {
3388
+ checkForDefaultPrevented: false
3389
+ })
3390
+ }));
3391
+ });
3392
+ var PopoverContentNonModal = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3393
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3394
+ const hasInteractedOutsideRef = useRef5(false);
3395
+ const hasPointerDownOutsideRef = useRef5(false);
3396
+ return /* @__PURE__ */ React34.createElement(PopoverContentImpl, {
3397
+ ...props,
3398
+ ref: forwardedRef,
3399
+ trapFocus: false,
3400
+ disableOutsidePointerEvents: false,
3401
+ onCloseAutoFocus: (event) => {
3402
+ props.onCloseAutoFocus?.(event);
3403
+ if (!event.defaultPrevented) {
3404
+ if (!hasInteractedOutsideRef.current) {
3405
+ context.triggerRef.current?.focus();
3406
+ }
3407
+ event.preventDefault();
3408
+ }
3409
+ hasInteractedOutsideRef.current = false;
3410
+ hasPointerDownOutsideRef.current = false;
3411
+ },
3412
+ onInteractOutside: (event) => {
3413
+ props.onInteractOutside?.(event);
3414
+ if (!event.defaultPrevented) {
3415
+ hasInteractedOutsideRef.current = true;
3416
+ if (event.detail.originalEvent.type === "pointerdown") {
3417
+ hasPointerDownOutsideRef.current = true;
3418
+ }
3419
+ }
3420
+ const target = event.target;
3421
+ const targetIsTrigger = context.triggerRef.current?.contains(target);
3422
+ if (targetIsTrigger) {
3423
+ event.preventDefault();
3424
+ }
3425
+ if (event.detail.originalEvent.type === "focusin" && hasPointerDownOutsideRef.current) {
3426
+ event.preventDefault();
3427
+ }
3428
+ }
3429
+ });
3430
+ });
3431
+ var PopoverContentImpl = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3432
+ const { __scopePopover, trapFocus, onOpenAutoFocus, onCloseAutoFocus, disableOutsidePointerEvents, onEscapeKeyDown, onPointerDownOutside, onFocusOutside, onInteractOutside, collisionPadding = 8, collisionBoundary, classNames, ...contentProps } = props;
3433
+ const context = usePopoverContext(CONTENT_NAME2, __scopePopover);
3434
+ const popperScope = usePopperScope(__scopePopover);
3435
+ const { tx } = useThemeContext();
3436
+ const elevation = useElevationContext();
3437
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
3438
+ useFocusGuards();
3439
+ const computedCollisionBoundary = useMemo6(() => {
3440
+ const closestBoundary = context.triggerRef.current?.closest("[data-popover-collision-boundary]");
3441
+ return closestBoundary ? Array.isArray(collisionBoundary) ? [
3442
+ closestBoundary,
3443
+ ...collisionBoundary
3444
+ ] : collisionBoundary ? [
3445
+ closestBoundary,
3446
+ collisionBoundary
3447
+ ] : [
3448
+ closestBoundary
3449
+ ] : collisionBoundary;
3450
+ }, [
3451
+ context.open,
3452
+ collisionBoundary,
3453
+ context.triggerRef.current
3454
+ ]);
3455
+ return /* @__PURE__ */ React34.createElement(FocusScope, {
3456
+ asChild: true,
3457
+ loop: true,
3458
+ trapped: trapFocus,
3459
+ onMountAutoFocus: onOpenAutoFocus,
3460
+ onUnmountAutoFocus: onCloseAutoFocus
3461
+ }, /* @__PURE__ */ React34.createElement(DismissableLayer, {
3462
+ asChild: true,
3463
+ disableOutsidePointerEvents,
3464
+ onInteractOutside,
3465
+ onEscapeKeyDown,
3466
+ onPointerDownOutside,
3467
+ onFocusOutside,
3468
+ onDismiss: () => context.onOpenChange(false)
3469
+ }, /* @__PURE__ */ React34.createElement(PopperPrimitive.Content, {
3470
+ "data-state": getState(context.open),
3471
+ role: "dialog",
3472
+ id: context.contentId,
3473
+ ...popperScope,
3474
+ ...contentProps,
3475
+ collisionPadding: safeCollisionPadding,
3476
+ collisionBoundary: computedCollisionBoundary,
3477
+ className: tx("popover.content", {
3478
+ elevation
3479
+ }, classNames),
3480
+ ref: forwardedRef,
3481
+ style: {
3482
+ ...contentProps.style,
3483
+ // Re-namespace exposed content custom properties.
3484
+ ...{
3485
+ "--radix-popover-content-transform-origin": "var(--radix-popper-transform-origin)",
3486
+ "--radix-popover-content-available-width": "var(--radix-popper-available-width)",
3487
+ "--radix-popover-content-available-height": "var(--radix-popper-available-height)",
3488
+ "--radix-popover-trigger-width": "var(--radix-popper-anchor-width)",
3489
+ "--radix-popover-trigger-height": "var(--radix-popper-anchor-height)"
3490
+ }
3491
+ }
3492
+ })));
3493
+ });
3494
+ var CLOSE_NAME = "PopoverClose";
3495
+ var PopoverClose = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3496
+ const { __scopePopover, ...closeProps } = props;
3497
+ const context = usePopoverContext(CLOSE_NAME, __scopePopover);
3498
+ return /* @__PURE__ */ React34.createElement(Primitive19.button, {
3499
+ type: "button",
3500
+ ...closeProps,
3501
+ ref: forwardedRef,
3502
+ onClick: composeEventHandlers2(props.onClick, () => context.onOpenChange(false))
3503
+ });
3504
+ });
3505
+ PopoverClose.displayName = CLOSE_NAME;
3506
+ var ARROW_NAME2 = "PopoverArrow";
3507
+ var PopoverArrow = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3508
+ const { __scopePopover, classNames, ...arrowProps } = props;
3509
+ const popperScope = usePopperScope(__scopePopover);
3510
+ const { tx } = useThemeContext();
3511
+ return /* @__PURE__ */ React34.createElement(PopperPrimitive.Arrow, {
3512
+ ...popperScope,
3513
+ ...arrowProps,
3514
+ className: tx("popover.arrow", {}, classNames),
3515
+ ref: forwardedRef
3516
+ });
3517
+ });
3518
+ PopoverArrow.displayName = ARROW_NAME2;
3519
+ var PopoverViewport = /* @__PURE__ */ forwardRef22(({ classNames, asChild, constrainInline = true, constrainBlock = true, children, ...props }, forwardedRef) => {
3520
+ const { tx } = useThemeContext();
3521
+ const Comp = asChild ? Slot19 : Primitive19.div;
3522
+ return /* @__PURE__ */ React34.createElement(Comp, {
3523
+ ...props,
3524
+ className: tx("popover.viewport", {
3525
+ constrainInline,
3526
+ constrainBlock
3527
+ }, classNames),
3528
+ ref: forwardedRef
3529
+ }, children);
3530
+ });
3531
+ var getState = (open) => open ? "open" : "closed";
3532
+ var Popover = {
3533
+ Root: PopoverRoot,
3534
+ Anchor: PopoverAnchor,
3535
+ Trigger: PopoverTrigger,
3536
+ VirtualTrigger: PopoverVirtualTrigger,
3537
+ Portal: PopoverPortal,
3538
+ Content: PopoverContent,
3539
+ Close: PopoverClose,
3540
+ Arrow: PopoverArrow,
3541
+ Viewport: PopoverViewport
3542
+ };
3543
+
3544
+ // src/components/Status/Status.tsx
3545
+ import React35, { forwardRef as forwardRef23 } from "react";
3546
+ var Status = /* @__PURE__ */ forwardRef23(({ classNames, children, progress = 0, indeterminate, variant, ...props }, forwardedRef) => {
3547
+ const { tx } = useThemeContext();
3548
+ return /* @__PURE__ */ React35.createElement("span", {
3549
+ role: "status",
3550
+ ...props,
3551
+ className: tx("status.root", {
3552
+ indeterminate,
3553
+ variant
3554
+ }, classNames),
3555
+ ref: forwardedRef
3556
+ }, /* @__PURE__ */ React35.createElement("span", {
3557
+ role: "none",
3558
+ className: tx("status.bar", {
3559
+ indeterminate,
3560
+ variant
3561
+ }, classNames),
3562
+ ...!indeterminate && {
3563
+ style: {
3564
+ width: `${Math.round(progress * 100)}%`
3565
+ }
3566
+ }
3567
+ }), children);
3568
+ });
3569
+
3570
+ // src/components/ScrollArea/ScrollArea.tsx
3571
+ import { createContext as createContext10 } from "@radix-ui/react-context";
3572
+ import { Primitive as Primitive20 } from "@radix-ui/react-primitive";
3573
+ import { Slot as Slot20 } from "@radix-ui/react-slot";
3574
+ import React36, { useMemo as useMemo7 } from "react";
3575
+ import { composableProps as composableProps12, scrollbar, slottable as slottable9 } from "@dxos/ui-theme";
3576
+ var SCROLLAREA_NAME = "ScrollArea";
3577
+ var [ScrollAreaProvider, useScrollAreaContext] = createContext10(SCROLLAREA_NAME);
3578
+ var SCROLLAREA_ROOT_NAME = "ScrollArea.Root";
3579
+ var ScrollAreaRoot = slottable9(({ children, asChild, orientation = "vertical", autoHide = true, centered = false, padding = false, thin = false, snap = false, ...props }, forwardedRef) => {
3580
+ const { tx } = useThemeContext();
3581
+ const { className, ...rest } = composableProps12(props);
3582
+ const Comp = asChild ? Slot20 : Primitive20.div;
3583
+ const options = useMemo7(() => ({
3584
+ orientation,
3585
+ autoHide,
3586
+ centered,
3587
+ padding,
3588
+ thin,
3589
+ snap
3590
+ }), [
3591
+ orientation,
3592
+ autoHide,
3593
+ centered,
3594
+ padding,
3595
+ thin,
3596
+ snap
3597
+ ]);
3598
+ return /* @__PURE__ */ React36.createElement(ScrollAreaProvider, options, /* @__PURE__ */ React36.createElement(Comp, {
3599
+ ...rest,
3600
+ className: tx("scrollArea.root", options, className),
3601
+ ref: forwardedRef
3602
+ }, children));
3603
+ });
3604
+ ScrollAreaRoot.displayName = SCROLLAREA_ROOT_NAME;
3605
+ var SCROLLAREA_VIEWPORT_NAME = "ScrollArea.Viewport";
3606
+ var ScrollAreaViewport = slottable9(({ children, asChild, ...props }, forwardedRef) => {
3607
+ const { tx } = useThemeContext();
3608
+ const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
3609
+ const density = options.thin ? scrollbar.thin : scrollbar.coarse;
3610
+ const { className, ...rest } = composableProps12(props);
3611
+ const { style, ...restWithoutStyle } = rest;
3612
+ const Comp = asChild ? Slot20 : Primitive20.div;
3613
+ return /* @__PURE__ */ React36.createElement(Comp, {
3614
+ ...restWithoutStyle,
3615
+ style: {
3616
+ "--scroll-width": `${density.size}px`,
3617
+ "--scroll-padding": `${density.padding}px`,
3618
+ ...style
3619
+ },
3620
+ className: tx("scrollArea.viewport", options, className),
3621
+ ref: forwardedRef
3622
+ }, children);
3623
+ });
3624
+ ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
3625
+ var ScrollArea = {
3626
+ Root: ScrollAreaRoot,
3627
+ Viewport: ScrollAreaViewport
3628
+ };
3629
+
3630
+ // src/components/ScrollContainer/ScrollContainer.tsx
3631
+ import { createContext as createContext11 } from "@radix-ui/react-context";
3632
+ import React37, { forwardRef as forwardRef24, useCallback as useCallback11, useEffect as useEffect7, useImperativeHandle, useMemo as useMemo8, useRef as useRef6, useState as useState10 } from "react";
3633
+ import { addEventListener as addEventListener2, combine } from "@dxos/async";
3634
+ import { invariant } from "@dxos/invariant";
3635
+ import { useMergeRefs } from "@dxos/react-hooks";
3636
+ import { composable as composable6, composableProps as composableProps13, slottable as slottable10 } from "@dxos/ui-theme";
3637
+ import { mx as mx9 } from "@dxos/ui-theme";
3638
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui/src/components/ScrollContainer/ScrollContainer.tsx";
3639
+ var isBottom = (el) => {
3640
+ return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
3641
+ };
3642
+ var [ScrollContainerProvider, useScrollContainerContext] = createContext11("ScrollContainer");
3643
+ var Root10 = /* @__PURE__ */ forwardRef24(({ children, pin, behavior: behaviorProp = "smooth" }, forwardedRef) => {
3644
+ const scrollerRef = useRef6(null);
3645
+ const autoScrollRef = useRef6(false);
3646
+ const [pinned, setPinned] = useState10(pin);
3647
+ const [overflow, setOverflow] = useState10(false);
3648
+ const timeoutRef = useRef6(void 0);
3649
+ const scrollToBottom = useCallback11((behavior = behaviorProp) => {
3650
+ if (scrollerRef.current) {
3651
+ if (behavior !== "instant") {
3652
+ autoScrollRef.current = true;
3653
+ scrollerRef.current.classList.add("scrollbar-none");
3654
+ clearTimeout(timeoutRef.current);
3655
+ timeoutRef.current = setTimeout(() => {
3656
+ scrollerRef.current?.classList.remove("scrollbar-none");
3657
+ autoScrollRef.current = false;
3658
+ }, 500);
3659
+ }
3660
+ scrollerRef.current.scrollTo({
3661
+ top: scrollerRef.current.scrollHeight,
3662
+ behavior
3663
+ });
3664
+ setPinned(true);
3665
+ }
3666
+ }, [
3667
+ behaviorProp
3668
+ ]);
3669
+ const controller = useMemo8(() => ({
3670
+ get viewport() {
3671
+ return scrollerRef.current;
3672
+ },
3673
+ scrollToTop: () => {
3674
+ invariant(scrollerRef.current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 54, S: void 0, A: ["scrollerRef.current", ""] });
3675
+ scrollerRef.current.scrollTo({
3676
+ top: 0,
3677
+ behavior: "smooth"
3678
+ });
3679
+ setPinned(false);
3680
+ },
3681
+ scrollToBottom: (behavior = "smooth") => {
3682
+ scrollToBottom(behavior);
3683
+ }
3684
+ }), [
3685
+ scrollToBottom
3686
+ ]);
3687
+ useImperativeHandle(forwardedRef, () => controller, [
3688
+ controller
3689
+ ]);
3690
+ const setViewport = useCallback11((el) => {
3691
+ scrollerRef.current = el;
3692
+ }, []);
3693
+ return /* @__PURE__ */ React37.createElement(ScrollContainerProvider, {
3694
+ pinned,
3695
+ overflow,
3696
+ controller,
3697
+ setViewport,
3698
+ setPinned,
3699
+ setOverflow
3700
+ }, children);
3701
+ });
3702
+ Root10.displayName = "ScrollContainer.Root";
3703
+ var Content6 = composable6(({ children, thin, padding, centered, ...props }, forwardedRef) => {
3704
+ return /* @__PURE__ */ React37.createElement(ScrollArea.Root, {
3705
+ ...composableProps13(props, {
3706
+ classNames: "relative"
3707
+ }),
3708
+ thin,
3709
+ padding,
3710
+ centered,
3711
+ ref: forwardedRef
3712
+ }, children);
3713
+ });
3714
+ Content6.displayName = "ScrollContainer.Content";
3715
+ var VIEWPORT_NAME = "ScrollContainer.Viewport";
3716
+ var Viewport = slottable10(({ children, asChild, ...props }, forwardedRef) => {
3717
+ const scrollerRef = useRef6(null);
3718
+ const mergedRef = useMergeRefs([
3719
+ forwardedRef,
3720
+ scrollerRef
3721
+ ]);
3722
+ const { setViewport, setPinned, setOverflow } = useScrollContainerContext(VIEWPORT_NAME);
3723
+ useEffect7(() => {
3724
+ const el = scrollerRef.current;
3725
+ if (!el) {
3726
+ return;
3727
+ }
3728
+ setViewport(el);
3729
+ return combine(addEventListener2(el, "wheel", () => setPinned(isBottom(el))), addEventListener2(el, "scroll", () => setOverflow((el.scrollTop ?? 0) > 0)), () => setViewport(null));
3730
+ }, [
3731
+ setViewport,
3732
+ setPinned,
3733
+ setOverflow
3734
+ ]);
3735
+ return /* @__PURE__ */ React37.createElement(React37.Fragment, null, /* @__PURE__ */ React37.createElement(ScrollArea.Viewport, {
3736
+ asChild,
3737
+ ...composableProps13(props),
3738
+ ref: mergedRef
3739
+ }, children), /* @__PURE__ */ React37.createElement(PinEffect, {
3740
+ scrollerRef
3741
+ }));
3742
+ });
3743
+ Viewport.displayName = VIEWPORT_NAME;
3744
+ var PIN_EFFECT_NAME = "ScrollContainer.PinEffect";
3745
+ var PinEffect = ({ scrollerRef }) => {
3746
+ const { pinned, controller } = useScrollContainerContext(PIN_EFFECT_NAME);
3747
+ useEffect7(() => {
3748
+ const viewport = scrollerRef.current;
3749
+ if (!pinned || !viewport) {
3750
+ return;
3751
+ }
3752
+ controller?.scrollToBottom("instant");
3753
+ const resizeObserver = new ResizeObserver(() => controller?.scrollToBottom("smooth"));
3754
+ Array.from(viewport.children).forEach((child) => {
3755
+ resizeObserver.observe(child);
3756
+ });
3757
+ const mutationObserver = new MutationObserver((mutations) => {
3758
+ mutations.forEach((mutation) => {
3759
+ mutation.addedNodes.forEach((node) => {
3760
+ if (node instanceof Element) {
3761
+ resizeObserver.observe(node);
3762
+ }
3763
+ });
3764
+ });
3765
+ controller?.scrollToBottom("smooth");
3766
+ });
3767
+ mutationObserver.observe(viewport, {
3768
+ childList: true
3769
+ });
3770
+ return () => {
3771
+ resizeObserver.disconnect();
3772
+ mutationObserver.disconnect();
3773
+ };
3774
+ }, [
3775
+ pinned,
3776
+ controller,
3777
+ scrollerRef
3778
+ ]);
3779
+ return null;
3780
+ };
3781
+ var FADE_NAME = "ScrollContainer.Fade";
3782
+ var Fade = () => {
3783
+ const { overflow } = useScrollContainerContext(FADE_NAME);
3784
+ return /* @__PURE__ */ React37.createElement("div", {
3785
+ role: "none",
3786
+ "data-visible": overflow,
3787
+ className: mx9(
3788
+ // NOTE: Gradients may not be visible with dark reader extensions.
3789
+ "z-10 absolute top-0 inset-x-0 h-24 w-full",
3790
+ 'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
3791
+ "bg-gradient-to-b from-(--color-base-surface) to-transparent pointer-events-none"
3792
+ )
3793
+ });
3794
+ };
3795
+ Fade.displayName = FADE_NAME;
3796
+ var SCROLL_DOWN_BUTTON_NAME = "ScrollContainer.ScrollDownButton";
3797
+ var ScrollDownButton = ({ classNames }) => {
3798
+ const { pinned, controller } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
3799
+ return /* @__PURE__ */ React37.createElement("div", {
3800
+ role: "none",
3801
+ className: mx9("absolute bottom-2 right-4 opacity-100 transition-opacity duration-300", pinned && "opacity-0", classNames)
3802
+ }, /* @__PURE__ */ React37.createElement(IconButton, {
3803
+ variant: "primary",
3804
+ icon: "ph--arrow-down--regular",
3805
+ iconOnly: true,
3806
+ size: 4,
3807
+ label: "Scroll down",
3808
+ onClick: () => controller?.scrollToBottom()
3809
+ }));
3810
+ };
3811
+ ScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
3812
+ var ScrollContainer = {
3813
+ Root: Root10,
3814
+ Content: Content6,
3815
+ Viewport,
3816
+ Fade,
3817
+ ScrollDownButton
3818
+ };
3819
+
3820
+ // src/components/Select/Select.tsx
3821
+ import * as SelectPrimitive from "@radix-ui/react-select";
3822
+ import React38, { forwardRef as forwardRef25 } from "react";
3823
+ var SelectRoot = SelectPrimitive.Root;
3824
+ var SelectTrigger = SelectPrimitive.Trigger;
3825
+ var SelectValue = SelectPrimitive.Value;
3826
+ var SelectIcon = SelectPrimitive.Icon;
3827
+ var SelectPortal = SelectPrimitive.Portal;
3828
+ var SelectTriggerButton = /* @__PURE__ */ forwardRef25(({ children, placeholder, ...props }, forwardedRef) => {
3829
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Trigger, {
3830
+ asChild: true,
3831
+ ref: forwardedRef
3832
+ }, /* @__PURE__ */ React38.createElement(Button, props, /* @__PURE__ */ React38.createElement(SelectPrimitive.Value, {
3833
+ placeholder
3834
+ }, children), /* @__PURE__ */ React38.createElement("span", {
3835
+ className: "w-1 flex-1"
3836
+ }), /* @__PURE__ */ React38.createElement(SelectPrimitive.Icon, {
3837
+ asChild: true
3838
+ }, /* @__PURE__ */ React38.createElement(Icon, {
3839
+ size: 3,
3840
+ icon: "ph--caret-down--bold"
3841
+ }))));
3842
+ });
3843
+ var SelectContent = /* @__PURE__ */ forwardRef25(({ classNames, children, collisionPadding = 8, ...props }, forwardedRef) => {
3844
+ const { tx } = useThemeContext();
3845
+ const elevation = useElevationContext();
3846
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
3847
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Content, {
3848
+ ...props,
3849
+ "data-arrow-keys": "up down",
3850
+ collisionPadding: safeCollisionPadding,
3851
+ className: tx("select.content", {
3852
+ elevation
3853
+ }, classNames),
3854
+ position: "popper",
3855
+ ref: forwardedRef
3856
+ }, children);
3857
+ });
3858
+ var SelectScrollUpButton2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
3859
+ const { tx } = useThemeContext();
3860
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.SelectScrollUpButton, {
3861
+ ...props,
3862
+ className: tx("select.scrollButton", {}, classNames),
3863
+ ref: forwardedRef
3864
+ }, children ?? /* @__PURE__ */ React38.createElement(Icon, {
3865
+ size: 3,
3866
+ icon: "ph--caret-up--bold"
3867
+ }));
3868
+ });
3869
+ var SelectScrollDownButton2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
3870
+ const { tx } = useThemeContext();
3871
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.SelectScrollDownButton, {
3872
+ ...props,
3873
+ className: tx("select.scrollButton", {}, classNames),
3874
+ ref: forwardedRef
3875
+ }, children ?? /* @__PURE__ */ React38.createElement(Icon, {
3876
+ size: 3,
3877
+ icon: "ph--caret-down--bold"
3878
+ }));
3879
+ });
3880
+ var SelectViewport2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
3881
+ const { tx } = useThemeContext();
3882
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.SelectViewport, {
3883
+ ...props,
3884
+ className: tx("select.viewport", {}, classNames),
3885
+ ref: forwardedRef
3886
+ }, children);
3887
+ });
3888
+ var SelectItem = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
3889
+ const { tx } = useThemeContext();
3890
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Item, {
3891
+ ...props,
3892
+ className: tx("select.item", {}, classNames),
3893
+ ref: forwardedRef
3894
+ });
3895
+ });
3896
+ var SelectItemText = SelectPrimitive.ItemText;
3897
+ var SelectItemIndicator = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
3898
+ const { tx } = useThemeContext();
3899
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.ItemIndicator, {
3900
+ ...props,
3901
+ className: tx("select.itemIndicator", {}, classNames),
3902
+ ref: forwardedRef
3903
+ }, children);
3904
+ });
3905
+ var SelectOption = /* @__PURE__ */ forwardRef25(({ children, classNames, ...props }, forwardedRef) => {
3906
+ const { tx } = useThemeContext();
3907
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Item, {
3908
+ ...props,
3909
+ className: tx("select.item", {}, classNames),
3910
+ ref: forwardedRef
3911
+ }, /* @__PURE__ */ React38.createElement(SelectPrimitive.ItemText, null, children), /* @__PURE__ */ React38.createElement("span", {
3912
+ className: "grow w-1"
3913
+ }), /* @__PURE__ */ React38.createElement(Icon, {
3914
+ icon: "ph--check--regular"
3915
+ }));
3916
+ });
3917
+ var SelectGroup = SelectPrimitive.Group;
3918
+ var SelectLabel = SelectPrimitive.Label;
3919
+ var SelectSeparator = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
3920
+ const { tx } = useThemeContext();
3921
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Separator, {
3922
+ ...props,
3923
+ className: tx("select.separator", {}, classNames),
3924
+ ref: forwardedRef
3925
+ });
3926
+ });
3927
+ var SelectArrow = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
3928
+ const { tx } = useThemeContext();
3929
+ return /* @__PURE__ */ React38.createElement(SelectPrimitive.Arrow, {
3930
+ ...props,
3931
+ className: tx("select.arrow", {}, classNames),
3932
+ ref: forwardedRef
3933
+ });
3934
+ });
3935
+ var Select = {
3936
+ Root: SelectRoot,
3937
+ Trigger: SelectTrigger,
3938
+ TriggerButton: SelectTriggerButton,
3939
+ Value: SelectValue,
3940
+ Icon: SelectIcon,
3941
+ Portal: SelectPortal,
3942
+ Content: SelectContent,
3943
+ ScrollUpButton: SelectScrollUpButton2,
3944
+ ScrollDownButton: SelectScrollDownButton2,
3945
+ Viewport: SelectViewport2,
3946
+ Item: SelectItem,
3947
+ ItemText: SelectItemText,
3948
+ ItemIndicator: SelectItemIndicator,
3949
+ Option: SelectOption,
3950
+ Group: SelectGroup,
3951
+ Label: SelectLabel,
3952
+ Separator: SelectSeparator,
3953
+ Arrow: SelectArrow
3954
+ };
3955
+
3956
+ // src/components/Skeleton/Skeleton.tsx
3957
+ import React39, { forwardRef as forwardRef26 } from "react";
3958
+ var Skeleton = /* @__PURE__ */ forwardRef26(({ classNames, variant = "default", ...props }, forwardedRef) => {
3959
+ const { tx } = useThemeContext();
3960
+ return /* @__PURE__ */ React39.createElement("div", {
3961
+ ...props,
3962
+ className: tx("skeleton.root", {
3963
+ variant
3964
+ }, classNames),
3965
+ ref: forwardedRef
3966
+ });
3967
+ });
3968
+
3969
+ // src/components/Splitter/Splitter.tsx
3970
+ import { createContextScope as createContextScope4 } from "@radix-ui/react-context";
3971
+ import { Primitive as Primitive21 } from "@radix-ui/react-primitive";
3972
+ import { Slot as Slot21 } from "@radix-ui/react-slot";
3973
+ import React40 from "react";
3974
+ import { composableProps as composableProps14, slottable as slottable11 } from "@dxos/ui-theme";
3975
+ var SPLITTER_NAME = "Splitter";
3976
+ var [createSplitterContext, createSplitterScope] = createContextScope4(SPLITTER_NAME);
3977
+ var [SplitterProvider, useSplitterContext] = createSplitterContext(SPLITTER_NAME);
3978
+ var ROOT_NAME = "Splitter.Root";
3979
+ var Root12 = slottable11(({ asChild, mode = "top", ratio = 0.5, transition = 250, children, ...props }, forwardedRef) => {
3980
+ const { tx } = useThemeContext();
3981
+ const { __scopeSplitter, ...rest } = props;
3982
+ const { className, ...restProps } = composableProps14(rest);
3983
+ const Comp = asChild ? Slot21 : Primitive21.div;
3984
+ return /* @__PURE__ */ React40.createElement(SplitterProvider, {
3985
+ scope: __scopeSplitter,
3986
+ mode,
3987
+ ratio,
3988
+ transition
3989
+ }, /* @__PURE__ */ React40.createElement(Comp, {
3990
+ ...restProps,
3991
+ ref: forwardedRef,
3992
+ className: tx("splitter.root", {}, className)
3993
+ }, children));
3994
+ });
3995
+ Root12.displayName = ROOT_NAME;
3996
+ var PANEL_NAME = "Splitter.Panel";
3997
+ var Panel2 = slottable11(({ classNames, asChild, children, position, style, ...props }, forwardedRef) => {
3998
+ const { tx } = useThemeContext();
3999
+ const { __scopeSplitter, ...rest } = props;
4000
+ const Comp = asChild ? Slot21 : Primitive21.div;
4001
+ const { mode, ratio = 0.5, transition } = useSplitterContext(PANEL_NAME, __scopeSplitter);
4002
+ const { className, ...restProps } = composableProps14(rest);
4003
+ const isTopPanel = position === "top";
4004
+ const topOffset = isTopPanel ? "0%" : mode === "top" ? "100%" : mode === "bottom" ? "0%" : `${ratio * 100}%`;
4005
+ const height = isTopPanel ? mode === "top" ? "100%" : mode === "bottom" ? "0%" : `${ratio * 100}%` : mode === "bottom" ? "100%" : mode === "top" ? "0%" : `${(1 - ratio) * 100}%`;
4006
+ return /* @__PURE__ */ React40.createElement(Comp, {
4007
+ ...restProps,
4008
+ ref: forwardedRef,
4009
+ className: tx("splitter.panel", {}, className),
4010
+ style: {
4011
+ top: topOffset,
4012
+ height,
4013
+ transition: `top ${transition}ms, height ${transition}ms ease-out`,
4014
+ ...style
4015
+ }
4016
+ }, children);
4017
+ });
4018
+ Panel2.displayName = PANEL_NAME;
4019
+ var Splitter = {
4020
+ Root: Root12,
4021
+ Panel: Panel2
4022
+ };
4023
+
4024
+ // src/components/Tag/Tag.tsx
4025
+ import { Primitive as Primitive22 } from "@radix-ui/react-primitive";
4026
+ import { Slot as Slot22 } from "@radix-ui/react-slot";
4027
+ import React41, { forwardRef as forwardRef27 } from "react";
4028
+ var Tag = /* @__PURE__ */ forwardRef27(({ asChild, palette = "neutral", classNames, ...props }, forwardedRef) => {
4029
+ const { tx } = useThemeContext();
4030
+ const Comp = asChild ? Slot22 : Primitive22.span;
4031
+ return /* @__PURE__ */ React41.createElement(Comp, {
4032
+ ...props,
4033
+ className: tx("tag.root", {
4034
+ palette
4035
+ }, classNames),
4036
+ "data-hue": palette,
4037
+ ref: forwardedRef
4038
+ });
4039
+ });
4040
+
4041
+ // src/components/Toast/Toast.tsx
4042
+ import { Primitive as Primitive23 } from "@radix-ui/react-primitive";
4043
+ import { Slot as Slot23 } from "@radix-ui/react-slot";
4044
+ import * as ToastPrimitive from "@radix-ui/react-toast";
4045
+ import React42, { forwardRef as forwardRef28 } from "react";
4046
+ var ToastProvider = ToastPrimitive.Provider;
4047
+ var ToastViewport = /* @__PURE__ */ forwardRef28(({ classNames, ...props }, forwardedRef) => {
4048
+ const { tx } = useThemeContext();
4049
+ return /* @__PURE__ */ React42.createElement(ToastPrimitive.Viewport, {
4050
+ ...props,
4051
+ className: tx("toast.viewport", {}, classNames),
4052
+ ref: forwardedRef
4053
+ });
4054
+ });
4055
+ var ToastRoot = /* @__PURE__ */ forwardRef28(({ classNames, children, ...props }, forwardedRef) => {
4056
+ const { tx } = useThemeContext();
4057
+ return /* @__PURE__ */ React42.createElement(ToastPrimitive.Root, {
4058
+ ...props,
4059
+ className: tx("toast.root", {}, classNames),
4060
+ ref: forwardedRef
4061
+ }, /* @__PURE__ */ React42.createElement(ElevationProvider, {
4062
+ elevation: "toast"
4063
+ }, children));
4064
+ });
4065
+ var ToastBody = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4066
+ const { tx } = useThemeContext();
4067
+ const Comp = asChild ? Slot23 : Primitive23.div;
4068
+ return /* @__PURE__ */ React42.createElement(Comp, {
4069
+ ...props,
4070
+ className: tx("toast.body", {}, classNames),
4071
+ ref: forwardedRef
4072
+ });
4073
+ });
4074
+ var ToastTitle = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4075
+ const { tx } = useThemeContext();
4076
+ const Comp = asChild ? Slot23 : ToastPrimitive.Title;
4077
+ return /* @__PURE__ */ React42.createElement(Comp, {
4078
+ ...props,
4079
+ className: tx("toast.title", {}, classNames),
4080
+ ref: forwardedRef
4081
+ });
4082
+ });
4083
+ var ToastDescription = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4084
+ const { tx } = useThemeContext();
4085
+ const Comp = asChild ? Slot23 : ToastPrimitive.Description;
4086
+ return /* @__PURE__ */ React42.createElement(Comp, {
4087
+ ...props,
4088
+ className: tx("toast.description", {}, classNames),
4089
+ ref: forwardedRef
4090
+ });
4091
+ });
4092
+ var ToastActions = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4093
+ const { tx } = useThemeContext();
4094
+ const Comp = asChild ? Slot23 : Primitive23.div;
4095
+ return /* @__PURE__ */ React42.createElement(Comp, {
4096
+ ...props,
4097
+ className: tx("toast.actions", {}, classNames),
4098
+ ref: forwardedRef
4099
+ });
4100
+ });
4101
+ var ToastAction = ToastPrimitive.Action;
4102
+ var ToastClose = ToastPrimitive.Close;
4103
+ var Toast = {
4104
+ Provider: ToastProvider,
4105
+ Viewport: ToastViewport,
4106
+ Root: ToastRoot,
4107
+ Body: ToastBody,
4108
+ Title: ToastTitle,
4109
+ Description: ToastDescription,
4110
+ Actions: ToastActions,
4111
+ Action: ToastAction,
4112
+ Close: ToastClose
4113
+ };
79
4114
  export {
80
4115
  AlertDialog,
81
- AnchoredOverflow,
82
4116
  Avatar,
83
4117
  BUTTON_GROUP_NAME,
84
4118
  Breadcrumb,
85
4119
  Button,
86
4120
  ButtonGroup,
87
4121
  Callout,
4122
+ Card,
88
4123
  Clipboard,
89
- ContextMenu,
4124
+ Column,
4125
+ Container,
4126
+ ContextMenu2 as ContextMenu,
90
4127
  DensityContext,
91
4128
  DensityProvider,
92
4129
  Dialog,
93
4130
  DropdownMenu,
94
4131
  ElevationContext,
95
4132
  ElevationProvider,
4133
+ ErrorBoundary,
4134
+ ErrorFallback,
4135
+ ErrorStack,
4136
+ Flex,
4137
+ Focus,
4138
+ Grid,
96
4139
  Icon,
97
4140
  IconButton,
4141
+ Image,
98
4142
  Input,
99
4143
  LIST_ITEM_NAME,
100
4144
  LIST_NAME,
@@ -103,17 +4147,25 @@ export {
103
4147
  ListItem,
104
4148
  Main,
105
4149
  Message,
4150
+ Panel,
106
4151
  Popover,
107
4152
  ScrollArea,
4153
+ ScrollContainer,
108
4154
  Select,
109
- Separator,
4155
+ Separator3 as Separator,
4156
+ Skeleton,
4157
+ Splitter,
110
4158
  Status,
4159
+ TREEGRID_PARENT_OF_SEPARATOR,
4160
+ TREEGRID_PATH_SEPARATOR,
111
4161
  Tag,
112
4162
  ThemeContext,
113
4163
  ThemeProvider,
4164
+ ThrowError,
114
4165
  Toast,
115
4166
  Toggle,
116
4167
  ToggleGroup,
4168
+ ToggleGroupIconItem,
117
4169
  ToggleGroupItem,
118
4170
  Toolbar,
119
4171
  Tooltip,
@@ -123,11 +4175,13 @@ export {
123
4175
  Treegrid,
124
4176
  createDropdownMenuScope,
125
4177
  createPopoverScope,
4178
+ createSplitterScope,
126
4179
  createTooltipScope,
127
4180
  hasIosKeyboard,
128
4181
  initialSafeArea,
129
4182
  isLabel,
130
4183
  messageIcons,
4184
+ parseCaptureOwnerStack,
131
4185
  toLocalizedString,
132
4186
  useAvatarContext,
133
4187
  useButtonGroupContext,
@@ -136,12 +4190,16 @@ export {
136
4190
  useDropdownMenuContext,
137
4191
  useDropdownMenuMenuScope,
138
4192
  useElevationContext,
4193
+ useFocus,
139
4194
  useIconHref,
140
4195
  useLandmarkMover,
141
4196
  useListContext,
142
4197
  useListItemContext,
143
4198
  useMainContext,
4199
+ usePx,
144
4200
  useSafeArea,
4201
+ useSafeCollisionPadding,
4202
+ useScrollContainerContext,
145
4203
  useSidebars,
146
4204
  useThemeContext,
147
4205
  useTooltipContext,