@dxos/plugin-deck 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (483) hide show
  1. package/dist/lib/browser/add-toast-EUN62IUE.mjs +24 -0
  2. package/dist/lib/browser/add-toast-EUN62IUE.mjs.map +7 -0
  3. package/dist/lib/browser/adjust-XWB6ZZ6U.mjs +95 -0
  4. package/dist/lib/browser/adjust-XWB6ZZ6U.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-5LM6A3EC.mjs +208 -0
  6. package/dist/lib/browser/chunk-5LM6A3EC.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-BRZAVPMC.mjs +48 -0
  8. package/dist/lib/browser/chunk-BRZAVPMC.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-DF2VZ6W3.mjs +69 -0
  10. package/dist/lib/browser/chunk-DF2VZ6W3.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-FRVCL5NO.mjs +72 -0
  12. package/dist/lib/browser/chunk-FRVCL5NO.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  14. package/dist/lib/browser/chunk-KUTDCWZF.mjs +30 -0
  15. package/dist/lib/browser/chunk-KUTDCWZF.mjs.map +7 -0
  16. package/dist/lib/browser/close-JXK73YIM.mjs +44 -0
  17. package/dist/lib/browser/close-JXK73YIM.mjs.map +7 -0
  18. package/dist/lib/browser/index.mjs +161 -134
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/open-K2JOEW2E.mjs +150 -0
  22. package/dist/lib/browser/open-K2JOEW2E.mjs.map +7 -0
  23. package/dist/lib/browser/operations/index.mjs +13 -0
  24. package/dist/lib/browser/operations/index.mjs.map +7 -0
  25. package/dist/lib/browser/revert-workspace-BNIR5U64.mjs +21 -0
  26. package/dist/lib/browser/revert-workspace-BNIR5U64.mjs.map +7 -0
  27. package/dist/lib/browser/scroll-into-view-4GSKC3GA.mjs +21 -0
  28. package/dist/lib/browser/scroll-into-view-4GSKC3GA.mjs.map +7 -0
  29. package/dist/lib/browser/set-XCG6NIAO.mjs +37 -0
  30. package/dist/lib/browser/set-XCG6NIAO.mjs.map +7 -0
  31. package/dist/lib/browser/set-layout-mode-BEVNGOY2.mjs +90 -0
  32. package/dist/lib/browser/set-layout-mode-BEVNGOY2.mjs.map +7 -0
  33. package/dist/lib/browser/show-undo-5RQNREEB.mjs +59 -0
  34. package/dist/lib/browser/show-undo-5RQNREEB.mjs.map +7 -0
  35. package/dist/lib/browser/switch-workspace-ICJJWNFT.mjs +68 -0
  36. package/dist/lib/browser/switch-workspace-ICJJWNFT.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +12 -12
  38. package/dist/lib/browser/update-companion-VPCBH3YT.mjs +32 -0
  39. package/dist/lib/browser/update-companion-VPCBH3YT.mjs.map +7 -0
  40. package/dist/lib/browser/update-complementary-74DEQY6T.mjs +28 -0
  41. package/dist/lib/browser/update-complementary-74DEQY6T.mjs.map +7 -0
  42. package/dist/lib/browser/update-dialog-6TDUYI5R.mjs +29 -0
  43. package/dist/lib/browser/update-dialog-6TDUYI5R.mjs.map +7 -0
  44. package/dist/lib/browser/update-plank-size-5VHZOTHE.mjs +28 -0
  45. package/dist/lib/browser/update-plank-size-5VHZOTHE.mjs.map +7 -0
  46. package/dist/lib/browser/update-popover-W7E2Z5T6.mjs +33 -0
  47. package/dist/lib/browser/update-popover-W7E2Z5T6.mjs.map +7 -0
  48. package/dist/lib/browser/update-sidebar-H3A6ZFRU.mjs +25 -0
  49. package/dist/lib/browser/update-sidebar-H3A6ZFRU.mjs.map +7 -0
  50. package/dist/lib/node-esm/add-toast-AZM7NFNM.mjs +25 -0
  51. package/dist/lib/node-esm/add-toast-AZM7NFNM.mjs.map +7 -0
  52. package/dist/lib/node-esm/adjust-ICALXQ6F.mjs +96 -0
  53. package/dist/lib/node-esm/adjust-ICALXQ6F.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-A63Q53TW.mjs +73 -0
  55. package/dist/lib/node-esm/chunk-A63Q53TW.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-B7WZXRW4.mjs +209 -0
  57. package/dist/lib/node-esm/chunk-B7WZXRW4.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  59. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-IRWCUYJY.mjs +71 -0
  61. package/dist/lib/node-esm/chunk-IRWCUYJY.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-MB4SDDVY.mjs +50 -0
  63. package/dist/lib/node-esm/chunk-MB4SDDVY.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-MLVJ2ODW.mjs +32 -0
  65. package/dist/lib/node-esm/chunk-MLVJ2ODW.mjs.map +7 -0
  66. package/dist/lib/node-esm/close-GC5V3GD5.mjs +45 -0
  67. package/dist/lib/node-esm/close-GC5V3GD5.mjs.map +7 -0
  68. package/dist/lib/node-esm/index.mjs +202 -0
  69. package/dist/lib/node-esm/index.mjs.map +7 -0
  70. package/dist/lib/node-esm/meta.json +1 -0
  71. package/dist/lib/node-esm/open-XXEHIR6G.mjs +151 -0
  72. package/dist/lib/node-esm/open-XXEHIR6G.mjs.map +7 -0
  73. package/dist/lib/node-esm/operations/index.mjs +14 -0
  74. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  75. package/dist/lib/node-esm/revert-workspace-WCXAL5C6.mjs +22 -0
  76. package/dist/lib/node-esm/revert-workspace-WCXAL5C6.mjs.map +7 -0
  77. package/dist/lib/node-esm/scroll-into-view-2ZNU44ZO.mjs +22 -0
  78. package/dist/lib/node-esm/scroll-into-view-2ZNU44ZO.mjs.map +7 -0
  79. package/dist/lib/node-esm/set-5MO2JCUQ.mjs +38 -0
  80. package/dist/lib/node-esm/set-5MO2JCUQ.mjs.map +7 -0
  81. package/dist/lib/node-esm/set-layout-mode-3RK4HIG7.mjs +91 -0
  82. package/dist/lib/node-esm/set-layout-mode-3RK4HIG7.mjs.map +7 -0
  83. package/dist/lib/node-esm/show-undo-WV7SAYGJ.mjs +60 -0
  84. package/dist/lib/node-esm/show-undo-WV7SAYGJ.mjs.map +7 -0
  85. package/dist/lib/node-esm/switch-workspace-VNM75H66.mjs +69 -0
  86. package/dist/lib/node-esm/switch-workspace-VNM75H66.mjs.map +7 -0
  87. package/dist/lib/node-esm/types/index.mjs +33 -0
  88. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  89. package/dist/lib/node-esm/update-companion-SIB3GWH7.mjs +33 -0
  90. package/dist/lib/node-esm/update-companion-SIB3GWH7.mjs.map +7 -0
  91. package/dist/lib/node-esm/update-complementary-CZTIVIXU.mjs +29 -0
  92. package/dist/lib/node-esm/update-complementary-CZTIVIXU.mjs.map +7 -0
  93. package/dist/lib/node-esm/update-dialog-HEDV5XBB.mjs +30 -0
  94. package/dist/lib/node-esm/update-dialog-HEDV5XBB.mjs.map +7 -0
  95. package/dist/lib/node-esm/update-plank-size-JJLU7VE3.mjs +29 -0
  96. package/dist/lib/node-esm/update-plank-size-JJLU7VE3.mjs.map +7 -0
  97. package/dist/lib/node-esm/update-popover-HI5TU2VT.mjs +34 -0
  98. package/dist/lib/node-esm/update-popover-HI5TU2VT.mjs.map +7 -0
  99. package/dist/lib/node-esm/update-sidebar-QB5BA655.mjs +26 -0
  100. package/dist/lib/node-esm/update-sidebar-QB5BA655.mjs.map +7 -0
  101. package/dist/types/src/DeckPlugin.d.ts +2 -1
  102. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/check-app-scheme.d.ts +17 -2
  106. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/index.d.ts +196 -12
  108. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  110. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/react-root.d.ts +4 -2
  112. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  114. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/settings.d.ts +5 -2
  116. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/state.d.ts +134 -47
  118. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/tools.d.ts +4 -3
  120. package/dist/types/src/capabilities/tools.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/url-handler.d.ts +3 -2
  122. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -1
  123. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +4 -4
  124. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +1 -1
  125. package/dist/types/src/components/DeckSettings/DeckSettings.stories.d.ts +71 -0
  126. package/dist/types/src/components/DeckSettings/DeckSettings.stories.d.ts.map +1 -0
  127. package/dist/types/src/components/DeckSettings/index.d.ts +1 -1
  128. package/dist/types/src/components/DeckSettings/index.d.ts.map +1 -1
  129. package/dist/types/src/components/Matrix/Matrix.d.ts +41 -0
  130. package/dist/types/src/components/Matrix/Matrix.d.ts.map +1 -0
  131. package/dist/types/src/components/Matrix/Matrix.stories.d.ts +17 -0
  132. package/dist/types/src/components/Matrix/Matrix.stories.d.ts.map +1 -0
  133. package/dist/types/src/components/Matrix/index.d.ts +3 -0
  134. package/dist/types/src/components/Matrix/index.d.ts.map +1 -0
  135. package/dist/types/src/components/index.d.ts +3 -2
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/containers/Deck/Banner.d.ts.map +1 -0
  138. package/dist/types/src/containers/Deck/Deck.d.ts +25 -0
  139. package/dist/types/src/containers/Deck/Deck.d.ts.map +1 -0
  140. package/dist/types/src/containers/Deck/Deck.stories.d.ts +71 -0
  141. package/dist/types/src/containers/Deck/Deck.stories.d.ts.map +1 -0
  142. package/dist/types/src/containers/Deck/DeckContent.d.ts +7 -0
  143. package/dist/types/src/containers/Deck/DeckContent.d.ts.map +1 -0
  144. package/dist/types/src/containers/Deck/DeckRoot.d.ts +42 -0
  145. package/dist/types/src/containers/Deck/DeckRoot.d.ts.map +1 -0
  146. package/dist/types/src/containers/Deck/DeckViewport.d.ts +19 -0
  147. package/dist/types/src/containers/Deck/DeckViewport.d.ts.map +1 -0
  148. package/dist/types/src/containers/Deck/StatusBar.d.ts.map +1 -0
  149. package/dist/types/src/containers/Deck/index.d.ts +2 -0
  150. package/dist/types/src/containers/Deck/index.d.ts.map +1 -0
  151. package/dist/types/src/containers/DeckLayout/ActiveNode.d.ts.map +1 -0
  152. package/dist/types/src/containers/DeckLayout/DeckLayout.d.ts.map +1 -0
  153. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts +73 -0
  154. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts.map +1 -0
  155. package/dist/types/src/containers/DeckLayout/Dialog.d.ts.map +1 -0
  156. package/dist/types/src/containers/DeckLayout/Fallback.d.ts +2 -0
  157. package/dist/types/src/containers/DeckLayout/Fallback.d.ts.map +1 -0
  158. package/dist/types/src/containers/DeckLayout/Popover.d.ts +5 -0
  159. package/dist/types/src/containers/DeckLayout/Popover.d.ts.map +1 -0
  160. package/dist/types/src/{components → containers}/DeckLayout/Toast.d.ts +3 -3
  161. package/dist/types/src/containers/DeckLayout/Toast.d.ts.map +1 -0
  162. package/dist/types/src/containers/DeckLayout/constants.d.ts.map +1 -0
  163. package/dist/types/src/containers/DeckLayout/index.d.ts +4 -0
  164. package/dist/types/src/containers/DeckLayout/index.d.ts.map +1 -0
  165. package/dist/types/src/containers/Plank/Plank.d.ts +17 -0
  166. package/dist/types/src/containers/Plank/Plank.d.ts.map +1 -0
  167. package/dist/types/src/containers/Plank/Plank.stories.d.ts +71 -0
  168. package/dist/types/src/containers/Plank/Plank.stories.d.ts.map +1 -0
  169. package/dist/types/src/containers/Plank/PlankComponent.d.ts +17 -0
  170. package/dist/types/src/containers/Plank/PlankComponent.d.ts.map +1 -0
  171. package/dist/types/src/containers/Plank/PlankContent.d.ts +10 -0
  172. package/dist/types/src/containers/Plank/PlankContent.d.ts.map +1 -0
  173. package/dist/types/src/{components → containers}/Plank/PlankControls.d.ts +5 -6
  174. package/dist/types/src/containers/Plank/PlankControls.d.ts.map +1 -0
  175. package/dist/types/src/containers/Plank/PlankError.d.ts +15 -0
  176. package/dist/types/src/containers/Plank/PlankError.d.ts.map +1 -0
  177. package/dist/types/src/{components → containers}/Plank/PlankHeading.d.ts +5 -4
  178. package/dist/types/src/containers/Plank/PlankHeading.d.ts.map +1 -0
  179. package/dist/types/src/{components → containers}/Plank/PlankLoading.d.ts.map +1 -1
  180. package/dist/types/src/containers/Plank/PlankRoot.d.ts +37 -0
  181. package/dist/types/src/containers/Plank/PlankRoot.d.ts.map +1 -0
  182. package/dist/types/src/containers/Plank/index.d.ts +4 -0
  183. package/dist/types/src/containers/Plank/index.d.ts.map +1 -0
  184. package/dist/types/src/containers/Sidebar/ComplementarySidebar.d.ts.map +1 -0
  185. package/dist/types/src/containers/Sidebar/Sidebar.d.ts.map +1 -0
  186. package/dist/types/src/containers/Sidebar/SidebarButton.d.ts.map +1 -0
  187. package/dist/types/src/{components → containers}/Sidebar/index.d.ts.map +1 -1
  188. package/dist/types/src/containers/index.d.ts +6 -0
  189. package/dist/types/src/containers/index.d.ts.map +1 -0
  190. package/dist/types/src/hooks/index.d.ts +2 -0
  191. package/dist/types/src/hooks/index.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useDeckCompanions.d.ts +4 -4
  193. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  194. package/dist/types/src/hooks/useDeckState.d.ts +17 -0
  195. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
  196. package/dist/types/src/hooks/useHoistStatusbar.d.ts +1 -1
  197. package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +1 -1
  198. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  199. package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
  200. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
  202. package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
  203. package/dist/types/src/index.d.ts +1 -2
  204. package/dist/types/src/index.d.ts.map +1 -1
  205. package/dist/types/src/layout.d.ts +20 -9
  206. package/dist/types/src/layout.d.ts.map +1 -1
  207. package/dist/types/src/layout.test.d.ts +2 -0
  208. package/dist/types/src/layout.test.d.ts.map +1 -0
  209. package/dist/types/src/meta.d.ts +2 -2
  210. package/dist/types/src/meta.d.ts.map +1 -1
  211. package/dist/types/src/operations/add-toast.d.ts +5 -0
  212. package/dist/types/src/operations/add-toast.d.ts.map +1 -0
  213. package/dist/types/src/operations/adjust.d.ts +5 -0
  214. package/dist/types/src/operations/adjust.d.ts.map +1 -0
  215. package/dist/types/src/operations/close.d.ts +5 -0
  216. package/dist/types/src/operations/close.d.ts.map +1 -0
  217. package/dist/types/src/operations/definitions.d.ts +15 -0
  218. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  219. package/dist/types/src/operations/helpers.d.ts +3 -0
  220. package/dist/types/src/operations/helpers.d.ts.map +1 -0
  221. package/dist/types/src/operations/index.d.ts +4 -0
  222. package/dist/types/src/operations/index.d.ts.map +1 -0
  223. package/dist/types/src/operations/open.d.ts +5 -0
  224. package/dist/types/src/operations/open.d.ts.map +1 -0
  225. package/dist/types/src/operations/revert-workspace.d.ts +5 -0
  226. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -0
  227. package/dist/types/src/operations/scroll-into-view.d.ts +5 -0
  228. package/dist/types/src/operations/scroll-into-view.d.ts.map +1 -0
  229. package/dist/types/src/operations/set-layout-mode.d.ts +9 -0
  230. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -0
  231. package/dist/types/src/operations/set.d.ts +5 -0
  232. package/dist/types/src/operations/set.d.ts.map +1 -0
  233. package/dist/types/src/operations/show-undo.d.ts +5 -0
  234. package/dist/types/src/operations/show-undo.d.ts.map +1 -0
  235. package/dist/types/src/operations/switch-workspace.d.ts +5 -0
  236. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -0
  237. package/dist/types/src/operations/update-companion.d.ts +5 -0
  238. package/dist/types/src/operations/update-companion.d.ts.map +1 -0
  239. package/dist/types/src/operations/update-complementary.d.ts +5 -0
  240. package/dist/types/src/operations/update-complementary.d.ts.map +1 -0
  241. package/dist/types/src/operations/update-dialog.d.ts +5 -0
  242. package/dist/types/src/operations/update-dialog.d.ts.map +1 -0
  243. package/dist/types/src/operations/update-plank-size.d.ts +5 -0
  244. package/dist/types/src/operations/update-plank-size.d.ts.map +1 -0
  245. package/dist/types/src/operations/update-popover.d.ts +5 -0
  246. package/dist/types/src/operations/update-popover.d.ts.map +1 -0
  247. package/dist/types/src/operations/update-sidebar.d.ts +5 -0
  248. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -0
  249. package/dist/types/src/translations.d.ts +52 -54
  250. package/dist/types/src/translations.d.ts.map +1 -1
  251. package/dist/types/src/types/Settings.d.ts +11 -0
  252. package/dist/types/src/types/Settings.d.ts.map +1 -0
  253. package/dist/types/src/{capabilities → types}/capabilities.d.ts +103 -96
  254. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  255. package/dist/types/src/types/events.d.ts +7 -0
  256. package/dist/types/src/types/events.d.ts.map +1 -0
  257. package/dist/types/src/types/index.d.ts +3 -0
  258. package/dist/types/src/types/index.d.ts.map +1 -1
  259. package/dist/types/src/types/schema.d.ts +65 -64
  260. package/dist/types/src/types/schema.d.ts.map +1 -1
  261. package/dist/types/src/util/index.d.ts +2 -1
  262. package/dist/types/src/util/index.d.ts.map +1 -1
  263. package/dist/types/src/util/layoutAppliesTopbar.d.ts +1 -1
  264. package/dist/types/src/util/layoutAppliesTopbar.d.ts.map +1 -1
  265. package/dist/types/src/util/plank-url-params.d.ts +14 -0
  266. package/dist/types/src/util/plank-url-params.d.ts.map +1 -0
  267. package/dist/types/src/util/plank-url-params.test.d.ts +2 -0
  268. package/dist/types/src/util/plank-url-params.test.d.ts.map +1 -0
  269. package/dist/types/src/util/sanitize-persisted-state.d.ts +19 -0
  270. package/dist/types/src/util/sanitize-persisted-state.d.ts.map +1 -0
  271. package/dist/types/src/util/sanitize-persisted-state.test.d.ts +2 -0
  272. package/dist/types/src/util/sanitize-persisted-state.test.d.ts.map +1 -0
  273. package/dist/types/src/util/set-active.d.ts +19 -4
  274. package/dist/types/src/util/set-active.d.ts.map +1 -1
  275. package/dist/types/src/util/set-active.test.d.ts +2 -0
  276. package/dist/types/src/util/set-active.test.d.ts.map +1 -0
  277. package/dist/types/tsconfig.tsbuildinfo +1 -1
  278. package/package.json +84 -56
  279. package/src/DeckPlugin.ts +29 -54
  280. package/src/capabilities/app-graph-builder.ts +112 -128
  281. package/src/capabilities/check-app-scheme.ts +123 -24
  282. package/src/capabilities/index.ts +13 -14
  283. package/src/capabilities/operation-handler.ts +16 -0
  284. package/src/capabilities/react-root.tsx +37 -29
  285. package/src/capabilities/react-surface.tsx +28 -22
  286. package/src/capabilities/settings.ts +30 -20
  287. package/src/capabilities/state.ts +74 -91
  288. package/src/capabilities/tools.ts +57 -50
  289. package/src/capabilities/url-handler.ts +221 -50
  290. package/src/components/DeckSettings/DeckSettings.stories.tsx +37 -0
  291. package/src/components/DeckSettings/DeckSettings.tsx +56 -86
  292. package/src/components/DeckSettings/index.ts +2 -2
  293. package/src/components/Matrix/Matrix.stories.tsx +220 -0
  294. package/src/components/Matrix/Matrix.tsx +205 -0
  295. package/src/components/Matrix/SPEC.md +219 -0
  296. package/src/components/Matrix/index.ts +6 -0
  297. package/src/components/index.ts +6 -3
  298. package/src/{components/DeckLayout → containers/Deck}/Banner.tsx +12 -10
  299. package/src/containers/Deck/Deck.stories.tsx +81 -0
  300. package/src/containers/Deck/Deck.tsx +21 -0
  301. package/src/containers/Deck/DeckContent.tsx +105 -0
  302. package/src/containers/Deck/DeckRoot.tsx +50 -0
  303. package/src/containers/Deck/DeckViewport.tsx +456 -0
  304. package/src/{components/DeckLayout → containers/Deck}/StatusBar.tsx +4 -4
  305. package/src/containers/Deck/index.ts +5 -0
  306. package/src/{components → containers}/DeckLayout/ActiveNode.tsx +8 -3
  307. package/src/containers/DeckLayout/DeckLayout.stories.tsx +397 -0
  308. package/src/containers/DeckLayout/DeckLayout.tsx +62 -0
  309. package/src/containers/DeckLayout/Dialog.tsx +52 -0
  310. package/src/containers/DeckLayout/Fallback.tsx +24 -0
  311. package/src/containers/DeckLayout/Popover.tsx +161 -0
  312. package/src/{components → containers}/DeckLayout/Toast.tsx +6 -6
  313. package/src/{components → containers}/DeckLayout/constants.ts +1 -0
  314. package/src/{components → containers}/DeckLayout/index.ts +3 -2
  315. package/src/containers/Plank/Plank.stories.tsx +108 -0
  316. package/src/containers/Plank/Plank.tsx +22 -0
  317. package/src/containers/Plank/PlankComponent.tsx +217 -0
  318. package/src/containers/Plank/PlankContent.tsx +45 -0
  319. package/src/{components → containers}/Plank/PlankControls.tsx +43 -36
  320. package/src/containers/Plank/PlankError.tsx +79 -0
  321. package/src/{components → containers}/Plank/PlankHeading.tsx +67 -63
  322. package/src/{components → containers}/Plank/PlankLoading.tsx +1 -1
  323. package/src/containers/Plank/PlankRoot.tsx +49 -0
  324. package/src/{components → containers}/Plank/index.ts +0 -2
  325. package/src/containers/Sidebar/ComplementarySidebar.tsx +210 -0
  326. package/src/containers/Sidebar/Sidebar.tsx +44 -0
  327. package/src/containers/Sidebar/SidebarButton.tsx +94 -0
  328. package/src/containers/index.ts +11 -0
  329. package/src/hooks/index.ts +2 -0
  330. package/src/hooks/useCompanions.ts +3 -3
  331. package/src/hooks/useDeckCompanions.ts +8 -10
  332. package/src/hooks/useDeckState.ts +73 -0
  333. package/src/hooks/useHoistStatusbar.ts +3 -5
  334. package/src/hooks/useMainSize.ts +2 -2
  335. package/src/hooks/useNodeActionExpander.ts +4 -4
  336. package/src/hooks/useSelectedCompanion.ts +32 -0
  337. package/src/index.ts +1 -2
  338. package/src/layout.test.ts +59 -0
  339. package/src/layout.ts +38 -40
  340. package/src/meta.ts +8 -3
  341. package/src/operations/add-toast.ts +24 -0
  342. package/src/operations/adjust.ts +83 -0
  343. package/src/operations/close.ts +35 -0
  344. package/src/operations/definitions.ts +49 -0
  345. package/src/operations/helpers.ts +22 -0
  346. package/src/operations/index.ts +26 -0
  347. package/src/operations/open.ts +184 -0
  348. package/src/operations/revert-workspace.ts +22 -0
  349. package/src/operations/scroll-into-view.ts +24 -0
  350. package/src/operations/set-layout-mode.ts +84 -0
  351. package/src/operations/set.ts +36 -0
  352. package/src/operations/show-undo.ts +47 -0
  353. package/src/operations/switch-workspace.ts +60 -0
  354. package/src/operations/update-companion.ts +35 -0
  355. package/src/operations/update-complementary.ts +33 -0
  356. package/src/operations/update-dialog.ts +34 -0
  357. package/src/operations/update-plank-size.ts +29 -0
  358. package/src/operations/update-popover.ts +36 -0
  359. package/src/operations/update-sidebar.ts +28 -0
  360. package/src/translations.ts +52 -54
  361. package/src/types/Settings.ts +17 -0
  362. package/src/types/capabilities.ts +35 -0
  363. package/src/types/events.ts +21 -0
  364. package/src/types/index.ts +3 -0
  365. package/src/types/schema.ts +50 -57
  366. package/src/util/index.ts +2 -1
  367. package/src/util/layoutAppliesTopbar.ts +2 -2
  368. package/src/util/plank-url-params.test.ts +85 -0
  369. package/src/util/plank-url-params.ts +36 -0
  370. package/src/util/sanitize-persisted-state.test.ts +79 -0
  371. package/src/util/sanitize-persisted-state.ts +52 -0
  372. package/src/util/set-active.test.ts +106 -0
  373. package/src/util/set-active.ts +50 -30
  374. package/src/vite-env.d.ts +5 -0
  375. package/dist/lib/browser/app-graph-builder-YYP67JHW.mjs +0 -153
  376. package/dist/lib/browser/app-graph-builder-YYP67JHW.mjs.map +0 -7
  377. package/dist/lib/browser/check-app-scheme-GCOL6YDT.mjs +0 -32
  378. package/dist/lib/browser/check-app-scheme-GCOL6YDT.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-7I6H3N4Q.mjs +0 -162
  380. package/dist/lib/browser/chunk-7I6H3N4Q.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-CNTGBCMK.mjs +0 -145
  382. package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
  383. package/dist/lib/browser/chunk-HUWUYTOI.mjs +0 -16
  384. package/dist/lib/browser/chunk-HUWUYTOI.mjs.map +0 -7
  385. package/dist/lib/browser/chunk-JQKOS2HB.mjs +0 -1531
  386. package/dist/lib/browser/chunk-JQKOS2HB.mjs.map +0 -7
  387. package/dist/lib/browser/chunk-MHP4GPX5.mjs +0 -11
  388. package/dist/lib/browser/chunk-MHP4GPX5.mjs.map +0 -7
  389. package/dist/lib/browser/chunk-RJP5R7PY.mjs +0 -127
  390. package/dist/lib/browser/chunk-RJP5R7PY.mjs.map +0 -7
  391. package/dist/lib/browser/chunk-VX7MMQOW.mjs +0 -129
  392. package/dist/lib/browser/chunk-VX7MMQOW.mjs.map +0 -7
  393. package/dist/lib/browser/intent-resolver-7XNOEPVN.mjs +0 -524
  394. package/dist/lib/browser/intent-resolver-7XNOEPVN.mjs.map +0 -7
  395. package/dist/lib/browser/react-root-OJEF7YCH.mjs +0 -43
  396. package/dist/lib/browser/react-root-OJEF7YCH.mjs.map +0 -7
  397. package/dist/lib/browser/react-surface-XN2NJYHO.mjs +0 -40
  398. package/dist/lib/browser/react-surface-XN2NJYHO.mjs.map +0 -7
  399. package/dist/lib/browser/settings-M3KSKRAP.mjs +0 -30
  400. package/dist/lib/browser/settings-M3KSKRAP.mjs.map +0 -7
  401. package/dist/lib/browser/state-6ZSDTF6Q.mjs +0 -12
  402. package/dist/lib/browser/toolkit-L7C3UAEU.mjs +0 -63
  403. package/dist/lib/browser/toolkit-L7C3UAEU.mjs.map +0 -7
  404. package/dist/lib/browser/url-handler-EHTLXZRR.mjs +0 -70
  405. package/dist/lib/browser/url-handler-EHTLXZRR.mjs.map +0 -7
  406. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  407. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  408. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  409. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  410. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  411. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +0 -1
  412. package/dist/types/src/components/DeckLayout/Banner.d.ts.map +0 -1
  413. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts +0 -3
  414. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +0 -1
  415. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +0 -1
  416. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +0 -74
  417. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +0 -1
  418. package/dist/types/src/components/DeckLayout/DeckMain.d.ts +0 -3
  419. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +0 -1
  420. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +0 -1
  421. package/dist/types/src/components/DeckLayout/Fallback.d.ts +0 -3
  422. package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +0 -1
  423. package/dist/types/src/components/DeckLayout/Popover.d.ts +0 -5
  424. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +0 -1
  425. package/dist/types/src/components/DeckLayout/StatusBar.d.ts.map +0 -1
  426. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +0 -1
  427. package/dist/types/src/components/DeckLayout/Topbar.d.ts +0 -3
  428. package/dist/types/src/components/DeckLayout/Topbar.d.ts.map +0 -1
  429. package/dist/types/src/components/DeckLayout/constants.d.ts.map +0 -1
  430. package/dist/types/src/components/DeckLayout/index.d.ts +0 -4
  431. package/dist/types/src/components/DeckLayout/index.d.ts.map +0 -1
  432. package/dist/types/src/components/Plank/Plank.d.ts +0 -27
  433. package/dist/types/src/components/Plank/Plank.d.ts.map +0 -1
  434. package/dist/types/src/components/Plank/Plank.stories.d.ts +0 -89
  435. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +0 -1
  436. package/dist/types/src/components/Plank/PlankControls.d.ts.map +0 -1
  437. package/dist/types/src/components/Plank/PlankError.d.ts +0 -13
  438. package/dist/types/src/components/Plank/PlankError.d.ts.map +0 -1
  439. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +0 -1
  440. package/dist/types/src/components/Plank/index.d.ts +0 -6
  441. package/dist/types/src/components/Plank/index.d.ts.map +0 -1
  442. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +0 -1
  443. package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +0 -1
  444. package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +0 -1
  445. package/dist/types/src/components/fragments.d.ts +0 -4
  446. package/dist/types/src/components/fragments.d.ts.map +0 -1
  447. package/dist/types/src/events.d.ts +0 -4
  448. package/dist/types/src/events.d.ts.map +0 -1
  449. package/dist/types/src/util/overscroll.d.ts +0 -47
  450. package/dist/types/src/util/overscroll.d.ts.map +0 -1
  451. package/src/capabilities/capabilities.ts +0 -14
  452. package/src/capabilities/intent-resolver.ts +0 -472
  453. package/src/capabilities/toolkit.ts +0 -57
  454. package/src/components/DeckLayout/ContentEmpty.tsx +0 -31
  455. package/src/components/DeckLayout/DeckLayout.stories.tsx +0 -64
  456. package/src/components/DeckLayout/DeckLayout.tsx +0 -32
  457. package/src/components/DeckLayout/DeckMain.tsx +0 -285
  458. package/src/components/DeckLayout/Dialog.tsx +0 -36
  459. package/src/components/DeckLayout/Fallback.tsx +0 -28
  460. package/src/components/DeckLayout/Popover.tsx +0 -104
  461. package/src/components/DeckLayout/Topbar.tsx +0 -11
  462. package/src/components/Plank/Plank.stories.tsx +0 -54
  463. package/src/components/Plank/Plank.tsx +0 -283
  464. package/src/components/Plank/PlankError.tsx +0 -49
  465. package/src/components/Sidebar/ComplementarySidebar.tsx +0 -194
  466. package/src/components/Sidebar/Sidebar.tsx +0 -42
  467. package/src/components/Sidebar/SidebarButton.tsx +0 -87
  468. package/src/components/fragments.ts +0 -14
  469. package/src/events.ts +0 -11
  470. package/src/util/overscroll.ts +0 -69
  471. /package/dist/lib/browser/{state-6ZSDTF6Q.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  472. /package/dist/types/src/{components/DeckLayout → containers/Deck}/Banner.d.ts +0 -0
  473. /package/dist/types/src/{components/DeckLayout → containers/Deck}/StatusBar.d.ts +0 -0
  474. /package/dist/types/src/{components → containers}/DeckLayout/ActiveNode.d.ts +0 -0
  475. /package/dist/types/src/{components → containers}/DeckLayout/DeckLayout.d.ts +0 -0
  476. /package/dist/types/src/{components → containers}/DeckLayout/Dialog.d.ts +0 -0
  477. /package/dist/types/src/{components → containers}/DeckLayout/constants.d.ts +0 -0
  478. /package/dist/types/src/{components → containers}/Plank/PlankLoading.d.ts +0 -0
  479. /package/dist/types/src/{components → containers}/Sidebar/ComplementarySidebar.d.ts +0 -0
  480. /package/dist/types/src/{components → containers}/Sidebar/Sidebar.d.ts +0 -0
  481. /package/dist/types/src/{components → containers}/Sidebar/SidebarButton.d.ts +0 -0
  482. /package/dist/types/src/{components → containers}/Sidebar/index.d.ts +0 -0
  483. /package/src/{components → containers}/Sidebar/index.ts +0 -0
@@ -0,0 +1,36 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { fromUrlPath, toUrlPath } from '@dxos/app-toolkit';
6
+
7
+ const PLANK_PARAM = 'plank';
8
+
9
+ /**
10
+ * Serialize deck active qualified IDs into a URL search string.
11
+ * Preserves non-plank query params from the existing search string.
12
+ */
13
+ export const serializePlanks = (active: readonly string[], existingSearch: string): string => {
14
+ const params = new URLSearchParams(existingSearch);
15
+ params.delete(PLANK_PARAM);
16
+ for (const id of active) {
17
+ params.append(PLANK_PARAM, toUrlPath(id));
18
+ }
19
+ return params.size > 0 ? `?${params.toString()}` : '';
20
+ };
21
+
22
+ /**
23
+ * Deserialize plank query params from a URL back to qualified graph IDs.
24
+ */
25
+ export const deserializePlanks = (url: URL): string[] => {
26
+ return url.searchParams.getAll(PLANK_PARAM).map(fromUrlPath);
27
+ };
28
+
29
+ /**
30
+ * Strip plank query params from a search string, preserving all others.
31
+ */
32
+ export const stripPlanks = (existingSearch: string): string => {
33
+ const params = new URLSearchParams(existingSearch);
34
+ params.delete(PLANK_PARAM);
35
+ return params.size > 0 ? `?${params.toString()}` : '';
36
+ };
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import { defaultDeck, type DeckState, type StoredDeckState } from '#types';
8
+
9
+ import { sanitizePersistedState } from './sanitize-persisted-state';
10
+
11
+ const makeState = (decks: Record<string, Partial<DeckState>>): StoredDeckState => ({
12
+ sidebarState: 'expanded',
13
+ complementarySidebarState: 'collapsed',
14
+ complementarySidebarPanel: undefined,
15
+ activeDeck: Object.keys(decks)[0] ?? 'default',
16
+ previousDeck: 'default',
17
+ decks: Object.fromEntries(Object.entries(decks).map(([id, overrides]) => [id, { ...defaultDeck, ...overrides }])),
18
+ previousMode: {},
19
+ });
20
+
21
+ describe('sanitizePersistedState', () => {
22
+ test('returns same reference when no cleanup needed', ({ expect }) => {
23
+ const state = makeState({ default: {} });
24
+ expect(sanitizePersistedState(state)).toBe(state);
25
+ });
26
+
27
+ test('clears fullscreen on any deck', ({ expect }) => {
28
+ const state = makeState({ ws1: { fullscreen: true } });
29
+ const result = sanitizePersistedState(state);
30
+ expect(result.decks.ws1?.fullscreen).toBe(false);
31
+ });
32
+
33
+ test('clears active for solo-mode decks', ({ expect }) => {
34
+ const state = makeState({ ws1: { solo: 'item-a', active: ['item-b', 'item-c'] } });
35
+ const result = sanitizePersistedState(state);
36
+ expect(result.decks.ws1?.active).toEqual([]);
37
+ expect(result.decks.ws1?.solo).toBe('item-a');
38
+ });
39
+
40
+ test('preserves active for deck-mode decks (no solo)', ({ expect }) => {
41
+ const state = makeState({ ws1: { active: ['item-a', 'item-b'], initialized: true } });
42
+ const result = sanitizePersistedState(state);
43
+ expect(result).toBe(state);
44
+ });
45
+
46
+ test('does not clear active when it is already empty', ({ expect }) => {
47
+ const state = makeState({ ws1: { solo: 'item-a', active: [] } });
48
+ expect(sanitizePersistedState(state)).toBe(state);
49
+ });
50
+
51
+ test('cleans multiple decks independently', ({ expect }) => {
52
+ const state = makeState({
53
+ ws1: { solo: 'item-a', active: ['item-b'] },
54
+ ws2: { active: ['item-c'], initialized: true },
55
+ ws3: { fullscreen: true, solo: 'item-d', active: ['item-e'] },
56
+ });
57
+ const result = sanitizePersistedState(state);
58
+
59
+ // ws1: solo with active → active cleared.
60
+ expect(result.decks.ws1?.active).toEqual([]);
61
+ expect(result.decks.ws1?.solo).toBe('item-a');
62
+
63
+ // ws2: deck mode, no solo → untouched.
64
+ expect(result.decks.ws2?.active).toEqual(['item-c']);
65
+
66
+ // ws3: fullscreen + solo with active → both cleared.
67
+ expect(result.decks.ws3?.fullscreen).toBe(false);
68
+ expect(result.decks.ws3?.active).toEqual([]);
69
+ expect(result.decks.ws3?.solo).toBe('item-d');
70
+ });
71
+
72
+ test('does not mutate the original state', ({ expect }) => {
73
+ const state = makeState({ ws1: { solo: 'item-a', active: ['item-b'], fullscreen: true } });
74
+ const originalActive = [...state.decks.ws1!.active];
75
+ sanitizePersistedState(state);
76
+ expect(state.decks.ws1?.active).toEqual(originalActive);
77
+ expect(state.decks.ws1?.fullscreen).toBe(true);
78
+ });
79
+ });
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type StoredDeckState } from '#types';
6
+
7
+ /**
8
+ * Sanitizes persisted deck state on startup.
9
+ *
10
+ * Persisted state may contain values that are inappropriate to restore across sessions:
11
+ *
12
+ * - **Fullscreen**: Cleared unconditionally to prevent the user from getting stuck in fullscreen
13
+ * mode if the app was closed (or crashed) while fullscreen was active.
14
+ *
15
+ * - **Active planks in solo-mode decks**: When a deck is in solo mode, any items in `active`
16
+ * represent planks that were kept mounted (hidden) during the session for fast deck↔solo
17
+ * switching. After a restart these planks would need to fully remount anyway, so retaining
18
+ * them only adds unnecessary load. Clearing `active` for solo-mode decks avoids rendering
19
+ * stale planks in the background on startup.
20
+ *
21
+ * Returns a new state object if any changes were made, or the original state if clean.
22
+ */
23
+ export const sanitizePersistedState = (state: StoredDeckState): StoredDeckState => {
24
+ let needsUpdate = false;
25
+ const cleanedDecks = { ...state.decks };
26
+
27
+ for (const [id, deck] of Object.entries(cleanedDecks)) {
28
+ if (!deck) {
29
+ continue;
30
+ }
31
+
32
+ let updated = false;
33
+ let cleanedDeck = deck;
34
+
35
+ if (deck.fullscreen) {
36
+ cleanedDeck = { ...cleanedDeck, fullscreen: false };
37
+ updated = true;
38
+ }
39
+
40
+ if (deck.solo && deck.active.length > 0) {
41
+ cleanedDeck = { ...cleanedDeck, active: [] };
42
+ updated = true;
43
+ }
44
+
45
+ if (updated) {
46
+ cleanedDecks[id] = cleanedDeck;
47
+ needsUpdate = true;
48
+ }
49
+ }
50
+
51
+ return needsUpdate ? { ...state, decks: cleanedDecks } : state;
52
+ };
@@ -0,0 +1,106 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, test } from 'vitest';
6
+
7
+ import { defaultDeck, type DeckState } from '#types';
8
+
9
+ import { computeActiveUpdates } from './set-active';
10
+
11
+ const makeDeck = (overrides: Partial<DeckState> = {}): DeckState => ({
12
+ ...defaultDeck,
13
+ ...overrides,
14
+ });
15
+
16
+ describe('computeActiveUpdates', () => {
17
+ describe('routing to solo vs active', () => {
18
+ test('routes to solo when initialized is false and solo is undefined', ({ expect }) => {
19
+ const deck = makeDeck({ initialized: false });
20
+ const { deckUpdates } = computeActiveUpdates({ next: ['item1'], deck });
21
+ expect(deckUpdates.solo).toBe('item1');
22
+ expect(deckUpdates.active).toEqual([]);
23
+ });
24
+
25
+ test('routes to solo when solo is set (regardless of initialized)', ({ expect }) => {
26
+ const deck = makeDeck({ solo: 'current', initialized: true });
27
+ const { deckUpdates } = computeActiveUpdates({ next: ['item1'], deck });
28
+ expect(deckUpdates.solo).toBe('item1');
29
+ expect(deckUpdates.active).toEqual([]);
30
+ });
31
+
32
+ test('routes to active when initialized is true and solo is undefined', ({ expect }) => {
33
+ const deck = makeDeck({ initialized: true });
34
+ const { deckUpdates } = computeActiveUpdates({ next: ['item1', 'item2'], deck });
35
+ expect(deckUpdates.solo).toBeUndefined();
36
+ expect(deckUpdates.active).toEqual(['item1', 'item2']);
37
+ });
38
+ });
39
+
40
+ describe('active preservation', () => {
41
+ test('preserves active unchanged when routing to solo', ({ expect }) => {
42
+ const deck = makeDeck({ solo: 'current', active: ['a', 'b', 'c'], initialized: true });
43
+ const { deckUpdates } = computeActiveUpdates({ next: ['item1'], deck });
44
+ expect(deckUpdates.solo).toBe('item1');
45
+ expect(deckUpdates.active).toEqual(['a', 'b', 'c']);
46
+ });
47
+
48
+ test('preserves active when initialized is false', ({ expect }) => {
49
+ const deck = makeDeck({ initialized: false, active: ['stale'] });
50
+ const { deckUpdates } = computeActiveUpdates({ next: ['item1'], deck });
51
+ expect(deckUpdates.solo).toBe('item1');
52
+ expect(deckUpdates.active).toEqual(['stale']);
53
+ });
54
+ });
55
+
56
+ describe('inactive handling', () => {
57
+ test('moves removed items to inactive', ({ expect }) => {
58
+ const deck = makeDeck({ initialized: true, active: ['a', 'b', 'c'] });
59
+ const { deckUpdates } = computeActiveUpdates({ next: ['a', 'c'], deck });
60
+ expect(deckUpdates.active).toEqual(['a', 'c']);
61
+ expect(deckUpdates.inactive).toContain('b');
62
+ });
63
+
64
+ test('moves displaced solo item to inactive', ({ expect }) => {
65
+ const deck = makeDeck({ solo: 'old', initialized: true });
66
+ const { deckUpdates } = computeActiveUpdates({ next: ['new'], deck });
67
+ expect(deckUpdates.solo).toBe('new');
68
+ expect(deckUpdates.inactive).toContain('old');
69
+ });
70
+
71
+ test('does not duplicate items already in inactive', ({ expect }) => {
72
+ const deck = makeDeck({ solo: 'old', initialized: true, inactive: ['old'] });
73
+ const { deckUpdates } = computeActiveUpdates({ next: ['new'], deck });
74
+ const oldCount = deckUpdates.inactive.filter((id) => id === 'old').length;
75
+ expect(oldCount).toBe(1);
76
+ });
77
+ });
78
+
79
+ describe('fullscreen', () => {
80
+ test('clears fullscreen when solo is cleared', ({ expect }) => {
81
+ const deck = makeDeck({ solo: 'item', fullscreen: true, initialized: true });
82
+ const { deckUpdates } = computeActiveUpdates({ next: [], deck });
83
+ expect(deckUpdates.fullscreen).toBe(false);
84
+ });
85
+
86
+ test('preserves fullscreen when solo is set', ({ expect }) => {
87
+ const deck = makeDeck({ solo: 'old', fullscreen: true, initialized: true });
88
+ const { deckUpdates } = computeActiveUpdates({ next: ['new'], deck });
89
+ expect(deckUpdates.fullscreen).toBe(true);
90
+ });
91
+ });
92
+
93
+ describe('empty next', () => {
94
+ test('clears solo when next is empty and in solo mode', ({ expect }) => {
95
+ const deck = makeDeck({ solo: 'item', initialized: false });
96
+ const { deckUpdates } = computeActiveUpdates({ next: [], deck });
97
+ expect(deckUpdates.solo).toBeUndefined();
98
+ });
99
+
100
+ test('clears active when next is empty and in deck mode', ({ expect }) => {
101
+ const deck = makeDeck({ initialized: true, active: ['a', 'b'] });
102
+ const { deckUpdates } = computeActiveUpdates({ next: [], deck });
103
+ expect(deckUpdates.active).toEqual([]);
104
+ });
105
+ });
106
+ });
@@ -2,46 +2,66 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { batch } from '@preact/signals-core';
5
+ import { type AttentionManager } from '@dxos/react-ui-attention';
6
6
 
7
- import { type AttentionManager } from '@dxos/plugin-attention';
8
-
9
- import { type DeckPluginState } from '../types';
7
+ import { type DeckState } from '#types';
10
8
 
11
9
  export type SetActiveOptions = {
12
10
  next: string[];
13
- state: DeckPluginState;
11
+ deck: DeckState;
14
12
  attention?: AttentionManager;
15
13
  };
16
14
 
17
- export const setActive = ({ next, state, attention }: SetActiveOptions) => {
18
- return batch(() => {
19
- const active = state.deck.solo ? [state.deck.solo] : state.deck.active;
20
- const removed = active.filter((id) => !next.includes(id));
21
- const closed = Array.from(new Set([...state.deck.inactive.filter((id) => !next.includes(id)), ...removed]));
15
+ export type SetActiveResult = {
16
+ /** Updates to apply to the deck. */
17
+ deckUpdates: {
18
+ inactive: string[];
19
+ solo: string | undefined;
20
+ active: string[];
21
+ fullscreen: boolean;
22
+ };
23
+ /** ID of the item to attend (scroll into view) if attention changed. */
24
+ toAttend?: string;
25
+ };
22
26
 
23
- state.deck.inactive = closed;
27
+ /**
28
+ * Computes the new active state for the deck without mutating.
29
+ * Returns the updates to apply and optionally an item to attend.
30
+ */
31
+ export const computeActiveUpdates = ({ next, deck, attention }: SetActiveOptions): SetActiveResult => {
32
+ const active = deck.solo ? [deck.solo] : deck.active;
33
+ const removed = active.filter((id) => !next.includes(id));
34
+ const closed = Array.from(new Set([...deck.inactive.filter((id) => !next.includes(id)), ...removed]));
24
35
 
25
- if (state.deck.solo || !state.deck.initialized) {
26
- state.deck.solo = next[0];
27
- } else {
28
- state.deck.active = next;
29
- }
36
+ const updates = {
37
+ inactive: closed,
38
+ solo: deck.solo,
39
+ active: deck.active,
40
+ fullscreen: deck.fullscreen,
41
+ };
30
42
 
31
- if (state.deck.fullscreen && !state.deck.solo) {
32
- state.deck.fullscreen = false;
33
- }
43
+ if (deck.solo || !deck.initialized) {
44
+ updates.solo = next[0];
45
+ } else {
46
+ updates.active = next;
47
+ }
48
+
49
+ if (deck.fullscreen && !updates.solo) {
50
+ updates.fullscreen = false;
51
+ }
34
52
 
35
- if (attention) {
36
- const attended = attention.current;
37
- const [attendedId] = Array.from(attended);
38
- const isAttendedAvailable = !!attendedId && next.includes(attendedId);
39
- if (!isAttendedAvailable) {
40
- const attendedIndex = active.indexOf(attendedId);
41
- // If outside of bounds, focus on the first/last plank, otherwise focus on the new plank in the same position.
42
- const index = attendedIndex === -1 ? 0 : attendedIndex >= next.length ? next.length - 1 : attendedIndex;
43
- return next[index];
44
- }
53
+ let toAttend: string | undefined;
54
+ if (attention) {
55
+ const attended = attention.getCurrent();
56
+ const [attendedId] = Array.from(attended);
57
+ const isAttendedAvailable = !!attendedId && next.includes(attendedId);
58
+ if (!isAttendedAvailable) {
59
+ const attendedIndex = active.indexOf(attendedId);
60
+ // If outside of bounds, focus on the first/last plank, otherwise focus on the new plank in the same position.
61
+ const index = attendedIndex === -1 ? 0 : attendedIndex >= next.length ? next.length - 1 : attendedIndex;
62
+ toAttend = next[index];
45
63
  }
46
- });
64
+ }
65
+
66
+ return { deckUpdates: updates, toAttend };
47
67
  };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ /// <reference types="vite/client" />
@@ -1,153 +0,0 @@
1
- import {
2
- DeckCapabilities
3
- } from "./chunk-HUWUYTOI.mjs";
4
- import {
5
- meta
6
- } from "./chunk-MHP4GPX5.mjs";
7
-
8
- // src/capabilities/app-graph-builder.ts
9
- import { Rx } from "@effect-rx/rx-react";
10
- import * as Function from "effect/Function";
11
- import * as Option from "effect/Option";
12
- import { Capabilities, LayoutAction, contributes, createIntent } from "@dxos/app-framework";
13
- import { AttentionCapabilities } from "@dxos/plugin-attention";
14
- import { ROOT_ID, createExtension, rxFromSignal } from "@dxos/plugin-graph";
15
- var app_graph_builder_default = ((context) => contributes(Capabilities.AppGraphBuilder, createExtension({
16
- id: meta.id,
17
- actions: (node) => Rx.make((get) => Function.pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => {
18
- const state = context.getCapability(DeckCapabilities.MutableDeckState);
19
- const _fullscreen = {
20
- id: `${LayoutAction.UpdateLayout._tag}/fullscreen`,
21
- data: async () => {
22
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
23
- await dispatch(createIntent(LayoutAction.SetLayoutMode, {
24
- part: "mode",
25
- options: {
26
- mode: "fullscreen"
27
- }
28
- }));
29
- },
30
- properties: {
31
- label: [
32
- "toggle fullscreen label",
33
- {
34
- ns: meta.id
35
- }
36
- ],
37
- icon: "ph--arrows-out--regular",
38
- keyBinding: {
39
- macos: "ctrl+meta+f",
40
- windows: "shift+ctrl+f"
41
- }
42
- }
43
- };
44
- const closeCurrent = {
45
- id: `${LayoutAction.Close._tag}/current`,
46
- data: async () => {
47
- const attention = context.getCapability(AttentionCapabilities.Attention);
48
- const attended = attention.current.at(-1);
49
- if (attended) {
50
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
51
- await dispatch(createIntent(LayoutAction.Close, {
52
- part: "main",
53
- subject: [
54
- attended
55
- ],
56
- options: {
57
- state: false
58
- }
59
- }));
60
- }
61
- },
62
- properties: {
63
- label: [
64
- "close current label",
65
- {
66
- ns: meta.id
67
- }
68
- ],
69
- icon: "ph--x--regular"
70
- }
71
- };
72
- const closeOthers = {
73
- id: `${LayoutAction.Close._tag}/others`,
74
- data: async () => {
75
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
76
- const attention = context.getCapability(AttentionCapabilities.Attention);
77
- const attended = attention.current.at(-1);
78
- const ids = state.deck.active.filter((id) => id !== attended) ?? [];
79
- await dispatch(createIntent(LayoutAction.Close, {
80
- part: "main",
81
- subject: ids,
82
- options: {
83
- state: false
84
- }
85
- }));
86
- },
87
- properties: {
88
- label: [
89
- "close others label",
90
- {
91
- ns: meta.id
92
- }
93
- ],
94
- icon: "ph--x-square--regular"
95
- }
96
- };
97
- const closeAll = {
98
- id: `${LayoutAction.Close._tag}/all`,
99
- data: async () => {
100
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
101
- await dispatch(createIntent(LayoutAction.Close, {
102
- part: "main",
103
- subject: state.deck.active,
104
- options: {
105
- state: false
106
- }
107
- }));
108
- },
109
- properties: {
110
- label: [
111
- "close all label",
112
- {
113
- ns: meta.id
114
- }
115
- ],
116
- icon: "ph--x-circle--regular"
117
- }
118
- };
119
- const toggleSidebar = {
120
- id: `${LayoutAction.UpdateSidebar._tag}/nav`,
121
- data: async () => {
122
- state.sidebarState = state.sidebarState === "expanded" ? "collapsed" : "expanded";
123
- },
124
- properties: {
125
- label: [
126
- get(rxFromSignal(() => state.sidebarState === "expanded" ? "collapse navigation sidebar label" : "open navigation sidebar label")),
127
- {
128
- ns: meta.id
129
- }
130
- ],
131
- icon: "ph--sidebar--regular",
132
- keyBinding: {
133
- macos: "meta+'"
134
- },
135
- disposition: "pin-end",
136
- position: "hoist",
137
- l0Breakpoint: "lg"
138
- }
139
- };
140
- return get(rxFromSignal(() => !state.deck.solo ? [
141
- closeCurrent,
142
- closeOthers,
143
- closeAll,
144
- toggleSidebar
145
- ] : [
146
- toggleSidebar
147
- ]));
148
- }), Option.getOrElse(() => [])))
149
- })));
150
- export {
151
- app_graph_builder_default as default
152
- };
153
- //# sourceMappingURL=app-graph-builder-YYP67JHW.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\n\nimport { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';\n\nimport { meta } from '../meta';\n\nimport { DeckCapabilities } from './capabilities';\n\nexport default (context: PluginContext) =>\n contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: meta.id,\n actions: (node) =>\n Rx.make((get) =>\n Function.pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => {\n const state = context.getCapability(DeckCapabilities.MutableDeckState);\n\n // NOTE(Zan): This is currently disabled.\n // TODO(Zan): Fullscreen needs to know the active node and provide that to the layout part.\n const _fullscreen = {\n id: `${LayoutAction.UpdateLayout._tag}/fullscreen`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(LayoutAction.SetLayoutMode, { part: 'mode', options: { mode: 'fullscreen' } }),\n );\n },\n properties: {\n label: ['toggle fullscreen label', { ns: meta.id }],\n icon: 'ph--arrows-out--regular',\n keyBinding: {\n macos: 'ctrl+meta+f',\n windows: 'shift+ctrl+f',\n },\n },\n };\n\n const closeCurrent = {\n id: `${LayoutAction.Close._tag}/current`,\n data: async () => {\n const attention = context.getCapability(AttentionCapabilities.Attention);\n const attended = attention.current.at(-1);\n if (attended) {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(LayoutAction.Close, {\n part: 'main',\n subject: [attended],\n options: { state: false },\n }),\n );\n }\n },\n properties: {\n label: ['close current label', { ns: meta.id }],\n icon: 'ph--x--regular',\n },\n };\n\n const closeOthers = {\n id: `${LayoutAction.Close._tag}/others`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const attention = context.getCapability(AttentionCapabilities.Attention);\n const attended = attention.current.at(-1);\n const ids = state.deck.active.filter((id) => id !== attended) ?? [];\n await dispatch(\n createIntent(LayoutAction.Close, { part: 'main', subject: ids, options: { state: false } }),\n );\n },\n properties: {\n label: ['close others label', { ns: meta.id }],\n icon: 'ph--x-square--regular',\n },\n };\n\n const closeAll = {\n id: `${LayoutAction.Close._tag}/all`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(LayoutAction.Close, {\n part: 'main',\n subject: state.deck.active,\n options: { state: false },\n }),\n );\n },\n properties: {\n label: ['close all label', { ns: meta.id }],\n icon: 'ph--x-circle--regular',\n },\n };\n\n const toggleSidebar = {\n id: `${LayoutAction.UpdateSidebar._tag}/nav`,\n data: async () => {\n state.sidebarState = state.sidebarState === 'expanded' ? 'collapsed' : 'expanded';\n },\n properties: {\n label: [\n get(\n rxFromSignal(() =>\n state.sidebarState === 'expanded'\n ? 'collapse navigation sidebar label'\n : 'open navigation sidebar label',\n ),\n ),\n { ns: meta.id },\n ],\n icon: 'ph--sidebar--regular',\n keyBinding: {\n macos: \"meta+'\",\n },\n disposition: 'pin-end',\n position: 'hoist',\n l0Breakpoint: 'lg',\n },\n };\n\n return get(\n rxFromSignal(() =>\n !state.deck.solo ? [closeCurrent, closeOthers, closeAll, toggleSidebar] : [toggleSidebar],\n ),\n );\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n );\n"],
5
- "mappings": "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",
6
- "names": ["Rx", "Function", "Option", "Capabilities", "LayoutAction", "contributes", "createIntent", "AttentionCapabilities", "ROOT_ID", "createExtension", "rxFromSignal", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "meta", "actions", "node", "Rx", "make", "get", "pipe", "flatMap", "ROOT_ID", "some", "none", "map", "state", "getCapability", "DeckCapabilities", "MutableDeckState", "_fullscreen", "LayoutAction", "UpdateLayout", "_tag", "data", "dispatchPromise", "dispatch", "IntentDispatcher", "createIntent", "SetLayoutMode", "part", "options", "mode", "properties", "label", "ns", "icon", "keyBinding", "macos", "windows", "closeCurrent", "Close", "attention", "AttentionCapabilities", "Attention", "attended", "current", "at", "subject", "closeOthers", "ids", "deck", "active", "filter", "closeAll", "toggleSidebar", "UpdateSidebar", "sidebarState", "rxFromSignal", "disposition", "position", "l0Breakpoint", "solo", "getOrElse"]
7
- }
@@ -1,32 +0,0 @@
1
- import {
2
- meta
3
- } from "./chunk-MHP4GPX5.mjs";
4
-
5
- // src/capabilities/check-app-scheme.ts
6
- import { Capabilities, contributes } from "@dxos/app-framework";
7
- var isSocket = !!globalThis.__args;
8
- var appScheme = "composer://";
9
- var checkAppScheme = (url) => {
10
- const iframe = document.createElement("iframe");
11
- iframe.style.display = "none";
12
- document.body.appendChild(iframe);
13
- iframe.src = url + window.location.pathname.replace(/^\/+/, "") + window.location.search;
14
- const timer = setTimeout(() => {
15
- document.body.removeChild(iframe);
16
- }, 3e3);
17
- window.addEventListener("pagehide", (event) => {
18
- clearTimeout(timer);
19
- document.body.removeChild(iframe);
20
- });
21
- };
22
- var check_app_scheme_default = (async (context) => {
23
- const settings = context.getCapability(Capabilities.SettingsStore).getStore(meta.id)?.value;
24
- if (!isSocket && settings?.enableNativeRedirect) {
25
- checkAppScheme(appScheme);
26
- }
27
- return contributes(Capabilities.Null, null);
28
- });
29
- export {
30
- check_app_scheme_default as default
31
- };
32
- //# sourceMappingURL=check-app-scheme-GCOL6YDT.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/check-app-scheme.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';\n\nimport { meta } from '../meta';\nimport { type DeckSettingsProps } from '../types';\n\nconst isSocket = !!(globalThis as any).__args;\n\n// TODO(mjamesderocher): Can we get this directly from Socket?\nconst appScheme = 'composer://';\n\n// TODO(mjamesderocher): Factor out as part of NavigationPlugin.\nconst checkAppScheme = (url: string) => {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n document.body.appendChild(iframe);\n\n iframe.src = url + window.location.pathname.replace(/^\\/+/, '') + window.location.search;\n\n const timer = setTimeout(() => {\n document.body.removeChild(iframe);\n }, 3000);\n\n window.addEventListener('pagehide', (event) => {\n clearTimeout(timer);\n document.body.removeChild(iframe);\n });\n};\n\nexport default async (context: PluginContext) => {\n const settings = context.getCapability(Capabilities.SettingsStore).getStore<DeckSettingsProps>(meta.id)?.value;\n if (!isSocket && settings?.enableNativeRedirect) {\n checkAppScheme(appScheme);\n }\n\n return contributes(Capabilities.Null, null);\n};\n"],
5
- "mappings": ";;;;;AAIA,SAASA,cAAkCC,mBAAmB;AAK9D,IAAMC,WAAW,CAAC,CAAEC,WAAmBC;AAGvC,IAAMC,YAAY;AAGlB,IAAMC,iBAAiB,CAACC,QAAAA;AACtB,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOG,MAAMC,UAAU;AACvBH,WAASI,KAAKC,YAAYN,MAAAA;AAE1BA,SAAOO,MAAMR,MAAMS,OAAOC,SAASC,SAASC,QAAQ,QAAQ,EAAA,IAAMH,OAAOC,SAASG;AAElF,QAAMC,QAAQC,WAAW,MAAA;AACvBb,aAASI,KAAKU,YAAYf,MAAAA;EAC5B,GAAG,GAAA;AAEHQ,SAAOQ,iBAAiB,YAAY,CAACC,UAAAA;AACnCC,iBAAaL,KAAAA;AACbZ,aAASI,KAAKU,YAAYf,MAAAA;EAC5B,CAAA;AACF;AAEA,IAAA,4BAAe,OAAOmB,YAAAA;AACpB,QAAMC,WAAWD,QAAQE,cAAcC,aAAaC,aAAa,EAAEC,SAA4BC,KAAKC,EAAE,GAAGC;AACzG,MAAI,CAACjC,YAAY0B,UAAUQ,sBAAsB;AAC/C9B,mBAAeD,SAAAA;EACjB;AAEA,SAAOgC,YAAYP,aAAaQ,MAAM,IAAA;AACxC;",
6
- "names": ["Capabilities", "contributes", "isSocket", "globalThis", "__args", "appScheme", "checkAppScheme", "url", "iframe", "document", "createElement", "style", "display", "body", "appendChild", "src", "window", "location", "pathname", "replace", "search", "timer", "setTimeout", "removeChild", "addEventListener", "event", "clearTimeout", "context", "settings", "getCapability", "Capabilities", "SettingsStore", "getStore", "meta", "id", "value", "enableNativeRedirect", "contributes", "Null"]
7
- }