@dxos/react-ui 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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