@dxos/plugin-deck 0.9.0 → 0.9.1-staging.ee54ba693a

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 (314) hide show
  1. package/PLUGIN.mdl +3 -1
  2. package/dist/lib/neutral/{DeckLayout-DEURA3KR.mjs → DeckLayout-B3RUUV5P.mjs} +36 -22
  3. package/dist/lib/neutral/DeckLayout-B3RUUV5P.mjs.map +7 -0
  4. package/dist/lib/neutral/DeckPlugin.mjs +4 -8
  5. package/dist/lib/neutral/DeckPlugin.mjs.map +4 -4
  6. package/dist/lib/neutral/DeckSettings-Z7GMB7XJ.mjs +32 -0
  7. package/dist/lib/neutral/DeckSettings-Z7GMB7XJ.mjs.map +7 -0
  8. package/dist/lib/neutral/{add-toast-TNB6DXWU.mjs → add-toast-BHNEH5UY.mjs} +2 -2
  9. package/dist/lib/neutral/{adjust-HNU5CCRO.mjs → adjust-MJB6UMRQ.mjs} +16 -10
  10. package/dist/lib/neutral/adjust-MJB6UMRQ.mjs.map +7 -0
  11. package/dist/lib/neutral/{app-graph-builder-HMLT627T.mjs → app-graph-builder-2F7P4IFQ.mjs} +8 -7
  12. package/dist/lib/neutral/app-graph-builder-2F7P4IFQ.mjs.map +7 -0
  13. package/dist/lib/neutral/capabilities/index.mjs +8 -8
  14. package/dist/lib/neutral/{check-app-scheme-INSOF72J.mjs → check-app-scheme-HSAORHHX.mjs} +2 -2
  15. package/dist/lib/neutral/chunk-FKGYHBUB.mjs +8 -0
  16. package/dist/lib/neutral/{chunk-BS4EOYMK.mjs → chunk-ICOJ4GMB.mjs} +37 -19
  17. package/dist/lib/neutral/chunk-ICOJ4GMB.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-KY7LMF4D.mjs +46 -0
  19. package/dist/lib/neutral/chunk-KY7LMF4D.mjs.map +7 -0
  20. package/dist/lib/neutral/{chunk-324PPIZB.mjs → chunk-KZFJ4PBT.mjs} +4 -4
  21. package/dist/lib/neutral/chunk-KZFJ4PBT.mjs.map +7 -0
  22. package/dist/lib/neutral/{chunk-GBIGQKYW.mjs → chunk-PP32NEVY.mjs} +4 -4
  23. package/dist/lib/neutral/chunk-PP32NEVY.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-SONATB35.mjs +20 -0
  25. package/dist/lib/neutral/chunk-SONATB35.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-Z2B5RSVI.mjs +1096 -0
  27. package/dist/lib/neutral/chunk-Z2B5RSVI.mjs.map +7 -0
  28. package/dist/lib/neutral/{close-ASKR22A6.mjs → close-2YGB5IIP.mjs} +4 -3
  29. package/dist/lib/neutral/{close-ASKR22A6.mjs.map → close-2YGB5IIP.mjs.map} +1 -1
  30. package/dist/lib/neutral/components/index.mjs +201 -16
  31. package/dist/lib/neutral/components/index.mjs.map +4 -4
  32. package/dist/lib/neutral/containers/index.mjs +6 -11
  33. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  34. package/dist/lib/neutral/hooks/index.mjs +101 -17
  35. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  36. package/dist/lib/neutral/index.mjs +18 -2
  37. package/dist/lib/neutral/meta.json +1 -1
  38. package/dist/lib/neutral/meta.mjs +1 -1
  39. package/dist/lib/neutral/{notification-tracker-P36322BH.mjs → notification-tracker-Y5CRTWJM.mjs} +12 -10
  40. package/dist/lib/neutral/notification-tracker-Y5CRTWJM.mjs.map +7 -0
  41. package/dist/lib/neutral/{open-5OYNO3RT.mjs → open-P6XQ56M7.mjs} +8 -7
  42. package/dist/lib/neutral/open-P6XQ56M7.mjs.map +7 -0
  43. package/dist/lib/neutral/operations/index.mjs +1 -1
  44. package/dist/lib/neutral/plugin.mjs +2 -2
  45. package/dist/lib/neutral/{react-root-HH5DEUOG.mjs → react-root-E6TAFHX6.mjs} +2 -2
  46. package/dist/lib/neutral/react-root-E6TAFHX6.mjs.map +7 -0
  47. package/dist/lib/neutral/{react-surface-3UVVCK3O.mjs → react-surface-H63FXUK3.mjs} +5 -6
  48. package/dist/lib/neutral/react-surface-H63FXUK3.mjs.map +7 -0
  49. package/dist/lib/neutral/{revert-workspace-B2QLT2C4.mjs → revert-workspace-RXWP2TEE.mjs} +2 -2
  50. package/dist/lib/neutral/{scroll-into-view-B52C3PJO.mjs → scroll-into-view-HFV5EGYZ.mjs} +2 -2
  51. package/dist/lib/neutral/{set-PA35ONXO.mjs → set-HOOVB7E4.mjs} +4 -3
  52. package/dist/lib/neutral/{set-PA35ONXO.mjs.map → set-HOOVB7E4.mjs.map} +1 -1
  53. package/dist/lib/neutral/{set-layout-mode-RPCCPQRB.mjs → set-layout-mode-XAGSZZGB.mjs} +2 -2
  54. package/dist/lib/neutral/{settings-EGNYUM4T.mjs → settings-6CDQEB6B.mjs} +3 -3
  55. package/dist/lib/neutral/settings-6CDQEB6B.mjs.map +7 -0
  56. package/dist/lib/neutral/{state-IIDXMQUO.mjs → state-F4X5GPGZ.mjs} +4 -3
  57. package/dist/lib/neutral/state-F4X5GPGZ.mjs.map +7 -0
  58. package/dist/lib/neutral/{switch-workspace-LZF4KZXH.mjs → switch-workspace-PA7N6EUX.mjs} +4 -4
  59. package/dist/lib/neutral/switch-workspace-PA7N6EUX.mjs.map +7 -0
  60. package/dist/lib/neutral/translations.mjs +3 -3
  61. package/dist/lib/neutral/translations.mjs.map +3 -3
  62. package/dist/lib/neutral/types/index.mjs +11 -1
  63. package/dist/lib/neutral/{update-companion-YUCZZVGY.mjs → update-companion-6A2SKQAI.mjs} +14 -6
  64. package/dist/lib/neutral/update-companion-6A2SKQAI.mjs.map +7 -0
  65. package/dist/lib/neutral/{update-complementary-7FZNB55J.mjs → update-complementary-K55I5EV5.mjs} +2 -2
  66. package/dist/lib/neutral/{update-dialog-FNQTSSAP.mjs → update-dialog-Z3GEXMVV.mjs} +2 -2
  67. package/dist/lib/neutral/{update-plank-size-3YW4NXEY.mjs → update-plank-size-BTESVV7N.mjs} +2 -2
  68. package/dist/lib/neutral/{update-popover-G2VUD7E6.mjs → update-popover-QEVDSZSH.mjs} +2 -2
  69. package/dist/lib/neutral/{update-sidebar-KRHPUHUB.mjs → update-sidebar-VSRCN47U.mjs} +2 -2
  70. package/dist/lib/neutral/{url-handler-A6HLW4RB.mjs → url-handler-ERZXXEYR.mjs} +11 -10
  71. package/dist/lib/neutral/url-handler-ERZXXEYR.mjs.map +7 -0
  72. package/dist/types/dx.config.d.ts +28 -0
  73. package/dist/types/dx.config.d.ts.map +1 -0
  74. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
  76. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/index.d.ts +8 -196
  78. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/notification-tracker.d.ts +1 -1
  80. package/dist/types/src/capabilities/notification-tracker.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/react-root.d.ts +1 -5
  82. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  84. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/settings.d.ts +1 -3
  86. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/state.d.ts +1 -187
  88. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/tools.d.ts +1 -1
  90. package/dist/types/src/capabilities/url-handler.d.ts +1 -1
  91. package/dist/types/src/components/Companion/Companion.d.ts +17 -0
  92. package/dist/types/src/components/Companion/Companion.d.ts.map +1 -0
  93. package/dist/types/src/components/Companion/index.d.ts +2 -0
  94. package/dist/types/src/components/Companion/index.d.ts.map +1 -0
  95. package/dist/types/src/components/Matrix/Matrix.d.ts +1 -1
  96. package/dist/types/src/components/Matrix/Matrix.d.ts.map +1 -1
  97. package/dist/types/src/components/Matrix/Matrix.stories.d.ts +2 -2
  98. package/dist/types/src/components/Matrix/Matrix.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/Matrix/index.d.ts +1 -1
  100. package/dist/types/src/components/Matrix/index.d.ts.map +1 -1
  101. package/dist/types/src/components/Pane/Pane.d.ts +45 -0
  102. package/dist/types/src/components/Pane/Pane.d.ts.map +1 -0
  103. package/dist/types/src/components/Pane/Pane.stories.d.ts +7 -0
  104. package/dist/types/src/components/Pane/Pane.stories.d.ts.map +1 -0
  105. package/dist/types/src/components/Pane/index.d.ts +2 -0
  106. package/dist/types/src/components/Pane/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Plank/Plank.d.ts +74 -0
  108. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -0
  109. package/dist/types/src/components/Plank/Plank.stories.d.ts +6 -0
  110. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/Plank/index.d.ts +2 -0
  112. package/dist/types/src/components/Plank/index.d.ts.map +1 -0
  113. package/dist/types/src/components/index.d.ts +3 -2
  114. package/dist/types/src/components/index.d.ts.map +1 -1
  115. package/dist/types/src/containers/Deck/Banner.d.ts.map +1 -1
  116. package/dist/types/src/containers/Deck/Deck.d.ts +1 -1
  117. package/dist/types/src/containers/Deck/Deck.d.ts.map +1 -1
  118. package/dist/types/src/containers/Deck/Deck.stories.d.ts +2 -2
  119. package/dist/types/src/containers/Deck/DeckPlank.d.ts +21 -0
  120. package/dist/types/src/containers/Deck/DeckPlank.d.ts.map +1 -0
  121. package/dist/types/src/containers/Deck/DeckViewport.d.ts +3 -1
  122. package/dist/types/src/containers/Deck/DeckViewport.d.ts.map +1 -1
  123. package/dist/types/src/containers/{Plank → Deck}/PlankControls.d.ts +3 -10
  124. package/dist/types/src/containers/Deck/PlankControls.d.ts.map +1 -0
  125. package/dist/types/src/containers/Deck/PlankFallback.d.ts +6 -0
  126. package/dist/types/src/containers/Deck/PlankFallback.d.ts.map +1 -0
  127. package/dist/types/src/containers/Deck/StatusBar.d.ts.map +1 -1
  128. package/dist/types/src/containers/Deck/useDeckPlank.d.ts +49 -0
  129. package/dist/types/src/containers/Deck/useDeckPlank.d.ts.map +1 -0
  130. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts +2 -2
  131. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
  132. package/dist/types/src/containers/DeckLayout/Popover.d.ts.map +1 -1
  133. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts +1 -1
  134. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
  135. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts +2 -2
  136. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts.map +1 -1
  137. package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
  138. package/dist/types/src/containers/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  139. package/dist/types/src/containers/index.d.ts +1 -1
  140. package/dist/types/src/containers/index.d.ts.map +1 -1
  141. package/dist/types/src/hooks/index.d.ts +2 -0
  142. package/dist/types/src/hooks/index.d.ts.map +1 -1
  143. package/dist/types/src/hooks/useCompanionSplit.d.ts +28 -0
  144. package/dist/types/src/hooks/useCompanionSplit.d.ts.map +1 -0
  145. package/dist/types/src/hooks/useCompanions.d.ts +11 -7
  146. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
  147. package/dist/types/src/hooks/useDeckCompanions.d.ts +2 -2
  148. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useDeckState.d.ts +1 -1
  150. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -1
  151. package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts +6 -0
  152. package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts.map +1 -0
  153. package/dist/types/src/index.d.ts +1 -0
  154. package/dist/types/src/index.d.ts.map +1 -1
  155. package/dist/types/src/meta.d.ts +32 -2
  156. package/dist/types/src/meta.d.ts.map +1 -1
  157. package/dist/types/src/operations/adjust.d.ts.map +1 -1
  158. package/dist/types/src/operations/open.d.ts.map +1 -1
  159. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -1
  160. package/dist/types/src/operations/update-companion.d.ts.map +1 -1
  161. package/dist/types/src/translations.d.ts +2 -2
  162. package/dist/types/src/translations.d.ts.map +1 -1
  163. package/dist/types/src/types/DeckCapabilities.d.ts +4 -4
  164. package/dist/types/src/types/DeckCapabilities.d.ts.map +1 -1
  165. package/dist/types/src/types/DeckOperation.d.ts +2 -2
  166. package/dist/types/src/types/DeckOperation.d.ts.map +1 -1
  167. package/dist/types/src/types/index.d.ts +1 -0
  168. package/dist/types/src/types/index.d.ts.map +1 -1
  169. package/dist/types/src/types/schema.d.ts +11 -9
  170. package/dist/types/src/types/schema.d.ts.map +1 -1
  171. package/dist/types/src/types/surface.d.ts +12 -0
  172. package/dist/types/src/types/surface.d.ts.map +1 -0
  173. package/dist/types/src/util/companion-view-state.d.ts +16 -0
  174. package/dist/types/src/util/companion-view-state.d.ts.map +1 -0
  175. package/dist/types/src/util/index.d.ts +1 -0
  176. package/dist/types/src/util/index.d.ts.map +1 -1
  177. package/dist/types/src/util/plank-url-params.d.ts +2 -0
  178. package/dist/types/src/util/plank-url-params.d.ts.map +1 -1
  179. package/dist/types/tsconfig.tsbuildinfo +1 -1
  180. package/dx.config.ts +35 -0
  181. package/package.json +50 -48
  182. package/src/DeckPlugin.test.ts +1 -1
  183. package/src/DeckPlugin.ts +2 -3
  184. package/src/capabilities/app-graph-builder.ts +7 -6
  185. package/src/capabilities/check-app-scheme.ts +3 -3
  186. package/src/capabilities/notification-tracker.ts +11 -9
  187. package/src/capabilities/react-root.tsx +1 -1
  188. package/src/capabilities/react-surface.tsx +4 -5
  189. package/src/capabilities/settings.ts +2 -2
  190. package/src/capabilities/state.ts +1 -1
  191. package/src/capabilities/url-handler.ts +7 -15
  192. package/src/components/Companion/Companion.tsx +91 -0
  193. package/src/components/Companion/index.ts +5 -0
  194. package/src/components/Matrix/Matrix.stories.tsx +15 -27
  195. package/src/components/Matrix/Matrix.tsx +3 -3
  196. package/src/components/Matrix/SPEC.md +1 -1
  197. package/src/components/Matrix/index.ts +1 -1
  198. package/src/components/Pane/Pane.stories.tsx +92 -0
  199. package/src/components/Pane/Pane.tsx +178 -0
  200. package/src/components/Pane/index.ts +5 -0
  201. package/src/components/Plank/Plank.stories.tsx +103 -0
  202. package/src/components/Plank/Plank.tsx +149 -0
  203. package/src/components/Plank/index.ts +5 -0
  204. package/src/components/index.ts +3 -4
  205. package/src/containers/Deck/Banner.tsx +5 -4
  206. package/src/containers/Deck/Deck.tsx +3 -3
  207. package/src/containers/Deck/DeckPlank.tsx +187 -0
  208. package/src/containers/Deck/DeckViewport.tsx +118 -246
  209. package/src/containers/{Plank → Deck}/PlankControls.tsx +21 -19
  210. package/src/containers/Deck/PlankFallback.tsx +42 -0
  211. package/src/containers/Deck/StatusBar.tsx +4 -2
  212. package/src/containers/Deck/useDeckPlank.ts +219 -0
  213. package/src/containers/DeckLayout/DeckLayout.stories.tsx +44 -60
  214. package/src/containers/DeckLayout/Dialog.tsx +1 -1
  215. package/src/containers/DeckLayout/Fallback.tsx +1 -1
  216. package/src/containers/DeckLayout/Popover.tsx +37 -20
  217. package/src/containers/DeckLayout/Toast.tsx +1 -1
  218. package/src/{components → containers}/DeckSettings/DeckSettings.stories.tsx +1 -1
  219. package/src/containers/DeckSettings/DeckSettings.tsx +42 -0
  220. package/src/containers/Sidebar/ComplementarySidebar.tsx +8 -7
  221. package/src/containers/Sidebar/Sidebar.tsx +1 -1
  222. package/src/containers/Sidebar/SidebarButton.tsx +3 -3
  223. package/src/containers/index.ts +1 -1
  224. package/src/hooks/index.ts +2 -0
  225. package/src/hooks/useCompanionSplit.ts +78 -0
  226. package/src/hooks/useCompanions.ts +39 -7
  227. package/src/hooks/useDeckCompanions.ts +3 -3
  228. package/src/hooks/useDeckState.ts +1 -1
  229. package/src/hooks/useSelectedCompanionVariant.ts +14 -0
  230. package/src/index.ts +7 -0
  231. package/src/meta.ts +2 -27
  232. package/src/operations/adjust.ts +23 -12
  233. package/src/operations/open.ts +12 -10
  234. package/src/operations/switch-workspace.ts +2 -2
  235. package/src/operations/update-companion.ts +10 -6
  236. package/src/translations.ts +3 -3
  237. package/src/types/DeckCapabilities.ts +6 -4
  238. package/src/types/DeckEvents.ts +1 -1
  239. package/src/types/DeckOperation.ts +3 -2
  240. package/src/types/index.ts +1 -0
  241. package/src/types/schema.ts +21 -16
  242. package/src/types/surface.ts +28 -0
  243. package/src/util/companion-view-state.ts +28 -0
  244. package/src/util/index.ts +1 -0
  245. package/src/util/plank-url-params.test.ts +5 -0
  246. package/src/util/plank-url-params.ts +5 -3
  247. package/src/util/sanitize-persisted-state.test.ts +1 -1
  248. package/src/util/set-active.test.ts +1 -1
  249. package/dist/lib/neutral/DeckLayout-DEURA3KR.mjs.map +0 -7
  250. package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs +0 -27
  251. package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs.map +0 -7
  252. package/dist/lib/neutral/adjust-HNU5CCRO.mjs.map +0 -7
  253. package/dist/lib/neutral/app-graph-builder-HMLT627T.mjs.map +0 -7
  254. package/dist/lib/neutral/chunk-324PPIZB.mjs.map +0 -7
  255. package/dist/lib/neutral/chunk-BS4EOYMK.mjs.map +0 -7
  256. package/dist/lib/neutral/chunk-GBIGQKYW.mjs.map +0 -7
  257. package/dist/lib/neutral/chunk-PYEY5SEC.mjs +0 -37
  258. package/dist/lib/neutral/chunk-PYEY5SEC.mjs.map +0 -7
  259. package/dist/lib/neutral/chunk-Q4W6B4IB.mjs +0 -8
  260. package/dist/lib/neutral/chunk-WAXJPQJI.mjs +0 -1306
  261. package/dist/lib/neutral/chunk-WAXJPQJI.mjs.map +0 -7
  262. package/dist/lib/neutral/notification-tracker-P36322BH.mjs.map +0 -7
  263. package/dist/lib/neutral/open-5OYNO3RT.mjs.map +0 -7
  264. package/dist/lib/neutral/react-root-HH5DEUOG.mjs.map +0 -7
  265. package/dist/lib/neutral/react-surface-3UVVCK3O.mjs.map +0 -7
  266. package/dist/lib/neutral/settings-EGNYUM4T.mjs.map +0 -7
  267. package/dist/lib/neutral/state-IIDXMQUO.mjs.map +0 -7
  268. package/dist/lib/neutral/switch-workspace-LZF4KZXH.mjs.map +0 -7
  269. package/dist/lib/neutral/update-companion-YUCZZVGY.mjs.map +0 -7
  270. package/dist/lib/neutral/url-handler-A6HLW4RB.mjs.map +0 -7
  271. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
  272. package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
  273. package/dist/types/src/containers/Plank/Plank.d.ts +0 -17
  274. package/dist/types/src/containers/Plank/Plank.d.ts.map +0 -1
  275. package/dist/types/src/containers/Plank/Plank.stories.d.ts +0 -67
  276. package/dist/types/src/containers/Plank/Plank.stories.d.ts.map +0 -1
  277. package/dist/types/src/containers/Plank/PlankComponent.d.ts +0 -17
  278. package/dist/types/src/containers/Plank/PlankComponent.d.ts.map +0 -1
  279. package/dist/types/src/containers/Plank/PlankContent.d.ts +0 -10
  280. package/dist/types/src/containers/Plank/PlankContent.d.ts.map +0 -1
  281. package/dist/types/src/containers/Plank/PlankControls.d.ts.map +0 -1
  282. package/dist/types/src/containers/Plank/PlankError.d.ts +0 -15
  283. package/dist/types/src/containers/Plank/PlankError.d.ts.map +0 -1
  284. package/dist/types/src/containers/Plank/PlankHeading.d.ts +0 -22
  285. package/dist/types/src/containers/Plank/PlankHeading.d.ts.map +0 -1
  286. package/dist/types/src/containers/Plank/PlankLoading.d.ts +0 -3
  287. package/dist/types/src/containers/Plank/PlankLoading.d.ts.map +0 -1
  288. package/dist/types/src/containers/Plank/PlankRoot.d.ts +0 -37
  289. package/dist/types/src/containers/Plank/PlankRoot.d.ts.map +0 -1
  290. package/dist/types/src/containers/Plank/index.d.ts +0 -4
  291. package/dist/types/src/containers/Plank/index.d.ts.map +0 -1
  292. package/src/components/DeckSettings/DeckSettings.tsx +0 -34
  293. package/src/containers/Plank/Plank.stories.tsx +0 -108
  294. package/src/containers/Plank/Plank.tsx +0 -22
  295. package/src/containers/Plank/PlankComponent.tsx +0 -223
  296. package/src/containers/Plank/PlankContent.tsx +0 -45
  297. package/src/containers/Plank/PlankError.tsx +0 -82
  298. package/src/containers/Plank/PlankHeading.tsx +0 -237
  299. package/src/containers/Plank/PlankLoading.tsx +0 -10
  300. package/src/containers/Plank/PlankRoot.tsx +0 -49
  301. package/src/containers/Plank/index.ts +0 -7
  302. /package/dist/lib/neutral/{add-toast-TNB6DXWU.mjs.map → add-toast-BHNEH5UY.mjs.map} +0 -0
  303. /package/dist/lib/neutral/{check-app-scheme-INSOF72J.mjs.map → check-app-scheme-HSAORHHX.mjs.map} +0 -0
  304. /package/dist/lib/neutral/{chunk-Q4W6B4IB.mjs.map → chunk-FKGYHBUB.mjs.map} +0 -0
  305. /package/dist/lib/neutral/{revert-workspace-B2QLT2C4.mjs.map → revert-workspace-RXWP2TEE.mjs.map} +0 -0
  306. /package/dist/lib/neutral/{scroll-into-view-B52C3PJO.mjs.map → scroll-into-view-HFV5EGYZ.mjs.map} +0 -0
  307. /package/dist/lib/neutral/{set-layout-mode-RPCCPQRB.mjs.map → set-layout-mode-XAGSZZGB.mjs.map} +0 -0
  308. /package/dist/lib/neutral/{update-complementary-7FZNB55J.mjs.map → update-complementary-K55I5EV5.mjs.map} +0 -0
  309. /package/dist/lib/neutral/{update-dialog-FNQTSSAP.mjs.map → update-dialog-Z3GEXMVV.mjs.map} +0 -0
  310. /package/dist/lib/neutral/{update-plank-size-3YW4NXEY.mjs.map → update-plank-size-BTESVV7N.mjs.map} +0 -0
  311. /package/dist/lib/neutral/{update-popover-G2VUD7E6.mjs.map → update-popover-QEVDSZSH.mjs.map} +0 -0
  312. /package/dist/lib/neutral/{update-sidebar-KRHPUHUB.mjs.map → update-sidebar-VSRCN47U.mjs.map} +0 -0
  313. /package/dist/types/src/{components → containers}/DeckSettings/index.d.ts +0 -0
  314. /package/src/{components → containers}/DeckSettings/index.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/components/index.ts", "../../../../src/components/Matrix/Matrix.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const DeckSettings: ComponentType<any> = lazy(() => import('./DeckSettings'));\n\nexport { Matrix } from './Matrix';\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { forwardRef, type PropsWithChildren, useCallback, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { type MosaicStackTileComponent, Mosaic } from '@dxos/react-ui-mosaic';\nimport { type ComposableProps } from '@dxos/ui-types';\n\n//\n// Context\n//\n\nconst MATRIX_NAME = 'Matrix';\n\ntype MatrixContextValue = {\n /** Items to render. */\n items: Obj.Any[];\n /** Tile component to render for each item. */\n Tile: MosaicStackTileComponent<Obj.Any>;\n /** Currently attended tile ID. */\n current?: Obj.ID;\n /** Callback when the attended tile changes. */\n onCurrentChange?: (id: Obj.ID | undefined) => void;\n /** Register the viewport element for scroll operations. */\n registerViewport: (element: HTMLElement | null) => void;\n};\n\nconst [MatrixProvider, useMatrixContext] = createContext<MatrixContextValue>(MATRIX_NAME);\n\n//\n// Controller\n//\n\ninterface MatrixController {\n scrollTo: (id: Obj.ID) => void;\n}\n\n//\n// Root\n//\n\nconst MATRIX_ROOT_NAME = 'Matrix.Root';\n\ntype MatrixRootProps = PropsWithChildren<{\n /** Items to render. */\n items?: Obj.Any[];\n /** Tile component to render for each item. */\n Tile: MosaicStackTileComponent<Obj.Any>;\n /** Currently attended tile ID. */\n current?: Obj.ID;\n /** Callback when the attended tile changes. */\n onCurrentChange?: (id: Obj.ID | undefined) => void;\n}>;\n\n/**\n * Headless root that provides matrix context.\n * Syncs the attention system with `onCurrentChange` — when a tile gains attention, the callback fires.\n */\nconst MatrixRoot = forwardRef<MatrixController, MatrixRootProps>(\n ({ children, items = [], Tile, current, onCurrentChange }, forwardedRef) => {\n const viewportRef = useRef<HTMLElement | null>(null);\n const registerViewport = useCallback((element: HTMLElement | null) => {\n viewportRef.current = element;\n }, []);\n\n const { findFirstFocusable } = useFocusFinders();\n const findFirstFocusableRef = useRef(findFirstFocusable);\n findFirstFocusableRef.current = findFirstFocusable;\n\n // Sync attention system with current tile.\n const attended = useAttended();\n const itemIds = useRef(new Set<string>());\n useEffect(() => {\n itemIds.current = new Set(items.map((item) => item.id));\n }, [items]);\n\n useEffect(() => {\n // Find the first attended ID that matches an item.\n const matchedId = attended.find((id) => itemIds.current.has(id));\n if (matchedId !== current) {\n onCurrentChange?.(matchedId);\n }\n }, [attended, current, onCurrentChange]);\n\n useImperativeHandle(forwardedRef, () => ({\n scrollTo: (id) => {\n const viewport = viewportRef.current;\n if (!viewport) {\n return;\n }\n\n const tile = viewport.querySelector<HTMLElement>(`[data-object-id=\"${CSS.escape(id)}\"]`);\n if (!tile) {\n return;\n }\n\n // Focus first focusable element so attention updates immediately, then scroll.\n const focusable = findFirstFocusableRef.current(tile);\n (focusable ?? tile).focus({ preventScroll: true });\n\n const tileRect = tile.getBoundingClientRect();\n const viewportRect = viewport.getBoundingClientRect();\n const offset = tileRect.left - viewportRect.left + viewport.scrollLeft;\n if (Math.abs(offset - viewport.scrollLeft) > 1) {\n viewport.scrollTo({ left: offset, behavior: 'smooth' });\n }\n },\n }));\n\n return (\n <MatrixProvider\n items={items}\n Tile={Tile}\n current={current}\n onCurrentChange={onCurrentChange}\n registerViewport={registerViewport}\n >\n {children}\n </MatrixProvider>\n );\n },\n);\n\nMatrixRoot.displayName = MATRIX_ROOT_NAME;\n\n//\n// Content\n//\n\nconst MATRIX_CONTENT_NAME = 'Matrix.Content';\n\ntype MatrixContentProps = ComposableProps;\n\n/**\n * Styled container wrapping Mosaic.Container for drag-and-drop support.\n */\nconst MatrixContent = composable<HTMLDivElement>(({ children, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n return (\n <Mosaic.Container ref={forwardedRef} classNames={className} orientation='horizontal' {...rest}>\n {children}\n </Mosaic.Container>\n );\n});\n\nMatrixContent.displayName = MATRIX_CONTENT_NAME;\n\n//\n// Viewport\n//\n\nconst MATRIX_VIEWPORT_NAME = 'Matrix.Viewport';\n\ntype MatrixViewportProps = ComposableProps;\n\nconst getId = (item: Obj.Any) => item.id;\n\n/**\n * Horizontally scrollable viewport that renders tiles from context.\n */\nconst MatrixViewport = composable<HTMLDivElement>(({ ...props }, forwardedRef) => {\n const { items, Tile, registerViewport } = useMatrixContext(MATRIX_VIEWPORT_NAME);\n const viewportRef = useCallback(\n (element: HTMLElement | null) => {\n registerViewport(element);\n },\n [registerViewport],\n );\n\n return (\n <ScrollArea.Root orientation='horizontal' padding snap {...composableProps(props)} ref={forwardedRef}>\n <ScrollArea.Viewport ref={viewportRef}>\n <Mosaic.Stack\n orientation='horizontal'\n classNames='snap-x snap-mandatory gap-2'\n getId={getId}\n items={items}\n Tile={Tile}\n draggable={false}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n});\n\nMatrixViewport.displayName = MATRIX_VIEWPORT_NAME;\n\n//\n// Matrix\n//\n\nexport const Matrix = {\n Root: MatrixRoot,\n Content: MatrixContent,\n Viewport: MatrixViewport,\n};\n\nexport type { MatrixController, MatrixRootProps, MatrixContentProps, MatrixViewportProps };\n"],
5
- "mappings": "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",
6
- "names": ["lazy", "useFocusFinders", "createContext", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useRef", "ScrollArea", "composable", "composableProps", "useAttended", "Mosaic", "MATRIX_NAME", "MatrixProvider", "useMatrixContext", "MATRIX_ROOT_NAME", "MatrixRoot", "children", "items", "Tile", "current", "onCurrentChange", "forwardedRef", "viewportRef", "registerViewport", "element", "findFirstFocusable", "findFirstFocusableRef", "attended", "itemIds", "Set", "map", "item", "id", "matchedId", "find", "has", "scrollTo", "viewport", "tile", "querySelector", "CSS", "escape", "focusable", "focus", "preventScroll", "tileRect", "getBoundingClientRect", "viewportRect", "offset", "left", "scrollLeft", "Math", "abs", "behavior", "displayName", "MATRIX_CONTENT_NAME", "MatrixContent", "props", "className", "rest", "Container", "ref", "classNames", "orientation", "MATRIX_VIEWPORT_NAME", "getId", "MatrixViewport", "Root", "padding", "snap", "Viewport", "Stack", "draggable", "Matrix", "Content", "DeckSettings", "lazy"]
3
+ "sources": ["../../../../src/components/Companion/Companion.tsx", "../../../../src/components/Pane/Pane.tsx", "../../../../src/components/Matrix/Matrix.tsx", "../../../../src/components/Plank/Plank.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type ReactNode, useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Node } from '@dxos/plugin-graph';\nimport { type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { Pane, type PaneTab } from '../Pane';\n\n//\n// Companion\n//\n// A higher-level companion pane bound to a set of companion {@link Node}s: a {@link Pane} whose toolbar\n// holds the companion tab strip and whose body renders the companions' content Surfaces. All panels stay\n// mounted (inactive hidden) so switching tabs preserves each companion's state. Shares attention with the\n// primary plank via `attendableId`. Controls (e.g. close) are supplied by the container.\n//\n\nexport type CompanionProps = ThemedClassName<{\n companions: Node.Node[];\n /** Selected companion id. */\n value?: string;\n onValueChange?: (id: string) => void;\n /** Primary plank attendable id; the companion shares its attention. */\n attendableId?: string;\n /** Primary plank subject; companion Article surfaces filter on (and operate against) `companionTo`. */\n companionTo?: unknown;\n /** Toolbar controls rendered after the tabs (e.g. close). */\n controls?: ReactNode;\n}>;\n\nexport const Companion = ({\n classNames,\n companions,\n value,\n onValueChange,\n attendableId,\n companionTo,\n controls,\n}: CompanionProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n // Fall back to the first companion when uncontrolled so a panel is always visible.\n const selected = value ?? companions[0]?.id;\n const tabs = useMemo<PaneTab[]>(\n () =>\n companions.map((node) => ({\n id: node.id,\n icon: node.properties?.icon ?? 'ph--circle-dashed--regular',\n label: toLocalizedString(node.properties?.label ?? '', t),\n })),\n [companions, t],\n );\n\n // Stable per-companion data objects so companion article surfaces don't receive a new prop reference on\n // every parent re-render (the same pattern as the inline data fix in Plank).\n const companionDataList = useMemo(\n () =>\n companions.map((node) => ({\n attendableId,\n subject: node.data,\n companionTo,\n variant: getLinkedVariant(node.id),\n properties: node.properties,\n })),\n [companions, attendableId, companionTo],\n );\n\n return (\n <Pane.Root classNames={classNames}>\n <Pane.Toolbar>\n <Pane.Tabs tabs={tabs} value={selected} onValueChange={onValueChange} attendableId={attendableId} related />\n {controls}\n </Pane.Toolbar>\n {/* Panels stay mounted; the inactive ones are hidden so switching companions preserves their state. */}\n {companions.map((node, index) => (\n <Pane.Content key={node.id} classNames={mx(node.id !== selected && 'hidden')}>\n <Surface.Surface type={AppSurface.Article} data={companionDataList[index]} limit={1} />\n </Pane.Content>\n ))}\n </Pane.Root>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type ComponentPropsWithRef, forwardRef } from 'react';\n\nimport { AttentionSigilButton } from '@dxos/app-toolkit/ui';\nimport { DensityProvider, IconButton, type ThemedClassName, composableProps, slottable } from '@dxos/react-ui';\nimport { type AttendableId, type Related, useAttention } from '@dxos/react-ui-attention';\nimport { iconSize, mx } from '@dxos/ui-theme';\nimport type { Merge } from '@dxos/util';\n\n//\n// Pane\n//\n// A presentational, radix-style component for a single deck pane: a toolbar rail above a content body.\n// A plank always has a toolbar, so it implements that layout directly rather than wrapping the\n// generalized `Panel`. A companion pane is just a Pane whose toolbar holds `Pane.Tabs` instead of a\n// sigil/title. Intentionally free of app-framework concepts (capabilities, operations, Surface) —\n// containers compose the sigil, controls, tabs and content surface into the slots.\n//\n\n//\n// Root\n//\n\n// Root accepts arbitrary div attributes (the container wires tabIndex, data-* and key handlers), so it\n// is a plain forwarding div rather than the narrowly-typed `slottable` used by the toolbar/content slots.\ntype PaneRootProps = ThemedClassName<ComponentPropsWithRef<'div'>>;\n\nconst PaneRoot = forwardRef<HTMLDivElement, PaneRootProps>(({ children, ...props }, forwardedRef) => (\n <div\n {...composableProps(props, {\n role: 'article',\n classNames:\n 'dx-container flex flex-col dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-lg min-w-0',\n })}\n ref={forwardedRef}\n >\n {children}\n </div>\n));\n\nPaneRoot.displayName = 'Pane.Root';\n\n//\n// Toolbar\n//\n\nconst PaneToolbar = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n return (\n <Comp\n {...composableProps(props, {\n style: iconSize(5),\n classNames: 'flex items-center gap-1 px-1 shrink-0 h-(--dx-rail-content) bg-header-surface',\n })}\n ref={forwardedRef}\n >\n <DensityProvider density='lg'>{children}</DensityProvider>\n </Comp>\n );\n});\n\nPaneToolbar.displayName = 'Pane.Toolbar';\n\n//\n// Content\n//\n\nconst PaneContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n return (\n <Comp {...composableProps(props, { classNames: 'flex-1 min-h-0' })} ref={forwardedRef}>\n {children}\n </Comp>\n );\n});\n\nPaneContent.displayName = 'Pane.Content';\n\n//\n// Title\n//\n\ntype PaneTitleProps = ThemedClassName<ComponentPropsWithRef<'h1'>> & AttendableId & Related;\n\n/** Attention-aware plank title; colors to the accent when the plank (or a related companion) is attended. */\nconst PaneTitle = forwardRef<HTMLHeadingElement, PaneTitleProps>(\n ({ attendableId, related, classNames, ...props }, forwardedRef) => {\n const { hasAttention, isAncestor, isRelated } = useAttention(attendableId);\n return (\n <h1\n {...props}\n data-attention={((related && isRelated) || hasAttention || isAncestor).toString()}\n className={mx(\n 'px-1 min-w-0 w-0 grow truncate font-medium text-base-fg data-[attention=true]:text-accent-text self-center',\n classNames,\n )}\n ref={forwardedRef}\n />\n );\n },\n);\n\nPaneTitle.displayName = 'Pane.Title';\n\n//\n// Tabs\n//\n\nexport type PaneTab = {\n id: string;\n icon: string;\n /** Already-localized label. */\n label: string;\n};\n\ntype PaneTabsProps = Merge<\n ThemedClassName<{\n tabs: ReadonlyArray<PaneTab>;\n value?: string;\n onValueChange?: (id: string) => void;\n /** Collapse inactive tabs to icon-only once the tab count exceeds this. */\n maxTabs?: number;\n }>,\n AttendableId,\n Related\n>;\n\n/** Full-height tab strip for a companion plank's toolbar; selects among available companions. */\nconst PaneTabs = forwardRef<HTMLDivElement, PaneTabsProps>(\n ({ tabs, value, onValueChange, maxTabs = 5, attendableId, related, classNames }, forwardedRef) => {\n // The active tab only reads as primary when the plank (shared with its companion) is attended.\n const { hasAttention, isAncestor, isRelated } = useAttention(attendableId);\n const attended = (related && isRelated) || hasAttention || isAncestor;\n return (\n <div\n role='tablist'\n className={mx('flex-1 min-w-0 overflow-x-auto scrollbar-none flex items-center gap-1', classNames)}\n ref={forwardedRef}\n >\n {tabs.map(({ id, icon, label }) => (\n <IconButton\n key={id}\n role='tab'\n aria-selected={value === id}\n tabIndex={value === id ? 0 : -1}\n data-id={id}\n icon={icon}\n iconOnly={tabs.length > maxTabs && value !== id}\n label={label}\n variant={value === id && attended ? 'primary' : 'ghost'}\n onClick={() => onValueChange?.(id)}\n />\n ))}\n </div>\n );\n },\n);\n\nPaneTabs.displayName = 'Pane.Tabs';\n\n//\n// Pane\n//\n\nexport const Pane = {\n Root: PaneRoot,\n Toolbar: PaneToolbar,\n Sigil: AttentionSigilButton,\n Title: PaneTitle,\n Tabs: PaneTabs,\n Content: PaneContent,\n};\n\nexport type { PaneRootProps, PaneTabsProps, PaneTitleProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { type ComposableProps } from '@dxos/ui-types';\n\n//\n// Context\n//\n\nconst MATRIX_NAME = 'Matrix';\n\ntype MatrixContextValue = {\n /** Items to render. */\n items: Obj.Any[];\n /** Tile component to render for each item. */\n Tile: MosaicStackTileComponent<Obj.Any>;\n /** Currently attended tile ID. */\n current?: Obj.ID;\n /** Callback when the attended tile changes. */\n onCurrentChange?: (id: Obj.ID | undefined) => void;\n /** Register the viewport element for scroll operations. */\n registerViewport: (element: HTMLElement | null) => void;\n};\n\nconst [MatrixProvider, useMatrixContext] = createContext<MatrixContextValue>(MATRIX_NAME);\n\n//\n// Controller\n//\n\ninterface MatrixController {\n scrollTo: (id: Obj.ID) => void;\n}\n\n//\n// Root\n//\n\nconst MATRIX_ROOT_NAME = 'Matrix.Root';\n\ntype MatrixRootProps = PropsWithChildren<{\n /** Items to render. */\n items?: Obj.Any[];\n /** Tile component to render for each item. */\n Tile: MosaicStackTileComponent<Obj.Any>;\n /** Currently attended tile ID. */\n current?: Obj.ID;\n /** Callback when the attended tile changes. */\n onCurrentChange?: (id: Obj.ID | undefined) => void;\n}>;\n\n/**\n * Headless root that provides matrix context.\n * Syncs the attention system with `onCurrentChange` — when a tile gains attention, the callback fires.\n */\nconst MatrixRoot = forwardRef<MatrixController, MatrixRootProps>(\n ({ children, items = [], Tile, current, onCurrentChange }, forwardedRef) => {\n const viewportRef = useRef<HTMLElement | null>(null);\n const registerViewport = useCallback((element: HTMLElement | null) => {\n viewportRef.current = element;\n }, []);\n\n const { findFirstFocusable } = useFocusFinders();\n const findFirstFocusableRef = useRef(findFirstFocusable);\n findFirstFocusableRef.current = findFirstFocusable;\n\n // Sync attention system with current tile.\n const attended = useAttended();\n const itemIds = useRef(new Set<string>());\n useEffect(() => {\n itemIds.current = new Set(items.map((item) => item.id));\n }, [items]);\n\n useEffect(() => {\n // Find the first attended ID that matches an item.\n const matchedId = attended.find((id) => itemIds.current.has(id));\n if (matchedId !== current) {\n onCurrentChange?.(matchedId);\n }\n }, [attended, current, onCurrentChange]);\n\n useImperativeHandle(forwardedRef, () => ({\n scrollTo: (id) => {\n const viewport = viewportRef.current;\n if (!viewport) {\n return;\n }\n\n const tile = viewport.querySelector<HTMLElement>(`[data-object-id=\"${CSS.escape(id)}\"]`);\n if (!tile) {\n return;\n }\n\n // Focus first focusable element so attention updates immediately, then scroll.\n const focusable = findFirstFocusableRef.current(tile);\n (focusable ?? tile).focus({ preventScroll: true });\n\n const tileRect = tile.getBoundingClientRect();\n const viewportRect = viewport.getBoundingClientRect();\n const offset = tileRect.left - viewportRect.left + viewport.scrollLeft;\n if (Math.abs(offset - viewport.scrollLeft) > 1) {\n viewport.scrollTo({ left: offset, behavior: 'smooth' });\n }\n },\n }));\n\n return (\n <MatrixProvider\n items={items}\n Tile={Tile}\n current={current}\n onCurrentChange={onCurrentChange}\n registerViewport={registerViewport}\n >\n {children}\n </MatrixProvider>\n );\n },\n);\n\nMatrixRoot.displayName = MATRIX_ROOT_NAME;\n\n//\n// Content\n//\n\nconst MATRIX_CONTENT_NAME = 'Matrix.Content';\n\ntype MatrixContentProps = ComposableProps;\n\n/**\n * Styled container wrapping Mosaic.Container for drag-and-drop support.\n */\nconst MatrixContent = composable<HTMLDivElement>(({ children, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n return (\n <Mosaic.Container ref={forwardedRef} classNames={className} orientation='horizontal' {...rest}>\n {children}\n </Mosaic.Container>\n );\n});\n\nMatrixContent.displayName = MATRIX_CONTENT_NAME;\n\n//\n// Viewport\n//\n\nconst MATRIX_VIEWPORT_NAME = 'Matrix.Viewport';\n\ntype MatrixViewportProps = ComposableProps;\n\nconst getId = (item: Obj.Any) => item.id;\n\n/**\n * Horizontally scrollable viewport that renders tiles from context.\n */\nconst MatrixViewport = composable<HTMLDivElement>(({ ...props }, forwardedRef) => {\n const { items, Tile, registerViewport } = useMatrixContext(MATRIX_VIEWPORT_NAME);\n const viewportRef = useCallback(\n (element: HTMLElement | null) => {\n registerViewport(element);\n },\n [registerViewport],\n );\n\n return (\n <ScrollArea.Root orientation='horizontal' padding snap {...composableProps(props)} ref={forwardedRef}>\n <ScrollArea.Viewport ref={viewportRef}>\n <Mosaic.Stack\n orientation='horizontal'\n classNames='snap-x snap-mandatory gap-2'\n getId={getId}\n items={items}\n Tile={Tile}\n draggable={false}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n});\n\nMatrixViewport.displayName = MATRIX_VIEWPORT_NAME;\n\n//\n// Matrix\n//\n\nexport const Matrix = {\n Root: MatrixRoot,\n Content: MatrixContent,\n Viewport: MatrixViewport,\n};\n\nexport type { MatrixContentProps, MatrixController, MatrixRootProps, MatrixViewportProps };\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, {\n type ComponentProps,\n Fragment,\n type KeyboardEventHandler,\n type ReactNode,\n forwardRef,\n useMemo,\n} from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface, AttentionSigil, type AttentionSigilAction } from '@dxos/app-toolkit/ui';\nimport { type Node } from '@dxos/plugin-graph';\nimport { Icon, Popover, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { useAttentionAttributes } from '@dxos/react-ui-attention';\n\nimport { meta } from '#meta';\n\nimport { Pane } from '../Pane';\n\ntype SurfaceProps = ComponentProps<typeof Surface.Surface>;\n\nexport type PlankProps = ThemedClassName<{\n node: Node.Node;\n /** Attendable id; defaults to the node id. */\n attendableId?: string;\n /** Grouped sigil menu actions; when present the sigil opens a menu, otherwise it is a plain button. */\n actions?: AttentionSigilAction[][];\n onAction?: (action: AttentionSigilAction) => void;\n /** Toolbar controls rendered after the title (e.g. close/solo/fullscreen). */\n controls?: ReactNode;\n /** Toolbar content rendered between the title and the controls (e.g. a NavbarEnd surface). */\n navbarEnd?: ReactNode;\n /** Sigil-menu footer content (e.g. a MenuFooter surface). */\n sigilFooter?: ReactNode;\n /** Highlight the title/sigil when a related (companion) region is attended. */\n related?: boolean;\n /** Render the title in a muted style (e.g. while the subject is loading). */\n pending?: boolean;\n /** When it matches `${meta.key}:${node.id}`, anchors a popover to the sigil. */\n popoverAnchorId?: string;\n /** Extra Article surface data merged over the computed defaults (e.g. companionTo/variant/path). */\n articleData?: Partial<AppSurface.ArticleData>;\n /** Error fallback for the content surface. */\n fallback?: SurfaceProps['fallback'];\n /** Loading placeholder for the content surface. */\n placeholder?: SurfaceProps['placeholder'];\n /** Render only the content surface, omitting the toolbar (e.g. fullscreen). */\n headless?: boolean;\n // TODO(burdon): Why is this required?\n onKeyDown?: KeyboardEventHandler<HTMLDivElement>;\n}>;\n\n/**\n * A higher-level deck pane bound to a graph {@link Node}: renders the node's sigil, title and content\n * Surface inside a {@link Pane}, and makes itself the node's attendable region. Toolbar controls\n * (close/solo/etc.) and framework surfaces (NavbarEnd/MenuFooter) are supplied by the container via\n * slots so this component stays free of capabilities/operations.\n */\nexport const Plank = forwardRef<HTMLDivElement, PlankProps>(\n (\n {\n classNames,\n node,\n attendableId = node.id,\n actions,\n onAction,\n controls,\n navbarEnd,\n sigilFooter,\n related,\n pending,\n popoverAnchorId,\n articleData,\n fallback,\n placeholder,\n headless,\n onKeyDown,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.profile.key);\n const attentionAttrs = useAttentionAttributes(attendableId);\n const icon = node.properties?.icon ?? 'ph--circle-dashed--regular';\n const label = toLocalizedString(node.properties?.label ?? '', t);\n const data = useMemo<AppSurface.ArticleData>(\n () => ({ attendableId, subject: node.data, properties: node.properties, popoverAnchorId, ...articleData }),\n [attendableId, node.data, node.properties, popoverAnchorId, articleData],\n );\n\n // Anchor the sigil's popover only when this plank's menu is the active popover target.\n const ActionRoot = popoverAnchorId === `${meta.profile.key}:${node.id}` ? Popover.Anchor : Fragment;\n\n return (\n <Pane.Root\n ref={forwardedRef}\n classNames={classNames}\n tabIndex={0}\n onKeyDown={onKeyDown}\n {...attentionAttrs}\n data-testid='deck.plank'\n >\n {!headless && (\n <Pane.Toolbar>\n <ActionRoot>\n {actions && actions.length > 0 ? (\n <AttentionSigil\n icon={icon}\n related={related}\n attendableId={attendableId}\n actions={actions}\n onAction={onAction}\n triggerLabel={label}\n >\n {sigilFooter}\n </AttentionSigil>\n ) : (\n <Pane.Sigil attendableId={attendableId}>\n <span className='sr-only'>{label}</span>\n <Icon icon={icon} />\n </Pane.Sigil>\n )}\n </ActionRoot>\n <Pane.Title attendableId={attendableId} related={related} classNames={pending && 'text-description'}>\n {label}\n </Pane.Title>\n {navbarEnd}\n {controls}\n </Pane.Toolbar>\n )}\n <Pane.Content>\n <Surface.Surface\n key={node.id}\n type={AppSurface.Article}\n data={data}\n limit={1}\n fallback={fallback}\n placeholder={placeholder}\n />\n </Pane.Content>\n </Pane.Root>\n );\n },\n);\n\nPlank.displayName = 'Plank';\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useMemo", "Surface", "AppSurface", "toLocalizedString", "useTranslation", "getLinkedVariant", "mx", "meta", "Slot", "React", "forwardRef", "AttentionSigilButton", "DensityProvider", "IconButton", "composableProps", "slottable", "useAttention", "iconSize", "mx", "PaneRoot", "children", "props", "forwardedRef", "div", "role", "classNames", "ref", "displayName", "PaneToolbar", "asChild", "Comp", "style", "density", "PaneContent", "PaneTitle", "attendableId", "related", "hasAttention", "isAncestor", "isRelated", "h1", "data-attention", "toString", "className", "PaneTabs", "tabs", "value", "onValueChange", "maxTabs", "attended", "map", "id", "icon", "label", "key", "aria-selected", "tabIndex", "data-id", "iconOnly", "length", "variant", "onClick", "Pane", "Root", "Toolbar", "Sigil", "Title", "Tabs", "Content", "Companion", "classNames", "companions", "value", "onValueChange", "attendableId", "companionTo", "controls", "t", "useTranslation", "meta", "profile", "key", "selected", "id", "tabs", "useMemo", "map", "node", "icon", "properties", "label", "toLocalizedString", "companionDataList", "subject", "data", "variant", "getLinkedVariant", "React", "Pane", "Root", "Toolbar", "Tabs", "related", "index", "Content", "mx", "Surface", "type", "AppSurface", "Article", "limit", "useFocusFinders", "createContext", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useRef", "ScrollArea", "composable", "composableProps", "useAttended", "Mosaic", "MATRIX_NAME", "MatrixProvider", "useMatrixContext", "MATRIX_ROOT_NAME", "MatrixRoot", "children", "items", "Tile", "current", "onCurrentChange", "forwardedRef", "viewportRef", "registerViewport", "element", "findFirstFocusable", "findFirstFocusableRef", "attended", "itemIds", "Set", "map", "item", "id", "matchedId", "find", "has", "scrollTo", "viewport", "tile", "querySelector", "CSS", "escape", "focusable", "focus", "preventScroll", "tileRect", "getBoundingClientRect", "viewportRect", "offset", "left", "scrollLeft", "Math", "abs", "behavior", "displayName", "MATRIX_CONTENT_NAME", "MatrixContent", "props", "className", "rest", "Container", "ref", "classNames", "orientation", "MATRIX_VIEWPORT_NAME", "getId", "MatrixViewport", "Root", "padding", "snap", "Viewport", "Stack", "draggable", "Matrix", "Content", "React", "Fragment", "forwardRef", "useMemo", "Surface", "AppSurface", "AttentionSigil", "Icon", "Popover", "toLocalizedString", "useTranslation", "useAttentionAttributes", "meta", "Plank", "forwardRef", "classNames", "node", "attendableId", "id", "actions", "onAction", "controls", "navbarEnd", "sigilFooter", "related", "pending", "popoverAnchorId", "articleData", "fallback", "placeholder", "headless", "onKeyDown", "forwardedRef", "t", "useTranslation", "meta", "profile", "key", "attentionAttrs", "useAttentionAttributes", "icon", "properties", "label", "toLocalizedString", "data", "useMemo", "subject", "ActionRoot", "Popover", "Anchor", "Fragment", "React", "Pane", "Root", "ref", "tabIndex", "data-testid", "Toolbar", "length", "AttentionSigil", "triggerLabel", "Sigil", "span", "className", "Icon", "Title", "Content", "Surface", "type", "AppSurface", "Article", "limit", "displayName"]
7
7
  }
@@ -2,29 +2,24 @@ import {
2
2
  CloseSidebarButton,
3
3
  ComplementarySidebar,
4
4
  Deck,
5
- Plank,
6
- PlankError,
7
- PlankErrorFallback,
8
- PlankLoading,
9
5
  Sidebar,
10
6
  ToggleComplementarySidebarButton,
11
7
  ToggleSidebarButton
12
- } from "../chunk-WAXJPQJI.mjs";
13
- import "../chunk-GBIGQKYW.mjs";
8
+ } from "../chunk-Z2B5RSVI.mjs";
9
+ import "../chunk-PP32NEVY.mjs";
10
+ import "../chunk-SONATB35.mjs";
14
11
  import "../chunk-J5LGTIGS.mjs";
15
12
 
16
13
  // src/containers/index.ts
17
14
  import { lazy } from "react";
18
- var DeckLayout = lazy(() => import("../DeckLayout-DEURA3KR.mjs"));
15
+ var DeckLayout = lazy(() => import("../DeckLayout-B3RUUV5P.mjs"));
16
+ var DeckSettings = lazy(() => import("../DeckSettings-Z7GMB7XJ.mjs"));
19
17
  export {
20
18
  CloseSidebarButton,
21
19
  ComplementarySidebar,
22
20
  Deck,
23
21
  DeckLayout,
24
- Plank,
25
- PlankError,
26
- PlankErrorFallback,
27
- PlankLoading,
22
+ DeckSettings,
28
23
  Sidebar,
29
24
  ToggleComplementarySidebarButton,
30
25
  ToggleSidebarButton
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/containers/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './Deck';\nexport * from './Plank';\nexport * from './Sidebar';\n\nexport const DeckLayout: ComponentType<any> = lazy(() => import('./DeckLayout'));\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAIA,SAA6BA,YAAY;AAMlC,IAAMC,aAAiCD,KAAK,MAAM,OAAO,4BAAA,CAAA;",
6
- "names": ["lazy", "DeckLayout"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './Deck';\nexport * from './Sidebar';\n\nexport const DeckLayout: ComponentType<any> = lazy(() => import('./DeckLayout'));\nexport const DeckSettings: ComponentType<any> = lazy(() => import('./DeckSettings'));\n"],
5
+ "mappings": ";;;;;;;;;;;;;AAIA,SAA6BA,YAAY;AAKlC,IAAMC,aAAiCD,KAAK,MAAM,OAAO,4BAAA,CAAA;AACzD,IAAME,eAAmCF,KAAK,MAAM,OAAO,8BAAA,CAAA;",
6
+ "names": ["lazy", "DeckLayout", "DeckSettings"]
7
7
  }
@@ -1,3 +1,8 @@
1
+ import "../chunk-PP32NEVY.mjs";
2
+ import {
3
+ COMPANION_VIEW_STATE_CONTEXT,
4
+ companionVariantAspect
5
+ } from "../chunk-SONATB35.mjs";
1
6
  import "../chunk-J5LGTIGS.mjs";
2
7
 
3
8
  // src/hooks/useBreakpoints.ts
@@ -9,36 +14,107 @@ var useBreakpoints = () => {
9
14
  };
10
15
 
11
16
  // src/hooks/useCompanions.ts
12
- import { useMemo } from "react";
17
+ import { RegistryContext } from "@effect-atom/atom-react";
18
+ import { useContext, useEffect, useState } from "react";
13
19
  import { useAppGraph } from "@dxos/app-toolkit/ui";
14
- import { useConnections } from "@dxos/plugin-graph";
15
- import { byPosition } from "@dxos/util";
20
+ import { Position } from "@dxos/util";
16
21
  import { PLANK_COMPANION_TYPE } from "#types";
17
22
  var useCompanions = (id) => {
18
23
  const { graph } = useAppGraph();
19
- const nodes = useConnections(graph, id, "child");
20
- const companions = nodes.filter((node) => node.type === PLANK_COMPANION_TYPE);
21
- return useMemo(() => companions.toSorted((a, b) => byPosition(a.properties, b.properties)), [
22
- companions
24
+ const registry = useContext(RegistryContext);
25
+ const [companions, setCompanions] = useState([]);
26
+ useEffect(() => {
27
+ if (!id) {
28
+ setCompanions([]);
29
+ return;
30
+ }
31
+ const atom = graph.connections(id, "child");
32
+ const update = () => {
33
+ const next = registry.get(atom).filter((node) => node.type === PLANK_COMPANION_TYPE).toSorted((a, b) => Position.compare(a.properties, b.properties));
34
+ setCompanions((prev) => prev.length === next.length && prev.every((node, index) => node === next[index]) ? prev : next);
35
+ };
36
+ update();
37
+ return registry.subscribe(atom, update);
38
+ }, [
39
+ graph,
40
+ registry,
41
+ id
42
+ ]);
43
+ return companions;
44
+ };
45
+
46
+ // src/hooks/useCompanionSplit.ts
47
+ import * as Schema from "effect/Schema";
48
+ import { useCallback, useEffect as useEffect2, useMemo, useRef, useState as useState2 } from "react";
49
+ import { defineViewState, useViewState, useViewStateActions } from "@dxos/react-ui-attention";
50
+ var DEFAULT_COMPANION_SIZE = 30;
51
+ var PERSIST_DELAY = 250;
52
+ var CompanionSplitSchema = Schema.Struct({
53
+ horizontal: Schema.optional(Schema.Number),
54
+ vertical: Schema.optional(Schema.Number)
55
+ }).pipe(Schema.mutable);
56
+ var companionSplitAspect = defineViewState({
57
+ key: "deck-companion-split",
58
+ backend: "local",
59
+ schema: CompanionSplitSchema,
60
+ defaultValue: () => ({})
61
+ });
62
+ var useCompanionSplit = (orientation) => {
63
+ const split = useViewState(companionSplitAspect, COMPANION_VIEW_STATE_CONTEXT);
64
+ const { update } = useViewStateActions(companionSplitAspect, COMPANION_VIEW_STATE_CONTEXT);
65
+ const storedSize = split[orientation] ?? DEFAULT_COMPANION_SIZE;
66
+ const [liveSize, setLiveSize] = useState2(storedSize);
67
+ useEffect2(() => setLiveSize(storedSize), [
68
+ storedSize,
69
+ orientation
70
+ ]);
71
+ const pending = useRef(void 0);
72
+ useEffect2(() => () => pending.current?.flush(), []);
73
+ const onSizeChange = useCallback((next) => {
74
+ setLiveSize(next);
75
+ if (pending.current) {
76
+ clearTimeout(pending.current.timer);
77
+ }
78
+ const flush = () => {
79
+ pending.current = void 0;
80
+ update((prev) => ({
81
+ ...prev,
82
+ [orientation]: next
83
+ }));
84
+ };
85
+ pending.current = {
86
+ timer: setTimeout(flush, PERSIST_DELAY),
87
+ flush
88
+ };
89
+ }, [
90
+ update,
91
+ orientation
92
+ ]);
93
+ return useMemo(() => ({
94
+ size: liveSize,
95
+ onSizeChange
96
+ }), [
97
+ liveSize,
98
+ onSizeChange
23
99
  ]);
24
100
  };
25
101
 
26
102
  // src/hooks/useDeckCompanions.ts
27
103
  import { useAppGraph as useAppGraph2 } from "@dxos/app-toolkit/ui";
28
104
  import { Node } from "@dxos/plugin-graph";
29
- import { useConnections as useConnections2 } from "@dxos/plugin-graph";
30
- import { byPosition as byPosition2 } from "@dxos/util";
105
+ import { useConnections } from "@dxos/plugin-graph";
106
+ import { Position as Position2 } from "@dxos/util";
31
107
  import { DECK_COMPANION_TYPE } from "#types";
32
108
  var useDeckCompanions = () => {
33
109
  const { graph } = useAppGraph2();
34
- const connections = useConnections2(graph, Node.RootId, "child");
110
+ const connections = useConnections(graph, Node.RootId, "child");
35
111
  const companions = connections.filter((node) => node.type === DECK_COMPANION_TYPE);
36
- return companions.toSorted((a, b) => byPosition2(a.properties, b.properties));
112
+ return companions.toSorted((a, b) => Position2.compare(a.properties, b.properties));
37
113
  };
38
114
 
39
115
  // src/hooks/useDeckState.ts
40
116
  import { useAtomValue } from "@effect-atom/atom-react";
41
- import { useCallback, useMemo as useMemo2 } from "react";
117
+ import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
42
118
  import { Capabilities } from "@dxos/app-framework";
43
119
  import { useCapability } from "@dxos/app-framework/ui";
44
120
  import { invariant } from "@dxos/invariant";
@@ -65,13 +141,13 @@ var useDeckState = () => {
65
141
  persistedState,
66
142
  ephemeralState
67
143
  ]);
68
- const updateState = useCallback((fn) => {
144
+ const updateState = useCallback2((fn) => {
69
145
  registry.set(stateAtom, fn(registry.get(stateAtom)));
70
146
  }, [
71
147
  registry,
72
148
  stateAtom
73
149
  ]);
74
- const updateEphemeral = useCallback((fn) => {
150
+ const updateEphemeral = useCallback2((fn) => {
75
151
  registry.set(ephemeralAtom, fn(registry.get(ephemeralAtom)));
76
152
  }, [
77
153
  registry,
@@ -101,10 +177,10 @@ var useMainSize = () => {
101
177
  };
102
178
 
103
179
  // src/hooks/useNodeActionExpander.ts
104
- import { useEffect } from "react";
180
+ import { useEffect as useEffect3 } from "react";
105
181
  import { Graph } from "@dxos/plugin-graph";
106
182
  var useNodeActionExpander = (node) => {
107
- useEffect(() => {
183
+ useEffect3(() => {
108
184
  if (node) {
109
185
  const frame = requestAnimationFrame(() => {
110
186
  const graph = Graph.getGraph(node);
@@ -147,13 +223,21 @@ var useSelectedCompanion = (companions, preferredVariant) => {
147
223
  preferredVariant
148
224
  ]);
149
225
  };
226
+
227
+ // src/hooks/useSelectedCompanionVariant.ts
228
+ import { useViewState as useViewState2 } from "@dxos/react-ui-attention";
229
+ var useSelectedCompanionVariant = () => useViewState2(companionVariantAspect, COMPANION_VIEW_STATE_CONTEXT).variant;
150
230
  export {
231
+ DEFAULT_COMPANION_SIZE,
232
+ companionSplitAspect,
151
233
  useBreakpoints,
234
+ useCompanionSplit,
152
235
  useCompanions,
153
236
  useDeckCompanions,
154
237
  useDeckState,
155
238
  useMainSize,
156
239
  useNodeActionExpander,
157
- useSelectedCompanion
240
+ useSelectedCompanion,
241
+ useSelectedCompanionVariant
158
242
  };
159
243
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/hooks/useBreakpoints.ts", "../../../../src/hooks/useCompanions.ts", "../../../../src/hooks/useDeckCompanions.ts", "../../../../src/hooks/useDeckState.ts", "../../../../src/hooks/useMainSize.ts", "../../../../src/hooks/useNodeActionExpander.ts", "../../../../src/hooks/useSelectedCompanion.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMediaQuery } from '@dxos/react-ui';\n\nexport const useBreakpoints = () => {\n const [isNotMobile] = useMediaQuery('md');\n const [isDesktop] = useMediaQuery('lg');\n return isDesktop ? 'desktop' : isNotMobile ? 'tablet' : 'mobile';\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { useConnections } from '@dxos/plugin-graph';\nimport { byPosition } from '@dxos/util';\n\nimport { PLANK_COMPANION_TYPE } from '#types';\n\nexport const useCompanions = (id?: string) => {\n const { graph } = useAppGraph();\n const nodes = useConnections(graph, id, 'child');\n const companions = nodes.filter((node) => node.type === PLANK_COMPANION_TYPE);\n return useMemo(() => companions.toSorted((a, b) => byPosition(a.properties, b.properties)), [companions]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, type Node as NodeType } from '@dxos/plugin-graph';\nimport { useConnections } from '@dxos/plugin-graph';\nimport { type Label } from '@dxos/ui-types/translations';\nimport { type Position, byPosition } from '@dxos/util';\n\nimport { DECK_COMPANION_TYPE } from '#types';\n\nexport type DeckCompanion = NodeType.Node<\n any,\n {\n label: Label;\n icon: string;\n // TODO(burdon): Scroll area should be controlled by surface.\n /** If true, the panel will not be wrapped in a scroll area. */\n fixed?: boolean;\n position?: Position;\n joyride?: string;\n }\n>;\n\nexport const useDeckCompanions = (): DeckCompanion[] => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, Node.RootId, 'child');\n const companions = connections.filter((node) => node.type === DECK_COMPANION_TYPE) as DeckCompanion[];\n return companions.toSorted((a, b) => byPosition(a.properties, b.properties));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useMemo } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { invariant } from '@dxos/invariant';\n\nimport {\n DeckCapabilities,\n type EphemeralDeckState,\n type DeckPluginState,\n type DeckState,\n type StoredDeckState,\n} from '#types';\n\nexport type DeckStateHook = {\n /** Combined state value (reactive). Includes both persisted and ephemeral state. */\n state: DeckPluginState;\n /** The active deck, computed from decks[activeDeck]. */\n deck: DeckState;\n /** Update persisted state. */\n updateState: (fn: (current: StoredDeckState) => StoredDeckState) => void;\n /** Update ephemeral state. */\n updateEphemeral: (fn: (current: EphemeralDeckState) => EphemeralDeckState) => void;\n};\n\n/**\n * Hook to access the deck plugin state reactively.\n * Returns the combined state, the active deck, and update functions for each atom.\n */\nexport const useDeckState = (): DeckStateHook => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const stateAtom = useCapability(DeckCapabilities.State);\n const ephemeralAtom = useCapability(DeckCapabilities.EphemeralState);\n const persistedState = useAtomValue(stateAtom);\n const ephemeralState = useAtomValue(ephemeralAtom);\n\n // Compute deck from decks[activeDeck] to ensure it's always current.\n const deck = useMemo(() => {\n const deck = persistedState.decks[persistedState.activeDeck];\n invariant(deck, `Deck not found: ${persistedState.activeDeck}`);\n return deck;\n }, [persistedState.decks, persistedState.activeDeck]);\n\n // Combine persisted and ephemeral state into a unified view.\n const state = useMemo(\n (): DeckPluginState => ({\n ...persistedState,\n ...ephemeralState,\n }),\n [persistedState, ephemeralState],\n );\n\n const updateState = useCallback(\n (fn: (current: StoredDeckState) => StoredDeckState) => {\n registry.set(stateAtom, fn(registry.get(stateAtom)));\n },\n [registry, stateAtom],\n );\n\n const updateEphemeral = useCallback(\n (fn: (current: EphemeralDeckState) => EphemeralDeckState) => {\n registry.set(ephemeralAtom, fn(registry.get(ephemeralAtom)));\n },\n [registry, ephemeralAtom],\n );\n\n return useMemo(() => ({ state, deck, updateState, updateEphemeral }), [state, deck, updateState, updateEphemeral]);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useMainContext } from '@dxos/react-ui';\n\nexport const useMainSize = () => {\n const { navigationSidebarState, complementarySidebarState } = useMainContext('DeckPluginPlank');\n return {\n 'data-sidebar-left-state': navigationSidebarState,\n 'data-sidebar-right-state': complementarySidebarState,\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { Graph, type Node } from '@dxos/plugin-graph';\n\nexport const useNodeActionExpander = (node?: Node.Node) => {\n useEffect(() => {\n if (node) {\n const frame = requestAnimationFrame(() => {\n const graph = Graph.getGraph(node);\n void Graph.expand(graph, node.id, 'action');\n });\n return () => cancelAnimationFrame(frame);\n }\n }, [node]);\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type Node } from '@dxos/plugin-graph';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\n\n/**\n * Resolves which companion to show based on variant preference.\n * Falls back to first available if preferred variant not found.\n */\nexport const useSelectedCompanion = (companions: Node.Node[], preferredVariant?: string) => {\n return useMemo(() => {\n if (companions.length === 0) {\n return { companionId: undefined, variant: undefined };\n }\n\n // Try to find companion matching the preferred variant.\n if (preferredVariant) {\n const preferred = companions.find((companion) => getLinkedVariant(companion.id) === preferredVariant);\n if (preferred) {\n return { companionId: preferred.id, variant: getLinkedVariant(preferred.id) };\n }\n }\n\n // Fallback to first companion.\n const first = companions[0];\n return { companionId: first.id, variant: getLinkedVariant(first.id) };\n }, [companions, preferredVariant]);\n};\n"],
5
- "mappings": "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",
6
- "names": ["useMediaQuery", "useBreakpoints", "isNotMobile", "isDesktop", "useMemo", "useAppGraph", "useConnections", "byPosition", "PLANK_COMPANION_TYPE", "useCompanions", "id", "graph", "nodes", "companions", "filter", "node", "type", "toSorted", "a", "b", "properties", "useAppGraph", "Node", "useConnections", "byPosition", "DECK_COMPANION_TYPE", "useDeckCompanions", "graph", "connections", "RootId", "companions", "filter", "node", "type", "toSorted", "a", "b", "properties", "useAtomValue", "useCallback", "useMemo", "Capabilities", "useCapability", "invariant", "DeckCapabilities", "stateAtom", "ephemeralAtom", "EphemeralState", "persistedState", "ephemeralState", "deck", "registry", "updateState", "updateEphemeral", "state", "useMainContext", "useMainSize", "navigationSidebarState", "complementarySidebarState", "useEffect", "Graph", "useNodeActionExpander", "node", "frame", "requestAnimationFrame", "graph", "getGraph", "expand", "id", "cancelAnimationFrame", "useMemo", "getLinkedVariant", "useSelectedCompanion", "companions", "preferredVariant", "length", "companionId", "undefined", "variant", "preferred", "find", "companion", "id", "first"]
3
+ "sources": ["../../../../src/hooks/useBreakpoints.ts", "../../../../src/hooks/useCompanions.ts", "../../../../src/hooks/useCompanionSplit.ts", "../../../../src/hooks/useDeckCompanions.ts", "../../../../src/hooks/useDeckState.ts", "../../../../src/hooks/useMainSize.ts", "../../../../src/hooks/useNodeActionExpander.ts", "../../../../src/hooks/useSelectedCompanion.ts", "../../../../src/hooks/useSelectedCompanionVariant.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMediaQuery } from '@dxos/react-ui';\n\nexport const useBreakpoints = () => {\n const [isNotMobile] = useMediaQuery('md');\n const [isDesktop] = useMediaQuery('lg');\n return isDesktop ? 'desktop' : isNotMobile ? 'tablet' : 'mobile';\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { type Node } from '@dxos/plugin-graph';\nimport { Position } from '@dxos/util';\n\nimport { PLANK_COMPANION_TYPE } from '#types';\n\n/**\n * Companion (child) nodes for a plank.\n *\n * The node's child-connections atom is read in a commit-phase effect rather than during render.\n * Subscribing to it during render (via `useConnections`/`useAtomValue`) recomputes the shared atom and\n * synchronously notifies its other subscribers — notably navtree items rendering the same node — which\n * surfaces as a React \"cannot update a component while rendering a different component\" warning. Reading\n * it from an effect defers that notification to the commit phase where cross-component updates are allowed.\n */\nexport const useCompanions = (id?: string): Node.Node[] => {\n const { graph } = useAppGraph();\n const registry = useContext(RegistryContext);\n const [companions, setCompanions] = useState<Node.Node[]>([]);\n\n useEffect(() => {\n if (!id) {\n setCompanions([]);\n return;\n }\n\n const atom = graph.connections(id, 'child');\n const update = () => {\n const next = registry\n .get(atom)\n .filter((node) => node.type === PLANK_COMPANION_TYPE)\n .toSorted((a, b) => Position.compare(a.properties, b.properties));\n setCompanions((prev) =>\n prev.length === next.length && prev.every((node, index) => node === next[index]) ? prev : next,\n );\n };\n\n update();\n return registry.subscribe(atom, update);\n }, [graph, registry, id]);\n\n return companions;\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type SplitterOrientation } from '@dxos/react-ui';\nimport { type AspectDef, defineViewState, useViewState, useViewStateActions } from '@dxos/react-ui-attention';\n\nimport { COMPANION_VIEW_STATE_CONTEXT } from '../util';\n\n/** Companion split point (rem) used until the user resizes a given orientation. */\nexport const DEFAULT_COMPANION_SIZE = 30;\n\n/** Trailing delay before a resize is committed to storage (drags fire continuously). */\nconst PERSIST_DELAY = 250;\n\nconst CompanionSplitSchema = Schema.Struct({\n horizontal: Schema.optional(Schema.Number),\n vertical: Schema.optional(Schema.Number),\n}).pipe(Schema.mutable);\n\nexport type CompanionSplit = Schema.Schema.Type<typeof CompanionSplitSchema>;\n\n/**\n * Companion splitter sizes (rem), memoized separately for each orientation so toggling the companion\n * between side-by-side and stacked restores that orientation's last split point. Stored in the `local`\n * backend (localStorage, persisted across reloads) via react-ui-attention view state.\n */\nexport const companionSplitAspect: AspectDef<CompanionSplit> = defineViewState<CompanionSplit>({\n key: 'deck-companion-split',\n backend: 'local',\n schema: CompanionSplitSchema,\n defaultValue: () => ({}),\n});\n\nexport type UseCompanionSplit = {\n /** The remembered split point for the current orientation (or the default). */\n size: number;\n onSizeChange: (size: number) => void;\n};\n\n/**\n * Reads and writes the global companion splitter size keyed by `orientation`. A live size keeps dragging\n * smooth while the persisted write is debounced (and flushed on unmount) to avoid per-frame storage writes.\n */\nexport const useCompanionSplit = (orientation: SplitterOrientation): UseCompanionSplit => {\n const split = useViewState(companionSplitAspect, COMPANION_VIEW_STATE_CONTEXT);\n const { update } = useViewStateActions(companionSplitAspect, COMPANION_VIEW_STATE_CONTEXT);\n const storedSize = split[orientation] ?? DEFAULT_COMPANION_SIZE;\n\n // Drive the controlled Splitter from local state so a drag tracks the pointer without a storage\n // round-trip per frame; reseed when the orientation switches (recall) or storage changes externally.\n const [liveSize, setLiveSize] = useState(storedSize);\n useEffect(() => setLiveSize(storedSize), [storedSize, orientation]);\n\n // Flush the trailing write on unmount so the final size is not dropped inside the debounce window.\n const pending = useRef<{ timer: ReturnType<typeof setTimeout>; flush: () => void } | undefined>(undefined);\n useEffect(() => () => pending.current?.flush(), []);\n\n const onSizeChange = useCallback(\n (next: number) => {\n setLiveSize(next);\n if (pending.current) {\n clearTimeout(pending.current.timer);\n }\n const flush = () => {\n pending.current = undefined;\n update((prev) => ({ ...prev, [orientation]: next }));\n };\n pending.current = { timer: setTimeout(flush, PERSIST_DELAY), flush };\n },\n [update, orientation],\n );\n\n return useMemo(() => ({ size: liveSize, onSizeChange }), [liveSize, onSizeChange]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Node, type Node as NodeType } from '@dxos/plugin-graph';\nimport { useConnections } from '@dxos/plugin-graph';\nimport { type Label } from '@dxos/ui-types/translations';\nimport { Position } from '@dxos/util';\n\nimport { DECK_COMPANION_TYPE } from '#types';\n\nexport type DeckCompanion = NodeType.Node<\n any,\n {\n label: Label;\n icon: string;\n // TODO(burdon): Scroll area should be controlled by surface.\n /** If true, the panel will not be wrapped in a scroll area. */\n fixed?: boolean;\n position?: Position.Position;\n joyride?: string;\n }\n>;\n\nexport const useDeckCompanions = (): DeckCompanion[] => {\n const { graph } = useAppGraph();\n const connections = useConnections(graph, Node.RootId, 'child');\n const companions = connections.filter((node) => node.type === DECK_COMPANION_TYPE) as DeckCompanion[];\n return companions.toSorted((a, b) => Position.compare(a.properties, b.properties));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useMemo } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { invariant } from '@dxos/invariant';\n\nimport {\n DeckCapabilities,\n type DeckPluginState,\n type DeckState,\n type EphemeralDeckState,\n type StoredDeckState,\n} from '#types';\n\nexport type DeckStateHook = {\n /** Combined state value (reactive). Includes both persisted and ephemeral state. */\n state: DeckPluginState;\n /** The active deck, computed from decks[activeDeck]. */\n deck: DeckState;\n /** Update persisted state. */\n updateState: (fn: (current: StoredDeckState) => StoredDeckState) => void;\n /** Update ephemeral state. */\n updateEphemeral: (fn: (current: EphemeralDeckState) => EphemeralDeckState) => void;\n};\n\n/**\n * Hook to access the deck plugin state reactively.\n * Returns the combined state, the active deck, and update functions for each atom.\n */\nexport const useDeckState = (): DeckStateHook => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const stateAtom = useCapability(DeckCapabilities.State);\n const ephemeralAtom = useCapability(DeckCapabilities.EphemeralState);\n const persistedState = useAtomValue(stateAtom);\n const ephemeralState = useAtomValue(ephemeralAtom);\n\n // Compute deck from decks[activeDeck] to ensure it's always current.\n const deck = useMemo(() => {\n const deck = persistedState.decks[persistedState.activeDeck];\n invariant(deck, `Deck not found: ${persistedState.activeDeck}`);\n return deck;\n }, [persistedState.decks, persistedState.activeDeck]);\n\n // Combine persisted and ephemeral state into a unified view.\n const state = useMemo(\n (): DeckPluginState => ({\n ...persistedState,\n ...ephemeralState,\n }),\n [persistedState, ephemeralState],\n );\n\n const updateState = useCallback(\n (fn: (current: StoredDeckState) => StoredDeckState) => {\n registry.set(stateAtom, fn(registry.get(stateAtom)));\n },\n [registry, stateAtom],\n );\n\n const updateEphemeral = useCallback(\n (fn: (current: EphemeralDeckState) => EphemeralDeckState) => {\n registry.set(ephemeralAtom, fn(registry.get(ephemeralAtom)));\n },\n [registry, ephemeralAtom],\n );\n\n return useMemo(() => ({ state, deck, updateState, updateEphemeral }), [state, deck, updateState, updateEphemeral]);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useMainContext } from '@dxos/react-ui';\n\nexport const useMainSize = () => {\n const { navigationSidebarState, complementarySidebarState } = useMainContext('DeckPluginPlank');\n return {\n 'data-sidebar-left-state': navigationSidebarState,\n 'data-sidebar-right-state': complementarySidebarState,\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { Graph, type Node } from '@dxos/plugin-graph';\n\nexport const useNodeActionExpander = (node?: Node.Node) => {\n useEffect(() => {\n if (node) {\n const frame = requestAnimationFrame(() => {\n const graph = Graph.getGraph(node);\n void Graph.expand(graph, node.id, 'action');\n });\n return () => cancelAnimationFrame(frame);\n }\n }, [node]);\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type Node } from '@dxos/plugin-graph';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\n\n/**\n * Resolves which companion to show based on variant preference.\n * Falls back to first available if preferred variant not found.\n */\nexport const useSelectedCompanion = (companions: Node.Node[], preferredVariant?: string) => {\n return useMemo(() => {\n if (companions.length === 0) {\n return { companionId: undefined, variant: undefined };\n }\n\n // Try to find companion matching the preferred variant.\n if (preferredVariant) {\n const preferred = companions.find((companion) => getLinkedVariant(companion.id) === preferredVariant);\n if (preferred) {\n return { companionId: preferred.id, variant: getLinkedVariant(preferred.id) };\n }\n }\n\n // Fallback to first companion.\n const first = companions[0];\n return { companionId: first.id, variant: getLinkedVariant(first.id) };\n }, [companions, preferredVariant]);\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useViewState } from '@dxos/react-ui-attention';\n\nimport { COMPANION_VIEW_STATE_CONTEXT, companionVariantAspect } from '../util';\n\n/**\n * Reads the globally-selected companion variant (persisted via view state) so reopening the companion\n * restores the last-selected tab rather than resetting to the first.\n */\nexport const useSelectedCompanionVariant = (): string | undefined =>\n useViewState(companionVariantAspect, COMPANION_VIEW_STATE_CONTEXT).variant;\n"],
5
+ "mappings": "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",
6
+ "names": ["useMediaQuery", "useBreakpoints", "isNotMobile", "isDesktop", "RegistryContext", "useContext", "useEffect", "useState", "useAppGraph", "Position", "PLANK_COMPANION_TYPE", "useCompanions", "id", "graph", "registry", "companions", "setCompanions", "atom", "connections", "update", "next", "get", "filter", "node", "type", "toSorted", "a", "b", "compare", "properties", "prev", "length", "every", "index", "subscribe", "Schema", "useCallback", "useEffect", "useMemo", "useRef", "useState", "defineViewState", "useViewState", "useViewStateActions", "DEFAULT_COMPANION_SIZE", "PERSIST_DELAY", "CompanionSplitSchema", "Struct", "horizontal", "optional", "Number", "vertical", "pipe", "mutable", "companionSplitAspect", "defineViewState", "key", "backend", "schema", "defaultValue", "useCompanionSplit", "orientation", "split", "useViewState", "COMPANION_VIEW_STATE_CONTEXT", "update", "useViewStateActions", "storedSize", "liveSize", "setLiveSize", "useState", "useEffect", "pending", "useRef", "undefined", "current", "flush", "onSizeChange", "useCallback", "next", "clearTimeout", "timer", "prev", "setTimeout", "useMemo", "size", "useAppGraph", "Node", "useConnections", "Position", "DECK_COMPANION_TYPE", "useDeckCompanions", "graph", "connections", "RootId", "companions", "filter", "node", "type", "toSorted", "a", "b", "compare", "properties", "useAtomValue", "useCallback", "useMemo", "Capabilities", "useCapability", "invariant", "DeckCapabilities", "stateAtom", "ephemeralAtom", "EphemeralState", "persistedState", "ephemeralState", "deck", "registry", "updateState", "updateEphemeral", "state", "useMainContext", "useMainSize", "navigationSidebarState", "complementarySidebarState", "useEffect", "Graph", "useNodeActionExpander", "node", "frame", "requestAnimationFrame", "graph", "getGraph", "expand", "id", "cancelAnimationFrame", "useMemo", "getLinkedVariant", "useSelectedCompanion", "companions", "preferredVariant", "length", "companionId", "undefined", "variant", "preferred", "find", "companion", "id", "first", "useViewState", "useSelectedCompanionVariant", "useViewState", "companionVariantAspect", "COMPANION_VIEW_STATE_CONTEXT", "variant"]
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-PYEY5SEC.mjs";
3
+ } from "./chunk-KY7LMF4D.mjs";
4
4
  import {
5
5
  DECK_COMPANION_TYPE,
6
6
  DeckAction,
@@ -9,16 +9,26 @@ import {
9
9
  DeckOperation_exports,
10
10
  DeckState,
11
11
  EphemeralDeckState,
12
+ Hints,
13
+ Keyshortcuts,
12
14
  PLANK_COMPANION_TYPE,
13
15
  PlankSizing,
14
16
  Settings_exports,
17
+ StatusBar,
18
+ StatusBarFooter,
15
19
  StoredDeckState,
20
+ VersionInfo,
16
21
  defaultDeck,
17
22
  getMode,
18
23
  isLayoutMode
19
- } from "./chunk-BS4EOYMK.mjs";
24
+ } from "./chunk-ICOJ4GMB.mjs";
25
+ import {
26
+ COMPANION_VIEW_STATE_CONTEXT,
27
+ companionVariantAspect
28
+ } from "./chunk-SONATB35.mjs";
20
29
  import "./chunk-J5LGTIGS.mjs";
21
30
  export {
31
+ COMPANION_VIEW_STATE_CONTEXT,
22
32
  DECK_COMPANION_TYPE,
23
33
  DeckAction,
24
34
  DeckCapabilities_exports as DeckCapabilities,
@@ -26,10 +36,16 @@ export {
26
36
  DeckOperation_exports as DeckOperation,
27
37
  DeckState,
28
38
  EphemeralDeckState,
39
+ Hints,
40
+ Keyshortcuts,
29
41
  PLANK_COMPANION_TYPE,
30
42
  PlankSizing,
31
43
  Settings_exports as Settings,
44
+ StatusBar,
45
+ StatusBarFooter,
32
46
  StoredDeckState,
47
+ VersionInfo,
48
+ companionVariantAspect,
33
49
  defaultDeck,
34
50
  getMode,
35
51
  isLayoutMode,