@dxos/plugin-deck 0.8.4-main.b97322e → 0.8.4-main.bc674ce

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 (277) hide show
  1. package/dist/lib/browser/app-graph-builder-DTVCULQ4.mjs +120 -0
  2. package/dist/lib/browser/app-graph-builder-DTVCULQ4.mjs.map +7 -0
  3. package/dist/lib/browser/{check-app-scheme-57U62A3A.mjs → check-app-scheme-JSRXXIYF.mjs} +9 -9
  4. package/dist/lib/browser/check-app-scheme-JSRXXIYF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-F5BQOOEG.mjs → chunk-ATFPDN6J.mjs} +155 -23
  6. package/dist/lib/browser/chunk-ATFPDN6J.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-CNTGBCMK.mjs → chunk-NHABISX2.mjs} +40 -33
  8. package/dist/lib/browser/chunk-NHABISX2.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-S4A5UO4K.mjs +1448 -0
  10. package/dist/lib/browser/chunk-S4A5UO4K.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-UNG4CLLP.mjs +161 -0
  12. package/dist/lib/browser/chunk-UNG4CLLP.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +79 -67
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/operation-resolver-CDYBLZJ4.mjs +595 -0
  17. package/dist/lib/browser/operation-resolver-CDYBLZJ4.mjs.map +7 -0
  18. package/dist/lib/browser/react-root-XDCMNENQ.mjs +47 -0
  19. package/dist/lib/browser/react-root-XDCMNENQ.mjs.map +7 -0
  20. package/dist/lib/browser/react-surface-HODERLOL.mjs +42 -0
  21. package/dist/lib/browser/react-surface-HODERLOL.mjs.map +7 -0
  22. package/dist/lib/browser/settings-OMHVGZ6V.mjs +37 -0
  23. package/dist/lib/browser/settings-OMHVGZ6V.mjs.map +7 -0
  24. package/dist/lib/browser/state-OC3BSB6E.mjs +103 -0
  25. package/dist/lib/browser/state-OC3BSB6E.mjs.map +7 -0
  26. package/dist/lib/browser/toolkit-R53LD3EA.mjs +53 -0
  27. package/dist/lib/browser/toolkit-R53LD3EA.mjs.map +7 -0
  28. package/dist/lib/browser/types/index.mjs +11 -4
  29. package/dist/lib/browser/url-handler-53TE6JZO.mjs +93 -0
  30. package/dist/lib/browser/url-handler-53TE6JZO.mjs.map +7 -0
  31. package/dist/lib/node-esm/app-graph-builder-473BNZDJ.mjs +121 -0
  32. package/dist/lib/node-esm/app-graph-builder-473BNZDJ.mjs.map +7 -0
  33. package/dist/lib/node-esm/check-app-scheme-IVYRHKRH.mjs +33 -0
  34. package/dist/lib/node-esm/check-app-scheme-IVYRHKRH.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-ADPMWKLL.mjs +154 -0
  36. package/dist/lib/node-esm/chunk-ADPMWKLL.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-D34L3ECT.mjs +1449 -0
  38. package/dist/lib/node-esm/chunk-D34L3ECT.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-SKEVPQ7E.mjs +162 -0
  40. package/dist/lib/node-esm/chunk-SKEVPQ7E.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-XAKTY3EB.mjs +294 -0
  42. package/dist/lib/node-esm/chunk-XAKTY3EB.mjs.map +7 -0
  43. package/dist/lib/node-esm/index.mjs +181 -0
  44. package/dist/lib/node-esm/index.mjs.map +7 -0
  45. package/dist/lib/node-esm/meta.json +1 -0
  46. package/dist/lib/node-esm/operation-resolver-WUOE33ID.mjs +596 -0
  47. package/dist/lib/node-esm/operation-resolver-WUOE33ID.mjs.map +7 -0
  48. package/dist/lib/node-esm/react-root-O6GZO62Z.mjs +48 -0
  49. package/dist/lib/node-esm/react-root-O6GZO62Z.mjs.map +7 -0
  50. package/dist/lib/node-esm/react-surface-IHDJDGC5.mjs +43 -0
  51. package/dist/lib/node-esm/react-surface-IHDJDGC5.mjs.map +7 -0
  52. package/dist/lib/node-esm/settings-2HB6FKIK.mjs +38 -0
  53. package/dist/lib/node-esm/settings-2HB6FKIK.mjs.map +7 -0
  54. package/dist/lib/node-esm/state-JRQ45ACJ.mjs +104 -0
  55. package/dist/lib/node-esm/state-JRQ45ACJ.mjs.map +7 -0
  56. package/dist/lib/node-esm/toolkit-JLPZNNKB.mjs +54 -0
  57. package/dist/lib/node-esm/toolkit-JLPZNNKB.mjs.map +7 -0
  58. package/dist/lib/node-esm/types/index.mjs +40 -0
  59. package/dist/lib/node-esm/url-handler-QGF2R24T.mjs +94 -0
  60. package/dist/lib/node-esm/url-handler-QGF2R24T.mjs.map +7 -0
  61. package/dist/types/src/DeckPlugin.d.ts +2 -1
  62. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  64. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +5 -0
  68. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/check-app-scheme/index.d.ts +3 -0
  70. package/dist/types/src/capabilities/check-app-scheme/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/index.d.ts +8 -13
  72. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  74. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  76. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  78. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  80. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  84. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/settings/index.d.ts +19 -0
  86. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/settings/settings.d.ts +21 -0
  88. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/state/index.d.ts +172 -0
  90. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/state/state.d.ts +175 -0
  92. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/toolkit/index.d.ts +3 -0
  94. package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/toolkit/toolkit.d.ts +26 -0
  96. package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/tools/index.d.ts +3 -0
  98. package/dist/types/src/capabilities/tools/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/tools/tools.d.ts +12 -0
  100. package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/url-handler/index.d.ts +3 -0
  102. package/dist/types/src/capabilities/url-handler/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +5 -0
  104. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -0
  105. package/dist/types/src/components/DeckLayout/Banner.d.ts.map +1 -1
  106. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +1 -1
  107. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts +2 -3
  108. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
  109. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +74 -0
  110. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/DeckLayout/DeckMain.d.ts +3 -0
  112. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -0
  113. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
  114. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
  115. package/dist/types/src/components/DeckLayout/Toast.d.ts +7 -2
  116. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
  117. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +4 -2
  118. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +1 -1
  119. package/dist/types/src/components/Plank/Plank.d.ts +4 -4
  120. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
  121. package/dist/types/src/components/Plank/Plank.stories.d.ts +104 -5
  122. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/Plank/PlankControls.d.ts +1 -1
  124. package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
  125. package/dist/types/src/components/Plank/PlankError.d.ts +1 -1
  126. package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
  127. package/dist/types/src/components/Plank/PlankHeading.d.ts +3 -3
  128. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
  129. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  130. package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +1 -1
  131. package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +1 -1
  132. package/dist/types/src/hooks/index.d.ts +1 -0
  133. package/dist/types/src/hooks/index.d.ts.map +1 -1
  134. package/dist/types/src/hooks/useDeckCompanions.d.ts +3 -3
  135. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useDeckState.d.ts +17 -0
  137. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
  138. package/dist/types/src/hooks/useHoistStatusbar.d.ts +1 -1
  139. package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +1 -1
  140. package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
  141. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  142. package/dist/types/src/index.d.ts +1 -2
  143. package/dist/types/src/index.d.ts.map +1 -1
  144. package/dist/types/src/meta.d.ts +2 -3
  145. package/dist/types/src/meta.d.ts.map +1 -1
  146. package/dist/types/src/translations.d.ts +3 -1
  147. package/dist/types/src/translations.d.ts.map +1 -1
  148. package/dist/types/src/{capabilities → types}/capabilities.d.ts +96 -90
  149. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  150. package/dist/types/src/types/events.d.ts +7 -0
  151. package/dist/types/src/types/events.d.ts.map +1 -0
  152. package/dist/types/src/types/index.d.ts +2 -0
  153. package/dist/types/src/types/index.d.ts.map +1 -1
  154. package/dist/types/src/types/schema.d.ts +90 -30
  155. package/dist/types/src/types/schema.d.ts.map +1 -1
  156. package/dist/types/src/util/set-active.d.ts +18 -3
  157. package/dist/types/src/util/set-active.d.ts.map +1 -1
  158. package/dist/types/tsconfig.tsbuildinfo +1 -1
  159. package/package.json +56 -46
  160. package/src/DeckPlugin.ts +45 -61
  161. package/src/capabilities/app-graph-builder/app-graph-builder.ts +118 -0
  162. package/src/capabilities/app-graph-builder/index.ts +7 -0
  163. package/src/capabilities/{check-app-scheme.ts → check-app-scheme/check-app-scheme.ts} +12 -11
  164. package/src/capabilities/check-app-scheme/index.ts +7 -0
  165. package/src/capabilities/index.ts +9 -13
  166. package/src/capabilities/operation-resolver/index.ts +10 -0
  167. package/src/capabilities/operation-resolver/operation-resolver.ts +555 -0
  168. package/src/capabilities/react-root/index.ts +7 -0
  169. package/src/capabilities/react-root/react-root.tsx +47 -0
  170. package/src/capabilities/react-surface/index.ts +7 -0
  171. package/src/capabilities/react-surface/react-surface.tsx +37 -0
  172. package/src/capabilities/settings/index.ts +7 -0
  173. package/src/capabilities/settings/settings.ts +38 -0
  174. package/src/capabilities/state/index.ts +7 -0
  175. package/src/capabilities/state/state.ts +104 -0
  176. package/src/capabilities/toolkit/index.ts +7 -0
  177. package/src/capabilities/toolkit/toolkit.ts +63 -0
  178. package/src/capabilities/tools/index.ts +7 -0
  179. package/src/capabilities/tools/tools.ts +92 -0
  180. package/src/capabilities/url-handler/index.ts +7 -0
  181. package/src/capabilities/url-handler/url-handler.ts +95 -0
  182. package/src/components/DeckLayout/ActiveNode.tsx +1 -1
  183. package/src/components/DeckLayout/Banner.tsx +6 -6
  184. package/src/components/DeckLayout/ContentEmpty.tsx +4 -5
  185. package/src/components/DeckLayout/DeckLayout.stories.tsx +51 -0
  186. package/src/components/DeckLayout/DeckLayout.tsx +18 -285
  187. package/src/components/DeckLayout/DeckMain.tsx +286 -0
  188. package/src/components/DeckLayout/Dialog.tsx +13 -10
  189. package/src/components/DeckLayout/Fallback.tsx +4 -4
  190. package/src/components/DeckLayout/Popover.tsx +44 -32
  191. package/src/components/DeckLayout/StatusBar.tsx +1 -1
  192. package/src/components/DeckLayout/Toast.tsx +30 -5
  193. package/src/components/DeckSettings/DeckSettings.tsx +91 -66
  194. package/src/components/Plank/Plank.stories.tsx +23 -16
  195. package/src/components/Plank/Plank.tsx +89 -56
  196. package/src/components/Plank/PlankControls.tsx +9 -9
  197. package/src/components/Plank/PlankError.tsx +5 -4
  198. package/src/components/Plank/PlankHeading.tsx +38 -42
  199. package/src/components/Sidebar/ComplementarySidebar.tsx +61 -33
  200. package/src/components/Sidebar/Sidebar.tsx +6 -6
  201. package/src/components/Sidebar/SidebarButton.tsx +39 -32
  202. package/src/components/fragments.ts +1 -1
  203. package/src/hooks/index.ts +1 -0
  204. package/src/hooks/useCompanions.ts +1 -1
  205. package/src/hooks/useDeckCompanions.ts +7 -5
  206. package/src/hooks/useDeckState.ts +82 -0
  207. package/src/hooks/useHoistStatusbar.ts +4 -5
  208. package/src/hooks/useNodeActionExpander.ts +4 -4
  209. package/src/index.ts +1 -2
  210. package/src/meta.ts +8 -5
  211. package/src/translations.ts +3 -1
  212. package/src/types/capabilities.ts +33 -0
  213. package/src/types/events.ts +20 -0
  214. package/src/types/index.ts +2 -0
  215. package/src/types/schema.ts +86 -14
  216. package/src/util/layoutAppliesTopbar.ts +1 -1
  217. package/src/util/set-active.ts +49 -29
  218. package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs +0 -152
  219. package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs.map +0 -7
  220. package/dist/lib/browser/check-app-scheme-57U62A3A.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
  222. package/dist/lib/browser/chunk-D7KTFCUV.mjs +0 -1494
  223. package/dist/lib/browser/chunk-D7KTFCUV.mjs.map +0 -7
  224. package/dist/lib/browser/chunk-F5BQOOEG.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-JFTXENFN.mjs +0 -129
  226. package/dist/lib/browser/chunk-JFTXENFN.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-M57WD3V6.mjs +0 -16
  228. package/dist/lib/browser/chunk-M57WD3V6.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-QDZO4AJ4.mjs +0 -127
  230. package/dist/lib/browser/chunk-QDZO4AJ4.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-Z5KITAZW.mjs +0 -13
  232. package/dist/lib/browser/chunk-Z5KITAZW.mjs.map +0 -7
  233. package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs +0 -521
  234. package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs.map +0 -7
  235. package/dist/lib/browser/react-root-PO64J7ML.mjs +0 -43
  236. package/dist/lib/browser/react-root-PO64J7ML.mjs.map +0 -7
  237. package/dist/lib/browser/react-surface-E45YOVF5.mjs +0 -40
  238. package/dist/lib/browser/react-surface-E45YOVF5.mjs.map +0 -7
  239. package/dist/lib/browser/settings-6AJZPZPM.mjs +0 -29
  240. package/dist/lib/browser/settings-6AJZPZPM.mjs.map +0 -7
  241. package/dist/lib/browser/state-MVDYX77Y.mjs +0 -12
  242. package/dist/lib/browser/tools-TKQDPCHJ.mjs +0 -88
  243. package/dist/lib/browser/tools-TKQDPCHJ.mjs.map +0 -7
  244. package/dist/lib/browser/url-handler-7L7M6IKH.mjs +0 -70
  245. package/dist/lib/browser/url-handler-7L7M6IKH.mjs.map +0 -7
  246. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  247. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  248. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  249. package/dist/types/src/capabilities/check-app-scheme.d.ts +0 -4
  250. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +0 -1
  251. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  252. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  253. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  254. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  255. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  256. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  257. package/dist/types/src/capabilities/settings.d.ts +0 -4
  258. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  259. package/dist/types/src/capabilities/state.d.ts +0 -101
  260. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  261. package/dist/types/src/capabilities/tools.d.ts +0 -11
  262. package/dist/types/src/capabilities/tools.d.ts.map +0 -1
  263. package/dist/types/src/capabilities/url-handler.d.ts +0 -4
  264. package/dist/types/src/capabilities/url-handler.d.ts.map +0 -1
  265. package/dist/types/src/events.d.ts +0 -4
  266. package/dist/types/src/events.d.ts.map +0 -1
  267. package/src/capabilities/app-graph-builder.ts +0 -141
  268. package/src/capabilities/capabilities.ts +0 -14
  269. package/src/capabilities/intent-resolver.ts +0 -468
  270. package/src/capabilities/react-root.tsx +0 -38
  271. package/src/capabilities/react-surface.tsx +0 -30
  272. package/src/capabilities/settings.ts +0 -26
  273. package/src/capabilities/state.ts +0 -104
  274. package/src/capabilities/tools.ts +0 -81
  275. package/src/capabilities/url-handler.ts +0 -59
  276. package/src/events.ts +0 -11
  277. /package/dist/lib/{browser/state-MVDYX77Y.mjs.map → node-esm/types/index.mjs.map} +0 -0
@@ -0,0 +1,1449 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ getCompanionId,
4
+ useBreakpoints,
5
+ useCompanions,
6
+ useDeckCompanions,
7
+ useDeckState,
8
+ useHoistStatusbar,
9
+ useMainSize,
10
+ useNodeActionExpander
11
+ } from "./chunk-SKEVPQ7E.mjs";
12
+ import {
13
+ calculateOverscroll,
14
+ layoutAppliesTopbar,
15
+ parseEntryId
16
+ } from "./chunk-ADPMWKLL.mjs";
17
+ import {
18
+ DeckCapabilities,
19
+ DeckOperation,
20
+ NewPlankPositions,
21
+ OverscrollOptions,
22
+ PLANK_COMPANION_TYPE,
23
+ getMode,
24
+ meta
25
+ } from "./chunk-XAKTY3EB.mjs";
26
+
27
+ // src/components/DeckLayout/Banner.tsx
28
+ import React9 from "react";
29
+ import { Surface as Surface5 } from "@dxos/app-framework/react";
30
+ import { useTranslation as useTranslation6 } from "@dxos/react-ui";
31
+ import { mx as mx5, osTranslations } from "@dxos/ui-theme";
32
+
33
+ // src/components/Sidebar/ComplementarySidebar.tsx
34
+ import React7, { Fragment as Fragment2, useCallback as useCallback5, useEffect as useEffect3, useMemo as useMemo3, useState as useState2 } from "react";
35
+ import { Common as Common4 } from "@dxos/app-framework";
36
+ import { Surface as Surface3, useOperationInvoker as useOperationInvoker5 } from "@dxos/app-framework/react";
37
+ import { IconButton as IconButton4, Main, toLocalizedString as toLocalizedString2, useTranslation as useTranslation5 } from "@dxos/react-ui";
38
+ import { Tabs } from "@dxos/react-ui-tabs";
39
+ import { mx as mx4 } from "@dxos/ui-theme";
40
+
41
+ // src/components/Plank/Plank.tsx
42
+ import { useFocusFinders } from "@fluentui/react-tabster";
43
+ import React5, { memo as memo2, useCallback as useCallback3, useLayoutEffect, useMemo as useMemo2, useRef } from "react";
44
+ import { Common as Common2 } from "@dxos/app-framework";
45
+ import { Surface as Surface2, useAppGraph as useAppGraph2, useOperationInvoker as useOperationInvoker3 } from "@dxos/app-framework/react";
46
+ import { debounce } from "@dxos/async";
47
+ import { useNode } from "@dxos/plugin-graph";
48
+ import { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from "@dxos/react-ui-attention";
49
+ import { StackItem as StackItem2, railGridHorizontal } from "@dxos/react-ui-stack";
50
+ import { mainIntrinsicSize, mx as mx3 } from "@dxos/ui-theme";
51
+
52
+ // src/components/Plank/PlankError.tsx
53
+ import React4, { useEffect as useEffect2, useState } from "react";
54
+ import { useTranslation as useTranslation3 } from "@dxos/react-ui";
55
+ import { descriptionMessage, mx as mx2 } from "@dxos/ui-theme";
56
+
57
+ // src/components/Plank/PlankHeading.tsx
58
+ import React2, { Fragment, memo, useCallback as useCallback2, useEffect, useMemo } from "react";
59
+ import { Common } from "@dxos/app-framework";
60
+ import { Surface, useAppGraph, useOperationInvoker as useOperationInvoker2 } from "@dxos/app-framework/react";
61
+ import { Graph, useActionRunner } from "@dxos/plugin-graph";
62
+ import { Icon, IconButton as IconButton2, Popover, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
63
+ import { StackItem } from "@dxos/react-ui-stack";
64
+ import { TextTooltip } from "@dxos/react-ui-text-tooltip";
65
+ import { hoverableControls, hoverableFocusedWithinControls } from "@dxos/ui-theme";
66
+
67
+ // src/components/fragments.ts
68
+ import { mx } from "@dxos/ui-theme";
69
+ var soloInlinePadding = "pis-[calc(env(safe-area-inset-left)+.25rem)] pie-[calc(env(safe-area-inset-left)+.25rem)]";
70
+ var sidebarToggleStyles = "bs-[--rail-item] is-[--rail-item] absolute block-end-2 z-[1] !bg-deckSurface lg:hidden";
71
+ var fixedSidebarToggleStyles = mx(sidebarToggleStyles, "inline-start-2");
72
+ var fixedComplementarySidebarToggleStyles = mx(sidebarToggleStyles, "inline-end-2");
73
+
74
+ // src/components/Plank/PlankControls.tsx
75
+ import React, { forwardRef, useCallback } from "react";
76
+ import { useOperationInvoker } from "@dxos/app-framework/react";
77
+ import { invariant } from "@dxos/invariant";
78
+ import { ButtonGroup, IconButton, useTranslation } from "@dxos/react-ui";
79
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-deck/src/components/Plank/PlankControls.tsx";
80
+ var PlankControl = ({ icon, label: label3, ...props }) => {
81
+ return /* @__PURE__ */ React.createElement(IconButton, {
82
+ label: label3,
83
+ icon,
84
+ iconOnly: true,
85
+ variant: "ghost",
86
+ tooltipSide: "bottom",
87
+ ...props
88
+ });
89
+ };
90
+ var plankControlSpacing = "pli-2";
91
+ var PlankCompanionControls = /* @__PURE__ */ forwardRef(({ primary }, forwardedRef) => {
92
+ const { t } = useTranslation(meta.id);
93
+ const { invokePromise } = useOperationInvoker();
94
+ const handleCloseCompanion = useCallback(() => {
95
+ invariant(primary, void 0, {
96
+ F: __dxlog_file,
97
+ L: 49,
98
+ S: void 0,
99
+ A: [
100
+ "primary",
101
+ ""
102
+ ]
103
+ });
104
+ return invokePromise(DeckOperation.ChangeCompanion, {
105
+ primary,
106
+ companion: null
107
+ });
108
+ }, [
109
+ invokePromise,
110
+ primary
111
+ ]);
112
+ return /* @__PURE__ */ React.createElement("div", {
113
+ ref: forwardedRef,
114
+ className: "contents app-no-drag"
115
+ }, /* @__PURE__ */ React.createElement(PlankControl, {
116
+ label: t("close companion label"),
117
+ variant: "ghost",
118
+ icon: "ph--x--regular",
119
+ onClick: handleCloseCompanion,
120
+ classNames: plankControlSpacing
121
+ }));
122
+ });
123
+ var PlankControls = /* @__PURE__ */ forwardRef(({ children, classNames, variant = "default", capabilities, layoutMode, pin, close = false, onClick, ...props }, forwardedRef) => {
124
+ const { t } = useTranslation(meta.id);
125
+ const buttonClassNames = variant === "hide-disabled" ? `disabled:hidden ${plankControlSpacing}` : plankControlSpacing;
126
+ const layoutIsAnySolo = !!layoutMode?.startsWith("solo");
127
+ return /* @__PURE__ */ React.createElement(ButtonGroup, {
128
+ ...props,
129
+ classNames: [
130
+ "app-no-drag !opacity-100",
131
+ classNames
132
+ ],
133
+ ref: forwardedRef
134
+ }, capabilities.deck ? /* @__PURE__ */ React.createElement(React.Fragment, null, capabilities.solo && /* @__PURE__ */ React.createElement(React.Fragment, null, layoutMode === "solo" && /* @__PURE__ */ React.createElement(PlankControl, {
135
+ label: t("show fullscreen plank label"),
136
+ classNames: buttonClassNames,
137
+ icon: "ph--corners-out--regular",
138
+ onClick: () => onClick?.("solo--fullscreen")
139
+ }), /* @__PURE__ */ React.createElement(PlankControl, {
140
+ label: t(layoutMode === "solo--fullscreen" ? "exit fullscreen label" : layoutIsAnySolo ? "show deck plank label" : "show solo plank label"),
141
+ classNames: buttonClassNames,
142
+ icon: layoutMode === "solo--fullscreen" ? "ph--corners-in--regular" : layoutIsAnySolo ? "ph--arrows-in-line-horizontal--regular" : "ph--arrows-out-line-horizontal--regular",
143
+ onClick: () => onClick?.(layoutMode === "solo--fullscreen" ? "solo--fullscreen" : "solo")
144
+ })), !layoutIsAnySolo && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(PlankControl, {
145
+ label: t("increment start label"),
146
+ disabled: !capabilities.incrementStart,
147
+ classNames: buttonClassNames,
148
+ icon: "ph--caret-left--regular",
149
+ onClick: () => onClick?.("increment-start")
150
+ }), /* @__PURE__ */ React.createElement(PlankControl, {
151
+ label: t("increment end label"),
152
+ disabled: !capabilities.incrementEnd,
153
+ classNames: buttonClassNames,
154
+ icon: "ph--caret-right--regular",
155
+ onClick: () => onClick?.("increment-end")
156
+ }))) : capabilities.fullscreen && /* @__PURE__ */ React.createElement(PlankControl, {
157
+ label: t(layoutMode === "solo--fullscreen" ? "exit fullscreen label" : "show fullscreen plank label"),
158
+ classNames: buttonClassNames,
159
+ icon: layoutMode === "solo--fullscreen" ? "ph--corners-in--regular" : "ph--corners-out--regular",
160
+ onClick: () => onClick?.("solo--fullscreen")
161
+ }), close && !layoutIsAnySolo && /* @__PURE__ */ React.createElement(PlankControl, {
162
+ label: t(`${typeof close === "string" ? "minify" : "close"} label`),
163
+ classNames: buttonClassNames,
164
+ "data-testid": "plankHeading.close",
165
+ icon: close === "minify-start" ? "ph--caret-line-left--regular" : close === "minify-end" ? "ph--caret-line-right--regular" : "ph--x--regular",
166
+ onClick: () => onClick?.("close")
167
+ }), capabilities.companion && /* @__PURE__ */ React.createElement(PlankControl, {
168
+ label: t("open companion label"),
169
+ classNames: buttonClassNames,
170
+ "data-testid": "plankHeading.companion",
171
+ icon: "ph--square-split-horizontal--regular",
172
+ onClick: () => onClick?.("companion")
173
+ }), children);
174
+ });
175
+
176
+ // src/components/Plank/PlankHeading.tsx
177
+ var MAX_COMPANIONS = 5;
178
+ var PlankHeading = /* @__PURE__ */ memo(({ id, part, node, deckEnabled, canIncrementStart, canIncrementEnd, popoverAnchorId, primaryId, pending, companioned, companions, layoutMode, actions = [] }) => {
179
+ const { t } = useTranslation2(meta.id);
180
+ const { invokePromise, invokeSync } = useOperationInvoker2();
181
+ const runAction = useActionRunner();
182
+ const { graph } = useAppGraph();
183
+ const breakpoint = useBreakpoints();
184
+ const icon = node?.properties?.icon ?? "ph--placeholder--regular";
185
+ const label3 = pending ? t("pending heading") : toLocalizedString(node?.properties?.label ?? [
186
+ "plank heading fallback label",
187
+ {
188
+ ns: meta.id
189
+ }
190
+ ], t);
191
+ const isCompanionNode = node?.type === PLANK_COMPANION_TYPE;
192
+ useEffect(() => {
193
+ const frame = requestAnimationFrame(() => {
194
+ if (node) {
195
+ void Graph.expand(graph, node.id);
196
+ }
197
+ });
198
+ return () => cancelAnimationFrame(frame);
199
+ }, [
200
+ node
201
+ ]);
202
+ const attendableId = primaryId ?? id;
203
+ const capabilities = useMemo(() => ({
204
+ deck: deckEnabled ?? true,
205
+ solo: breakpoint !== "mobile" && (part === "solo" || part === "deck"),
206
+ incrementStart: canIncrementStart,
207
+ incrementEnd: canIncrementEnd,
208
+ fullscreen: !isCompanionNode,
209
+ companion: !isCompanionNode && companions && companions.length > 0
210
+ }), [
211
+ breakpoint,
212
+ part,
213
+ companions,
214
+ canIncrementStart,
215
+ canIncrementEnd,
216
+ isCompanionNode,
217
+ deckEnabled
218
+ ]);
219
+ const { variant } = parseEntryId(id);
220
+ const sigilActions = useMemo(() => {
221
+ if (!node) {
222
+ return void 0;
223
+ } else if (variant) {
224
+ return [];
225
+ } else {
226
+ return [
227
+ actions,
228
+ Graph.getActions(graph, node.id).filter((a) => [
229
+ "list-item",
230
+ "list-item-primary",
231
+ "heading-list-item"
232
+ ].includes(a.properties.disposition))
233
+ ].filter((a) => a.length > 0);
234
+ }
235
+ }, [
236
+ actions,
237
+ node,
238
+ variant,
239
+ graph
240
+ ]);
241
+ const handleAction = useCallback2((action) => {
242
+ if (typeof action.data === "function") {
243
+ void runAction(action, {
244
+ parent: node,
245
+ caller: meta.id
246
+ });
247
+ }
248
+ }, [
249
+ node,
250
+ runAction
251
+ ]);
252
+ const handlePlankAction = useCallback2((eventType) => {
253
+ if (eventType.startsWith("solo")) {
254
+ return invokePromise(DeckOperation.Adjust, {
255
+ type: eventType,
256
+ id
257
+ });
258
+ } else if (eventType === "close") {
259
+ if (part === "complementary") {
260
+ return invokeSync(Common.LayoutOperation.UpdateComplementary, {
261
+ state: "collapsed"
262
+ });
263
+ } else {
264
+ return invokeSync(Common.LayoutOperation.Close, {
265
+ subject: [
266
+ id
267
+ ]
268
+ });
269
+ }
270
+ } else {
271
+ return invokePromise(DeckOperation.Adjust, {
272
+ type: eventType,
273
+ id
274
+ });
275
+ }
276
+ }, [
277
+ invokePromise,
278
+ invokeSync,
279
+ id,
280
+ part
281
+ ]);
282
+ const ActionRoot = node && popoverAnchorId === `dxos.org/ui/${meta.id}/${node.id}` ? Popover.Anchor : Fragment;
283
+ const handleTabClick = useCallback2((event) => {
284
+ const target = event.target.closest("[data-id]");
285
+ const tabId = target?.dataset?.id;
286
+ if (primaryId && tabId) {
287
+ void invokePromise(DeckOperation.ChangeCompanion, {
288
+ primary: primaryId,
289
+ companion: tabId
290
+ });
291
+ }
292
+ }, [
293
+ primaryId,
294
+ invokePromise
295
+ ]);
296
+ return /* @__PURE__ */ React2.createElement(StackItem.Heading, {
297
+ classNames: [
298
+ "plb-1 items-stretch gap-1 sticky inline-start-12 app-drag min-is-0 contain-layout density-coarse",
299
+ part === "solo" ? soloInlinePadding : "pli-1",
300
+ ...layoutMode === "solo--fullscreen" ? [
301
+ hoverableControls,
302
+ hoverableFocusedWithinControls,
303
+ "*:transition-opacity *:opacity-[--controls-opacity] bg-transparent border-transparent transition-[background-color,border-color]",
304
+ "hover-hover:hover:bg-headerSurface focus-within:bg-headerSurface hover-hover:hover:border-subduedSeparator focus-within:border-subduedSeparator"
305
+ ] : []
306
+ ],
307
+ "data-plank-heading": true
308
+ }, companions && isCompanionNode ? (
309
+ /* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */
310
+ /* @__PURE__ */ React2.createElement("div", {
311
+ role: "none",
312
+ className: "flex-1 min-is-0 overflow-x-auto scrollbar-none flex gap-1"
313
+ }, companions.map(({ id: id2, properties: { icon: icon2, label: label4 } }) => /* @__PURE__ */ React2.createElement(IconButton2, {
314
+ key: id2,
315
+ "data-id": id2,
316
+ icon: icon2,
317
+ iconOnly: companions.length > MAX_COMPANIONS && node?.id !== id2,
318
+ label: toLocalizedString(label4, t),
319
+ variant: node?.id === id2 ? "primary" : "ghost",
320
+ onClick: handleTabClick
321
+ })))
322
+ ) : /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(ActionRoot, null, node && sigilActions ? /* @__PURE__ */ React2.createElement(StackItem.Sigil, {
323
+ icon,
324
+ related: part === "complementary",
325
+ attendableId,
326
+ triggerLabel: t("actions menu label"),
327
+ actions: sigilActions,
328
+ onAction: handleAction
329
+ }, /* @__PURE__ */ React2.createElement(Surface, {
330
+ role: "menu-footer",
331
+ data: {
332
+ subject: node.data
333
+ }
334
+ })) : /* @__PURE__ */ React2.createElement(StackItem.SigilButton, null, /* @__PURE__ */ React2.createElement("span", {
335
+ className: "sr-only"
336
+ }, label3), /* @__PURE__ */ React2.createElement(Icon, {
337
+ icon
338
+ }))), /* @__PURE__ */ React2.createElement(TextTooltip, {
339
+ text: label3,
340
+ onlyWhenTruncating: true
341
+ }, /* @__PURE__ */ React2.createElement(StackItem.HeadingLabel, {
342
+ attendableId,
343
+ related: part === "complementary",
344
+ ...pending && {
345
+ classNames: "text-description"
346
+ }
347
+ }, label3))), node && part !== "complementary" && /* @__PURE__ */ React2.createElement(Surface, {
348
+ role: "navbar-end",
349
+ data: {
350
+ subject: node.data
351
+ }
352
+ }), companioned === "companion" ? /* @__PURE__ */ React2.createElement(PlankCompanionControls, {
353
+ primary: primaryId
354
+ }) : /* @__PURE__ */ React2.createElement(PlankControls, {
355
+ capabilities,
356
+ layoutMode,
357
+ close: part === "complementary" ? "minify-end" : true,
358
+ onClick: handlePlankAction
359
+ }));
360
+ });
361
+
362
+ // src/components/Plank/PlankLoading.tsx
363
+ import React3 from "react";
364
+ var PlankLoading = () => {
365
+ return /* @__PURE__ */ React3.createElement("div", {
366
+ role: "none",
367
+ className: "grid place-items-center attention-surface"
368
+ });
369
+ };
370
+
371
+ // src/components/Plank/PlankError.tsx
372
+ var PlankContentError = ({ error }) => {
373
+ const { t } = useTranslation3(meta.id);
374
+ const errorString = error?.toString() ?? "";
375
+ return /* @__PURE__ */ React4.createElement("div", {
376
+ role: "none",
377
+ className: "overflow-y-auto p-8 attention-surface grid place-items-center"
378
+ }, /* @__PURE__ */ React4.createElement("p", {
379
+ role: "alert",
380
+ className: mx2(descriptionMessage, "break-all rounded-md p-4")
381
+ }, error ? errorString : t("error fallback message")));
382
+ };
383
+ var PlankError = ({ id, part, node, error }) => {
384
+ const [timedOut, setTimedOut] = useState(false);
385
+ useEffect2(() => {
386
+ setTimeout(() => setTimedOut(true), 5e3);
387
+ }, []);
388
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(PlankHeading, {
389
+ id,
390
+ part,
391
+ node,
392
+ pending: !timedOut
393
+ }), timedOut ? /* @__PURE__ */ React4.createElement(PlankContentError, {
394
+ error
395
+ }) : /* @__PURE__ */ React4.createElement(PlankLoading, null));
396
+ };
397
+
398
+ // src/components/Plank/Plank.tsx
399
+ var UNKNOWN_ID = "unknown_id";
400
+ var Plank = /* @__PURE__ */ memo2(({ id = UNKNOWN_ID, companionId, ...props }) => {
401
+ const { graph } = useAppGraph2();
402
+ const node = useNode(graph, id);
403
+ const companions = useCompanions(id);
404
+ const currentCompanion = companions.find(({ id: id2 }) => id2 === companionId);
405
+ const hasCompanion = !!(companionId && currentCompanion);
406
+ return /* @__PURE__ */ React5.createElement(PlankContainer, {
407
+ solo: props.part === "solo",
408
+ companion: hasCompanion,
409
+ encapsulate: !!props.settings?.encapsulatedPlanks
410
+ }, /* @__PURE__ */ React5.createElement(PlankComponent, {
411
+ id,
412
+ node,
413
+ companioned: hasCompanion ? "primary" : void 0,
414
+ companions: hasCompanion ? [] : companions,
415
+ ...props,
416
+ ...props.part === "solo" ? {
417
+ part: "solo-primary"
418
+ } : {}
419
+ }), hasCompanion && /* @__PURE__ */ React5.createElement(PlankComponent, {
420
+ id: companionId,
421
+ node: currentCompanion,
422
+ primary: node,
423
+ companions,
424
+ companioned: "companion",
425
+ ...props,
426
+ ...props.part === "solo" ? {
427
+ part: "solo-companion"
428
+ } : {
429
+ order: (props.order ?? 0) + 1
430
+ }
431
+ }));
432
+ });
433
+ var PlankContainer = ({ children, solo, companion, encapsulate }) => {
434
+ const sizeAttrs = useMainSize();
435
+ if (!solo) {
436
+ return children;
437
+ }
438
+ return /* @__PURE__ */ React5.createElement("div", {
439
+ role: "none",
440
+ "data-popover-collision-boundary": true,
441
+ className: mx3("absolute inset-[--main-spacing] grid", encapsulate && "border border-separator rounded overflow-hidden", companion && "grid-cols-[6fr_4fr]", railGridHorizontal, mainIntrinsicSize),
442
+ ...sizeAttrs
443
+ }, children);
444
+ };
445
+ var PlankComponent = /* @__PURE__ */ memo2(({ layoutMode, id, part, path, order, active, companioned, node, primary, companions, settings }) => {
446
+ const { invokePromise } = useOperationInvoker3();
447
+ const { state, deck } = useDeckState();
448
+ const { popoverAnchorId, scrollIntoView } = state;
449
+ const { findFirstFocusable } = useFocusFinders();
450
+ const canResize = layoutMode === "deck";
451
+ const attentionAttrs = useAttentionAttributes(primary?.id ?? id);
452
+ const index = active ? active.findIndex((entryId) => entryId === id) : 0;
453
+ const length = active?.length ?? 1;
454
+ const canIncrementStart = active && index !== void 0 && index > 0 && length !== void 0 && length > 1;
455
+ const canIncrementEnd = active && index !== void 0 && index < length - 1 && length !== void 0;
456
+ const rootElement = useRef(null);
457
+ const { variant } = parseEntryId(id);
458
+ const sizeKey = `${id.split("+")[0]}${variant ? `${ATTENDABLE_PATH_SEPARATOR}${variant}` : ""}`;
459
+ const size = deck.plankSizing[sizeKey];
460
+ const handleSizeChange = useCallback3(debounce((nextSize) => {
461
+ return invokePromise(DeckOperation.UpdatePlankSize, {
462
+ id: sizeKey,
463
+ size: nextSize
464
+ });
465
+ }, 200), [
466
+ invokePromise,
467
+ sizeKey
468
+ ]);
469
+ const handleKeyDown = useCallback3((event) => {
470
+ if (event.target === event.currentTarget) {
471
+ switch (event.key) {
472
+ case "Escape":
473
+ rootElement.current?.closest("main")?.focus();
474
+ break;
475
+ case "Enter":
476
+ rootElement.current && findFirstFocusable(rootElement.current)?.focus();
477
+ break;
478
+ }
479
+ }
480
+ }, []);
481
+ useLayoutEffect(() => {
482
+ if (scrollIntoView === id) {
483
+ layoutMode === "deck" && rootElement.current?.scrollIntoView({
484
+ behavior: "smooth",
485
+ inline: "center"
486
+ });
487
+ void invokePromise(Common2.LayoutOperation.ScrollIntoView, {
488
+ subject: void 0
489
+ });
490
+ }
491
+ }, [
492
+ id,
493
+ scrollIntoView,
494
+ layoutMode,
495
+ invokePromise
496
+ ]);
497
+ const isSolo = layoutMode.startsWith("solo") && part === "solo";
498
+ const isAttendable = layoutMode.startsWith("solo") && part.startsWith("solo") || layoutMode === "deck" && part === "deck";
499
+ const sizeAttrs = useMainSize();
500
+ const data = useMemo2(() => node && {
501
+ attendableId: id,
502
+ subject: node.data,
503
+ companionTo: primary?.data,
504
+ properties: node.properties,
505
+ variant,
506
+ path,
507
+ popoverAnchorId
508
+ }, [
509
+ node,
510
+ node?.data,
511
+ node?.properties,
512
+ path,
513
+ popoverAnchorId,
514
+ primary?.data,
515
+ variant
516
+ ]);
517
+ const placeholder = useMemo2(() => /* @__PURE__ */ React5.createElement(PlankLoading, null), []);
518
+ const Root = part.startsWith("solo") ? "article" : StackItem2.Root;
519
+ const fullscreen = layoutMode === "solo--fullscreen";
520
+ const className = mx3("attention-surface relative dx-focus-ring-inset-over-all density-coarse", isSolo && "absolute inset-0", isSolo && mainIntrinsicSize, railGridHorizontal, part.startsWith("solo") && "grid", part.startsWith("solo-") && "grid-rows-subgrid row-span-2 min-is-0", fullscreen && "grid-rows-1", part === "deck" && (companioned === "companion" ? "!border-separator border-ie" : "!border-separator border-li"), part === "solo-companion" && "!border-separator border-is", settings?.encapsulatedPlanks && !part.startsWith("solo") && "mli-[--main-spacing] !border-separator border rounded overflow-hidden");
521
+ return /* @__PURE__ */ React5.createElement(Root, {
522
+ ref: rootElement,
523
+ "data-testid": "deck.plank",
524
+ "data-popover-collision-boundary": true,
525
+ tabIndex: 0,
526
+ ...part.startsWith("solo") ? {
527
+ ...sizeAttrs,
528
+ className
529
+ } : {
530
+ item: {
531
+ id
532
+ },
533
+ size,
534
+ onSizeChange: handleSizeChange,
535
+ classNames: className,
536
+ order,
537
+ role: "article"
538
+ },
539
+ ...isAttendable ? attentionAttrs : {},
540
+ onKeyDown: handleKeyDown
541
+ }, node ? /* @__PURE__ */ React5.createElement(React5.Fragment, null, !fullscreen && /* @__PURE__ */ React5.createElement(PlankHeading, {
542
+ id,
543
+ part: part.startsWith("solo-") ? "solo" : part,
544
+ node,
545
+ layoutMode,
546
+ deckEnabled: settings?.enableDeck,
547
+ canIncrementStart,
548
+ canIncrementEnd,
549
+ popoverAnchorId,
550
+ primaryId: primary?.id,
551
+ companioned,
552
+ companions
553
+ }), /* @__PURE__ */ React5.createElement(Surface2, {
554
+ key: node.id,
555
+ role: "article",
556
+ data,
557
+ limit: 1,
558
+ fallback: PlankContentError,
559
+ placeholder
560
+ })) : /* @__PURE__ */ React5.createElement(PlankError, {
561
+ id,
562
+ part
563
+ }), canResize && /* @__PURE__ */ React5.createElement(StackItem2.ResizeHandle, null));
564
+ });
565
+
566
+ // src/components/Sidebar/SidebarButton.tsx
567
+ import React6, { useCallback as useCallback4 } from "react";
568
+ import { Common as Common3 } from "@dxos/app-framework";
569
+ import { useOperationInvoker as useOperationInvoker4 } from "@dxos/app-framework/react";
570
+ import { IconButton as IconButton3, useTranslation as useTranslation4 } from "@dxos/react-ui";
571
+ var ToggleSidebarButton = ({ classNames, variant = "ghost" }) => {
572
+ const { state, updateState } = useDeckState();
573
+ const { t } = useTranslation4(meta.id);
574
+ const handleClick = useCallback4(() => {
575
+ updateState((s) => ({
576
+ ...s,
577
+ sidebarState: s.sidebarState === "expanded" ? "collapsed" : "expanded"
578
+ }));
579
+ }, [
580
+ updateState
581
+ ]);
582
+ return /* @__PURE__ */ React6.createElement(IconButton3, {
583
+ variant,
584
+ icon: "ph--sidebar--regular",
585
+ iconOnly: true,
586
+ size: 4,
587
+ label: t("open navigation sidebar label"),
588
+ onClick: handleClick,
589
+ classNames
590
+ });
591
+ };
592
+ var CloseSidebarButton = () => {
593
+ const { updateState } = useDeckState();
594
+ const { t } = useTranslation4(meta.id);
595
+ const handleClick = useCallback4(() => {
596
+ updateState((s) => ({
597
+ ...s,
598
+ sidebarState: "collapsed"
599
+ }));
600
+ }, [
601
+ updateState
602
+ ]);
603
+ return /* @__PURE__ */ React6.createElement(IconButton3, {
604
+ variant: "ghost",
605
+ icon: "ph--caret-line-left--regular",
606
+ iconOnly: true,
607
+ size: 4,
608
+ label: t("close navigation sidebar label"),
609
+ onClick: handleClick,
610
+ classNames: "rounded-none pli-1 dx-focus-ring-inset pie-[max(.5rem,env(safe-area-inset-left))]"
611
+ });
612
+ };
613
+ var ToggleComplementarySidebarButton = ({ inR0, classNames, current }) => {
614
+ const { invokeSync } = useOperationInvoker4();
615
+ const { state, updateState } = useDeckState();
616
+ const { t } = useTranslation4(meta.id);
617
+ const companions = useDeckCompanions();
618
+ const handleClick = useCallback4(() => {
619
+ const nextState = state.complementarySidebarState === "expanded" ? "collapsed" : "expanded";
620
+ updateState((s) => ({
621
+ ...s,
622
+ complementarySidebarState: nextState
623
+ }));
624
+ const subject = state.complementarySidebarPanel ?? (companions[0] && getCompanionId(companions[0].id));
625
+ if (nextState === "expanded" && !current && subject) {
626
+ invokeSync(Common3.LayoutOperation.UpdateComplementary, {
627
+ subject
628
+ });
629
+ }
630
+ }, [
631
+ state,
632
+ updateState,
633
+ current,
634
+ companions,
635
+ invokeSync
636
+ ]);
637
+ return /* @__PURE__ */ React6.createElement(IconButton3, {
638
+ variant: "ghost",
639
+ classNames: [
640
+ "[&>svg]:-scale-x-100",
641
+ classNames
642
+ ],
643
+ icon: "ph--sidebar-simple--regular",
644
+ iconOnly: true,
645
+ label: t("open complementary sidebar label"),
646
+ size: inR0 ? 5 : 4,
647
+ tooltipSide: inR0 ? "left" : void 0,
648
+ onClick: handleClick
649
+ });
650
+ };
651
+
652
+ // src/components/Sidebar/ComplementarySidebar.tsx
653
+ var label = [
654
+ "complementary sidebar title",
655
+ {
656
+ ns: meta.id
657
+ }
658
+ ];
659
+ var ComplementarySidebar = ({ current }) => {
660
+ const { t } = useTranslation5(meta.id);
661
+ const { invokeSync } = useOperationInvoker5();
662
+ const { state, deck, updateState } = useDeckState();
663
+ const layoutMode = getMode(deck);
664
+ const breakpoint = useBreakpoints();
665
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
666
+ const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
667
+ const companions = useDeckCompanions();
668
+ const activeCompanion = companions.find((companion) => getCompanionId(companion.id) === current);
669
+ const activeId = activeCompanion && getCompanionId(activeCompanion.id);
670
+ const [internalValue, setInternalValue] = useState2(activeId);
671
+ useEffect3(() => {
672
+ setInternalValue(activeId);
673
+ }, [
674
+ activeId
675
+ ]);
676
+ const handleTabClick = useCallback5((event) => {
677
+ const nextValue = event.currentTarget.getAttribute("data-value");
678
+ if (nextValue === activeId) {
679
+ updateState((s) => ({
680
+ ...s,
681
+ complementarySidebarState: s.complementarySidebarState === "expanded" ? "collapsed" : "expanded"
682
+ }));
683
+ } else {
684
+ setInternalValue(nextValue);
685
+ updateState((s) => ({
686
+ ...s,
687
+ complementarySidebarState: "expanded"
688
+ }));
689
+ invokeSync(Common4.LayoutOperation.UpdateComplementary, {
690
+ subject: nextValue
691
+ });
692
+ }
693
+ }, [
694
+ state.complementarySidebarState,
695
+ activeId,
696
+ invokeSync,
697
+ updateState
698
+ ]);
699
+ const data = useMemo3(() => activeCompanion && {
700
+ id: activeCompanion.id,
701
+ subject: activeCompanion.data
702
+ }, [
703
+ activeCompanion?.id,
704
+ activeCompanion?.data
705
+ ]);
706
+ useEffect3(() => {
707
+ if (!activeId) {
708
+ invokeSync(Common4.LayoutOperation.UpdateComplementary, {
709
+ state: "collapsed"
710
+ });
711
+ }
712
+ }, [
713
+ activeId,
714
+ invokeSync
715
+ ]);
716
+ return /* @__PURE__ */ React7.createElement(Main.ComplementarySidebar, {
717
+ label,
718
+ classNames: [
719
+ topbar && "block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]",
720
+ hoistStatusbar && "block-end-[--statusbar-size]"
721
+ ]
722
+ }, /* @__PURE__ */ React7.createElement(Tabs.Root, {
723
+ orientation: "vertical",
724
+ verticalVariant: "stateless",
725
+ value: internalValue,
726
+ classNames: "contents"
727
+ }, /* @__PURE__ */ React7.createElement("div", {
728
+ role: "none",
729
+ className: mx4("absolute z-[1] inset-block-0 inline-end-0 !is-[--r0-size]", "pbs-[env(safe-area-inset-top)] pbe-[env(safe-area-inset-bottom)] border-is border-subduedSeparator", "grid grid-cols-1 grid-rows-[1fr_min-content] bg-baseSurface contain-layout app-drag")
730
+ }, /* @__PURE__ */ React7.createElement(Tabs.Tablist, {
731
+ classNames: "grid grid-cols-1 auto-rows-[--rail-action] p-1 gap-1 !overflow-y-auto"
732
+ }, companions.map((companion) => /* @__PURE__ */ React7.createElement(Tabs.Tab, {
733
+ key: getCompanionId(companion.id),
734
+ value: getCompanionId(companion.id),
735
+ asChild: true
736
+ }, /* @__PURE__ */ React7.createElement(IconButton4, {
737
+ label: toLocalizedString2(companion.properties.label, t),
738
+ icon: companion.properties.icon,
739
+ iconOnly: true,
740
+ tooltipSide: "left",
741
+ "data-value": getCompanionId(companion.id),
742
+ variant: activeId === getCompanionId(companion.id) ? state.complementarySidebarState === "expanded" ? "primary" : "default" : "ghost",
743
+ onClick: handleTabClick
744
+ })))), !hoistStatusbar && /* @__PURE__ */ React7.createElement("div", {
745
+ role: "none",
746
+ className: "grid grid-cols-1 auto-rows-[--rail-item] p-1 overflow-y-auto"
747
+ }, /* @__PURE__ */ React7.createElement(Surface3, {
748
+ role: "status-bar--r0-footer",
749
+ limit: 1
750
+ })), /* @__PURE__ */ React7.createElement("div", {
751
+ role: "none",
752
+ className: "hidden lg:grid grid-cols-1 auto-rows-[--rail-action] p-1"
753
+ }, /* @__PURE__ */ React7.createElement(ToggleComplementarySidebarButton, null))), activeId && companions.map((companion) => /* @__PURE__ */ React7.createElement(Tabs.Tabpanel, {
754
+ key: getCompanionId(companion.id),
755
+ value: getCompanionId(companion.id),
756
+ classNames: [
757
+ 'absolute data-[state="inactive"]:-z-[1] overflow-hidden',
758
+ "inset-block-0 inline-start-0 is-[calc(100%-var(--r0-size))] lg:is-[--r1-size]",
759
+ "grid grid-cols-1 grid-rows-[var(--rail-size)_1fr_min-content] pbs-[env(safe-area-inset-top)]"
760
+ ],
761
+ ...state.complementarySidebarState !== "expanded" && {
762
+ inert: true
763
+ }
764
+ }, /* @__PURE__ */ React7.createElement(ComplementarySidebarPanel, {
765
+ companion,
766
+ activeId,
767
+ data,
768
+ hoistStatusbar
769
+ })))));
770
+ };
771
+ var ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }) => {
772
+ const { t } = useTranslation5(meta.id);
773
+ if (getCompanionId(companion.id) !== activeId && !data) {
774
+ return null;
775
+ }
776
+ const Wrapper = companion.properties.fixed ? Fragment2 : ScrollArea;
777
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", {
778
+ role: "none",
779
+ className: "flex items-center p-1 gap-1 border-be border-subduedSeparator"
780
+ }, /* @__PURE__ */ React7.createElement(IconButton4, {
781
+ label: toLocalizedString2(companion.properties.label, t),
782
+ icon: companion.properties.icon,
783
+ iconOnly: true,
784
+ tooltipSide: "left",
785
+ "data-value": getCompanionId(companion.id),
786
+ classNames: "bs-10 is-10",
787
+ variant: "default"
788
+ }), /* @__PURE__ */ React7.createElement("div", {
789
+ role: "none",
790
+ className: "pli-1"
791
+ }, toLocalizedString2(companion.properties.label, t))), /* @__PURE__ */ React7.createElement(Wrapper, null, /* @__PURE__ */ React7.createElement(Surface3, {
792
+ role: `deck-companion--${getCompanionId(companion.id)}`,
793
+ data,
794
+ fallback: PlankContentError,
795
+ placeholder: /* @__PURE__ */ React7.createElement(PlankLoading, null)
796
+ })), !hoistStatusbar && /* @__PURE__ */ React7.createElement("div", {
797
+ role: "contentinfo",
798
+ className: "flex flex-wrap justify-center items-center border-bs border-subduedSeparator pbs-1 pbe-[max(env(safe-area-inset-bottom),0.25rem)]"
799
+ }, /* @__PURE__ */ React7.createElement(Surface3, {
800
+ role: "status-bar--r1-footer",
801
+ limit: 1
802
+ })));
803
+ };
804
+ var ScrollArea = ({ children }) => {
805
+ return /* @__PURE__ */ React7.createElement("div", {
806
+ className: "flex flex-col grow overflow-x-hidden overflow-y-auto scrollbar-thin"
807
+ }, children);
808
+ };
809
+
810
+ // src/components/Sidebar/Sidebar.tsx
811
+ import React8, { useMemo as useMemo4 } from "react";
812
+ import { Surface as Surface4 } from "@dxos/app-framework/react";
813
+ import { Main as Main2 } from "@dxos/react-ui";
814
+ var label2 = [
815
+ "sidebar title",
816
+ {
817
+ ns: meta.id
818
+ }
819
+ ];
820
+ var Sidebar = () => {
821
+ const { state, deck } = useDeckState();
822
+ const { popoverAnchorId, activeDeck: current } = state;
823
+ const breakpoint = useBreakpoints();
824
+ const layoutMode = getMode(deck);
825
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
826
+ const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
827
+ const navigationData = useMemo4(() => ({
828
+ popoverAnchorId,
829
+ topbar,
830
+ hoistStatusbar,
831
+ current
832
+ }), [
833
+ popoverAnchorId,
834
+ topbar,
835
+ hoistStatusbar,
836
+ current
837
+ ]);
838
+ return /* @__PURE__ */ React8.createElement(Main2.NavigationSidebar, {
839
+ label: label2,
840
+ classNames: [
841
+ "grid",
842
+ topbar && "block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]",
843
+ hoistStatusbar && "block-end-[--statusbar-size]"
844
+ ]
845
+ }, /* @__PURE__ */ React8.createElement(Surface4, {
846
+ role: "navigation",
847
+ data: navigationData,
848
+ limit: 1
849
+ }));
850
+ };
851
+
852
+ // src/components/DeckLayout/Banner.tsx
853
+ var Banner = ({ variant, classNames }) => {
854
+ const { t } = useTranslation6(meta.id);
855
+ return /* @__PURE__ */ React9.createElement("header", {
856
+ className: mx5("flex items-stretch relative plb-1 pis-1 pie-2", variant === "topbar" && "fixed inset-inline-0 block-start-[env(safe-area-inset-top)] bs-[--rail-size] border-be border-separator", classNames)
857
+ }, variant === "sidebar" ? /* @__PURE__ */ React9.createElement(CloseSidebarButton, null) : /* @__PURE__ */ React9.createElement(ToggleSidebarButton, null), /* @__PURE__ */ React9.createElement("span", {
858
+ className: "self-center grow mis-1"
859
+ }, t("current app name", {
860
+ ns: osTranslations
861
+ })), variant === "topbar" && /* @__PURE__ */ React9.createElement("div", {
862
+ role: "none",
863
+ className: "absolute inset-0 pointer-events-none"
864
+ }, /* @__PURE__ */ React9.createElement("div", {
865
+ role: "none",
866
+ className: "grid bs-full pointer-fine:p-1 max-is-md mli-auto pointer-events-auto"
867
+ }, /* @__PURE__ */ React9.createElement(Surface5, {
868
+ role: "search-input",
869
+ limit: 1
870
+ }))), /* @__PURE__ */ React9.createElement("span", {
871
+ role: "none",
872
+ className: "grow"
873
+ }), /* @__PURE__ */ React9.createElement(Surface5, {
874
+ role: "header-end",
875
+ limit: 1
876
+ }), /* @__PURE__ */ React9.createElement(Surface5, {
877
+ role: "notch-start",
878
+ limit: 1
879
+ }));
880
+ };
881
+
882
+ // src/components/DeckLayout/DeckLayout.tsx
883
+ import React18 from "react";
884
+ import { Mosaic } from "@dxos/react-ui-mosaic";
885
+
886
+ // src/components/DeckLayout/ActiveNode.tsx
887
+ import React10 from "react";
888
+ import { Surface as Surface6, useAppGraph as useAppGraph3 } from "@dxos/app-framework/react";
889
+ import { useNode as useNode2 } from "@dxos/plugin-graph";
890
+ import { useAttended } from "@dxos/react-ui-attention";
891
+ var ActiveNode = () => {
892
+ const [id] = useAttended();
893
+ const { graph } = useAppGraph3();
894
+ const activeNode = useNode2(graph, id);
895
+ useNodeActionExpander(activeNode);
896
+ return /* @__PURE__ */ React10.createElement("div", {
897
+ role: "none",
898
+ className: "sr-only"
899
+ }, /* @__PURE__ */ React10.createElement(Surface6, {
900
+ role: "document-title",
901
+ data: {
902
+ subject: activeNode
903
+ },
904
+ limit: 1
905
+ }));
906
+ };
907
+
908
+ // src/components/DeckLayout/DeckMain.tsx
909
+ import React14, { Fragment as Fragment3, useCallback as useCallback6, useEffect as useEffect4, useMemo as useMemo5, useRef as useRef2 } from "react";
910
+ import { Common as Common5 } from "@dxos/app-framework";
911
+ import { useAtomCapability, useOperationInvoker as useOperationInvoker6, usePluginManager } from "@dxos/app-framework/react";
912
+ import { AttentionCapabilities } from "@dxos/plugin-attention";
913
+ import { Main as Main3, useMediaQuery, useOnTransition } from "@dxos/react-ui";
914
+ import { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from "@dxos/react-ui-stack";
915
+ import { mainPaddingTransitions, mx as mx6 } from "@dxos/ui-theme";
916
+
917
+ // src/components/DeckLayout/ContentEmpty.tsx
918
+ import React11 from "react";
919
+ import { Surface as Surface7 } from "@dxos/app-framework/react";
920
+ var ContentEmpty = () => {
921
+ const breakpoint = useBreakpoints();
922
+ const { deck } = useDeckState();
923
+ const layoutMode = getMode(deck);
924
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
925
+ return /* @__PURE__ */ React11.createElement("div", {
926
+ role: "none",
927
+ className: "grid place-items-center p-8 relative bg-deckSurface",
928
+ "data-testid": "layoutPlugin.firstRunMessage"
929
+ }, /* @__PURE__ */ React11.createElement(Surface7, {
930
+ role: "keyshortcuts"
931
+ }), !topbar && /* @__PURE__ */ React11.createElement(ToggleSidebarButton, {
932
+ variant: "default",
933
+ classNames: fixedSidebarToggleStyles
934
+ }));
935
+ };
936
+
937
+ // src/components/DeckLayout/StatusBar.tsx
938
+ import React12 from "react";
939
+ import { Surface as Surface8 } from "@dxos/app-framework/react";
940
+ import { useLandmarkMover } from "@dxos/react-ui";
941
+ var StatusBar = ({ showHints }) => {
942
+ const mover = useLandmarkMover(void 0, "3");
943
+ return /* @__PURE__ */ React12.createElement("div", {
944
+ role: "contentinfo",
945
+ className: "fixed block-end-0 inset-inline-0 bs-[--statusbar-size] border-bs border-separator z-[2] flex text-description",
946
+ ...mover
947
+ }, showHints && /* @__PURE__ */ React12.createElement(Surface8, {
948
+ role: "hints",
949
+ limit: 1
950
+ }), /* @__PURE__ */ React12.createElement(Surface8, {
951
+ role: "status-bar",
952
+ limit: 1
953
+ }));
954
+ };
955
+
956
+ // src/components/DeckLayout/Topbar.tsx
957
+ import React13 from "react";
958
+ var Topbar = () => {
959
+ return /* @__PURE__ */ React13.createElement(Banner, {
960
+ variant: "topbar"
961
+ });
962
+ };
963
+
964
+ // src/components/DeckLayout/DeckMain.tsx
965
+ var DeckMain = () => {
966
+ const { invokeSync } = useOperationInvoker6();
967
+ const settings = useAtomCapability(DeckCapabilities.Settings);
968
+ const { state, deck, updateState } = useDeckState();
969
+ const { sidebarState, complementarySidebarState, complementarySidebarPanel } = state;
970
+ const { active, activeCompanions, fullscreen, solo, plankSizing } = deck;
971
+ const layoutMode = getMode(deck);
972
+ const breakpoint = useBreakpoints();
973
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
974
+ const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
975
+ const pluginManager = usePluginManager();
976
+ const scrollLeftRef = useRef2(null);
977
+ const deckRef = useRef2(null);
978
+ useEffect4(() => {
979
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
980
+ const attended = attention.getCurrent();
981
+ const firstId = solo ?? active[0];
982
+ if (attended.length === 0 && firstId) {
983
+ document.querySelector(`article[data-attendable-id="${firstId}"] button`)?.focus();
984
+ }
985
+ }, []);
986
+ const [isNotMobile] = useMediaQuery("md");
987
+ const shouldRevert = useRef2(false);
988
+ useEffect4(() => {
989
+ if (!isNotMobile && layoutMode === "deck") {
990
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
991
+ const attended = attention.getCurrent();
992
+ shouldRevert.current = true;
993
+ invokeSync(Common5.LayoutOperation.SetLayoutMode, {
994
+ subject: attended[0],
995
+ mode: "solo"
996
+ });
997
+ } else if (isNotMobile && layoutMode === "solo" && shouldRevert.current) {
998
+ invokeSync(Common5.LayoutOperation.SetLayoutMode, {
999
+ revert: true
1000
+ });
1001
+ }
1002
+ }, [
1003
+ isNotMobile,
1004
+ layoutMode,
1005
+ invokeSync
1006
+ ]);
1007
+ useEffect4(() => {
1008
+ if (!settings?.enableDeck && layoutMode === "deck") {
1009
+ invokeSync(Common5.LayoutOperation.SetLayoutMode, {
1010
+ subject: active[0],
1011
+ mode: "solo"
1012
+ });
1013
+ }
1014
+ }, [
1015
+ settings?.enableDeck,
1016
+ invokeSync,
1017
+ active,
1018
+ layoutMode
1019
+ ]);
1020
+ const handleResize = useCallback6(() => {
1021
+ scrollLeftRef.current = null;
1022
+ }, []);
1023
+ useEffect4(() => {
1024
+ window.addEventListener("resize", handleResize);
1025
+ return () => window.removeEventListener("resize", handleResize);
1026
+ }, [
1027
+ handleResize
1028
+ ]);
1029
+ const restoreScroll = useCallback6(() => {
1030
+ if (deckRef.current && scrollLeftRef.current != null) {
1031
+ deckRef.current.scrollLeft = scrollLeftRef.current;
1032
+ }
1033
+ }, []);
1034
+ useOnTransition(layoutMode, (mode) => mode !== "deck", "deck", restoreScroll);
1035
+ const handleScroll = useCallback6((event) => {
1036
+ if (!solo && event.currentTarget === event.target) {
1037
+ scrollLeftRef.current = event.target.scrollLeft;
1038
+ }
1039
+ }, [
1040
+ solo
1041
+ ]);
1042
+ const isEmpty = !solo && active.length === 0;
1043
+ const padding = useMemo5(() => {
1044
+ if (!solo && settings?.overscroll === "centering") {
1045
+ return calculateOverscroll(active.length);
1046
+ }
1047
+ return {};
1048
+ }, [
1049
+ solo,
1050
+ settings?.overscroll,
1051
+ deck
1052
+ ]);
1053
+ const mainPosition = useMemo5(() => [
1054
+ "grid !block-start-[env(safe-area-inset-top)]",
1055
+ topbar && "!block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]",
1056
+ hoistStatusbar && "lg:block-end-[--statusbar-size]"
1057
+ ], [
1058
+ topbar,
1059
+ hoistStatusbar
1060
+ ]);
1061
+ const { order, itemsCount } = useMemo5(() => {
1062
+ return active.reduce((acc, entryId) => {
1063
+ acc.order[entryId] = acc.itemsCount + 1;
1064
+ acc.itemsCount += activeCompanions?.[entryId] ? 3 : 2;
1065
+ return acc;
1066
+ }, {
1067
+ order: {},
1068
+ itemsCount: 0
1069
+ });
1070
+ }, [
1071
+ active,
1072
+ activeCompanions
1073
+ ]);
1074
+ const handleNavigationSidebarStateChange = useCallback6((next) => {
1075
+ updateState((s) => ({
1076
+ ...s,
1077
+ sidebarState: next
1078
+ }));
1079
+ }, [
1080
+ updateState
1081
+ ]);
1082
+ const handleComplementarySidebarStateChange = useCallback6((next) => {
1083
+ updateState((s) => ({
1084
+ ...s,
1085
+ complementarySidebarState: next
1086
+ }));
1087
+ }, [
1088
+ updateState
1089
+ ]);
1090
+ return /* @__PURE__ */ React14.createElement(Main3.Root, {
1091
+ navigationSidebarState: fullscreen ? "closed" : sidebarState,
1092
+ complementarySidebarState: fullscreen ? "closed" : complementarySidebarState,
1093
+ onNavigationSidebarStateChange: handleNavigationSidebarStateChange,
1094
+ onComplementarySidebarStateChange: handleComplementarySidebarStateChange
1095
+ }, /* @__PURE__ */ React14.createElement(Sidebar, null), /* @__PURE__ */ React14.createElement(ComplementarySidebar, {
1096
+ current: complementarySidebarPanel
1097
+ }), /* @__PURE__ */ React14.createElement(Main3.Overlay, null), isEmpty && /* @__PURE__ */ React14.createElement(Main3.Content, {
1098
+ bounce: true,
1099
+ handlesFocus: true,
1100
+ classNames: mainPosition
1101
+ }, /* @__PURE__ */ React14.createElement(ContentEmpty, null)), !isEmpty && /* @__PURE__ */ React14.createElement(Main3.Content, {
1102
+ bounce: true,
1103
+ handlesFocus: true,
1104
+ classNames: mainPosition,
1105
+ style: {
1106
+ "--main-spacing": settings?.encapsulatedPlanks ? "0.75rem" : "0",
1107
+ "--dx-main-sidebarWidth": sidebarState === "expanded" ? "var(--nav-sidebar-size)" : sidebarState === "collapsed" ? "var(--l0-size)" : "0",
1108
+ "--dx-main-complementaryWidth": complementarySidebarState === "expanded" ? "var(--complementary-sidebar-size)" : complementarySidebarState === "collapsed" ? "var(--rail-size)" : "0",
1109
+ "--dx-main-contentFirstWidth": `${plankSizing[active[0] ?? "never"] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
1110
+ "--dx-main-contentLastWidth": `${plankSizing[active[(active.length ?? 1) - 1] ?? "never"] ?? DEFAULT_HORIZONTAL_SIZE}rem`
1111
+ }
1112
+ }, /* @__PURE__ */ React14.createElement("div", {
1113
+ role: "none",
1114
+ className: !solo ? "relative bg-deckSurface overflow-hidden" : "sr-only",
1115
+ ...solo && {
1116
+ inert: true
1117
+ }
1118
+ }, !topbar && !fullscreen && /* @__PURE__ */ React14.createElement(ToggleSidebarButton, {
1119
+ classNames: fixedSidebarToggleStyles
1120
+ }), !topbar && !fullscreen && /* @__PURE__ */ React14.createElement(ToggleComplementarySidebarButton, {
1121
+ classNames: fixedComplementarySidebarToggleStyles
1122
+ }), /* @__PURE__ */ React14.createElement(Stack, {
1123
+ ref: deckRef,
1124
+ orientation: "horizontal",
1125
+ size: "contain",
1126
+ itemsCount: itemsCount - 1,
1127
+ classNames: [
1128
+ "absolute inset-block-[--main-spacing] -inset-inline-px bs-[calc(100%-2*var(--main-spacing))]",
1129
+ mainPaddingTransitions
1130
+ ],
1131
+ style: padding,
1132
+ onScroll: handleScroll
1133
+ }, active.map((entryId) => /* @__PURE__ */ React14.createElement(Fragment3, {
1134
+ key: entryId
1135
+ }, /* @__PURE__ */ React14.createElement(PlankSeparator, {
1136
+ order: order[entryId] - 1,
1137
+ encapsulate: !!settings?.enableDeck
1138
+ }), /* @__PURE__ */ React14.createElement(Plank, {
1139
+ id: entryId,
1140
+ companionId: activeCompanions?.[entryId],
1141
+ part: "deck",
1142
+ order: order[entryId],
1143
+ active,
1144
+ layoutMode,
1145
+ settings
1146
+ }))))), /* @__PURE__ */ React14.createElement("div", {
1147
+ role: "none",
1148
+ className: solo ? "relative overflow-hidden bg-deckSurface" : "sr-only",
1149
+ ...!solo && {
1150
+ inert: true
1151
+ }
1152
+ }, !topbar && !fullscreen && /* @__PURE__ */ React14.createElement(ToggleSidebarButton, {
1153
+ classNames: fixedSidebarToggleStyles
1154
+ }), !topbar && !fullscreen && /* @__PURE__ */ React14.createElement(ToggleComplementarySidebarButton, {
1155
+ classNames: fixedComplementarySidebarToggleStyles
1156
+ }), /* @__PURE__ */ React14.createElement(StackContext.Provider, {
1157
+ value: {
1158
+ orientation: "horizontal",
1159
+ size: "contain",
1160
+ rail: true
1161
+ }
1162
+ }, /* @__PURE__ */ React14.createElement(Plank, {
1163
+ id: solo,
1164
+ companionId: solo ? activeCompanions?.[solo] : void 0,
1165
+ part: "solo",
1166
+ layoutMode,
1167
+ settings
1168
+ })))), topbar && /* @__PURE__ */ React14.createElement(Topbar, null), hoistStatusbar && /* @__PURE__ */ React14.createElement(StatusBar, {
1169
+ showHints: settings?.showHints
1170
+ }));
1171
+ };
1172
+ var PlankSeparator = ({ order, encapsulate }) => order > 0 ? /* @__PURE__ */ React14.createElement("span", {
1173
+ role: "separator",
1174
+ className: mx6("row-span-2 bg-deckSurface", encapsulate ? "is-0" : "is-4"),
1175
+ style: {
1176
+ gridColumn: order
1177
+ }
1178
+ }) : null;
1179
+
1180
+ // src/components/DeckLayout/Dialog.tsx
1181
+ import React15, { useCallback as useCallback7 } from "react";
1182
+ import { Surface as Surface9 } from "@dxos/app-framework/react";
1183
+ import { AlertDialog, Dialog as NaturalDialog } from "@dxos/react-ui";
1184
+ var Dialog = () => {
1185
+ const { state, updateEphemeral } = useDeckState();
1186
+ const { dialogOpen, dialogType, dialogBlockAlign, dialogOverlayClasses, dialogOverlayStyle, dialogContent } = state;
1187
+ const Root = dialogType === "alert" ? AlertDialog.Root : NaturalDialog.Root;
1188
+ const Overlay = dialogType === "alert" ? AlertDialog.Overlay : NaturalDialog.Overlay;
1189
+ const handleOpenChange = useCallback7((nextOpen) => {
1190
+ updateEphemeral((s) => ({
1191
+ ...s,
1192
+ dialogOpen: nextOpen
1193
+ }));
1194
+ }, [
1195
+ updateEphemeral
1196
+ ]);
1197
+ return /* @__PURE__ */ React15.createElement(Root, {
1198
+ modal: dialogBlockAlign !== "end",
1199
+ open: dialogOpen,
1200
+ onOpenChange: handleOpenChange
1201
+ }, dialogBlockAlign === "end" ? (
1202
+ // TODO(burdon): Placeholder creates a suspense boundary; replace with defaults.
1203
+ /* @__PURE__ */ React15.createElement(Surface9, {
1204
+ role: "dialog",
1205
+ data: dialogContent,
1206
+ limit: 1,
1207
+ fallback: PlankContentError,
1208
+ placeholder: /* @__PURE__ */ React15.createElement("div", null)
1209
+ })
1210
+ ) : /* @__PURE__ */ React15.createElement(Overlay, {
1211
+ blockAlign: dialogBlockAlign,
1212
+ classNames: dialogOverlayClasses,
1213
+ style: dialogOverlayStyle
1214
+ }, /* @__PURE__ */ React15.createElement(Surface9, {
1215
+ role: "dialog",
1216
+ data: dialogContent,
1217
+ limit: 1,
1218
+ fallback: PlankContentError
1219
+ })));
1220
+ };
1221
+
1222
+ // src/components/DeckLayout/Popover.tsx
1223
+ import { createContext } from "@radix-ui/react-context";
1224
+ import React16, { useCallback as useCallback8, useEffect as useEffect5, useRef as useRef3, useState as useState3 } from "react";
1225
+ import { Surface as Surface10 } from "@dxos/app-framework/react";
1226
+ import { Popover as Popover2, toLocalizedString as toLocalizedString3, useTranslation as useTranslation7 } from "@dxos/react-ui";
1227
+ import { Card } from "@dxos/react-ui-mosaic";
1228
+ var DEBOUNCE_DELAY = 40;
1229
+ var [DeckPopoverProvider, useDeckPopoverContext] = createContext("DeckPopover");
1230
+ var PopoverRoot = ({ children }) => {
1231
+ const { state } = useDeckState();
1232
+ const virtualRef = useRef3(null);
1233
+ const [virtualIter, setVirtualIter] = useState3(0);
1234
+ const [open, setOpen] = useState3(false);
1235
+ const debounceRef = useRef3(null);
1236
+ useEffect5(() => {
1237
+ setOpen(false);
1238
+ if (state.popoverOpen) {
1239
+ if (debounceRef.current) {
1240
+ clearTimeout(debounceRef.current);
1241
+ }
1242
+ if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {
1243
+ virtualRef.current = state.popoverAnchor ?? null;
1244
+ setVirtualIter((iter) => iter + 1);
1245
+ }
1246
+ debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);
1247
+ }
1248
+ }, [
1249
+ state.popoverOpen,
1250
+ state.popoverAnchorId,
1251
+ state.popoverAnchor,
1252
+ state.popoverContent
1253
+ ]);
1254
+ return /* @__PURE__ */ React16.createElement(DeckPopoverProvider, {
1255
+ setOpen
1256
+ }, /* @__PURE__ */ React16.createElement(Popover2.Root, {
1257
+ modal: false,
1258
+ open
1259
+ }, state.popoverAnchor && /* @__PURE__ */ React16.createElement(Popover2.VirtualTrigger, {
1260
+ key: virtualIter,
1261
+ virtualRef
1262
+ }), children));
1263
+ };
1264
+ var PopoverContent = () => {
1265
+ const { t } = useTranslation7(meta.id);
1266
+ const { state, updateEphemeral } = useDeckState();
1267
+ const { setOpen } = useDeckPopoverContext("PopoverContent");
1268
+ const handleClose = useCallback8(() => {
1269
+ setOpen(false);
1270
+ updateEphemeral((state2) => ({
1271
+ ...state2,
1272
+ popoverOpen: false,
1273
+ popoverAnchor: void 0,
1274
+ popoverAnchorId: void 0,
1275
+ popoverSide: void 0
1276
+ }));
1277
+ }, [
1278
+ updateEphemeral
1279
+ ]);
1280
+ const handleInteractOutside = useCallback8((event) => {
1281
+ if (
1282
+ // TODO(thure): CodeMirror should not focus itself when it updates.
1283
+ event.type === "dismissableLayer.focusOutside" && event.currentTarget?.classList.contains("cm-content")
1284
+ ) {
1285
+ event.preventDefault();
1286
+ } else {
1287
+ handleClose();
1288
+ }
1289
+ }, [
1290
+ handleClose
1291
+ ]);
1292
+ return /* @__PURE__ */ React16.createElement(Popover2.Portal, null, /* @__PURE__ */ React16.createElement(Popover2.Content, {
1293
+ side: state.popoverSide,
1294
+ sticky: "always",
1295
+ hideWhenDetached: true,
1296
+ onInteractOutside: handleInteractOutside,
1297
+ onEscapeKeyDown: handleInteractOutside
1298
+ }, /* @__PURE__ */ React16.createElement(Popover2.Viewport, null, state.popoverKind === "card" && /* @__PURE__ */ React16.createElement(Card.Root, null, /* @__PURE__ */ React16.createElement(Card.Toolbar, null, /* @__PURE__ */ React16.createElement("span", null), state.popoverTitle ? /* @__PURE__ */ React16.createElement(Card.Title, null, toLocalizedString3(state.popoverTitle, t)) : /* @__PURE__ */ React16.createElement("span", null), /* @__PURE__ */ React16.createElement(Card.Close, {
1299
+ onClick: handleClose
1300
+ })), /* @__PURE__ */ React16.createElement(Surface10, {
1301
+ role: "card--content",
1302
+ data: state.popoverContent,
1303
+ limit: 1
1304
+ })), state.popoverKind === "base" && /* @__PURE__ */ React16.createElement(Surface10, {
1305
+ role: "popover",
1306
+ data: state.popoverContent,
1307
+ limit: 1
1308
+ })), /* @__PURE__ */ React16.createElement(Popover2.Arrow, null)));
1309
+ };
1310
+
1311
+ // src/components/DeckLayout/Toast.tsx
1312
+ import React17 from "react";
1313
+ import { Button, Icon as Icon2, Toast as NaturalToast, toLocalizedString as toLocalizedString4, useTranslation as useTranslation8 } from "@dxos/react-ui";
1314
+ var Toast = ({ id, title, description, icon, duration, actionLabel, actionAlt, closeLabel, onAction, onOpenChange }) => {
1315
+ const { t } = useTranslation8(meta.id);
1316
+ return /* @__PURE__ */ React17.createElement(NaturalToast.Root, {
1317
+ "data-testid": id,
1318
+ defaultOpen: true,
1319
+ duration,
1320
+ onOpenChange
1321
+ }, /* @__PURE__ */ React17.createElement(NaturalToast.Body, null, /* @__PURE__ */ React17.createElement(NaturalToast.Title, {
1322
+ classNames: "items-center"
1323
+ }, icon && /* @__PURE__ */ React17.createElement(Icon2, {
1324
+ icon,
1325
+ classNames: "inline mr-1"
1326
+ }), title && /* @__PURE__ */ React17.createElement("span", null, toLocalizedString4(title, t))), description && /* @__PURE__ */ React17.createElement(NaturalToast.Description, null, description && toLocalizedString4(description, t))), /* @__PURE__ */ React17.createElement(NaturalToast.Actions, null, onAction && actionAlt && actionLabel && /* @__PURE__ */ React17.createElement(NaturalToast.Action, {
1327
+ altText: toLocalizedString4(actionAlt, t),
1328
+ asChild: true
1329
+ }, /* @__PURE__ */ React17.createElement(Button, {
1330
+ "data-testid": "toast.action",
1331
+ variant: "primary",
1332
+ onClick: () => onAction?.()
1333
+ }, toLocalizedString4(actionLabel, t))), closeLabel && /* @__PURE__ */ React17.createElement(NaturalToast.Close, {
1334
+ asChild: true
1335
+ }, /* @__PURE__ */ React17.createElement(Button, {
1336
+ "data-testid": "toast.close"
1337
+ }, toLocalizedString4(closeLabel, t)))));
1338
+ };
1339
+ var Toaster = ({ toasts, onDismissToast }) => {
1340
+ return /* @__PURE__ */ React17.createElement(React17.Fragment, null, toasts?.map((toast) => /* @__PURE__ */ React17.createElement(Toast, {
1341
+ ...toast,
1342
+ key: toast.id,
1343
+ onOpenChange: (open) => {
1344
+ if (!open) {
1345
+ onDismissToast?.(toast.id);
1346
+ }
1347
+ return open;
1348
+ }
1349
+ })));
1350
+ };
1351
+
1352
+ // src/components/DeckLayout/DeckLayout.tsx
1353
+ var DeckLayout = ({ onDismissToast }) => {
1354
+ const { state } = useDeckState();
1355
+ const { toasts } = state;
1356
+ return /* @__PURE__ */ React18.createElement(Mosaic.Root, null, /* @__PURE__ */ React18.createElement(PopoverRoot, null, /* @__PURE__ */ React18.createElement(ActiveNode, null), /* @__PURE__ */ React18.createElement(DeckMain, null), /* @__PURE__ */ React18.createElement(PopoverContent, null), /* @__PURE__ */ React18.createElement(Dialog, null), /* @__PURE__ */ React18.createElement(Toaster, {
1357
+ toasts,
1358
+ onDismissToast
1359
+ })));
1360
+ };
1361
+
1362
+ // src/components/DeckSettings/DeckSettings.tsx
1363
+ import React19 from "react";
1364
+ import { Input, Select, useTranslation as useTranslation9 } from "@dxos/react-ui";
1365
+ import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from "@dxos/react-ui-form";
1366
+ var isSocket = !!globalThis.__args;
1367
+ var DeckSettings = ({ settings, onSettingsChange }) => {
1368
+ const { t } = useTranslation9(meta.id);
1369
+ return /* @__PURE__ */ React19.createElement(ControlPage, null, /* @__PURE__ */ React19.createElement(ControlSection, {
1370
+ title: t("settings title", {
1371
+ ns: meta.id
1372
+ })
1373
+ }, /* @__PURE__ */ React19.createElement(ControlGroup, null, /* @__PURE__ */ React19.createElement(ControlItemInput, {
1374
+ title: t("settings enable deck label")
1375
+ }, /* @__PURE__ */ React19.createElement(Input.Switch, {
1376
+ checked: settings.enableDeck,
1377
+ onCheckedChange: (checked) => onSettingsChange((s) => ({
1378
+ ...s,
1379
+ enableDeck: checked
1380
+ }))
1381
+ })), /* @__PURE__ */ React19.createElement(ControlItemInput, {
1382
+ title: t("settings encapsulated planks label")
1383
+ }, /* @__PURE__ */ React19.createElement(Input.Switch, {
1384
+ checked: settings.encapsulatedPlanks ?? false,
1385
+ onCheckedChange: (checked) => onSettingsChange((s) => ({
1386
+ ...s,
1387
+ encapsulatedPlanks: checked
1388
+ }))
1389
+ })), /* @__PURE__ */ React19.createElement(ControlItemInput, {
1390
+ title: t("select new plank positioning label")
1391
+ }, /* @__PURE__ */ React19.createElement(Select.Root, {
1392
+ disabled: !settings.enableDeck,
1393
+ value: settings.newPlankPositioning ?? "start",
1394
+ onValueChange: (value) => onSettingsChange((s) => ({
1395
+ ...s,
1396
+ newPlankPositioning: value
1397
+ }))
1398
+ }, /* @__PURE__ */ React19.createElement(Select.TriggerButton, {
1399
+ placeholder: t("select new plank positioning placeholder")
1400
+ }), /* @__PURE__ */ React19.createElement(Select.Portal, null, /* @__PURE__ */ React19.createElement(Select.Content, null, /* @__PURE__ */ React19.createElement(Select.Viewport, null, NewPlankPositions.map((position) => /* @__PURE__ */ React19.createElement(Select.Option, {
1401
+ key: position,
1402
+ value: position
1403
+ }, t(`settings new plank position ${position} label`)))), /* @__PURE__ */ React19.createElement(Select.Arrow, null))))), /* @__PURE__ */ React19.createElement(ControlItemInput, {
1404
+ title: t("settings overscroll label")
1405
+ }, /* @__PURE__ */ React19.createElement(Select.Root, {
1406
+ disabled: !settings.enableDeck,
1407
+ value: settings.overscroll ?? "none",
1408
+ onValueChange: (value) => onSettingsChange((s) => ({
1409
+ ...s,
1410
+ overscroll: value
1411
+ }))
1412
+ }, /* @__PURE__ */ React19.createElement(Select.TriggerButton, {
1413
+ placeholder: t("select overscroll placeholder")
1414
+ }), /* @__PURE__ */ React19.createElement(Select.Portal, null, /* @__PURE__ */ React19.createElement(Select.Content, null, /* @__PURE__ */ React19.createElement(Select.Viewport, null, OverscrollOptions.map((option) => /* @__PURE__ */ React19.createElement(Select.Option, {
1415
+ key: option,
1416
+ value: option
1417
+ }, t(`settings overscroll ${option} label`)))), /* @__PURE__ */ React19.createElement(Select.Arrow, null))))), /* @__PURE__ */ React19.createElement(ControlItemInput, {
1418
+ title: t("settings enable statusbar label")
1419
+ }, /* @__PURE__ */ React19.createElement(Input.Switch, {
1420
+ checked: settings.enableStatusbar,
1421
+ onCheckedChange: (checked) => onSettingsChange((s) => ({
1422
+ ...s,
1423
+ enableStatusbar: checked
1424
+ }))
1425
+ })), /* @__PURE__ */ React19.createElement(ControlItemInput, {
1426
+ title: t("settings show hints label")
1427
+ }, /* @__PURE__ */ React19.createElement(Input.Switch, {
1428
+ checked: settings.showHints,
1429
+ onCheckedChange: (checked) => onSettingsChange((s) => ({
1430
+ ...s,
1431
+ showHints: checked
1432
+ }))
1433
+ })), !isSocket && /* @__PURE__ */ React19.createElement(ControlItemInput, {
1434
+ title: t("settings native redirect label")
1435
+ }, /* @__PURE__ */ React19.createElement(Input.Switch, {
1436
+ checked: settings.enableNativeRedirect,
1437
+ onCheckedChange: (checked) => onSettingsChange((s) => ({
1438
+ ...s,
1439
+ enableNativeRedirect: checked
1440
+ }))
1441
+ })))));
1442
+ };
1443
+
1444
+ export {
1445
+ Banner,
1446
+ DeckLayout,
1447
+ DeckSettings
1448
+ };
1449
+ //# sourceMappingURL=chunk-D34L3ECT.mjs.map