@dxos/react-ui 0.8.4-main.dedc0f3 → 0.8.4-main.e00bdcdb52

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