@dxos/react-ui 0.8.4-main.c1de068 → 0.8.4-main.c351d160a8

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