@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.40e3dcdf1b

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