@dxos/react-ui 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5

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