@dxos/react-ui 0.8.4-main.67995b8 → 0.8.4-main.6fa680abb7

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