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

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