@dxos/plugin-deck 0.8.4-main.e8ec1fe → 0.8.4-main.effb148878

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 (502) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/DeckLayout-NBVPPAQP.mjs +278 -0
  4. package/dist/lib/neutral/DeckLayout-NBVPPAQP.mjs.map +7 -0
  5. package/dist/lib/neutral/DeckPlugin.mjs +70 -0
  6. package/dist/lib/neutral/DeckPlugin.mjs.map +7 -0
  7. package/dist/lib/neutral/DeckPlugin.node.mjs +18 -0
  8. package/dist/lib/neutral/DeckPlugin.node.mjs.map +7 -0
  9. package/dist/lib/neutral/DeckPlugin.workerd.mjs +16 -0
  10. package/dist/lib/neutral/DeckPlugin.workerd.mjs.map +7 -0
  11. package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs +27 -0
  12. package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs.map +7 -0
  13. package/dist/lib/neutral/add-toast-H2PK2S3H.mjs +24 -0
  14. package/dist/lib/neutral/add-toast-H2PK2S3H.mjs.map +7 -0
  15. package/dist/lib/neutral/adjust-J6ZPQ5BT.mjs +93 -0
  16. package/dist/lib/neutral/adjust-J6ZPQ5BT.mjs.map +7 -0
  17. package/dist/lib/neutral/app-graph-builder-MRA3OMKO.mjs +129 -0
  18. package/dist/lib/neutral/app-graph-builder-MRA3OMKO.mjs.map +7 -0
  19. package/dist/lib/neutral/capabilities/index.mjs +23 -0
  20. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  21. package/dist/lib/neutral/check-app-scheme-A7FZVNZO.mjs +10 -0
  22. package/dist/lib/neutral/chunk-3WIBNTUT.mjs +35 -0
  23. package/dist/lib/neutral/chunk-3WIBNTUT.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-FBN443XP.mjs +8 -0
  25. package/dist/lib/neutral/chunk-FBN443XP.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-FSIEKCMR.mjs +1305 -0
  27. package/dist/lib/neutral/chunk-FSIEKCMR.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-GBIGQKYW.mjs +112 -0
  29. package/dist/lib/neutral/chunk-GBIGQKYW.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-GLB73Q6U.mjs +22 -0
  31. package/dist/lib/neutral/chunk-GLB73Q6U.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-HD44H4CJ.mjs +280 -0
  33. package/dist/lib/neutral/chunk-HD44H4CJ.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  35. package/dist/lib/neutral/chunk-VHETZ22W.mjs +101 -0
  36. package/dist/lib/neutral/chunk-VHETZ22W.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-ZYYOSX5I.mjs +69 -0
  38. package/dist/lib/neutral/chunk-ZYYOSX5I.mjs.map +7 -0
  39. package/dist/lib/neutral/close-IPQTWQXS.mjs +44 -0
  40. package/dist/lib/neutral/close-IPQTWQXS.mjs.map +7 -0
  41. package/dist/lib/neutral/components/index.mjs +126 -0
  42. package/dist/lib/neutral/components/index.mjs.map +7 -0
  43. package/dist/lib/neutral/containers/index.mjs +32 -0
  44. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  45. package/dist/lib/neutral/hooks/index.mjs +159 -0
  46. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  47. package/dist/lib/neutral/index.mjs +38 -0
  48. package/dist/lib/neutral/index.mjs.map +7 -0
  49. package/dist/lib/neutral/meta.json +1 -0
  50. package/dist/lib/neutral/meta.mjs +8 -0
  51. package/dist/lib/neutral/meta.mjs.map +7 -0
  52. package/dist/lib/neutral/open-OAKTKZM2.mjs +149 -0
  53. package/dist/lib/neutral/open-OAKTKZM2.mjs.map +7 -0
  54. package/dist/lib/neutral/operation-handler-266CVMTW.mjs +13 -0
  55. package/dist/lib/neutral/operation-handler-266CVMTW.mjs.map +7 -0
  56. package/dist/lib/neutral/operations/index.mjs +8 -0
  57. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  58. package/dist/lib/neutral/plugin.mjs +16 -0
  59. package/dist/lib/neutral/plugin.mjs.map +7 -0
  60. package/dist/lib/neutral/react-root-WZ6KH27J.mjs +41 -0
  61. package/dist/lib/neutral/react-root-WZ6KH27J.mjs.map +7 -0
  62. package/dist/lib/neutral/react-surface-KAAZDHV3.mjs +34 -0
  63. package/dist/lib/neutral/react-surface-KAAZDHV3.mjs.map +7 -0
  64. package/dist/lib/neutral/revert-workspace-PLY4YQ4X.mjs +21 -0
  65. package/dist/lib/neutral/revert-workspace-PLY4YQ4X.mjs.map +7 -0
  66. package/dist/lib/neutral/scroll-into-view-INJL3YOV.mjs +21 -0
  67. package/dist/lib/neutral/scroll-into-view-INJL3YOV.mjs.map +7 -0
  68. package/dist/lib/neutral/set-CQ6AO7QB.mjs +37 -0
  69. package/dist/lib/neutral/set-CQ6AO7QB.mjs.map +7 -0
  70. package/dist/lib/neutral/set-layout-mode-NBPJRYGC.mjs +85 -0
  71. package/dist/lib/neutral/set-layout-mode-NBPJRYGC.mjs.map +7 -0
  72. package/dist/lib/neutral/settings-EGNYUM4T.mjs +33 -0
  73. package/dist/lib/neutral/settings-EGNYUM4T.mjs.map +7 -0
  74. package/dist/lib/neutral/show-undo-EZH7JPAV.mjs +59 -0
  75. package/dist/lib/neutral/show-undo-EZH7JPAV.mjs.map +7 -0
  76. package/dist/lib/neutral/state-IIDXMQUO.mjs +86 -0
  77. package/dist/lib/neutral/state-IIDXMQUO.mjs.map +7 -0
  78. package/dist/lib/neutral/switch-workspace-UCFFW3B6.mjs +60 -0
  79. package/dist/lib/neutral/switch-workspace-UCFFW3B6.mjs.map +7 -0
  80. package/dist/lib/neutral/translations.mjs +58 -0
  81. package/dist/lib/neutral/translations.mjs.map +7 -0
  82. package/dist/lib/neutral/types/index.mjs +34 -0
  83. package/dist/lib/neutral/types/index.mjs.map +7 -0
  84. package/dist/lib/neutral/update-companion-NCPRS5MP.mjs +32 -0
  85. package/dist/lib/neutral/update-companion-NCPRS5MP.mjs.map +7 -0
  86. package/dist/lib/neutral/update-complementary-4RERA3VA.mjs +28 -0
  87. package/dist/lib/neutral/update-complementary-4RERA3VA.mjs.map +7 -0
  88. package/dist/lib/neutral/update-dialog-GMFMY7KZ.mjs +29 -0
  89. package/dist/lib/neutral/update-dialog-GMFMY7KZ.mjs.map +7 -0
  90. package/dist/lib/neutral/update-plank-size-TO7RMHQM.mjs +26 -0
  91. package/dist/lib/neutral/update-plank-size-TO7RMHQM.mjs.map +7 -0
  92. package/dist/lib/neutral/update-popover-H3KBQQZ4.mjs +33 -0
  93. package/dist/lib/neutral/update-popover-H3KBQQZ4.mjs.map +7 -0
  94. package/dist/lib/neutral/update-sidebar-OM7EGDQR.mjs +25 -0
  95. package/dist/lib/neutral/update-sidebar-OM7EGDQR.mjs.map +7 -0
  96. package/dist/lib/neutral/url-handler-3QTKEM2K.mjs +184 -0
  97. package/dist/lib/neutral/url-handler-3QTKEM2K.mjs.map +7 -0
  98. package/dist/types/src/DeckPlugin.d.ts +3 -1
  99. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  100. package/dist/types/src/DeckPlugin.node.d.ts +4 -0
  101. package/dist/types/src/DeckPlugin.node.d.ts.map +1 -0
  102. package/dist/types/src/DeckPlugin.test.d.ts +2 -0
  103. package/dist/types/src/DeckPlugin.test.d.ts.map +1 -0
  104. package/dist/types/src/DeckPlugin.workerd.d.ts +4 -0
  105. package/dist/types/src/DeckPlugin.workerd.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  107. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/check-app-scheme.d.ts +17 -2
  109. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/index.d.ts +196 -12
  111. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  113. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  114. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  115. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  117. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  118. package/dist/types/src/capabilities/settings.d.ts +5 -2
  119. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/state.d.ts +136 -49
  121. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  122. package/dist/types/src/capabilities/tools.d.ts +4 -3
  123. package/dist/types/src/capabilities/tools.d.ts.map +1 -1
  124. package/dist/types/src/capabilities/url-handler.d.ts +3 -2
  125. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -1
  126. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +4 -4
  127. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +1 -1
  128. package/dist/types/src/components/DeckSettings/DeckSettings.stories.d.ts +62 -0
  129. package/dist/types/src/components/DeckSettings/DeckSettings.stories.d.ts.map +1 -0
  130. package/dist/types/src/components/DeckSettings/index.d.ts +1 -1
  131. package/dist/types/src/components/DeckSettings/index.d.ts.map +1 -1
  132. package/dist/types/src/components/Matrix/Matrix.d.ts +41 -0
  133. package/dist/types/src/components/Matrix/Matrix.d.ts.map +1 -0
  134. package/dist/types/src/components/Matrix/Matrix.stories.d.ts +17 -0
  135. package/dist/types/src/components/Matrix/Matrix.stories.d.ts.map +1 -0
  136. package/dist/types/src/components/Matrix/index.d.ts +3 -0
  137. package/dist/types/src/components/Matrix/index.d.ts.map +1 -0
  138. package/dist/types/src/components/index.d.ts +3 -2
  139. package/dist/types/src/components/index.d.ts.map +1 -1
  140. package/dist/types/src/{components/DeckLayout → containers/Deck}/Banner.d.ts +1 -1
  141. package/dist/types/src/containers/Deck/Banner.d.ts.map +1 -0
  142. package/dist/types/src/containers/Deck/Deck.d.ts +25 -0
  143. package/dist/types/src/containers/Deck/Deck.d.ts.map +1 -0
  144. package/dist/types/src/containers/Deck/Deck.stories.d.ts +62 -0
  145. package/dist/types/src/containers/Deck/Deck.stories.d.ts.map +1 -0
  146. package/dist/types/src/containers/Deck/DeckContent.d.ts +7 -0
  147. package/dist/types/src/containers/Deck/DeckContent.d.ts.map +1 -0
  148. package/dist/types/src/containers/Deck/DeckRoot.d.ts +39 -0
  149. package/dist/types/src/containers/Deck/DeckRoot.d.ts.map +1 -0
  150. package/dist/types/src/containers/Deck/DeckViewport.d.ts +16 -0
  151. package/dist/types/src/containers/Deck/DeckViewport.d.ts.map +1 -0
  152. package/dist/types/src/containers/Deck/StatusBar.d.ts.map +1 -0
  153. package/dist/types/src/containers/Deck/index.d.ts +2 -0
  154. package/dist/types/src/containers/Deck/index.d.ts.map +1 -0
  155. package/dist/types/src/containers/DeckLayout/ActiveNode.d.ts.map +1 -0
  156. package/dist/types/src/containers/DeckLayout/DeckLayout.d.ts.map +1 -0
  157. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts +64 -0
  158. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts.map +1 -0
  159. package/dist/types/src/containers/DeckLayout/Dialog.d.ts.map +1 -0
  160. package/dist/types/src/containers/DeckLayout/Fallback.d.ts +2 -0
  161. package/dist/types/src/containers/DeckLayout/Fallback.d.ts.map +1 -0
  162. package/dist/types/src/containers/DeckLayout/Popover.d.ts +5 -0
  163. package/dist/types/src/containers/DeckLayout/Popover.d.ts.map +1 -0
  164. package/dist/types/src/{components → containers}/DeckLayout/Toast.d.ts +3 -3
  165. package/dist/types/src/containers/DeckLayout/Toast.d.ts.map +1 -0
  166. package/dist/types/src/containers/DeckLayout/constants.d.ts.map +1 -0
  167. package/dist/types/src/containers/DeckLayout/index.d.ts +4 -0
  168. package/dist/types/src/containers/DeckLayout/index.d.ts.map +1 -0
  169. package/dist/types/src/containers/Plank/Plank.d.ts +17 -0
  170. package/dist/types/src/containers/Plank/Plank.d.ts.map +1 -0
  171. package/dist/types/src/containers/Plank/Plank.stories.d.ts +62 -0
  172. package/dist/types/src/containers/Plank/Plank.stories.d.ts.map +1 -0
  173. package/dist/types/src/containers/Plank/PlankComponent.d.ts +17 -0
  174. package/dist/types/src/containers/Plank/PlankComponent.d.ts.map +1 -0
  175. package/dist/types/src/containers/Plank/PlankContent.d.ts +10 -0
  176. package/dist/types/src/containers/Plank/PlankContent.d.ts.map +1 -0
  177. package/dist/types/src/{components → containers}/Plank/PlankControls.d.ts +5 -6
  178. package/dist/types/src/containers/Plank/PlankControls.d.ts.map +1 -0
  179. package/dist/types/src/containers/Plank/PlankError.d.ts +15 -0
  180. package/dist/types/src/containers/Plank/PlankError.d.ts.map +1 -0
  181. package/dist/types/src/{components → containers}/Plank/PlankHeading.d.ts +5 -4
  182. package/dist/types/src/containers/Plank/PlankHeading.d.ts.map +1 -0
  183. package/dist/types/src/{components → containers}/Plank/PlankLoading.d.ts.map +1 -1
  184. package/dist/types/src/containers/Plank/PlankRoot.d.ts +37 -0
  185. package/dist/types/src/containers/Plank/PlankRoot.d.ts.map +1 -0
  186. package/dist/types/src/containers/Plank/index.d.ts +4 -0
  187. package/dist/types/src/containers/Plank/index.d.ts.map +1 -0
  188. package/dist/types/src/containers/Sidebar/ComplementarySidebar.d.ts.map +1 -0
  189. package/dist/types/src/containers/Sidebar/Sidebar.d.ts.map +1 -0
  190. package/dist/types/src/{components → containers}/Sidebar/SidebarButton.d.ts +1 -1
  191. package/dist/types/src/containers/Sidebar/SidebarButton.d.ts.map +1 -0
  192. package/dist/types/src/{components → containers}/Sidebar/index.d.ts.map +1 -1
  193. package/dist/types/src/containers/index.d.ts +6 -0
  194. package/dist/types/src/containers/index.d.ts.map +1 -0
  195. package/dist/types/src/hooks/index.d.ts +2 -1
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useBreakpoints.d.ts +1 -1
  198. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
  199. package/dist/types/src/hooks/useDeckCompanions.d.ts +4 -4
  200. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useDeckState.d.ts +17 -0
  202. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
  203. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  204. package/dist/types/src/hooks/useMainSize.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
  206. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  207. package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
  208. package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
  209. package/dist/types/src/index.d.ts +1 -4
  210. package/dist/types/src/index.d.ts.map +1 -1
  211. package/dist/types/src/layout.d.ts +20 -9
  212. package/dist/types/src/layout.d.ts.map +1 -1
  213. package/dist/types/src/layout.test.d.ts +2 -0
  214. package/dist/types/src/layout.test.d.ts.map +1 -0
  215. package/dist/types/src/meta.d.ts +2 -2
  216. package/dist/types/src/meta.d.ts.map +1 -1
  217. package/dist/types/src/operations/add-toast.d.ts +5 -0
  218. package/dist/types/src/operations/add-toast.d.ts.map +1 -0
  219. package/dist/types/src/operations/adjust.d.ts +5 -0
  220. package/dist/types/src/operations/adjust.d.ts.map +1 -0
  221. package/dist/types/src/operations/close.d.ts +5 -0
  222. package/dist/types/src/operations/close.d.ts.map +1 -0
  223. package/dist/types/src/operations/helpers.d.ts +3 -0
  224. package/dist/types/src/operations/helpers.d.ts.map +1 -0
  225. package/dist/types/src/operations/index.d.ts +3 -0
  226. package/dist/types/src/operations/index.d.ts.map +1 -0
  227. package/dist/types/src/operations/open.d.ts +5 -0
  228. package/dist/types/src/operations/open.d.ts.map +1 -0
  229. package/dist/types/src/operations/revert-workspace.d.ts +5 -0
  230. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -0
  231. package/dist/types/src/operations/scroll-into-view.d.ts +5 -0
  232. package/dist/types/src/operations/scroll-into-view.d.ts.map +1 -0
  233. package/dist/types/src/operations/set-layout-mode.d.ts +9 -0
  234. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -0
  235. package/dist/types/src/operations/set.d.ts +5 -0
  236. package/dist/types/src/operations/set.d.ts.map +1 -0
  237. package/dist/types/src/operations/show-undo.d.ts +5 -0
  238. package/dist/types/src/operations/show-undo.d.ts.map +1 -0
  239. package/dist/types/src/operations/switch-workspace.d.ts +5 -0
  240. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -0
  241. package/dist/types/src/operations/update-companion.d.ts +5 -0
  242. package/dist/types/src/operations/update-companion.d.ts.map +1 -0
  243. package/dist/types/src/operations/update-complementary.d.ts +5 -0
  244. package/dist/types/src/operations/update-complementary.d.ts.map +1 -0
  245. package/dist/types/src/operations/update-dialog.d.ts +5 -0
  246. package/dist/types/src/operations/update-dialog.d.ts.map +1 -0
  247. package/dist/types/src/operations/update-plank-size.d.ts +5 -0
  248. package/dist/types/src/operations/update-plank-size.d.ts.map +1 -0
  249. package/dist/types/src/operations/update-popover.d.ts +5 -0
  250. package/dist/types/src/operations/update-popover.d.ts.map +1 -0
  251. package/dist/types/src/operations/update-sidebar.d.ts +5 -0
  252. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -0
  253. package/dist/types/src/plugin.d.ts +4 -0
  254. package/dist/types/src/plugin.d.ts.map +1 -0
  255. package/dist/types/src/translations.d.ts +43 -55
  256. package/dist/types/src/translations.d.ts.map +1 -1
  257. package/dist/types/src/types/DeckCapabilities.d.ts +188 -0
  258. package/dist/types/src/types/DeckCapabilities.d.ts.map +1 -0
  259. package/dist/types/src/types/DeckEvents.d.ts +5 -0
  260. package/dist/types/src/types/DeckEvents.d.ts.map +1 -0
  261. package/dist/types/src/types/DeckOperation.d.ts +15 -0
  262. package/dist/types/src/types/DeckOperation.d.ts.map +1 -0
  263. package/dist/types/src/types/Settings.d.ts +10 -0
  264. package/dist/types/src/types/Settings.d.ts.map +1 -0
  265. package/dist/types/src/types/index.d.ts +4 -0
  266. package/dist/types/src/types/index.d.ts.map +1 -1
  267. package/dist/types/src/types/schema.d.ts +64 -64
  268. package/dist/types/src/types/schema.d.ts.map +1 -1
  269. package/dist/types/src/util/index.d.ts +2 -1
  270. package/dist/types/src/util/index.d.ts.map +1 -1
  271. package/dist/types/src/util/layoutAppliesTopbar.d.ts +1 -1
  272. package/dist/types/src/util/layoutAppliesTopbar.d.ts.map +1 -1
  273. package/dist/types/src/util/plank-url-params.d.ts +14 -0
  274. package/dist/types/src/util/plank-url-params.d.ts.map +1 -0
  275. package/dist/types/src/util/plank-url-params.test.d.ts +2 -0
  276. package/dist/types/src/util/plank-url-params.test.d.ts.map +1 -0
  277. package/dist/types/src/util/sanitize-persisted-state.d.ts +19 -0
  278. package/dist/types/src/util/sanitize-persisted-state.d.ts.map +1 -0
  279. package/dist/types/src/util/sanitize-persisted-state.test.d.ts +2 -0
  280. package/dist/types/src/util/sanitize-persisted-state.test.d.ts.map +1 -0
  281. package/dist/types/src/util/set-active.d.ts +19 -4
  282. package/dist/types/src/util/set-active.d.ts.map +1 -1
  283. package/dist/types/src/util/set-active.test.d.ts +2 -0
  284. package/dist/types/src/util/set-active.test.d.ts.map +1 -0
  285. package/dist/types/tsconfig.tsbuildinfo +1 -1
  286. package/package.json +130 -61
  287. package/src/DeckPlugin.node.ts +17 -0
  288. package/src/DeckPlugin.test.ts +27 -0
  289. package/src/DeckPlugin.ts +32 -56
  290. package/src/DeckPlugin.workerd.ts +16 -0
  291. package/src/capabilities/app-graph-builder.ts +111 -127
  292. package/src/capabilities/check-app-scheme.ts +123 -24
  293. package/src/capabilities/index.ts +13 -14
  294. package/src/capabilities/operation-handler.ts +16 -0
  295. package/src/capabilities/react-root.tsx +37 -30
  296. package/src/capabilities/react-surface.tsx +28 -22
  297. package/src/capabilities/settings.ts +29 -20
  298. package/src/capabilities/state.ts +74 -96
  299. package/src/capabilities/tools.ts +57 -50
  300. package/src/capabilities/url-handler.ts +221 -50
  301. package/src/components/DeckSettings/DeckSettings.stories.tsx +37 -0
  302. package/src/components/DeckSettings/DeckSettings.tsx +19 -88
  303. package/src/components/DeckSettings/index.ts +2 -2
  304. package/src/components/Matrix/Matrix.stories.tsx +220 -0
  305. package/src/components/Matrix/Matrix.tsx +205 -0
  306. package/src/components/Matrix/SPEC.md +219 -0
  307. package/src/components/Matrix/index.ts +6 -0
  308. package/src/components/index.ts +6 -3
  309. package/src/containers/Deck/Banner.tsx +41 -0
  310. package/src/containers/Deck/Deck.stories.tsx +81 -0
  311. package/src/containers/Deck/Deck.tsx +21 -0
  312. package/src/containers/Deck/DeckContent.tsx +102 -0
  313. package/src/containers/Deck/DeckRoot.tsx +50 -0
  314. package/src/containers/Deck/DeckViewport.tsx +450 -0
  315. package/src/{components/DeckLayout → containers/Deck}/StatusBar.tsx +4 -4
  316. package/src/containers/Deck/index.ts +5 -0
  317. package/src/{components → containers}/DeckLayout/ActiveNode.tsx +9 -4
  318. package/src/containers/DeckLayout/DeckLayout.stories.tsx +395 -0
  319. package/src/containers/DeckLayout/DeckLayout.tsx +62 -0
  320. package/src/containers/DeckLayout/Dialog.tsx +52 -0
  321. package/src/containers/DeckLayout/Fallback.tsx +24 -0
  322. package/src/containers/DeckLayout/Popover.tsx +162 -0
  323. package/src/{components → containers}/DeckLayout/Toast.tsx +5 -5
  324. package/src/{components → containers}/DeckLayout/constants.ts +1 -0
  325. package/src/{components → containers}/DeckLayout/index.ts +3 -2
  326. package/src/containers/Plank/Plank.stories.tsx +108 -0
  327. package/src/containers/Plank/Plank.tsx +22 -0
  328. package/src/containers/Plank/PlankComponent.tsx +218 -0
  329. package/src/containers/Plank/PlankContent.tsx +45 -0
  330. package/src/{components → containers}/Plank/PlankControls.tsx +43 -37
  331. package/src/containers/Plank/PlankError.tsx +82 -0
  332. package/src/{components → containers}/Plank/PlankHeading.tsx +67 -64
  333. package/src/{components → containers}/Plank/PlankLoading.tsx +1 -1
  334. package/src/containers/Plank/PlankRoot.tsx +49 -0
  335. package/src/{components → containers}/Plank/index.ts +0 -2
  336. package/src/containers/Sidebar/ComplementarySidebar.tsx +192 -0
  337. package/src/containers/Sidebar/Sidebar.tsx +39 -0
  338. package/src/containers/Sidebar/SidebarButton.tsx +100 -0
  339. package/src/containers/index.ts +11 -0
  340. package/src/hooks/index.ts +2 -1
  341. package/src/hooks/useCompanions.ts +3 -3
  342. package/src/hooks/useDeckCompanions.ts +8 -11
  343. package/src/hooks/useDeckState.ts +73 -0
  344. package/src/hooks/useMainSize.ts +2 -2
  345. package/src/hooks/useNodeActionExpander.ts +4 -4
  346. package/src/hooks/useSelectedCompanion.ts +32 -0
  347. package/src/index.ts +1 -4
  348. package/src/layout.test.ts +59 -0
  349. package/src/layout.ts +38 -40
  350. package/src/meta.ts +22 -5
  351. package/src/operations/add-toast.ts +24 -0
  352. package/src/operations/adjust.ts +82 -0
  353. package/src/operations/close.ts +35 -0
  354. package/src/operations/helpers.ts +22 -0
  355. package/src/operations/index.ts +24 -0
  356. package/src/operations/open.ts +186 -0
  357. package/src/operations/revert-workspace.ts +22 -0
  358. package/src/operations/scroll-into-view.ts +24 -0
  359. package/src/operations/set-layout-mode.ts +84 -0
  360. package/src/operations/set.ts +36 -0
  361. package/src/operations/show-undo.ts +47 -0
  362. package/src/operations/switch-workspace.ts +66 -0
  363. package/src/operations/update-companion.ts +35 -0
  364. package/src/operations/update-complementary.ts +33 -0
  365. package/src/operations/update-dialog.ts +34 -0
  366. package/src/operations/update-plank-size.ts +28 -0
  367. package/src/operations/update-popover.ts +36 -0
  368. package/src/operations/update-sidebar.ts +28 -0
  369. package/src/plugin.ts +11 -0
  370. package/src/translations.ts +43 -54
  371. package/src/types/DeckCapabilities.ts +34 -0
  372. package/src/types/DeckEvents.ts +21 -0
  373. package/src/types/DeckOperation.ts +53 -0
  374. package/src/types/Settings.ts +36 -0
  375. package/src/types/index.ts +5 -0
  376. package/src/types/schema.ts +49 -58
  377. package/src/util/index.ts +2 -1
  378. package/src/util/layoutAppliesTopbar.ts +2 -2
  379. package/src/util/plank-url-params.test.ts +85 -0
  380. package/src/util/plank-url-params.ts +36 -0
  381. package/src/util/sanitize-persisted-state.test.ts +79 -0
  382. package/src/util/sanitize-persisted-state.ts +52 -0
  383. package/src/util/set-active.test.ts +106 -0
  384. package/src/util/set-active.ts +50 -30
  385. package/src/vite-env.d.ts +5 -0
  386. package/dist/lib/browser/app-graph-builder-D74NTOMK.mjs +0 -128
  387. package/dist/lib/browser/app-graph-builder-D74NTOMK.mjs.map +0 -7
  388. package/dist/lib/browser/check-app-scheme-HIEVFAAX.mjs +0 -32
  389. package/dist/lib/browser/check-app-scheme-HIEVFAAX.mjs.map +0 -7
  390. package/dist/lib/browser/chunk-5KMJPIQC.mjs +0 -16
  391. package/dist/lib/browser/chunk-5KMJPIQC.mjs.map +0 -7
  392. package/dist/lib/browser/chunk-CNTGBCMK.mjs +0 -145
  393. package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
  394. package/dist/lib/browser/chunk-F3VCCHVL.mjs +0 -162
  395. package/dist/lib/browser/chunk-F3VCCHVL.mjs.map +0 -7
  396. package/dist/lib/browser/chunk-QKCGZ45E.mjs +0 -128
  397. package/dist/lib/browser/chunk-QKCGZ45E.mjs.map +0 -7
  398. package/dist/lib/browser/chunk-UXLU6CMW.mjs +0 -16
  399. package/dist/lib/browser/chunk-UXLU6CMW.mjs.map +0 -7
  400. package/dist/lib/browser/chunk-VBYJ664A.mjs +0 -132
  401. package/dist/lib/browser/chunk-VBYJ664A.mjs.map +0 -7
  402. package/dist/lib/browser/chunk-VUJ6UNIJ.mjs +0 -1553
  403. package/dist/lib/browser/chunk-VUJ6UNIJ.mjs.map +0 -7
  404. package/dist/lib/browser/index.mjs +0 -174
  405. package/dist/lib/browser/index.mjs.map +0 -7
  406. package/dist/lib/browser/intent-resolver-UA4YQGAC.mjs +0 -524
  407. package/dist/lib/browser/intent-resolver-UA4YQGAC.mjs.map +0 -7
  408. package/dist/lib/browser/meta.json +0 -1
  409. package/dist/lib/browser/react-root-JAMHKYWN.mjs +0 -44
  410. package/dist/lib/browser/react-root-JAMHKYWN.mjs.map +0 -7
  411. package/dist/lib/browser/react-surface-6LW337ZT.mjs +0 -40
  412. package/dist/lib/browser/react-surface-6LW337ZT.mjs.map +0 -7
  413. package/dist/lib/browser/settings-SDPTOCCM.mjs +0 -30
  414. package/dist/lib/browser/settings-SDPTOCCM.mjs.map +0 -7
  415. package/dist/lib/browser/state-7IFAGZQO.mjs +0 -12
  416. package/dist/lib/browser/toolkit-L5CFXJCF.mjs +0 -52
  417. package/dist/lib/browser/toolkit-L5CFXJCF.mjs.map +0 -7
  418. package/dist/lib/browser/types/index.mjs +0 -32
  419. package/dist/lib/browser/url-handler-QEYGYE2H.mjs +0 -70
  420. package/dist/lib/browser/url-handler-QEYGYE2H.mjs.map +0 -7
  421. package/dist/types/src/capabilities/capabilities.d.ts +0 -184
  422. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  423. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  424. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  425. package/dist/types/src/capabilities/toolkit.d.ts +0 -25
  426. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  427. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +0 -1
  428. package/dist/types/src/components/DeckLayout/Banner.d.ts.map +0 -1
  429. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts +0 -3
  430. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +0 -1
  431. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +0 -1
  432. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +0 -74
  433. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +0 -1
  434. package/dist/types/src/components/DeckLayout/DeckMain.d.ts +0 -3
  435. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +0 -1
  436. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +0 -1
  437. package/dist/types/src/components/DeckLayout/Fallback.d.ts +0 -3
  438. package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +0 -1
  439. package/dist/types/src/components/DeckLayout/Popover.d.ts +0 -5
  440. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +0 -1
  441. package/dist/types/src/components/DeckLayout/StatusBar.d.ts.map +0 -1
  442. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +0 -1
  443. package/dist/types/src/components/DeckLayout/Topbar.d.ts +0 -3
  444. package/dist/types/src/components/DeckLayout/Topbar.d.ts.map +0 -1
  445. package/dist/types/src/components/DeckLayout/constants.d.ts.map +0 -1
  446. package/dist/types/src/components/DeckLayout/index.d.ts +0 -4
  447. package/dist/types/src/components/DeckLayout/index.d.ts.map +0 -1
  448. package/dist/types/src/components/Plank/Plank.d.ts +0 -27
  449. package/dist/types/src/components/Plank/Plank.d.ts.map +0 -1
  450. package/dist/types/src/components/Plank/Plank.stories.d.ts +0 -89
  451. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +0 -1
  452. package/dist/types/src/components/Plank/PlankControls.d.ts.map +0 -1
  453. package/dist/types/src/components/Plank/PlankError.d.ts +0 -13
  454. package/dist/types/src/components/Plank/PlankError.d.ts.map +0 -1
  455. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +0 -1
  456. package/dist/types/src/components/Plank/index.d.ts +0 -6
  457. package/dist/types/src/components/Plank/index.d.ts.map +0 -1
  458. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +0 -1
  459. package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +0 -1
  460. package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +0 -1
  461. package/dist/types/src/components/fragments.d.ts +0 -4
  462. package/dist/types/src/components/fragments.d.ts.map +0 -1
  463. package/dist/types/src/events.d.ts +0 -4
  464. package/dist/types/src/events.d.ts.map +0 -1
  465. package/dist/types/src/hooks/useHoistStatusbar.d.ts +0 -3
  466. package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +0 -1
  467. package/dist/types/src/util/overscroll.d.ts +0 -47
  468. package/dist/types/src/util/overscroll.d.ts.map +0 -1
  469. package/src/capabilities/capabilities.ts +0 -14
  470. package/src/capabilities/intent-resolver.ts +0 -471
  471. package/src/capabilities/toolkit.ts +0 -66
  472. package/src/components/DeckLayout/Banner.tsx +0 -39
  473. package/src/components/DeckLayout/ContentEmpty.tsx +0 -31
  474. package/src/components/DeckLayout/DeckLayout.stories.tsx +0 -63
  475. package/src/components/DeckLayout/DeckLayout.tsx +0 -32
  476. package/src/components/DeckLayout/DeckMain.tsx +0 -281
  477. package/src/components/DeckLayout/Dialog.tsx +0 -36
  478. package/src/components/DeckLayout/Fallback.tsx +0 -28
  479. package/src/components/DeckLayout/Popover.tsx +0 -95
  480. package/src/components/DeckLayout/Topbar.tsx +0 -11
  481. package/src/components/Plank/Plank.stories.tsx +0 -54
  482. package/src/components/Plank/Plank.tsx +0 -299
  483. package/src/components/Plank/PlankError.tsx +0 -49
  484. package/src/components/Sidebar/ComplementarySidebar.tsx +0 -214
  485. package/src/components/Sidebar/Sidebar.tsx +0 -42
  486. package/src/components/Sidebar/SidebarButton.tsx +0 -88
  487. package/src/components/fragments.ts +0 -14
  488. package/src/events.ts +0 -11
  489. package/src/hooks/useHoistStatusbar.ts +0 -27
  490. package/src/util/overscroll.ts +0 -69
  491. /package/dist/lib/{browser/state-7IFAGZQO.mjs.map → neutral/check-app-scheme-A7FZVNZO.mjs.map} +0 -0
  492. /package/dist/lib/{browser/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  493. /package/dist/types/src/{components/DeckLayout → containers/Deck}/StatusBar.d.ts +0 -0
  494. /package/dist/types/src/{components → containers}/DeckLayout/ActiveNode.d.ts +0 -0
  495. /package/dist/types/src/{components → containers}/DeckLayout/DeckLayout.d.ts +0 -0
  496. /package/dist/types/src/{components → containers}/DeckLayout/Dialog.d.ts +0 -0
  497. /package/dist/types/src/{components → containers}/DeckLayout/constants.d.ts +0 -0
  498. /package/dist/types/src/{components → containers}/Plank/PlankLoading.d.ts +0 -0
  499. /package/dist/types/src/{components → containers}/Sidebar/ComplementarySidebar.d.ts +0 -0
  500. /package/dist/types/src/{components → containers}/Sidebar/Sidebar.d.ts +0 -0
  501. /package/dist/types/src/{components → containers}/Sidebar/index.d.ts +0 -0
  502. /package/src/{components → containers}/Sidebar/index.ts +0 -0
@@ -0,0 +1,1305 @@
1
+ import {
2
+ layoutAppliesTopbar
3
+ } from "./chunk-GBIGQKYW.mjs";
4
+
5
+ // src/containers/Plank/PlankLoading.tsx
6
+ import React from "react";
7
+ var PlankLoading = () => {
8
+ return /* @__PURE__ */ React.createElement("div", {
9
+ className: "grid place-items-center dx-attention-surface"
10
+ });
11
+ };
12
+
13
+ // src/containers/Plank/PlankError.tsx
14
+ import React5, { useEffect as useEffect2, useMemo as useMemo2, useState } from "react";
15
+ import { TimeoutError } from "@dxos/errors";
16
+ import { log } from "@dxos/log";
17
+ import { ErrorFallback, useTranslation as useTranslation3 } from "@dxos/react-ui";
18
+ import { descriptionMessage, mx } from "@dxos/ui-theme";
19
+ import { meta as meta3 } from "#meta";
20
+
21
+ // src/containers/Plank/PlankHeading.tsx
22
+ import React4, { Fragment, memo, useCallback as useCallback2, useEffect, useMemo } from "react";
23
+ import { Surface } from "@dxos/app-framework/ui";
24
+ import { AppSurface } from "@dxos/app-toolkit/ui";
25
+ import { Graph, useActionRunner } from "@dxos/plugin-graph";
26
+ import { Icon, IconButton as IconButton2, Popover, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
27
+ import { getLinkedVariant } from "@dxos/react-ui-attention";
28
+ import { StackItem } from "@dxos/react-ui-stack";
29
+ import { TextTooltip } from "@dxos/react-ui-text-tooltip";
30
+ import { hoverableControls, hoverableFocusedWithinControls, iconSize } from "@dxos/ui-theme";
31
+ import { useBreakpoints } from "#hooks";
32
+ import { meta as meta2 } from "#meta";
33
+ import { PLANK_COMPANION_TYPE } from "#types";
34
+
35
+ // src/containers/Plank/PlankControls.tsx
36
+ import React2, { forwardRef, useCallback } from "react";
37
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
38
+ import { LayoutOperation } from "@dxos/app-toolkit";
39
+ import { ButtonGroup, IconButton, useTranslation } from "@dxos/react-ui";
40
+ import { meta } from "#meta";
41
+ var plankControlSpacing = "px-2";
42
+ var PlankCompanionControls = /* @__PURE__ */ forwardRef(({ primary }, forwardedRef) => {
43
+ const { t } = useTranslation(meta.id);
44
+ const { invokePromise } = useOperationInvoker();
45
+ const handleCloseCompanion = useCallback(() => {
46
+ return invokePromise(LayoutOperation.UpdateCompanion, {
47
+ subject: null
48
+ });
49
+ }, [
50
+ invokePromise
51
+ ]);
52
+ return /* @__PURE__ */ React2.createElement("div", {
53
+ ref: forwardedRef,
54
+ className: "contents dx-app-no-drag"
55
+ }, /* @__PURE__ */ React2.createElement(PlankControl, {
56
+ label: t("close-companion.label"),
57
+ variant: "ghost",
58
+ icon: "ph--x--regular",
59
+ onClick: handleCloseCompanion,
60
+ classNames: plankControlSpacing
61
+ }));
62
+ });
63
+ var PlankControl = ({ icon, label: label3, ...props }) => {
64
+ return /* @__PURE__ */ React2.createElement(IconButton, {
65
+ label: label3,
66
+ icon,
67
+ iconOnly: true,
68
+ variant: "ghost",
69
+ tooltipSide: "bottom",
70
+ ...props
71
+ });
72
+ };
73
+ var PlankControls = /* @__PURE__ */ forwardRef(({ children, classNames, variant = "default", capabilities, layoutMode, pin, close = false, onClick, ...props }, forwardedRef) => {
74
+ const { t } = useTranslation(meta.id);
75
+ const buttonClassNames = variant === "hide-disabled" ? `disabled:hidden ${plankControlSpacing}` : plankControlSpacing;
76
+ const layoutIsAnySolo = !!layoutMode?.startsWith("solo");
77
+ return /* @__PURE__ */ React2.createElement(ButtonGroup, {
78
+ ...props,
79
+ classNames: [
80
+ "dx-app-no-drag opacity-100!",
81
+ classNames
82
+ ],
83
+ ref: forwardedRef
84
+ }, capabilities.deck ? /* @__PURE__ */ React2.createElement(React2.Fragment, null, capabilities.solo && /* @__PURE__ */ React2.createElement(React2.Fragment, null, layoutMode === "solo" && /* @__PURE__ */ React2.createElement(PlankControl, {
85
+ label: t("show-fullscreen-plank.label"),
86
+ classNames: buttonClassNames,
87
+ icon: "ph--corners-out--regular",
88
+ onClick: () => onClick?.("solo--fullscreen")
89
+ }), /* @__PURE__ */ React2.createElement(PlankControl, {
90
+ label: t(layoutMode === "solo--fullscreen" ? "exit-fullscreen.label" : layoutIsAnySolo ? "show-deck-plank.label" : "show-solo-plank.label"),
91
+ classNames: buttonClassNames,
92
+ icon: layoutMode === "solo--fullscreen" ? "ph--corners-in--regular" : layoutIsAnySolo ? "ph--arrows-in-line-horizontal--regular" : "ph--arrows-out-line-horizontal--regular",
93
+ onClick: () => onClick?.(layoutMode === "solo--fullscreen" ? "solo--fullscreen" : "solo")
94
+ })), !layoutIsAnySolo && layoutMode !== "multi" && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(PlankControl, {
95
+ label: t("increment-start.label"),
96
+ disabled: !capabilities.incrementStart,
97
+ classNames: buttonClassNames,
98
+ icon: "ph--caret-left--regular",
99
+ onClick: () => onClick?.("increment-start")
100
+ }), /* @__PURE__ */ React2.createElement(PlankControl, {
101
+ label: t("increment-end.label"),
102
+ disabled: !capabilities.incrementEnd,
103
+ classNames: buttonClassNames,
104
+ icon: "ph--caret-right--regular",
105
+ onClick: () => onClick?.("increment-end")
106
+ }))) : capabilities.fullscreen && /* @__PURE__ */ React2.createElement(PlankControl, {
107
+ label: t(layoutMode === "solo--fullscreen" ? "exit-fullscreen.label" : "show-fullscreen-plank.label"),
108
+ classNames: buttonClassNames,
109
+ icon: layoutMode === "solo--fullscreen" ? "ph--corners-in--regular" : "ph--corners-out--regular",
110
+ onClick: () => onClick?.("solo--fullscreen")
111
+ }), close && !layoutIsAnySolo && /* @__PURE__ */ React2.createElement(PlankControl, {
112
+ label: t(`${typeof close === "string" ? "minify" : "close"}.label`),
113
+ classNames: buttonClassNames,
114
+ "data-testid": "plankHeading.close",
115
+ icon: close === "minify-start" ? "ph--caret-line-left--regular" : close === "minify-end" ? "ph--caret-line-right--regular" : "ph--x--regular",
116
+ onClick: () => onClick?.("close")
117
+ }), capabilities.companion && /* @__PURE__ */ React2.createElement(PlankControl, {
118
+ label: t("open-companion.label"),
119
+ classNames: buttonClassNames,
120
+ "data-testid": "plankHeading.companion",
121
+ icon: "ph--square-split-horizontal--regular",
122
+ onClick: () => onClick?.("companion")
123
+ }), children);
124
+ });
125
+
126
+ // src/containers/Plank/PlankRoot.tsx
127
+ import { createContext } from "@radix-ui/react-context";
128
+ import React3 from "react";
129
+ var PLANK_NAME = "Plank";
130
+ var [PlankProvider, usePlankContext] = createContext(PLANK_NAME);
131
+ var PlankRoot = ({ children, ...context }) => {
132
+ return /* @__PURE__ */ React3.createElement(PlankProvider, context, children);
133
+ };
134
+
135
+ // src/containers/Plank/PlankHeading.tsx
136
+ var MAX_COMPANIONS = 5;
137
+ var PlankHeading = /* @__PURE__ */ memo(({ id, part, node, deckEnabled, canIncrementStart, canIncrementEnd, popoverAnchorId, primaryId, pending, companioned, companions, layoutMode, actions = [], debug = false }) => {
138
+ const { t } = useTranslation2(meta2.id);
139
+ const { graph, onAdjust, onUpdateCompanion } = usePlankContext("PlankHeading");
140
+ const runAction = useActionRunner();
141
+ const breakpoint = useBreakpoints();
142
+ const icon = node?.properties?.icon ?? "ph--circle-dashed--regular";
143
+ const label3 = pending ? t("pending.heading") : toLocalizedString(node?.properties?.label ?? [
144
+ "plank-heading-fallback.label",
145
+ {
146
+ ns: meta2.id
147
+ }
148
+ ], t);
149
+ const isCompanionNode = node?.type === PLANK_COMPANION_TYPE;
150
+ useEffect(() => {
151
+ const frame = requestAnimationFrame(() => {
152
+ if (node) {
153
+ void Graph.expand(graph, node.id, "child");
154
+ }
155
+ });
156
+ return () => cancelAnimationFrame(frame);
157
+ }, [
158
+ node
159
+ ]);
160
+ const attendableId = primaryId ?? id;
161
+ const capabilities = useMemo(() => ({
162
+ deck: deckEnabled ?? true,
163
+ solo: breakpoint !== "mobile" && (part === "solo" || part === "multi"),
164
+ incrementStart: canIncrementStart,
165
+ incrementEnd: canIncrementEnd,
166
+ fullscreen: !isCompanionNode,
167
+ companion: layoutMode !== "multi" && !isCompanionNode && companions && companions.length > 0
168
+ }), [
169
+ breakpoint,
170
+ part,
171
+ companions,
172
+ canIncrementStart,
173
+ canIncrementEnd,
174
+ isCompanionNode,
175
+ deckEnabled,
176
+ layoutMode
177
+ ]);
178
+ const variant = isCompanionNode ? getLinkedVariant(id) : void 0;
179
+ const sigilActions = useMemo(() => {
180
+ if (!node) {
181
+ return void 0;
182
+ } else if (variant) {
183
+ return [];
184
+ } else {
185
+ return [
186
+ actions,
187
+ Graph.getActions(graph, node.id).filter((action) => [
188
+ "list-item",
189
+ "list-item-primary",
190
+ "heading-list-item"
191
+ ].includes(action.properties.disposition))
192
+ ].filter((a) => a.length > 0);
193
+ }
194
+ }, [
195
+ actions,
196
+ node,
197
+ variant,
198
+ graph
199
+ ]);
200
+ const handleAction = useCallback2((action) => {
201
+ if (typeof action.data === "function") {
202
+ void runAction(action, {
203
+ parent: node,
204
+ caller: meta2.id
205
+ });
206
+ }
207
+ }, [
208
+ node,
209
+ runAction
210
+ ]);
211
+ const handlePlankAction = useCallback2((eventType) => {
212
+ onAdjust?.(id, eventType);
213
+ }, [
214
+ onAdjust,
215
+ id
216
+ ]);
217
+ const ActionRoot = node && popoverAnchorId === `${meta2.id}:${node.id}` ? Popover.Anchor : Fragment;
218
+ const handleTabClick = useCallback2((event) => {
219
+ const target = event.target.closest("[data-id]");
220
+ const tabId = target?.dataset?.id;
221
+ if (tabId) {
222
+ onUpdateCompanion?.(tabId);
223
+ }
224
+ }, [
225
+ onUpdateCompanion
226
+ ]);
227
+ return /* @__PURE__ */ React4.createElement(StackItem.Heading, {
228
+ "data-tauri-drag-region": true,
229
+ "data-plank-heading": true,
230
+ style: iconSize(5),
231
+ classNames: [
232
+ "py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-lg",
233
+ part === "solo" ? "ps-[calc(env(safe-area-inset-left)+.25rem)] pe-[calc(env(safe-area-inset-right)+.25rem)]" : "px-1",
234
+ ...layoutMode === "solo--fullscreen" ? [
235
+ hoverableControls,
236
+ hoverableFocusedWithinControls,
237
+ "*:transition-opacity *:opacity-(--controls-opacity) bg-transparent",
238
+ "border-transparent transition-[background-color,border-color]",
239
+ "hover-hover:hover:bg-header-surface focus-within:bg-header-surface",
240
+ "hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator"
241
+ ] : []
242
+ ]
243
+ }, companions && isCompanionNode ? (
244
+ /* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */
245
+ /* @__PURE__ */ React4.createElement("div", {
246
+ "data-tauri-drag-region": true,
247
+ className: "flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1"
248
+ }, companions.map(({ id: id2, properties: { icon: icon2, label: label4 } }) => /* @__PURE__ */ React4.createElement(IconButton2, {
249
+ key: id2,
250
+ "data-id": id2,
251
+ icon: icon2,
252
+ iconOnly: companions.length > MAX_COMPANIONS && node?.id !== id2,
253
+ label: toLocalizedString(label4, t),
254
+ variant: node?.id === id2 ? "primary" : "ghost",
255
+ onClick: handleTabClick
256
+ })))
257
+ ) : /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(ActionRoot, null, node && sigilActions ? /* @__PURE__ */ React4.createElement(StackItem.Sigil, {
258
+ icon,
259
+ related: part === "complementary",
260
+ attendableId,
261
+ triggerLabel: t("actions-menu.label"),
262
+ actions: sigilActions,
263
+ onAction: handleAction
264
+ }, /* @__PURE__ */ React4.createElement(Surface.Surface, {
265
+ type: AppSurface.MenuFooter,
266
+ data: {
267
+ subject: node.data
268
+ }
269
+ })) : /* @__PURE__ */ React4.createElement(StackItem.SigilButton, null, /* @__PURE__ */ React4.createElement("span", {
270
+ className: "sr-only"
271
+ }, label3), /* @__PURE__ */ React4.createElement(Icon, {
272
+ icon
273
+ }))), /* @__PURE__ */ React4.createElement(TextTooltip, {
274
+ text: label3,
275
+ onlyWhenTruncating: true
276
+ }, /* @__PURE__ */ React4.createElement(StackItem.HeadingLabel, {
277
+ "data-tauri-drag-region": true,
278
+ attendableId,
279
+ related: part === "complementary",
280
+ ...pending && {
281
+ classNames: "text-description"
282
+ }
283
+ }, label3))), debug && /* @__PURE__ */ React4.createElement("div", {
284
+ className: "flex items-center text-sm text-info-text"
285
+ }, layoutMode, ":", part, ":", companioned), node && part !== "complementary" && /* @__PURE__ */ React4.createElement(Surface.Surface, {
286
+ type: AppSurface.NavbarEnd,
287
+ data: {
288
+ subject: node.data
289
+ }
290
+ }), companioned === "companion" ? /* @__PURE__ */ React4.createElement(PlankCompanionControls, {
291
+ primary: primaryId
292
+ }) : /* @__PURE__ */ React4.createElement(PlankControls, {
293
+ capabilities,
294
+ layoutMode,
295
+ close: part === "complementary" ? "minify-end" : true,
296
+ onClick: handlePlankAction
297
+ }));
298
+ });
299
+
300
+ // src/containers/Plank/PlankError.tsx
301
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-deck/src/containers/Plank/PlankError.tsx";
302
+ var PlankError = ({ id, part, node, error: errorProp }) => {
303
+ const [timedOut, setTimedOut] = useState(false);
304
+ useEffect2(() => {
305
+ const timer = setTimeout(() => setTimedOut(true), 5e3);
306
+ return () => clearTimeout(timer);
307
+ }, []);
308
+ const error = useMemo2(() => {
309
+ if (timedOut) {
310
+ return new TimeoutError({
311
+ message: "Timeout loading content"
312
+ });
313
+ }
314
+ return errorProp;
315
+ }, [
316
+ timedOut,
317
+ errorProp
318
+ ]);
319
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(PlankHeading, {
320
+ id,
321
+ part,
322
+ node,
323
+ pending: !timedOut
324
+ }), timedOut ? /* @__PURE__ */ React5.createElement(PlankErrorFallback, {
325
+ error
326
+ }) : /* @__PURE__ */ React5.createElement(PlankLoading, null));
327
+ };
328
+ var PlankErrorFallback = ({ error }) => {
329
+ const { t } = useTranslation3(meta3.id);
330
+ useEffect2(() => {
331
+ if (error) {
332
+ log.error("plank error", {
333
+ error
334
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 44, S: void 0 });
335
+ }
336
+ }, [
337
+ error
338
+ ]);
339
+ if (process.env.NODE_ENV === "development") {
340
+ return /* @__PURE__ */ React5.createElement(ErrorFallback, {
341
+ title: "Plank Error",
342
+ error
343
+ });
344
+ } else {
345
+ const errorString = error?.toString() ?? "";
346
+ return /* @__PURE__ */ React5.createElement("div", {
347
+ role: "alert",
348
+ "data-testid": "plank-content-error",
349
+ className: "dx-attention-surface overflow-y-auto p-8 grid place-items-center"
350
+ }, /* @__PURE__ */ React5.createElement("div", {
351
+ className: "flex flex-col items-center gap-2"
352
+ }, /* @__PURE__ */ React5.createElement("p", {
353
+ className: mx(descriptionMessage, "break-all rounded-md p-4")
354
+ }, error ? errorString : t("error-fallback.message"))));
355
+ }
356
+ };
357
+
358
+ // src/containers/Plank/PlankComponent.tsx
359
+ import { useFocusFinders } from "@fluentui/react-tabster";
360
+ import React6, { memo as memo2, useCallback as useCallback3, useLayoutEffect, useMemo as useMemo3, useRef } from "react";
361
+ import { Surface as Surface2 } from "@dxos/app-framework/ui";
362
+ import { AppSurface as AppSurface2 } from "@dxos/app-toolkit/ui";
363
+ import { debounce } from "@dxos/async";
364
+ import { mainIntrinsicSize } from "@dxos/react-ui";
365
+ import { getLinkedVariant as getLinkedVariant2 } from "@dxos/react-ui-attention";
366
+ import { useAttentionAttributes } from "@dxos/react-ui-attention";
367
+ import { StackItem as StackItem2, railGridHorizontal } from "@dxos/react-ui-stack";
368
+ import { mx as mx2 } from "@dxos/ui-theme";
369
+ import { useMainSize } from "#hooks";
370
+ import { PLANK_COMPANION_TYPE as PLANK_COMPANION_TYPE2 } from "#types";
371
+ var smoothScrollTo = (element, target, duration) => {
372
+ const start = element.scrollLeft;
373
+ const distance = target - start;
374
+ const startTime = performance.now();
375
+ const step = (currentTime) => {
376
+ const elapsed = currentTime - startTime;
377
+ const progress = Math.min(elapsed / duration, 1);
378
+ const eased = 1 - Math.pow(1 - progress, 3);
379
+ element.scrollLeft = start + distance * eased;
380
+ if (progress < 1) {
381
+ requestAnimationFrame(step);
382
+ }
383
+ };
384
+ requestAnimationFrame(step);
385
+ };
386
+ var DEFAULT_SIZE = 48;
387
+ var DEFAULT_COMPANION_SIZE = 35;
388
+ var PlankComponent = /* @__PURE__ */ memo2(({ part, id, path, order, active, node, primary, companions, companioned }) => {
389
+ const { layoutMode, settings, popoverAnchorId, scrollIntoView, plankSizing, onResize, onScrollIntoView } = usePlankContext("PlankComponent");
390
+ const canResize = layoutMode === "multi";
391
+ const { findFirstFocusable } = useFocusFinders();
392
+ const isCompanion = companioned === "companion";
393
+ const attentionAttrs = useAttentionAttributes(primary?.id ?? id);
394
+ const orderId = isCompanion ? primary?.id : id;
395
+ const index = orderId && active ? active.findIndex((entryId) => entryId === orderId) : -1;
396
+ const length = active?.length ?? 1;
397
+ const isOrdered = !!active && index >= 0;
398
+ const canIncrementStart = isOrdered && index > 0;
399
+ const canIncrementEnd = isOrdered && index < length - 1;
400
+ const rootElement = useRef(null);
401
+ const variant = node?.type === PLANK_COMPANION_TYPE2 ? getLinkedVariant2(id) : void 0;
402
+ const sizeAttrs = useMainSize();
403
+ const sizeKey = id.split("+")[0];
404
+ const size = isCompanion ? DEFAULT_COMPANION_SIZE : plankSizing?.[sizeKey] ?? DEFAULT_SIZE;
405
+ const handleSizeChange = useCallback3(debounce((nextSize) => {
406
+ const size2 = Math.round(nextSize);
407
+ onResize?.(sizeKey, size2);
408
+ }, 200), [
409
+ sizeKey,
410
+ onResize
411
+ ]);
412
+ const handleKeyDown = useCallback3((event) => {
413
+ if (event.target === event.currentTarget) {
414
+ switch (event.key) {
415
+ case "Escape":
416
+ rootElement.current?.closest("main")?.focus();
417
+ break;
418
+ case "Enter":
419
+ rootElement.current && findFirstFocusable(rootElement.current)?.focus();
420
+ break;
421
+ }
422
+ }
423
+ }, []);
424
+ useLayoutEffect(() => {
425
+ if (scrollIntoView === id && layoutMode === "multi" && rootElement.current) {
426
+ const element = rootElement.current;
427
+ const scrollParent = element.closest('[style*="overflow"], .overflow-x-auto');
428
+ if (scrollParent) {
429
+ const elementRect = element.getBoundingClientRect();
430
+ const parentRect = scrollParent.getBoundingClientRect();
431
+ const targetScrollLeft = scrollParent.scrollLeft + (elementRect.left - parentRect.left);
432
+ smoothScrollTo(scrollParent, targetScrollLeft, 300);
433
+ }
434
+ onScrollIntoView?.(void 0);
435
+ }
436
+ }, [
437
+ id,
438
+ scrollIntoView,
439
+ layoutMode,
440
+ onScrollIntoView
441
+ ]);
442
+ const isSolo = layoutMode.startsWith("solo") && part === "solo";
443
+ const isAttendable = layoutMode.startsWith("solo") && part.startsWith("solo") || layoutMode === "multi" && part === "multi";
444
+ const data = useMemo3(() => node && {
445
+ attendableId: id,
446
+ subject: node.data,
447
+ companionTo: primary?.data,
448
+ properties: node.properties,
449
+ variant,
450
+ path,
451
+ popoverAnchorId
452
+ }, [
453
+ node,
454
+ node?.data,
455
+ node?.properties,
456
+ path,
457
+ popoverAnchorId,
458
+ primary?.data,
459
+ variant
460
+ ]);
461
+ const placeholder = useMemo3(() => /* @__PURE__ */ React6.createElement(PlankLoading, null), []);
462
+ const Root = part.startsWith("solo") ? "article" : StackItem2.Root;
463
+ const fullscreen = layoutMode === "solo--fullscreen";
464
+ const classNames = [
465
+ "dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-lg",
466
+ isSolo && "absolute inset-0",
467
+ isSolo && mainIntrinsicSize,
468
+ railGridHorizontal,
469
+ part.startsWith("solo") && "grid",
470
+ part.startsWith("solo-") && "grid-rows-subgrid row-span-2 min-w-0",
471
+ fullscreen && "grid-rows-1",
472
+ part === "multi" && (isCompanion ? "border-separator! border-e" : "border-separator! border-x"),
473
+ part === "solo-companion" && "border-separator! border-s",
474
+ settings?.encapsulatedPlanks && !part.startsWith("solo") && "mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden"
475
+ ];
476
+ return /* @__PURE__ */ React6.createElement(Root, {
477
+ ref: rootElement,
478
+ "data-testid": "deck.plank",
479
+ "data-popover-collision-boundary": true,
480
+ tabIndex: 0,
481
+ ...part.startsWith("solo") ? {
482
+ className: mx2(classNames),
483
+ ...sizeAttrs
484
+ } : {
485
+ role: "article",
486
+ item: {
487
+ id
488
+ },
489
+ classNames,
490
+ order,
491
+ size,
492
+ onSizeChange: handleSizeChange
493
+ },
494
+ ...isAttendable ? attentionAttrs : {},
495
+ onKeyDown: handleKeyDown
496
+ }, node ? /* @__PURE__ */ React6.createElement(React6.Fragment, null, !fullscreen && /* @__PURE__ */ React6.createElement(PlankHeading, {
497
+ id,
498
+ part: part.startsWith("solo-") ? "solo" : part,
499
+ node,
500
+ layoutMode,
501
+ deckEnabled: settings?.enableDeck,
502
+ canIncrementStart,
503
+ canIncrementEnd,
504
+ popoverAnchorId,
505
+ primaryId: primary?.id,
506
+ companioned,
507
+ companions
508
+ }), /* @__PURE__ */ React6.createElement(Surface2.Surface, {
509
+ key: node.id,
510
+ type: AppSurface2.Article,
511
+ data,
512
+ limit: 1,
513
+ fallback: PlankErrorFallback,
514
+ placeholder
515
+ })) : /* @__PURE__ */ React6.createElement(PlankError, {
516
+ id,
517
+ part
518
+ }), canResize && /* @__PURE__ */ React6.createElement(StackItem2.ResizeHandle, null));
519
+ });
520
+
521
+ // src/containers/Plank/PlankContent.tsx
522
+ import React7 from "react";
523
+ import { composable, composableProps, mainIntrinsicSize as mainIntrinsicSize2 } from "@dxos/react-ui";
524
+ import { railGridHorizontal as railGridHorizontal2 } from "@dxos/react-ui-stack";
525
+ import { useMainSize as useMainSize2 } from "#hooks";
526
+ var PlankContent = composable(({ children, solo, companion, encapsulate, ...props }, forwardedRef) => {
527
+ const sizeAttrs = useMainSize2();
528
+ if (!solo) {
529
+ return children;
530
+ }
531
+ return /* @__PURE__ */ React7.createElement("div", {
532
+ ...sizeAttrs,
533
+ ...composableProps(props, {
534
+ role: "none",
535
+ classNames: [
536
+ "absolute inset-(--main-spacing) grid",
537
+ railGridHorizontal2,
538
+ mainIntrinsicSize2,
539
+ companion && "grid-cols-[6fr_4fr]",
540
+ encapsulate && "border border-separator rounded-sm overflow-hidden"
541
+ ]
542
+ }),
543
+ "data-popover-collision-boundary": true,
544
+ ref: forwardedRef
545
+ }, children);
546
+ });
547
+
548
+ // src/containers/Plank/Plank.tsx
549
+ var Plank = {
550
+ Root: PlankRoot,
551
+ Content: PlankContent,
552
+ Component: PlankComponent,
553
+ Heading: PlankHeading,
554
+ Controls: PlankControls
555
+ };
556
+
557
+ // src/containers/Sidebar/SidebarButton.tsx
558
+ import React8, { useCallback as useCallback4 } from "react";
559
+ import { useOperationInvoker as useOperationInvoker2 } from "@dxos/app-framework/ui";
560
+ import { LayoutOperation as LayoutOperation2 } from "@dxos/app-toolkit";
561
+ import { IconButton as IconButton3, useTranslation as useTranslation4 } from "@dxos/react-ui";
562
+ import { getLinkedVariant as getLinkedVariant3 } from "@dxos/react-ui-attention";
563
+ import { useDeckCompanions, useDeckState } from "#hooks";
564
+ import { meta as meta4 } from "#meta";
565
+ var ToggleSidebarButton = ({ classNames, variant = "ghost" }) => {
566
+ const { updateState } = useDeckState();
567
+ const { t } = useTranslation4(meta4.id);
568
+ const handleClick = useCallback4(() => {
569
+ updateState((state) => ({
570
+ ...state,
571
+ sidebarState: state.sidebarState === "expanded" ? "collapsed" : "expanded"
572
+ }));
573
+ }, [
574
+ updateState
575
+ ]);
576
+ return /* @__PURE__ */ React8.createElement(IconButton3, {
577
+ variant,
578
+ icon: "ph--sidebar--regular",
579
+ iconOnly: true,
580
+ size: 4,
581
+ label: t("open-navigation-sidebar.label"),
582
+ onClick: handleClick,
583
+ classNames
584
+ });
585
+ };
586
+ var CloseSidebarButton = () => {
587
+ const { updateState } = useDeckState();
588
+ const { t } = useTranslation4(meta4.id);
589
+ const handleClick = useCallback4(() => {
590
+ updateState((state) => ({
591
+ ...state,
592
+ sidebarState: "collapsed"
593
+ }));
594
+ }, [
595
+ updateState
596
+ ]);
597
+ return /* @__PURE__ */ React8.createElement(IconButton3, {
598
+ variant: "ghost",
599
+ icon: "ph--caret-line-left--regular",
600
+ iconOnly: true,
601
+ size: 4,
602
+ label: t("close-navigation-sidebar.button"),
603
+ onClick: handleClick,
604
+ classNames: "rounded-none px-1 dx-focus-ring-inset pe-[max(.5rem,env(safe-area-inset-left))]"
605
+ });
606
+ };
607
+ var ToggleComplementarySidebarButton = ({ inR0, classNames, current }) => {
608
+ const { invokePromise } = useOperationInvoker2();
609
+ const { state, updateState } = useDeckState();
610
+ const { t } = useTranslation4(meta4.id);
611
+ const companions = useDeckCompanions();
612
+ const handleClick = useCallback4(() => {
613
+ const nextState = state.complementarySidebarState === "expanded" ? "collapsed" : "expanded";
614
+ updateState((state2) => ({
615
+ ...state2,
616
+ complementarySidebarState: nextState
617
+ }));
618
+ const subject = state.complementarySidebarPanel ?? (companions[0] && getLinkedVariant3(companions[0].id));
619
+ if (nextState === "expanded" && !current && subject) {
620
+ void invokePromise(LayoutOperation2.UpdateComplementary, {
621
+ subject
622
+ });
623
+ }
624
+ }, [
625
+ state,
626
+ updateState,
627
+ current,
628
+ companions,
629
+ invokePromise
630
+ ]);
631
+ const label3 = t(state.complementarySidebarState === "expanded" ? "close-complementary-sidebar.label" : "open-complementary-sidebar.label");
632
+ return /* @__PURE__ */ React8.createElement(IconButton3, {
633
+ variant: "ghost",
634
+ classNames: [
635
+ "[&>svg]:-scale-x-100",
636
+ classNames
637
+ ],
638
+ icon: "ph--sidebar-simple--regular",
639
+ iconOnly: true,
640
+ label: label3,
641
+ tooltipSide: inR0 ? "left" : void 0,
642
+ onClick: handleClick
643
+ });
644
+ };
645
+
646
+ // src/containers/Sidebar/ComplementarySidebar.tsx
647
+ import React9, { useCallback as useCallback5, useEffect as useEffect3, useMemo as useMemo4, useState as useState2 } from "react";
648
+ import { Surface as Surface3, useOperationInvoker as useOperationInvoker3 } from "@dxos/app-framework/ui";
649
+ import { LayoutOperation as LayoutOperation3 } from "@dxos/app-toolkit";
650
+ import { IconButton as IconButton4, Main, Panel, toLocalizedString as toLocalizedString2, Toolbar, useTranslation as useTranslation5 } from "@dxos/react-ui";
651
+ import { getLinkedVariant as getLinkedVariant4 } from "@dxos/react-ui-attention";
652
+ import { Tabs } from "@dxos/react-ui-tabs";
653
+ import { iconSize as iconSize2, mx as mx3 } from "@dxos/ui-theme";
654
+ import { useBreakpoints as useBreakpoints2, useDeckCompanions as useDeckCompanions2, useDeckState as useDeckState2 } from "#hooks";
655
+ import { meta as meta5 } from "#meta";
656
+ import { getMode } from "#types";
657
+ var label = [
658
+ "complementary-sidebar.title",
659
+ {
660
+ ns: meta5.id
661
+ }
662
+ ];
663
+ var ComplementarySidebar = ({ current }) => {
664
+ const { invokePromise } = useOperationInvoker3();
665
+ const { t } = useTranslation5(meta5.id);
666
+ const { state, deck, updateState } = useDeckState2();
667
+ const layoutMode = getMode(deck);
668
+ const breakpoint = useBreakpoints2();
669
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
670
+ const companions = useDeckCompanions2();
671
+ const activeCompanion = companions.find((companion) => getLinkedVariant4(companion.id) === current);
672
+ const activeId = activeCompanion && getLinkedVariant4(activeCompanion.id);
673
+ const [internalValue, setInternalValue] = useState2(activeId);
674
+ useEffect3(() => {
675
+ setInternalValue(activeId);
676
+ }, [
677
+ activeId
678
+ ]);
679
+ const handleTabClick = useCallback5((event) => {
680
+ const nextValue = event.currentTarget.getAttribute("data-value");
681
+ if (nextValue === activeId) {
682
+ updateState((state2) => ({
683
+ ...state2,
684
+ complementarySidebarState: state2.complementarySidebarState === "expanded" ? "collapsed" : "expanded"
685
+ }));
686
+ } else {
687
+ setInternalValue(nextValue);
688
+ updateState((state2) => ({
689
+ ...state2,
690
+ complementarySidebarState: "expanded"
691
+ }));
692
+ void invokePromise(LayoutOperation3.UpdateComplementary, {
693
+ subject: nextValue
694
+ });
695
+ }
696
+ }, [
697
+ state.complementarySidebarState,
698
+ activeId,
699
+ invokePromise,
700
+ updateState
701
+ ]);
702
+ const data = useMemo4(() => activeCompanion && {
703
+ id: activeCompanion.id,
704
+ subject: activeCompanion.data
705
+ }, [
706
+ activeCompanion?.id,
707
+ activeCompanion?.data
708
+ ]);
709
+ useEffect3(() => {
710
+ if (!activeId) {
711
+ void invokePromise(LayoutOperation3.UpdateComplementary, {
712
+ state: "collapsed"
713
+ });
714
+ }
715
+ }, [
716
+ activeId,
717
+ invokePromise
718
+ ]);
719
+ return /* @__PURE__ */ React9.createElement(Main.ComplementarySidebar, {
720
+ label,
721
+ classNames: [
722
+ topbar && "top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]"
723
+ ]
724
+ }, /* @__PURE__ */ React9.createElement(Tabs.Root, {
725
+ classNames: "contents",
726
+ orientation: "vertical",
727
+ value: internalValue
728
+ }, /* @__PURE__ */ React9.createElement("div", {
729
+ "data-tauri-drag-region": true,
730
+ style: iconSize2(5),
731
+ className: mx3("absolute z-1 inset-y-0 end-0 w-(--dx-r0-size)!", "py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator", "grid grid-cols-1 grid-rows-[1fr_min-content] bg-toolbar-surface dx-contain-layout dx-app-drag")
732
+ }, /* @__PURE__ */ React9.createElement(Tabs.Tablist, {
733
+ classNames: "grid grid-cols-1 auto-rows-(--dx-rail-action) overflow-y-auto gap-1 p-1"
734
+ }, companions.map((companion) => /* @__PURE__ */ React9.createElement(Tabs.Tab, {
735
+ key: getLinkedVariant4(companion.id),
736
+ value: getLinkedVariant4(companion.id),
737
+ asChild: true
738
+ }, /* @__PURE__ */ React9.createElement(IconButton4, {
739
+ classNames: "w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0",
740
+ label: toLocalizedString2(companion.properties.label, t),
741
+ icon: companion.properties.icon,
742
+ iconOnly: true,
743
+ tooltipSide: "left",
744
+ "data-value": getLinkedVariant4(companion.id),
745
+ ...companion.properties.joyride && {
746
+ "data-joyride": companion.properties.joyride
747
+ },
748
+ variant: activeId === getLinkedVariant4(companion.id) ? state.complementarySidebarState === "expanded" ? "primary" : "ghost" : "ghost",
749
+ onClick: handleTabClick
750
+ })))), /* @__PURE__ */ React9.createElement("div", {
751
+ className: "grid grid-cols-1 auto-rows-(--dx-rail-item) py-0.5 gap-0.5 overflow-y-auto scrollbar-none",
752
+ style: iconSize2(4)
753
+ }, /* @__PURE__ */ React9.createElement(Surface3.Surface, {
754
+ role: "status-indicator"
755
+ })), /* @__PURE__ */ React9.createElement("div", {
756
+ className: "hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1"
757
+ }, /* @__PURE__ */ React9.createElement(ToggleComplementarySidebarButton, null))), activeId && companions.map((companion) => /* @__PURE__ */ React9.createElement(Tabs.Panel, {
758
+ key: getLinkedVariant4(companion.id),
759
+ value: getLinkedVariant4(companion.id),
760
+ classNames: [
761
+ 'absolute data-[state="inactive"]:-z-[1] overflow-hidden',
762
+ "inset-y-0 start-0 w-full lg:w-(--dx-r1-size)"
763
+ ],
764
+ ...state.complementarySidebarState !== "expanded" && {
765
+ inert: true
766
+ }
767
+ }, /* @__PURE__ */ React9.createElement(ComplementarySidebarPanel, {
768
+ companion,
769
+ activeId,
770
+ data
771
+ })))));
772
+ };
773
+ var ComplementarySidebarPanel = ({ companion, activeId, data }) => {
774
+ const { t } = useTranslation5(meta5.id);
775
+ if (getLinkedVariant4(companion.id) !== activeId && !data) {
776
+ return null;
777
+ }
778
+ return /* @__PURE__ */ React9.createElement(Panel.Root, null, /* @__PURE__ */ React9.createElement(Panel.Toolbar, {
779
+ asChild: true,
780
+ size: "lg"
781
+ }, /* @__PURE__ */ React9.createElement(Toolbar.Root, {
782
+ style: iconSize2(5),
783
+ classNames: "bg-modal-surface border-b border-subdued-separator"
784
+ }, /* @__PURE__ */ React9.createElement(IconButton4, {
785
+ classNames: "w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0",
786
+ label: toLocalizedString2(companion.properties.label, t),
787
+ icon: companion.properties.icon,
788
+ iconOnly: true,
789
+ tooltipSide: "left",
790
+ "data-value": getLinkedVariant4(companion.id),
791
+ variant: "default"
792
+ }), /* @__PURE__ */ React9.createElement("div", {
793
+ role: "none",
794
+ className: "px-1"
795
+ }, toLocalizedString2(companion.properties.label, t)))), /* @__PURE__ */ React9.createElement(Panel.Content, {
796
+ classNames: "bg-base-surface"
797
+ }, /* @__PURE__ */ React9.createElement(Surface3.Surface, {
798
+ role: `deck-companion--${getLinkedVariant4(companion.id)}`,
799
+ data,
800
+ fallback: PlankErrorFallback,
801
+ placeholder: /* @__PURE__ */ React9.createElement(PlankLoading, null)
802
+ })));
803
+ };
804
+
805
+ // src/containers/Sidebar/Sidebar.tsx
806
+ import React10, { useMemo as useMemo5 } from "react";
807
+ import { Surface as Surface4 } from "@dxos/app-framework/ui";
808
+ import { AppSurface as AppSurface3 } from "@dxos/app-toolkit/ui";
809
+ import { Main as Main2 } from "@dxos/react-ui";
810
+ import { useBreakpoints as useBreakpoints3, useDeckState as useDeckState3 } from "#hooks";
811
+ import { meta as meta6 } from "#meta";
812
+ import { getMode as getMode2 } from "#types";
813
+ var label2 = [
814
+ "sidebar.title",
815
+ {
816
+ ns: meta6.id
817
+ }
818
+ ];
819
+ var Sidebar = () => {
820
+ const { state, deck } = useDeckState3();
821
+ const { popoverAnchorId, activeDeck: current } = state;
822
+ const breakpoint = useBreakpoints3();
823
+ const layoutMode = getMode2(deck);
824
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
825
+ const navigationData = useMemo5(() => ({
826
+ popoverAnchorId,
827
+ topbar,
828
+ current
829
+ }), [
830
+ popoverAnchorId,
831
+ topbar,
832
+ current
833
+ ]);
834
+ return /* @__PURE__ */ React10.createElement(Main2.NavigationSidebar, {
835
+ label: label2,
836
+ classNames: [
837
+ "grid",
838
+ topbar && "top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]"
839
+ ]
840
+ }, /* @__PURE__ */ React10.createElement(Surface4.Surface, {
841
+ type: AppSurface3.Navigation,
842
+ data: navigationData,
843
+ limit: 1
844
+ }));
845
+ };
846
+
847
+ // src/containers/Deck/DeckContent.tsx
848
+ import React13, { useCallback as useCallback6, useEffect as useEffect4, useRef as useRef2 } from "react";
849
+ import { AttentionCapabilities } from "@dxos/plugin-attention";
850
+ import { Main as Main3, useMediaQuery } from "@dxos/react-ui";
851
+ import { useBreakpoints as useBreakpoints4 } from "#hooks";
852
+
853
+ // src/containers/Deck/Banner.tsx
854
+ import React11 from "react";
855
+ import { Surface as Surface5 } from "@dxos/app-framework/ui";
856
+ import { useTranslation as useTranslation6 } from "@dxos/react-ui";
857
+ import { mx as mx4, osTranslations } from "@dxos/ui-theme";
858
+ import { meta as meta7 } from "#meta";
859
+ var Banner = ({ variant, classNames }) => {
860
+ const { t } = useTranslation6(meta7.id);
861
+ return /* @__PURE__ */ React11.createElement("header", {
862
+ className: mx4("flex items-stretch relative py-1 ps-1 pe-2", variant === "topbar" && "fixed inset-x-0 top-[env(safe-area-inset-top)] h-(--dx-rail-size) border-b border-separator", classNames)
863
+ }, variant === "sidebar" ? /* @__PURE__ */ React11.createElement(CloseSidebarButton, null) : /* @__PURE__ */ React11.createElement(ToggleSidebarButton, null), /* @__PURE__ */ React11.createElement("span", {
864
+ className: "self-center grow ms-1"
865
+ }, t("current-app.name", {
866
+ ns: osTranslations
867
+ })), variant === "topbar" && /* @__PURE__ */ React11.createElement("div", {
868
+ className: "absolute inset-0 pointer-events-none"
869
+ }, /* @__PURE__ */ React11.createElement("div", {
870
+ className: "grid h-full pointer-fine:p-1 max-w-md mx-auto pointer-events-auto"
871
+ }, /* @__PURE__ */ React11.createElement(Surface5.Surface, {
872
+ role: "search-input",
873
+ limit: 1
874
+ }))), /* @__PURE__ */ React11.createElement("span", {
875
+ role: "none",
876
+ className: "grow"
877
+ }), /* @__PURE__ */ React11.createElement(Surface5.Surface, {
878
+ role: "version-info",
879
+ limit: 1
880
+ }), /* @__PURE__ */ React11.createElement(Surface5.Surface, {
881
+ role: "notch-start",
882
+ limit: 1
883
+ }));
884
+ };
885
+
886
+ // src/containers/Deck/DeckRoot.tsx
887
+ import { createContext as createContext2 } from "@radix-ui/react-context";
888
+ import React12 from "react";
889
+ var DECK_NAME = "Deck";
890
+ var DECK_ROOT_NAME = "DeckRoot";
891
+ var [DeckProvider, useDeckContext] = createContext2(DECK_NAME);
892
+ var DeckRoot = ({ children, ...context }) => {
893
+ return /* @__PURE__ */ React12.createElement(DeckProvider, context, children);
894
+ };
895
+ DeckRoot.displayName = DECK_ROOT_NAME;
896
+
897
+ // src/containers/Deck/DeckContent.tsx
898
+ var DECK_CONTENT_NAME = "DeckContent";
899
+ var DeckContent = ({ children }) => {
900
+ const { state: { sidebarState, complementarySidebarState, complementarySidebarPanel }, deck: { active, fullscreen, solo }, updateState, layoutMode, settings, pluginManager, onLayoutChange } = useDeckContext(DECK_CONTENT_NAME);
901
+ const breakpoint = useBreakpoints4();
902
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
903
+ useEffect4(() => {
904
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
905
+ const attended = attention.getCurrent();
906
+ const firstId = solo ?? active[0];
907
+ if (attended.length === 0 && firstId) {
908
+ document.querySelector(`article[data-attendable-id="${firstId}"] button`)?.focus();
909
+ }
910
+ }, []);
911
+ const [isNotMobile] = useMediaQuery("md");
912
+ const shouldRevert = useRef2(false);
913
+ useEffect4(() => {
914
+ if (!isNotMobile && layoutMode === "multi") {
915
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
916
+ const attended = attention.getCurrent();
917
+ shouldRevert.current = true;
918
+ onLayoutChange({
919
+ subject: attended[0],
920
+ mode: "solo"
921
+ });
922
+ } else if (isNotMobile && layoutMode === "solo" && shouldRevert.current) {
923
+ onLayoutChange({
924
+ revert: true
925
+ });
926
+ }
927
+ }, [
928
+ isNotMobile,
929
+ layoutMode,
930
+ onLayoutChange
931
+ ]);
932
+ useEffect4(() => {
933
+ if (!settings?.enableDeck && layoutMode === "multi") {
934
+ onLayoutChange({
935
+ subject: active[0],
936
+ mode: "solo"
937
+ });
938
+ }
939
+ }, [
940
+ settings?.enableDeck,
941
+ onLayoutChange,
942
+ active,
943
+ layoutMode
944
+ ]);
945
+ const handleNavigationSidebarStateChange = useCallback6((next) => {
946
+ updateState((s) => ({
947
+ ...s,
948
+ sidebarState: next
949
+ }));
950
+ }, [
951
+ updateState
952
+ ]);
953
+ const handleComplementarySidebarStateChange = useCallback6((next) => {
954
+ updateState((s) => ({
955
+ ...s,
956
+ complementarySidebarState: next
957
+ }));
958
+ }, [
959
+ updateState
960
+ ]);
961
+ return /* @__PURE__ */ React13.createElement(Main3.Root, {
962
+ navigationSidebarState: fullscreen ? "closed" : sidebarState,
963
+ complementarySidebarState: fullscreen ? "closed" : complementarySidebarState,
964
+ onNavigationSidebarStateChange: handleNavigationSidebarStateChange,
965
+ onComplementarySidebarStateChange: handleComplementarySidebarStateChange
966
+ }, /* @__PURE__ */ React13.createElement(Sidebar, null), /* @__PURE__ */ React13.createElement(ComplementarySidebar, {
967
+ current: complementarySidebarPanel
968
+ }), /* @__PURE__ */ React13.createElement(Main3.Overlay, null), children, topbar && /* @__PURE__ */ React13.createElement(Banner, {
969
+ variant: "topbar"
970
+ }));
971
+ };
972
+ DeckContent.displayName = DECK_CONTENT_NAME;
973
+
974
+ // src/containers/Deck/DeckViewport.tsx
975
+ import React14, { Fragment as Fragment2, memo as memo3, useCallback as useCallback7, useEffect as useEffect5, useMemo as useMemo6, useRef as useRef3 } from "react";
976
+ import { Surface as Surface6, useOperationInvoker as useOperationInvoker4 } from "@dxos/app-framework/ui";
977
+ import { LayoutOperation as LayoutOperation4 } from "@dxos/app-toolkit";
978
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
979
+ import { addEventListener } from "@dxos/async";
980
+ import { invariant } from "@dxos/invariant";
981
+ import { useNode } from "@dxos/plugin-graph";
982
+ import { IconButton as IconButton5, Main as Main4, useOnTransition, useTranslation as useTranslation7 } from "@dxos/react-ui";
983
+ import { mainPaddingTransitions } from "@dxos/react-ui";
984
+ import { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from "@dxos/react-ui-stack";
985
+ import { hoverableControls as hoverableControls2, hoverableFocusedWithinControls as hoverableFocusedWithinControls2, mx as mx5 } from "@dxos/ui-theme";
986
+ import { useBreakpoints as useBreakpoints5, useCompanions, useDeckState as useDeckState4, useSelectedCompanion } from "#hooks";
987
+ import { meta as meta8 } from "#meta";
988
+ import { DeckOperation } from "#types";
989
+ import { getMode as getMode3 } from "#types";
990
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-deck/src/containers/Deck/DeckViewport.tsx";
991
+ var DECK_VIEWPORT_NAME = "DeckViewport";
992
+ var DeckViewport = ({ children }) => {
993
+ const { deck: { active, plankSizing }, state: { sidebarState, complementarySidebarState }, settings, layoutMode } = useDeckContext(DECK_VIEWPORT_NAME);
994
+ const breakpoint = useBreakpoints5();
995
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
996
+ return /* @__PURE__ */ React14.createElement(Main4.Content, {
997
+ bounce: true,
998
+ handlesFocus: true,
999
+ classNames: [
1000
+ "grid top-[env(safe-area-inset-top)]!",
1001
+ topbar && "top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]!"
1002
+ ],
1003
+ style: {
1004
+ "--main-spacing": settings?.encapsulatedPlanks ? "0.75rem" : "0",
1005
+ "--main-sidebar-width": sidebarState === "expanded" ? "var(--dx-nav-sidebar-size)" : sidebarState === "collapsed" ? "var(--dx-l0-size)" : "0",
1006
+ "--main-complementary-width": complementarySidebarState === "expanded" ? "var(--dx-complementary-sidebar-size)" : complementarySidebarState === "collapsed" ? "var(--dx-rail-size)" : "0",
1007
+ "--main-content-first-width": `${plankSizing[active[0] ?? "never"] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
1008
+ "--main-content-last-width": `${plankSizing[active[(active.length ?? 1) - 1] ?? "never"] ?? DEFAULT_HORIZONTAL_SIZE}rem`
1009
+ }
1010
+ }, children);
1011
+ };
1012
+ DeckViewport.displayName = DECK_VIEWPORT_NAME;
1013
+ var DeckContentEmpty = () => {
1014
+ const breakpoint = useBreakpoints5();
1015
+ const { deck } = useDeckState4();
1016
+ const layoutMode = getMode3(deck);
1017
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
1018
+ return /* @__PURE__ */ React14.createElement("div", {
1019
+ className: "grid place-items-center p-8 relative bg-deck-surface",
1020
+ "data-testid": "layoutPlugin.firstRunMessage"
1021
+ }, /* @__PURE__ */ React14.createElement(Surface6.Surface, {
1022
+ role: "keyshortcuts"
1023
+ }), !topbar && /* @__PURE__ */ React14.createElement(ToggleSidebarButton2, null));
1024
+ };
1025
+ var DeckSoloMode = () => {
1026
+ const { deck, settings, layoutMode, onLayoutChange } = useDeckContext("DeckSoloMode");
1027
+ const { companionOpen, companionVariant, fullscreen, solo } = deck;
1028
+ const effectiveCompanionVariant = fullscreen ? void 0 : companionOpen ? companionVariant : void 0;
1029
+ const breakpoint = useBreakpoints5();
1030
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
1031
+ invariant(solo, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 73, S: void 0, A: ["solo", ""] });
1032
+ useEffect5(() => {
1033
+ if (!fullscreen) {
1034
+ return;
1035
+ }
1036
+ const handleKeyDown = (event) => {
1037
+ if (event.key === "Escape") {
1038
+ event.preventDefault();
1039
+ event.stopPropagation();
1040
+ onLayoutChange({
1041
+ mode: "solo--fullscreen"
1042
+ });
1043
+ }
1044
+ };
1045
+ document.addEventListener("keydown", handleKeyDown);
1046
+ return () => document.removeEventListener("keydown", handleKeyDown);
1047
+ }, [
1048
+ fullscreen,
1049
+ onLayoutChange
1050
+ ]);
1051
+ return /* @__PURE__ */ React14.createElement("div", {
1052
+ className: "relative overflow-hidden bg-deck-surface"
1053
+ }, /* @__PURE__ */ React14.createElement(DeckSidebarToggles, {
1054
+ topbar,
1055
+ fullscreen
1056
+ }), fullscreen && /* @__PURE__ */ React14.createElement(ExitFullscreenButton, {
1057
+ onExit: () => onLayoutChange({
1058
+ mode: "solo--fullscreen"
1059
+ })
1060
+ }), /* @__PURE__ */ React14.createElement(StackContext.Provider, {
1061
+ value: {
1062
+ orientation: "horizontal",
1063
+ size: "contain",
1064
+ rail: true
1065
+ }
1066
+ }, /* @__PURE__ */ React14.createElement(PlankContainer, {
1067
+ id: solo,
1068
+ part: "solo",
1069
+ layoutMode,
1070
+ companionVariant: effectiveCompanionVariant,
1071
+ settings
1072
+ })));
1073
+ };
1074
+ var DeckMultiMode = () => {
1075
+ const { deck: { active, companionVariant, fullscreen }, settings, layoutMode } = useDeckContext("DeckMultiMode");
1076
+ const effectiveCompanionVariant = companionVariant;
1077
+ const lastPlankId = active[active.length - 1];
1078
+ const lastPlankCompanions = useCompanions(lastPlankId);
1079
+ const breakpoint = useBreakpoints5();
1080
+ const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
1081
+ const deckRef = useRef3(null);
1082
+ const scrollLeftRef = useRef3(null);
1083
+ useEffect5(() => addEventListener(window, "resize", () => {
1084
+ scrollLeftRef.current = null;
1085
+ }), []);
1086
+ const restoreScroll = useCallback7(() => {
1087
+ if (deckRef.current && scrollLeftRef.current != null) {
1088
+ deckRef.current.scrollLeft = scrollLeftRef.current;
1089
+ }
1090
+ }, []);
1091
+ useOnTransition(layoutMode, (mode) => mode !== "multi", "multi", restoreScroll);
1092
+ const handleScroll = useCallback7((event) => {
1093
+ if (event.currentTarget === event.target) {
1094
+ scrollLeftRef.current = event.target.scrollLeft;
1095
+ }
1096
+ }, []);
1097
+ const { order, itemsCount } = useMemo6(() => {
1098
+ const lastHasCompanions = lastPlankCompanions.length > 0;
1099
+ return active.reduce((acc, entryId, index) => {
1100
+ const isLastPlank = index === active.length - 1;
1101
+ acc.order[entryId] = acc.itemsCount + 1;
1102
+ acc.itemsCount += lastHasCompanions && isLastPlank ? 3 : 2;
1103
+ return acc;
1104
+ }, {
1105
+ order: {},
1106
+ itemsCount: 0
1107
+ });
1108
+ }, [
1109
+ active,
1110
+ lastPlankCompanions.length
1111
+ ]);
1112
+ return /* @__PURE__ */ React14.createElement("div", {
1113
+ className: "relative bg-deck-surface overflow-hidden"
1114
+ }, /* @__PURE__ */ React14.createElement(DeckSidebarToggles, {
1115
+ topbar,
1116
+ fullscreen
1117
+ }), /* @__PURE__ */ React14.createElement(Stack, {
1118
+ classNames: [
1119
+ "absolute h-[calc(100%-2*var(--main-spacing))] w-full inset-y-(--main-spacing) -inset-w-px",
1120
+ mainPaddingTransitions
1121
+ ],
1122
+ orientation: "horizontal",
1123
+ size: "contain",
1124
+ itemsCount: itemsCount - 1,
1125
+ onScroll: handleScroll,
1126
+ ref: deckRef
1127
+ }, active.map((entryId) => /* @__PURE__ */ React14.createElement(Fragment2, {
1128
+ key: entryId
1129
+ }, /* @__PURE__ */ React14.createElement(PlankSeparator, {
1130
+ hidden: true,
1131
+ order: order[entryId] - 1,
1132
+ encapsulate: !!settings?.encapsulatedPlanks
1133
+ }), /* @__PURE__ */ React14.createElement(PlankContainer, {
1134
+ id: entryId,
1135
+ part: "multi",
1136
+ active,
1137
+ order: order[entryId],
1138
+ layoutMode,
1139
+ companionVariant: effectiveCompanionVariant,
1140
+ settings
1141
+ })))));
1142
+ };
1143
+ var sidebarToggleStyles = "h-(--dx-rail-item) w-(--dx-rail-item) absolute bottom-2 z-[1] bg-deck-surface! lg:hidden";
1144
+ var ToggleSidebarButton2 = () => /* @__PURE__ */ React14.createElement(ToggleSidebarButton, {
1145
+ classNames: mx5(sidebarToggleStyles, "left-2")
1146
+ });
1147
+ var ToggleComplementarySidebarButton2 = () => /* @__PURE__ */ React14.createElement(ToggleComplementarySidebarButton, {
1148
+ classNames: mx5(sidebarToggleStyles, "right-2")
1149
+ });
1150
+ var ExitFullscreenButton = ({ onExit }) => {
1151
+ const { t } = useTranslation7(meta8.id);
1152
+ return /* @__PURE__ */ React14.createElement("div", {
1153
+ className: mx5("fixed top-2 right-2 z-[1]", hoverableControls2, hoverableFocusedWithinControls2, "transition-opacity opacity-(--controls-opacity)")
1154
+ }, /* @__PURE__ */ React14.createElement(IconButton5, {
1155
+ label: t("exit-fullscreen.label"),
1156
+ icon: "ph--corners-in--regular",
1157
+ iconOnly: true,
1158
+ variant: "ghost",
1159
+ tooltipSide: "bottom",
1160
+ onClick: onExit
1161
+ }));
1162
+ };
1163
+ var DeckSidebarToggles = ({ topbar, fullscreen }) => {
1164
+ if (topbar || fullscreen) {
1165
+ return null;
1166
+ }
1167
+ return /* @__PURE__ */ React14.createElement(React14.Fragment, null, /* @__PURE__ */ React14.createElement(ToggleSidebarButton2, null), /* @__PURE__ */ React14.createElement(ToggleComplementarySidebarButton2, null));
1168
+ };
1169
+ var PlankSeparator = ({ order, hidden, encapsulate }) => order > 0 && /* @__PURE__ */ React14.createElement("span", {
1170
+ role: "separator",
1171
+ className: mx5("row-span-2 bg-deck-surface", hidden && "hidden", encapsulate ? "w-0" : "w-4"),
1172
+ style: {
1173
+ gridColumn: order
1174
+ }
1175
+ });
1176
+ var PlankContainer = /* @__PURE__ */ memo3(({ id, layoutMode, part, order, settings, companionVariant, active, ...props }) => {
1177
+ const { graph } = useAppGraph();
1178
+ const { invokePromise } = useOperationInvoker4();
1179
+ const { state, deck } = useDeckState4();
1180
+ const node = useNode(graph, id);
1181
+ const companions = useCompanions(id);
1182
+ const isLastPlankInMulti = layoutMode === "multi" && active && active.length > 0 && active[active.length - 1] === id;
1183
+ const variantForThisPlank = layoutMode === "multi" ? isLastPlankInMulti ? companionVariant : void 0 : companionVariant;
1184
+ const { companionId } = useSelectedCompanion(companions, variantForThisPlank);
1185
+ const resolvedCompanionId = layoutMode === "multi" && isLastPlankInMulti && companions.length > 0 ? companionId : variantForThisPlank ? companionId : void 0;
1186
+ const currentCompanion = companions.find(({ id: id2 }) => id2 === resolvedCompanionId);
1187
+ const hasCompanion = !!(resolvedCompanionId && currentCompanion);
1188
+ const handleAdjust = useCallback7((plankId, type) => {
1189
+ if (type === "close") {
1190
+ if (part === "complementary") {
1191
+ return invokePromise(LayoutOperation4.UpdateComplementary, {
1192
+ state: "collapsed"
1193
+ });
1194
+ } else if (active) {
1195
+ const index = active.indexOf(plankId);
1196
+ const toClose = index !== -1 ? active.slice(index) : [
1197
+ plankId
1198
+ ];
1199
+ return invokePromise(LayoutOperation4.Close, {
1200
+ subject: toClose
1201
+ });
1202
+ } else {
1203
+ return invokePromise(LayoutOperation4.Close, {
1204
+ subject: [
1205
+ plankId
1206
+ ]
1207
+ });
1208
+ }
1209
+ } else {
1210
+ return invokePromise(DeckOperation.Adjust, {
1211
+ type,
1212
+ id: plankId
1213
+ });
1214
+ }
1215
+ }, [
1216
+ invokePromise,
1217
+ part,
1218
+ active
1219
+ ]);
1220
+ const handleResize = useCallback7((plankId, size) => invokePromise(DeckOperation.UpdatePlankSize, {
1221
+ id: plankId,
1222
+ size
1223
+ }), [
1224
+ invokePromise
1225
+ ]);
1226
+ const handleScrollIntoView = useCallback7((subject) => invokePromise(LayoutOperation4.ScrollIntoView, {
1227
+ subject
1228
+ }), [
1229
+ invokePromise
1230
+ ]);
1231
+ const handleUpdateCompanion = useCallback7((companion) => invokePromise(LayoutOperation4.UpdateCompanion, {
1232
+ subject: companion
1233
+ }), [
1234
+ invokePromise
1235
+ ]);
1236
+ return /* @__PURE__ */ React14.createElement(Plank.Root, {
1237
+ graph,
1238
+ layoutMode,
1239
+ part,
1240
+ settings,
1241
+ popoverAnchorId: state.popoverAnchorId,
1242
+ scrollIntoView: state.scrollIntoView,
1243
+ plankSizing: deck.plankSizing,
1244
+ onAdjust: handleAdjust,
1245
+ onResize: handleResize,
1246
+ onScrollIntoView: handleScrollIntoView,
1247
+ onUpdateCompanion: handleUpdateCompanion
1248
+ }, /* @__PURE__ */ React14.createElement(Plank.Content, {
1249
+ solo: part === "solo",
1250
+ companion: hasCompanion,
1251
+ encapsulate: !!settings?.encapsulatedPlanks
1252
+ }, /* @__PURE__ */ React14.createElement(Plank.Component, {
1253
+ ...props,
1254
+ active,
1255
+ id,
1256
+ node,
1257
+ companioned: hasCompanion ? "primary" : void 0,
1258
+ companions: hasCompanion ? [] : companions,
1259
+ order,
1260
+ ...part === "solo" ? {
1261
+ part: "solo-primary"
1262
+ } : {
1263
+ part
1264
+ }
1265
+ }), hasCompanion && /* @__PURE__ */ React14.createElement(Plank.Component, {
1266
+ ...props,
1267
+ active,
1268
+ id: resolvedCompanionId,
1269
+ node: currentCompanion,
1270
+ companions,
1271
+ companioned: "companion",
1272
+ primary: node,
1273
+ ...part === "solo" ? {
1274
+ order,
1275
+ part: "solo-companion"
1276
+ } : {
1277
+ order: (order ?? 0) + 1,
1278
+ part
1279
+ }
1280
+ })));
1281
+ });
1282
+
1283
+ // src/containers/Deck/Deck.tsx
1284
+ var Deck = {
1285
+ Root: DeckRoot,
1286
+ Content: DeckContent,
1287
+ Viewport: DeckViewport,
1288
+ ContentEmpty: DeckContentEmpty,
1289
+ MultiMode: DeckMultiMode,
1290
+ SoloMode: DeckSoloMode
1291
+ };
1292
+
1293
+ export {
1294
+ PlankLoading,
1295
+ PlankError,
1296
+ PlankErrorFallback,
1297
+ Plank,
1298
+ ToggleSidebarButton,
1299
+ CloseSidebarButton,
1300
+ ToggleComplementarySidebarButton,
1301
+ ComplementarySidebar,
1302
+ Sidebar,
1303
+ Deck
1304
+ };
1305
+ //# sourceMappingURL=chunk-FSIEKCMR.mjs.map