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

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