@dxos/plugin-deck 0.9.1-main.c7dcc2e112 → 0.10.0

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 (258) hide show
  1. package/PLUGIN.mdl +3 -1
  2. package/dist/lib/neutral/{DeckLayout-VX2BP4Q2.mjs → DeckLayout-B3RUUV5P.mjs} +4 -3
  3. package/dist/lib/neutral/DeckLayout-B3RUUV5P.mjs.map +7 -0
  4. package/dist/lib/neutral/DeckPlugin.mjs +2 -6
  5. package/dist/lib/neutral/DeckPlugin.mjs.map +3 -3
  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-APKTCLIA.mjs → add-toast-BHNEH5UY.mjs} +2 -2
  9. package/dist/lib/neutral/{adjust-7CZI4GK3.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-6HTXRTU2.mjs → app-graph-builder-2F7P4IFQ.mjs} +4 -3
  12. package/dist/lib/neutral/app-graph-builder-2F7P4IFQ.mjs.map +7 -0
  13. package/dist/lib/neutral/capabilities/index.mjs +5 -5
  14. package/dist/lib/neutral/chunk-FKGYHBUB.mjs +8 -0
  15. package/dist/lib/neutral/{chunk-CL7JIOI5.mjs → chunk-ICOJ4GMB.mjs} +10 -6
  16. package/dist/lib/neutral/chunk-ICOJ4GMB.mjs.map +7 -0
  17. package/dist/lib/neutral/{chunk-NGX6RXNV.mjs → chunk-PP32NEVY.mjs} +2 -2
  18. package/dist/lib/neutral/chunk-PP32NEVY.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-SONATB35.mjs +20 -0
  20. package/dist/lib/neutral/chunk-SONATB35.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-Z2B5RSVI.mjs +1096 -0
  22. package/dist/lib/neutral/chunk-Z2B5RSVI.mjs.map +7 -0
  23. package/dist/lib/neutral/{close-KJUCFIJ5.mjs → close-2YGB5IIP.mjs} +4 -3
  24. package/dist/lib/neutral/{close-KJUCFIJ5.mjs.map → close-2YGB5IIP.mjs.map} +1 -1
  25. package/dist/lib/neutral/components/index.mjs +201 -16
  26. package/dist/lib/neutral/components/index.mjs.map +4 -4
  27. package/dist/lib/neutral/containers/index.mjs +6 -11
  28. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  29. package/dist/lib/neutral/hooks/index.mjs +101 -17
  30. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  31. package/dist/lib/neutral/index.mjs +7 -1
  32. package/dist/lib/neutral/meta.json +1 -1
  33. package/dist/lib/neutral/{notification-tracker-CUDFRDCF.mjs → notification-tracker-Y5CRTWJM.mjs} +4 -2
  34. package/dist/lib/neutral/notification-tracker-Y5CRTWJM.mjs.map +7 -0
  35. package/dist/lib/neutral/{open-VU7YS3HB.mjs → open-P6XQ56M7.mjs} +4 -3
  36. package/dist/lib/neutral/{open-VU7YS3HB.mjs.map → open-P6XQ56M7.mjs.map} +1 -1
  37. package/dist/lib/neutral/operations/index.mjs +1 -1
  38. package/dist/lib/neutral/plugin.mjs +1 -1
  39. package/dist/lib/neutral/{react-surface-O4POQWYL.mjs → react-surface-H63FXUK3.mjs} +2 -2
  40. package/dist/lib/neutral/{react-surface-O4POQWYL.mjs.map → react-surface-H63FXUK3.mjs.map} +1 -1
  41. package/dist/lib/neutral/{revert-workspace-24TKG3I7.mjs → revert-workspace-RXWP2TEE.mjs} +2 -2
  42. package/dist/lib/neutral/{scroll-into-view-3VXT6TWC.mjs → scroll-into-view-HFV5EGYZ.mjs} +2 -2
  43. package/dist/lib/neutral/{set-RFOLTI57.mjs → set-HOOVB7E4.mjs} +4 -3
  44. package/dist/lib/neutral/{set-RFOLTI57.mjs.map → set-HOOVB7E4.mjs.map} +1 -1
  45. package/dist/lib/neutral/{set-layout-mode-AZ73W52Z.mjs → set-layout-mode-XAGSZZGB.mjs} +2 -2
  46. package/dist/lib/neutral/{state-D3YXB5NP.mjs → state-F4X5GPGZ.mjs} +3 -2
  47. package/dist/lib/neutral/{state-D3YXB5NP.mjs.map → state-F4X5GPGZ.mjs.map} +1 -1
  48. package/dist/lib/neutral/{switch-workspace-TBPT23CZ.mjs → switch-workspace-PA7N6EUX.mjs} +2 -2
  49. package/dist/lib/neutral/translations.mjs +2 -2
  50. package/dist/lib/neutral/translations.mjs.map +2 -2
  51. package/dist/lib/neutral/types/index.mjs +1 -1
  52. package/dist/lib/neutral/{update-companion-5LCY6QME.mjs → update-companion-6A2SKQAI.mjs} +14 -6
  53. package/dist/lib/neutral/update-companion-6A2SKQAI.mjs.map +7 -0
  54. package/dist/lib/neutral/{update-complementary-HZ7QXZYE.mjs → update-complementary-K55I5EV5.mjs} +2 -2
  55. package/dist/lib/neutral/{update-dialog-A7W3R5EI.mjs → update-dialog-Z3GEXMVV.mjs} +2 -2
  56. package/dist/lib/neutral/{update-plank-size-XHTYBLSD.mjs → update-plank-size-BTESVV7N.mjs} +2 -2
  57. package/dist/lib/neutral/{update-popover-RDIHG73B.mjs → update-popover-QEVDSZSH.mjs} +2 -2
  58. package/dist/lib/neutral/{update-sidebar-GEI7USA5.mjs → update-sidebar-VSRCN47U.mjs} +2 -2
  59. package/dist/lib/neutral/{url-handler-PUS4X33T.mjs → url-handler-ERZXXEYR.mjs} +3 -2
  60. package/dist/lib/neutral/{url-handler-PUS4X33T.mjs.map → url-handler-ERZXXEYR.mjs.map} +1 -1
  61. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
  63. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/notification-tracker.d.ts +1 -1
  65. package/dist/types/src/capabilities/notification-tracker.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/react-root.d.ts +1 -5
  67. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  69. package/dist/types/src/capabilities/settings.d.ts +1 -3
  70. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/state.d.ts +1 -187
  72. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/tools.d.ts +1 -1
  74. package/dist/types/src/capabilities/url-handler.d.ts +1 -1
  75. package/dist/types/src/components/Companion/Companion.d.ts +17 -0
  76. package/dist/types/src/components/Companion/Companion.d.ts.map +1 -0
  77. package/dist/types/src/components/Companion/index.d.ts +2 -0
  78. package/dist/types/src/components/Companion/index.d.ts.map +1 -0
  79. package/dist/types/src/components/Matrix/Matrix.d.ts +1 -1
  80. package/dist/types/src/components/Matrix/Matrix.d.ts.map +1 -1
  81. package/dist/types/src/components/Matrix/Matrix.stories.d.ts +2 -2
  82. package/dist/types/src/components/Matrix/Matrix.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/Matrix/index.d.ts +1 -1
  84. package/dist/types/src/components/Matrix/index.d.ts.map +1 -1
  85. package/dist/types/src/components/Pane/Pane.d.ts +45 -0
  86. package/dist/types/src/components/Pane/Pane.d.ts.map +1 -0
  87. package/dist/types/src/components/Pane/Pane.stories.d.ts +7 -0
  88. package/dist/types/src/components/Pane/Pane.stories.d.ts.map +1 -0
  89. package/dist/types/src/components/Pane/index.d.ts +2 -0
  90. package/dist/types/src/components/Pane/index.d.ts.map +1 -0
  91. package/dist/types/src/components/Plank/Plank.d.ts +74 -0
  92. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -0
  93. package/dist/types/src/components/Plank/Plank.stories.d.ts +6 -0
  94. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -0
  95. package/dist/types/src/components/Plank/index.d.ts +2 -0
  96. package/dist/types/src/components/Plank/index.d.ts.map +1 -0
  97. package/dist/types/src/components/index.d.ts +3 -2
  98. package/dist/types/src/components/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/Deck/Deck.d.ts +1 -1
  100. package/dist/types/src/containers/Deck/Deck.d.ts.map +1 -1
  101. package/dist/types/src/containers/Deck/Deck.stories.d.ts +2 -2
  102. package/dist/types/src/containers/Deck/DeckPlank.d.ts +21 -0
  103. package/dist/types/src/containers/Deck/DeckPlank.d.ts.map +1 -0
  104. package/dist/types/src/containers/Deck/DeckViewport.d.ts +3 -1
  105. package/dist/types/src/containers/Deck/DeckViewport.d.ts.map +1 -1
  106. package/dist/types/src/containers/{Plank → Deck}/PlankControls.d.ts +3 -10
  107. package/dist/types/src/containers/Deck/PlankControls.d.ts.map +1 -0
  108. package/dist/types/src/containers/Deck/PlankFallback.d.ts +6 -0
  109. package/dist/types/src/containers/Deck/PlankFallback.d.ts.map +1 -0
  110. package/dist/types/src/containers/Deck/useDeckPlank.d.ts +49 -0
  111. package/dist/types/src/containers/Deck/useDeckPlank.d.ts.map +1 -0
  112. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts +2 -2
  113. package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
  114. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts +1 -1
  115. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
  116. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts +2 -2
  117. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts.map +1 -1
  118. package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
  119. package/dist/types/src/containers/index.d.ts +1 -1
  120. package/dist/types/src/containers/index.d.ts.map +1 -1
  121. package/dist/types/src/hooks/index.d.ts +2 -0
  122. package/dist/types/src/hooks/index.d.ts.map +1 -1
  123. package/dist/types/src/hooks/useCompanionSplit.d.ts +28 -0
  124. package/dist/types/src/hooks/useCompanionSplit.d.ts.map +1 -0
  125. package/dist/types/src/hooks/useCompanions.d.ts +11 -7
  126. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
  127. package/dist/types/src/hooks/useDeckCompanions.d.ts +2 -2
  128. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  129. package/dist/types/src/hooks/useDeckState.d.ts +1 -1
  130. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -1
  131. package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts +6 -0
  132. package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts.map +1 -0
  133. package/dist/types/src/index.d.ts +1 -0
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/meta.d.ts +4 -0
  136. package/dist/types/src/meta.d.ts.map +1 -1
  137. package/dist/types/src/operations/adjust.d.ts.map +1 -1
  138. package/dist/types/src/operations/update-companion.d.ts.map +1 -1
  139. package/dist/types/src/translations.d.ts +2 -2
  140. package/dist/types/src/translations.d.ts.map +1 -1
  141. package/dist/types/src/types/DeckCapabilities.d.ts +2 -2
  142. package/dist/types/src/types/DeckCapabilities.d.ts.map +1 -1
  143. package/dist/types/src/types/DeckOperation.d.ts +2 -2
  144. package/dist/types/src/types/DeckOperation.d.ts.map +1 -1
  145. package/dist/types/src/types/schema.d.ts +7 -7
  146. package/dist/types/src/types/schema.d.ts.map +1 -1
  147. package/dist/types/src/util/companion-view-state.d.ts +16 -0
  148. package/dist/types/src/util/companion-view-state.d.ts.map +1 -0
  149. package/dist/types/src/util/index.d.ts +1 -0
  150. package/dist/types/src/util/index.d.ts.map +1 -1
  151. package/dist/types/src/util/plank-url-params.d.ts +2 -0
  152. package/dist/types/src/util/plank-url-params.d.ts.map +1 -1
  153. package/dist/types/tsconfig.tsbuildinfo +1 -1
  154. package/package.json +49 -47
  155. package/src/DeckPlugin.ts +1 -2
  156. package/src/capabilities/app-graph-builder.ts +3 -2
  157. package/src/capabilities/notification-tracker.ts +3 -1
  158. package/src/capabilities/react-surface.tsx +1 -1
  159. package/src/components/Companion/Companion.tsx +91 -0
  160. package/src/components/Companion/index.ts +5 -0
  161. package/src/components/Matrix/Matrix.stories.tsx +13 -26
  162. package/src/components/Matrix/Matrix.tsx +3 -3
  163. package/src/components/Matrix/SPEC.md +1 -1
  164. package/src/components/Matrix/index.ts +1 -1
  165. package/src/components/Pane/Pane.stories.tsx +92 -0
  166. package/src/components/Pane/Pane.tsx +178 -0
  167. package/src/components/Pane/index.ts +5 -0
  168. package/src/components/Plank/Plank.stories.tsx +103 -0
  169. package/src/components/Plank/Plank.tsx +149 -0
  170. package/src/components/Plank/index.ts +5 -0
  171. package/src/components/index.ts +3 -4
  172. package/src/containers/Deck/Deck.tsx +3 -3
  173. package/src/containers/Deck/DeckPlank.tsx +187 -0
  174. package/src/containers/Deck/DeckViewport.tsx +116 -243
  175. package/src/containers/{Plank → Deck}/PlankControls.tsx +19 -17
  176. package/src/containers/Deck/PlankFallback.tsx +42 -0
  177. package/src/containers/Deck/useDeckPlank.ts +219 -0
  178. package/src/containers/DeckLayout/DeckLayout.stories.tsx +38 -51
  179. package/src/containers/DeckLayout/Dialog.tsx +1 -1
  180. package/src/{components → containers}/DeckSettings/DeckSettings.stories.tsx +1 -1
  181. package/src/containers/DeckSettings/DeckSettings.tsx +42 -0
  182. package/src/containers/Sidebar/ComplementarySidebar.tsx +2 -2
  183. package/src/containers/index.ts +1 -1
  184. package/src/hooks/index.ts +2 -0
  185. package/src/hooks/useCompanionSplit.ts +78 -0
  186. package/src/hooks/useCompanions.ts +39 -7
  187. package/src/hooks/useDeckCompanions.ts +3 -3
  188. package/src/hooks/useDeckState.ts +1 -1
  189. package/src/hooks/useSelectedCompanionVariant.ts +14 -0
  190. package/src/index.ts +7 -0
  191. package/src/operations/adjust.ts +23 -12
  192. package/src/operations/update-companion.ts +10 -6
  193. package/src/translations.ts +2 -2
  194. package/src/types/DeckCapabilities.ts +1 -1
  195. package/src/types/DeckOperation.ts +2 -1
  196. package/src/types/schema.ts +5 -4
  197. package/src/util/companion-view-state.ts +28 -0
  198. package/src/util/index.ts +1 -0
  199. package/src/util/plank-url-params.test.ts +5 -0
  200. package/src/util/plank-url-params.ts +3 -1
  201. package/src/util/sanitize-persisted-state.test.ts +1 -1
  202. package/src/util/set-active.test.ts +1 -1
  203. package/dist/lib/neutral/DeckLayout-VX2BP4Q2.mjs.map +0 -7
  204. package/dist/lib/neutral/DeckSettings-CQQZJ2YS.mjs +0 -27
  205. package/dist/lib/neutral/DeckSettings-CQQZJ2YS.mjs.map +0 -7
  206. package/dist/lib/neutral/adjust-7CZI4GK3.mjs.map +0 -7
  207. package/dist/lib/neutral/app-graph-builder-6HTXRTU2.mjs.map +0 -7
  208. package/dist/lib/neutral/chunk-CL7JIOI5.mjs.map +0 -7
  209. package/dist/lib/neutral/chunk-DNG3L5QN.mjs +0 -1304
  210. package/dist/lib/neutral/chunk-DNG3L5QN.mjs.map +0 -7
  211. package/dist/lib/neutral/chunk-NGX6RXNV.mjs.map +0 -7
  212. package/dist/lib/neutral/chunk-UZLAR4DR.mjs +0 -8
  213. package/dist/lib/neutral/notification-tracker-CUDFRDCF.mjs.map +0 -7
  214. package/dist/lib/neutral/update-companion-5LCY6QME.mjs.map +0 -7
  215. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
  216. package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
  217. package/dist/types/src/containers/Plank/Plank.d.ts +0 -17
  218. package/dist/types/src/containers/Plank/Plank.d.ts.map +0 -1
  219. package/dist/types/src/containers/Plank/Plank.stories.d.ts +0 -67
  220. package/dist/types/src/containers/Plank/Plank.stories.d.ts.map +0 -1
  221. package/dist/types/src/containers/Plank/PlankComponent.d.ts +0 -17
  222. package/dist/types/src/containers/Plank/PlankComponent.d.ts.map +0 -1
  223. package/dist/types/src/containers/Plank/PlankContent.d.ts +0 -10
  224. package/dist/types/src/containers/Plank/PlankContent.d.ts.map +0 -1
  225. package/dist/types/src/containers/Plank/PlankControls.d.ts.map +0 -1
  226. package/dist/types/src/containers/Plank/PlankError.d.ts +0 -15
  227. package/dist/types/src/containers/Plank/PlankError.d.ts.map +0 -1
  228. package/dist/types/src/containers/Plank/PlankHeading.d.ts +0 -22
  229. package/dist/types/src/containers/Plank/PlankHeading.d.ts.map +0 -1
  230. package/dist/types/src/containers/Plank/PlankLoading.d.ts +0 -3
  231. package/dist/types/src/containers/Plank/PlankLoading.d.ts.map +0 -1
  232. package/dist/types/src/containers/Plank/PlankRoot.d.ts +0 -37
  233. package/dist/types/src/containers/Plank/PlankRoot.d.ts.map +0 -1
  234. package/dist/types/src/containers/Plank/index.d.ts +0 -4
  235. package/dist/types/src/containers/Plank/index.d.ts.map +0 -1
  236. package/src/components/DeckSettings/DeckSettings.tsx +0 -34
  237. package/src/containers/Plank/Plank.stories.tsx +0 -108
  238. package/src/containers/Plank/Plank.tsx +0 -22
  239. package/src/containers/Plank/PlankComponent.tsx +0 -223
  240. package/src/containers/Plank/PlankContent.tsx +0 -45
  241. package/src/containers/Plank/PlankError.tsx +0 -82
  242. package/src/containers/Plank/PlankHeading.tsx +0 -236
  243. package/src/containers/Plank/PlankLoading.tsx +0 -10
  244. package/src/containers/Plank/PlankRoot.tsx +0 -49
  245. package/src/containers/Plank/index.ts +0 -7
  246. /package/dist/lib/neutral/{add-toast-APKTCLIA.mjs.map → add-toast-BHNEH5UY.mjs.map} +0 -0
  247. /package/dist/lib/neutral/{chunk-UZLAR4DR.mjs.map → chunk-FKGYHBUB.mjs.map} +0 -0
  248. /package/dist/lib/neutral/{revert-workspace-24TKG3I7.mjs.map → revert-workspace-RXWP2TEE.mjs.map} +0 -0
  249. /package/dist/lib/neutral/{scroll-into-view-3VXT6TWC.mjs.map → scroll-into-view-HFV5EGYZ.mjs.map} +0 -0
  250. /package/dist/lib/neutral/{set-layout-mode-AZ73W52Z.mjs.map → set-layout-mode-XAGSZZGB.mjs.map} +0 -0
  251. /package/dist/lib/neutral/{switch-workspace-TBPT23CZ.mjs.map → switch-workspace-PA7N6EUX.mjs.map} +0 -0
  252. /package/dist/lib/neutral/{update-complementary-HZ7QXZYE.mjs.map → update-complementary-K55I5EV5.mjs.map} +0 -0
  253. /package/dist/lib/neutral/{update-dialog-A7W3R5EI.mjs.map → update-dialog-Z3GEXMVV.mjs.map} +0 -0
  254. /package/dist/lib/neutral/{update-plank-size-XHTYBLSD.mjs.map → update-plank-size-BTESVV7N.mjs.map} +0 -0
  255. /package/dist/lib/neutral/{update-popover-RDIHG73B.mjs.map → update-popover-QEVDSZSH.mjs.map} +0 -0
  256. /package/dist/lib/neutral/{update-sidebar-GEI7USA5.mjs.map → update-sidebar-VSRCN47U.mjs.map} +0 -0
  257. /package/dist/types/src/{components → containers}/DeckSettings/index.d.ts +0 -0
  258. /package/src/{components → containers}/DeckSettings/index.ts +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/Sidebar/SidebarButton.tsx", "../../../src/containers/Sidebar/ComplementarySidebar.tsx", "../../../src/containers/Deck/PlankFallback.tsx", "../../../src/containers/Sidebar/Sidebar.tsx", "../../../src/containers/Deck/DeckContent.tsx", "../../../src/containers/Deck/Banner.tsx", "../../../src/containers/Deck/DeckRoot.tsx", "../../../src/containers/Deck/DeckViewport.tsx", "../../../src/containers/Deck/DeckPlank.tsx", "../../../src/containers/Deck/PlankControls.tsx", "../../../src/containers/Deck/useDeckPlank.ts", "../../../src/containers/Deck/Deck.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { IconButton, type IconButtonProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\n\nimport { useDeckCompanions, useDeckState } from '#hooks';\nimport { meta } from '#meta';\n\nexport const ToggleSidebarButton = ({\n classNames,\n variant = 'ghost',\n}: ThemedClassName<Pick<IconButtonProps, 'variant'>>) => {\n const { updateState } = useDeckState();\n const { t } = useTranslation(meta.profile.key);\n\n const handleClick = useCallback(() => {\n updateState((state) => ({\n ...state,\n sidebarState: state.sidebarState === 'expanded' ? 'collapsed' : 'expanded',\n }));\n }, [updateState]);\n\n return (\n <IconButton\n variant={variant}\n icon='ph--sidebar--regular'\n iconOnly\n size={4}\n label={t('open-navigation-sidebar.label')}\n onClick={handleClick}\n classNames={classNames}\n />\n );\n};\n\nexport const CloseSidebarButton = () => {\n const { updateState } = useDeckState();\n const { t } = useTranslation(meta.profile.key);\n\n const handleClick = useCallback(() => {\n updateState((state) => ({ ...state, sidebarState: 'collapsed' }));\n }, [updateState]);\n\n return (\n <IconButton\n variant='ghost'\n icon='ph--caret-line-left--regular'\n iconOnly\n size={4}\n label={t('close-navigation-sidebar.button')}\n onClick={handleClick}\n classNames='rounded-none px-1 dx-focus-ring-inset pe-[max(.5rem,env(safe-area-inset-left))]'\n />\n );\n};\n\nexport const ToggleComplementarySidebarButton = ({\n inR0,\n classNames,\n current,\n}: ThemedClassName<{ inR0?: boolean; current?: string }>) => {\n const { invokePromise } = useOperationInvoker();\n const { state, updateState } = useDeckState();\n const { t } = useTranslation(meta.profile.key);\n\n const companions = useDeckCompanions();\n const handleClick = useCallback(() => {\n const nextState = state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded';\n updateState((state) => ({ ...state, complementarySidebarState: nextState }));\n\n const subject = state.complementarySidebarPanel ?? (companions[0] && getLinkedVariant(companions[0].id));\n if (nextState === 'expanded' && !current && subject) {\n void invokePromise(LayoutOperation.UpdateComplementary, { subject });\n }\n }, [state, updateState, current, companions, invokePromise]);\n\n const label = t(\n state.complementarySidebarState === 'expanded'\n ? 'close-complementary-sidebar.label'\n : 'open-complementary-sidebar.label',\n );\n\n return (\n <IconButton\n variant='ghost'\n classNames={['[&>svg]:-scale-x-100', classNames]}\n icon='ph--sidebar-simple--regular'\n iconOnly\n label={label}\n tooltipSide={inR0 ? 'left' : undefined}\n onClick={handleClick}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type MouseEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { IconButton, type Label, Main, Panel, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { iconSize, mx } from '@dxos/ui-theme';\n\nimport { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState } from '#hooks';\nimport { meta } from '#meta';\nimport { getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport { PlankErrorFallback, PlankLoading } from '../Deck/PlankFallback';\nimport { ToggleComplementarySidebarButton } from './SidebarButton';\n\nconst label = ['complementary-sidebar.title', { ns: meta.profile.key }] satisfies Label;\n\nexport type ComplementarySidebarProps = {\n current?: string;\n};\n\nexport const ComplementarySidebar = ({ current }: ComplementarySidebarProps) => {\n const { invokePromise } = useOperationInvoker();\n const { t } = useTranslation(meta.profile.key);\n const { state, deck, updateState } = useDeckState();\n const layoutMode = getMode(deck);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n const companions = useDeckCompanions();\n const activeCompanion = companions.find((companion) => getLinkedVariant(companion.id) === current);\n const activeId = activeCompanion && getLinkedVariant(activeCompanion.id);\n const [internalValue, setInternalValue] = useState(activeId);\n\n useEffect(() => {\n setInternalValue(activeId);\n }, [activeId]);\n\n const handleTabClick = useCallback(\n (event: MouseEvent) => {\n const nextValue = event.currentTarget.getAttribute('data-value') as string;\n if (nextValue === activeId) {\n updateState((state) => ({\n ...state,\n complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',\n }));\n } else {\n setInternalValue(nextValue);\n updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));\n void invokePromise(LayoutOperation.UpdateComplementary, { subject: nextValue });\n }\n },\n [state.complementarySidebarState, activeId, invokePromise, updateState],\n );\n\n const data = useMemo(\n () =>\n activeCompanion && {\n id: activeCompanion.id,\n subject: activeCompanion.data,\n },\n [activeCompanion?.id, activeCompanion?.data],\n );\n\n useEffect(() => {\n if (!activeId) {\n void invokePromise(LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n }\n }, [activeId, invokePromise]);\n\n return (\n <Main.ComplementarySidebar\n label={label}\n classNames={[topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]']}\n >\n {/* R0 Tabs */}\n <Tabs.Root classNames='contents' orientation='vertical' value={internalValue}>\n <div\n data-tauri-drag-region\n style={iconSize(5)}\n className={mx(\n 'absolute z-1 inset-y-0 end-0 w-(--dx-r0-size)!',\n 'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',\n 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-r0-surface dx-contain-layout dx-app-drag',\n )}\n >\n <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) overflow-y-auto scrollbar-none gap-1 p-1'>\n {companions.map((companion) => (\n <Tabs.Tab key={getLinkedVariant(companion.id)} value={getLinkedVariant(companion.id)} asChild>\n <IconButton\n classNames='w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0'\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getLinkedVariant(companion.id)}\n {...(companion.properties.joyride && { 'data-joyride': companion.properties.joyride })}\n variant={\n activeId === getLinkedVariant(companion.id)\n ? state.complementarySidebarState === 'expanded'\n ? 'primary'\n : 'ghost'\n : 'ghost'\n }\n onClick={handleTabClick}\n />\n </Tabs.Tab>\n ))}\n </Tabs.Tablist>\n <div\n className='grid grid-cols-1 auto-rows-(--dx-rail-item) py-0.5 gap-0.5 overflow-y-auto scrollbar-none'\n style={iconSize(4)}\n >\n <Surface.Surface type={AppSurface.StatusIndicator} />\n </div>\n <div className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>\n <ToggleComplementarySidebarButton />\n </div>\n </div>\n\n {/* R1 Content. */}\n {activeId &&\n companions.map((companion) => (\n <Tabs.Panel\n key={getLinkedVariant(companion.id)}\n value={getLinkedVariant(companion.id)}\n classNames={[\n 'absolute data-[state=\"inactive\"]:-z-[1] overflow-hidden',\n 'inset-y-0 start-0 w-full lg:w-(--dx-r1-size)',\n ]}\n {...(state.complementarySidebarState !== 'expanded' && { inert: true })}\n >\n <ComplementarySidebarPanel companion={companion} activeId={activeId} data={data} />\n </Tabs.Panel>\n ))}\n </Tabs.Root>\n </Main.ComplementarySidebar>\n );\n};\n\ntype ComplementarySidebarPanelProps = {\n companion: DeckCompanion;\n activeId: string;\n data?: {\n id: string;\n subject: any;\n };\n};\n\nconst ComplementarySidebarPanel = ({ companion, activeId, data }: ComplementarySidebarPanelProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n if (getLinkedVariant(companion.id) !== activeId && !data) {\n return null;\n }\n\n return (\n <Panel.Root>\n <Panel.Toolbar asChild size='lg'>\n <Toolbar.Root style={iconSize(5)} classNames='bg-header-surface'>\n <IconButton\n classNames='w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0'\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getLinkedVariant(companion.id)}\n variant='default'\n />\n <div className='px-1'>{toLocalizedString(companion.properties.label, t)}</div>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content classNames='bg-r1-surface'>\n <Surface.Surface\n type={AppSurface.deckCompanion(getLinkedVariant(companion.id))}\n data={data}\n fallback={PlankErrorFallback}\n placeholder={<PlankLoading />}\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { log } from '@dxos/log';\nimport { ErrorFallback, type ErrorFallbackProps, useTranslation } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\n// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259\nexport const PlankLoading = () => <div className='grid place-items-center dx-attention-surface' />;\n\n/** User-facing error fallback for a plank's content Surface. */\nexport const PlankErrorFallback = ({ error }: ErrorFallbackProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n useEffect(() => {\n if (error) {\n log.error('plank error', { error });\n }\n }, [error]);\n\n if (process.env.NODE_ENV === 'development') {\n return <ErrorFallback title='Plank Error' error={error} />;\n }\n\n // Show only a generic message to end users; raw error details stay in logs / the dev fallback above.\n return (\n <div\n role='alert'\n data-testid='plank-content-error'\n className='dx-attention-surface overflow-y-auto p-8 grid place-items-center'\n >\n <div className='flex flex-col items-center gap-2'>\n <p className={mx(descriptionMessage, 'break-all rounded-md p-4')}>{t('error-fallback.message')}</p>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Label, Main } from '@dxos/react-ui';\n\nimport { useBreakpoints, useDeckState } from '#hooks';\nimport { meta } from '#meta';\nimport { getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\n\nconst label = ['sidebar.title', { ns: meta.profile.key }] satisfies Label;\n\nexport const Sidebar = () => {\n const { state, deck } = useDeckState();\n const { popoverAnchorId, activeDeck: current } = state;\n const breakpoint = useBreakpoints();\n const layoutMode = getMode(deck);\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n const navigationData = useMemo<AppSurface.NavigationData<{ topbar: boolean }>>(\n () => ({ popoverAnchorId, topbar, current }),\n [popoverAnchorId, topbar, current],\n );\n\n return (\n <Main.NavigationSidebar\n label={label}\n classNames={['grid', topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]']}\n >\n <Surface.Surface type={AppSurface.Navigation} data={navigationData} limit={1} />\n </Main.NavigationSidebar>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useCallback, useEffect, useRef } from 'react';\n\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { Main, useMediaQuery } from '@dxos/react-ui';\n\nimport { useBreakpoints } from '#hooks';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport { ComplementarySidebar, Sidebar } from '../Sidebar';\nimport { Banner } from './Banner';\nimport { useDeckContext } from './DeckRoot';\n\nconst DECK_CONTENT_NAME = 'DeckContent';\n\nexport type DeckContentProps = PropsWithChildren;\n\nexport const DeckContent = ({ children }: DeckContentProps) => {\n const {\n state: { sidebarState, complementarySidebarState, complementarySidebarPanel },\n deck: { active, fullscreen, solo },\n updateState,\n layoutMode,\n settings,\n pluginManager,\n onLayoutChange,\n } = useDeckContext(DECK_CONTENT_NAME);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n // Ensure the first plank is attended when the deck is first rendered.\n useEffect(() => {\n // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.\n const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);\n const attended = attention.getCurrent();\n const firstId = solo ?? active[0];\n if (attended.length === 0 && firstId) {\n // TODO(wittjosiah): Focusing the type button is a workaround.\n // If the plank is directly focused on first load the focus ring appears.\n document.querySelector<HTMLElement>(`article[data-attendable-id=\"${firstId}\"] button`)?.focus();\n }\n }, []);\n\n // Not using `breakpoint` to avoid firing when breakpoint changes between tablet and desktop.\n // `ssr: false` to avoid using fallback values and flashing into solo mode on startup.\n const [isNotMobile] = useMediaQuery('md');\n const shouldRevert = useRef(false);\n useEffect(() => {\n if (!isNotMobile && layoutMode === 'multi') {\n // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.\n const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);\n const attended = attention.getCurrent();\n shouldRevert.current = true;\n onLayoutChange({ subject: attended[0], mode: 'solo' });\n } else if (isNotMobile && layoutMode === 'solo' && shouldRevert.current) {\n onLayoutChange({ revert: true });\n }\n // NOTE: Using `layoutMode` instead of `deck` to avoid infinite loops caused by object reference changes.\n }, [isNotMobile, layoutMode, onLayoutChange]);\n\n // When deck is disabled in settings, set to solo mode if the current layout mode is deck.\n // TODO(thure): Applying this as an effect should be avoided over emitting the operation only when the setting changes.\n useEffect(() => {\n if (!settings?.enableDeck && layoutMode === 'multi') {\n onLayoutChange({ subject: active[0], mode: 'solo' });\n }\n }, [settings?.enableDeck, onLayoutChange, active, layoutMode]);\n\n const handleNavigationSidebarStateChange = useCallback(\n (next: typeof sidebarState) => {\n updateState((s) => ({ ...s, sidebarState: next }));\n },\n [updateState],\n );\n\n const handleComplementarySidebarStateChange = useCallback(\n (next: typeof complementarySidebarState) => {\n updateState((s) => ({ ...s, complementarySidebarState: next }));\n },\n [updateState],\n );\n\n return (\n <Main.Root\n navigationSidebarState={fullscreen ? 'closed' : sidebarState}\n complementarySidebarState={fullscreen ? 'closed' : complementarySidebarState}\n onNavigationSidebarStateChange={handleNavigationSidebarStateChange}\n onComplementarySidebarStateChange={handleComplementarySidebarStateChange}\n >\n <Sidebar />\n <ComplementarySidebar current={complementarySidebarPanel} />\n <Main.Overlay />\n {children}\n {topbar && <Banner variant='topbar' />}\n </Main.Root>\n );\n};\n\nDeckContent.displayName = DECK_CONTENT_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { VersionInfo } from '#types';\n\nimport { CloseSidebarButton, ToggleSidebarButton } from '../Sidebar';\n\nexport const Banner = ({ variant, classNames }: ThemedClassName<{ variant?: 'topbar' | 'sidebar' }>) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <header\n className={mx(\n 'flex items-stretch relative py-1 ps-1 pe-2',\n variant === 'topbar' &&\n 'fixed inset-x-0 top-[env(safe-area-inset-top)] h-(--dx-rail-size) border-b border-separator',\n classNames,\n )}\n >\n {variant === 'sidebar' ? <CloseSidebarButton /> : <ToggleSidebarButton />}\n <span className='self-center grow ms-1'>{t('current-app.name', { ns: osTranslations })}</span>\n {variant === 'topbar' && (\n <div className='absolute inset-0 pointer-events-none'>\n <div className='grid h-full pointer-fine:p-1 max-w-md mx-auto pointer-events-auto'>\n <Surface.Surface type={AppSurface.SearchInput} limit={1} />\n </div>\n </div>\n )}\n <span className='grow' />\n <Surface.Surface type={VersionInfo} limit={1} />\n </header>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { PropsWithChildren } from 'react';\n\nimport { type PluginManager } from '@dxos/app-framework';\n\nimport { type LayoutMode, type Settings } from '#types';\n\nimport { type DeckStateHook } from '../../hooks/useDeckState';\n\nconst DECK_NAME = 'Deck';\nconst DECK_ROOT_NAME = 'DeckRoot';\n\n/** Request to change the layout mode. */\nexport type DeckLayoutChangeRequest = { subject?: string; mode: LayoutMode } | { revert: true };\n\n//\n// Context\n//\n\nexport type DeckContextValue = {\n /** Deck plugin settings. */\n settings?: Settings.Settings;\n /** Plugin manager for capability access. */\n pluginManager: PluginManager.PluginManager;\n /** Layout mode. */\n layoutMode: LayoutMode;\n /** Callback for layout mode changes. */\n onLayoutChange: (request: DeckLayoutChangeRequest) => void;\n} & Pick<DeckStateHook, 'state' | 'deck' | 'updateState'>;\n\nexport const [DeckProvider, useDeckContext] = createContext<DeckContextValue>(DECK_NAME);\n\n//\n// Root\n//\n\nexport type DeckRootProps = PropsWithChildren<DeckContextValue>;\n\n/**\n * Headless root that provides Deck context.\n */\nexport const DeckRoot = ({ children, ...context }: DeckRootProps) => {\n return <DeckProvider {...context}>{children}</DeckProvider>;\n};\n\nDeckRoot.displayName = DECK_ROOT_NAME;\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useCallback, useEffect, useRef } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { addEventListener } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { IconButton, Main, type MainContentProps, ScrollArea, useOnTransition, useTranslation } from '@dxos/react-ui';\nimport { mainIntrinsicSize, mainPaddingTransitions } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent, type MosaicTileProps } from '@dxos/react-ui-mosaic';\nimport { hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useBreakpoints, useDeckState } from '#hooks';\nimport { meta } from '#meta';\nimport { DeckOperation, Keyshortcuts, getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport {\n ToggleComplementarySidebarButton as NaturalToggleComplementarySidebarButton,\n ToggleSidebarButton as NaturalToggleSidebarButton,\n} from '../Sidebar';\nimport { DeckPlank } from './DeckPlank';\nimport { useDeckContext } from './DeckRoot';\n\nconst DECK_VIEWPORT_NAME = 'DeckViewport';\n\n// Multi-mode plank extents (rem); each plank persists its own width via `plankSizing`.\nconst DEFAULT_PLANK_SIZE = 50;\nconst MIN_PLANK_SIZE = 20;\nconst MAX_PLANK_SIZE = 120;\n\n//\n// DeckViewport\n//\n\nexport type DeckViewportProps = PropsWithChildren;\n\n/**\n * Deck viewport that renders the main content area and sets CSS variables for sidebar widths.\n */\nexport const DeckViewport = ({ children }: DeckViewportProps) => {\n const {\n state: { sidebarState, complementarySidebarState },\n settings,\n layoutMode,\n } = useDeckContext(DECK_VIEWPORT_NAME);\n\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n return (\n <Main.Content\n bounce\n handlesFocus\n classNames={[\n 'grid top-[env(safe-area-inset-top)]!',\n topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]!',\n ]}\n style={\n {\n '--main-spacing': settings?.encapsulatedPlanks ? '0.75rem' : '0',\n '--main-sidebar-width':\n sidebarState === 'expanded'\n ? 'var(--dx-nav-sidebar-size)'\n : sidebarState === 'collapsed'\n ? 'var(--dx-l0-size)'\n : '0',\n '--main-complementary-width':\n complementarySidebarState === 'expanded'\n ? 'var(--dx-complementary-sidebar-size)'\n : complementarySidebarState === 'collapsed'\n ? 'var(--dx-rail-size)'\n : '0',\n } as MainContentProps['style']\n }\n >\n {children}\n </Main.Content>\n );\n};\n\nDeckViewport.displayName = DECK_VIEWPORT_NAME;\n\n//\n// ContentEmpty\n//\n\nexport const DeckContentEmpty = () => {\n const breakpoint = useBreakpoints();\n const { deck } = useDeckState();\n const layoutMode = getMode(deck);\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n return (\n <div className='grid place-items-center p-8 relative bg-deck-surface' data-testid='layoutPlugin.firstRunMessage'>\n <Surface.Surface type={Keyshortcuts} />\n {!topbar && <ToggleSidebarButton />}\n </div>\n );\n};\n\n//\n// DeckSoloMode\n//\n\n/**\n * Single-plank layout with optional companion.\n */\nexport const DeckSoloMode = () => {\n const { deck, settings, layoutMode, onLayoutChange } = useDeckContext('DeckSoloMode');\n const { companionOpen, fullscreen, solo } = deck;\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n invariant(solo);\n\n useEffect(() => {\n if (!fullscreen) {\n return;\n }\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onLayoutChange({ mode: 'solo--fullscreen' });\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [fullscreen, onLayoutChange]);\n\n return (\n <div className='relative overflow-hidden bg-deck-surface'>\n <DeckSidebarToggles topbar={topbar} fullscreen={fullscreen} />\n {fullscreen && <ExitFullscreenButton onExit={() => onLayoutChange({ mode: 'solo--fullscreen' })} />}\n <DeckPlank\n id={solo}\n part='solo'\n layoutMode={layoutMode}\n companionShown={!fullscreen && companionOpen}\n settings={settings}\n classNames={mx('absolute inset-0', mainIntrinsicSize)}\n />\n </div>\n );\n};\n\n//\n// DeckMultiMode\n//\n\nconst getPlankId = (id: string) => id;\n\n/**\n * Tile wrapping a {@link DeckPlank} in a resizable {@link Mosaic.Tile}; the committed width persists via\n * `plankSizing`. Reads the deck context directly since the Mosaic stack renders tiles by id.\n */\nconst DeckPlankTile: MosaicStackTileComponent<string> = (props) => {\n const id = props.data;\n const { deck, settings, layoutMode } = useDeckContext('DeckPlankTile');\n const { invokePromise } = useOperationInvoker();\n\n const handleSizeChange = useCallback<NonNullable<MosaicTileProps['onSizeChange']>>(\n (size) => {\n if (typeof size === 'number') {\n void invokePromise(DeckOperation.UpdatePlankSize, { id, size: Math.round(size) });\n }\n },\n [invokePromise, id],\n );\n\n return (\n <Mosaic.Tile\n {...props}\n classNames='relative h-full'\n size={deck.plankSizing[id] ?? DEFAULT_PLANK_SIZE}\n minSize={MIN_PLANK_SIZE}\n maxSize={MAX_PLANK_SIZE}\n onSizeChange={handleSizeChange}\n >\n <DeckPlank\n id={id}\n part='multi'\n layoutMode={layoutMode}\n active={deck.active}\n companionShown={deck.companionOpen}\n settings={settings}\n classNames='size-full'\n />\n <Mosaic.ResizeHandle />\n </Mosaic.Tile>\n );\n};\n\n/**\n * Multi-plank horizontal scrolling layout. Planks are resizable {@link Mosaic.Tile}s in a horizontal\n * {@link Mosaic.Stack}; the scroll position is preserved across solo↔multi transitions and the\n * just-navigated plank is scrolled into view.\n */\nexport const DeckMultiMode = () => {\n const { deck, layoutMode } = useDeckContext('DeckMultiMode');\n const { active, fullscreen } = deck;\n const { state } = useDeckState();\n const { invokePromise } = useOperationInvoker();\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n const viewportRef = useRef<HTMLDivElement>(null);\n\n // Preserve horizontal scroll position across solo↔multi transitions; a window resize invalidates it.\n const scrollLeftRef = useRef<number | null>(null);\n useEffect(\n () =>\n addEventListener(window, 'resize', () => {\n scrollLeftRef.current = null;\n }),\n [],\n );\n const restoreScroll = useCallback(() => {\n if (viewportRef.current && scrollLeftRef.current != null) {\n viewportRef.current.scrollLeft = scrollLeftRef.current;\n }\n }, []);\n useOnTransition(layoutMode, (mode) => mode !== 'multi', 'multi', restoreScroll);\n // Save scroll position as the user scrolls (ScrollArea.Viewport does not forward `onScroll`).\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) {\n return;\n }\n return addEventListener(viewport, 'scroll', () => {\n scrollLeftRef.current = viewport.scrollLeft;\n });\n }, []);\n\n // Scroll the just-navigated plank into view, then clear the one-shot flag.\n useEffect(() => {\n const id = state.scrollIntoView;\n const viewport = viewportRef.current;\n if (!id || !viewport) {\n return;\n }\n\n const tile = viewport.querySelector<HTMLElement>(`[data-object-id=\"${CSS.escape(id)}\"]`);\n if (tile) {\n const offset = tile.getBoundingClientRect().left - viewport.getBoundingClientRect().left + viewport.scrollLeft;\n viewport.scrollTo({ left: offset, behavior: 'smooth' });\n }\n void invokePromise(LayoutOperation.ScrollIntoView, { subject: undefined });\n }, [state.scrollIntoView, invokePromise]);\n\n return (\n <div className='relative bg-deck-surface overflow-hidden'>\n <DeckSidebarToggles topbar={topbar} fullscreen={fullscreen} />\n <Mosaic.Root>\n <Mosaic.Container orientation='horizontal' classNames={['absolute inset-0', mainPaddingTransitions]}>\n <ScrollArea.Root orientation='horizontal' classNames='size-full'>\n <ScrollArea.Viewport ref={viewportRef}>\n <Mosaic.Stack\n orientation='horizontal'\n classNames='h-full gap-(--main-spacing) px-(--main-spacing)'\n getId={getPlankId}\n items={active}\n Tile={DeckPlankTile}\n draggable={false}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </Mosaic.Root>\n </div>\n );\n};\n\n//\n// SidebarToggles\n//\n\nconst sidebarToggleStyles = 'h-(--dx-rail-item) w-(--dx-rail-item) absolute bottom-2 z-[1] bg-deck-surface! lg:hidden';\n\nconst ToggleSidebarButton = () => <NaturalToggleSidebarButton classNames={mx(sidebarToggleStyles, 'left-2')} />;\nconst ToggleComplementarySidebarButton = () => (\n <NaturalToggleComplementarySidebarButton classNames={mx(sidebarToggleStyles, 'right-2')} />\n);\n\nconst ExitFullscreenButton = ({ onExit }: { onExit: () => void }) => {\n const { t } = useTranslation(meta.profile.key);\n return (\n <div\n className={mx(\n 'fixed top-2 right-2 z-[1]',\n hoverableControls,\n hoverableFocusedWithinControls,\n 'transition-opacity opacity-(--controls-opacity)',\n )}\n >\n <IconButton\n label={t('exit-fullscreen.label')}\n icon='ph--corners-in--regular'\n iconOnly\n variant='ghost'\n tooltipSide='bottom'\n onClick={onExit}\n />\n </div>\n );\n};\n\nconst DeckSidebarToggles = ({ topbar, fullscreen }: { topbar: boolean; fullscreen: boolean }) => {\n if (topbar || fullscreen) {\n return null;\n }\n\n return (\n <>\n <ToggleSidebarButton />\n <ToggleComplementarySidebarButton />\n </>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport React, { type KeyboardEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Splitter, type ThemedClassName } from '@dxos/react-ui';\n\nimport { Companion, Plank } from '#components';\nimport { useCompanionSplit } from '#hooks';\nimport { type LayoutMode, type ResolvedPart, type Settings } from '#types';\n\nimport { PlankCompanionControls, PlankControls } from './PlankControls';\nimport { PlankErrorFallback, PlankLoading } from './PlankFallback';\nimport { useDeckPlank } from './useDeckPlank';\n\nconst PLANK_LOADING = <PlankLoading />;\n\nexport type DeckPlankProps = ThemedClassName<{\n id: string;\n part: ResolvedPart;\n layoutMode: LayoutMode;\n active?: string[];\n /** Whether the companion pane should be shown for this plank (gated further by attention in multi-mode). */\n companionShown?: boolean;\n settings?: Settings.Settings;\n path?: string[];\n}>;\n\n/**\n * Connected deck plank: resolves the node, companions, actions and operation handlers via\n * {@link useDeckPlank} and renders the presentational {@link Plank} — wrapped in a {@link Splitter}\n * beside a {@link Companion} when a companion is open. Replaces the legacy\n * `PlankContainer`/`PlankComponent`/`PlankHeading` tree.\n */\nexport const DeckPlank = memo(\n ({ id, part, layoutMode, active, companionShown, settings, path, classNames }: DeckPlankProps) => {\n const { findFirstFocusable } = useFocusFinders();\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n node,\n companions,\n resolvedCompanionId,\n hasCompanion,\n companionOrientation,\n capabilities,\n sigilActions,\n popoverAnchorId,\n scrollIntoView,\n onAction,\n onAdjust,\n onScrollIntoView,\n onUpdateCompanion,\n } = useDeckPlank({ id, part, layoutMode, active, companionShown, deckEnabled: settings?.enableDeck });\n\n // Memoize the split point per orientation so toggling side-by-side ↔ stacked restores each one.\n const { size: companionSize, onSizeChange: onCompanionSizeChange } = useCompanionSplit(companionOrientation);\n\n // Newly opened/navigated planks are flagged via `scrollIntoView`; focus the pane so it gains\n // attention, then clear the one-shot flag.\n useEffect(() => {\n if (scrollIntoView === id) {\n rootRef.current?.focus();\n onScrollIntoView(undefined);\n }\n }, [scrollIntoView, id, onScrollIntoView]);\n\n // Tabster's focus group should move focus to Main on Escape, but something blocks it; handle directly.\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n switch (event.key) {\n case 'Escape':\n event.currentTarget.closest('main')?.focus();\n break;\n case 'Enter':\n findFirstFocusable(event.currentTarget)?.focus();\n break;\n }\n }\n },\n [findFirstFocusable],\n );\n\n // Stable reference so Plank's useMemo on articleData doesn't bust every render.\n const articleData = useMemo(() => ({ path }), [path]);\n\n // Keep the companion panel mounted for 250ms after hasCompanion goes false so the Splitter's\n // CSS transition can complete before the subtree is removed from the DOM.\n const [companionMounted, setCompanionMounted] = useState(hasCompanion);\n useEffect(() => {\n if (hasCompanion) {\n setCompanionMounted(true);\n return;\n }\n const timer = setTimeout(() => setCompanionMounted(false), 250);\n return () => clearTimeout(timer);\n }, [hasCompanion]);\n\n const companionControls = useMemo(() => <PlankCompanionControls primary={id} />, [id]);\n\n if (!node) {\n return PLANK_LOADING;\n }\n\n const controls = (\n <PlankControls\n capabilities={capabilities}\n layoutMode={layoutMode}\n close={part === 'complementary' ? 'minify-end' : true}\n onClick={onAdjust}\n />\n );\n\n const navbarEnd =\n part !== 'complementary' ? (\n <Surface.Surface type={AppSurface.NavbarEnd} data={{ subject: node.data } satisfies AppSurface.NavbarEndData} />\n ) : undefined;\n\n const sigilFooter = (\n <Surface.Surface type={AppSurface.MenuFooter} data={{ subject: node.data } satisfies AppSurface.MenuFooterData} />\n );\n\n // In fullscreen the toolbar is hidden so the content fills the viewport.\n const headless = layoutMode === 'solo--fullscreen';\n\n // Splitter.Root is always the outer element so <Plank> stays at the same tree position regardless of\n // whether the companion is open. A root-element-type change (Plank ↔ Splitter.Root) would force React\n // to unmount and remount the entire subtree on every companion toggle, resetting article state.\n //\n // `mode` drives the animated open/close: switching between 'split' and 'start' triggers the Splitter's\n // built-in 250ms CSS transition. `companionMounted` trails `hasCompanion` by 250ms on close so the\n // panel stays in the DOM long enough for the collapse animation to finish before being unmounted.\n return (\n <Splitter.Root\n orientation={companionOrientation}\n anchor='end'\n mode={hasCompanion ? 'split' : 'start'}\n resizable={hasCompanion}\n size={companionSize}\n minSize={20}\n onSizeChange={onCompanionSizeChange}\n classNames={classNames}\n >\n <Splitter.Panel position='start'>\n <Plank\n ref={rootRef}\n node={node}\n attendableId={id}\n related={part === 'complementary'}\n actions={sigilActions}\n onAction={onAction}\n popoverAnchorId={popoverAnchorId}\n articleData={articleData}\n controls={controls}\n navbarEnd={navbarEnd}\n sigilFooter={sigilFooter}\n fallback={PlankErrorFallback}\n placeholder={PLANK_LOADING}\n headless={headless}\n onKeyDown={handleKeyDown}\n />\n </Splitter.Panel>\n {companionMounted && (\n <>\n <Splitter.Handle />\n <Splitter.Panel position='end'>\n <Companion\n companions={companions}\n value={resolvedCompanionId}\n onValueChange={onUpdateCompanion}\n attendableId={id}\n companionTo={node.data}\n controls={companionControls}\n />\n </Splitter.Panel>\n </>\n )}\n </Splitter.Root>\n );\n },\n);\n\nDeckPlank.displayName = 'DeckPlank';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { ButtonGroup, type ButtonGroupProps, type ButtonProps, IconButton, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\nimport { type DeckOperation, type LayoutMode } from '#types';\n\nimport { type PlankCapabilities } from './useDeckPlank';\n\nexport type PlankControlHandler = (event: DeckOperation.PartAdjustment) => void;\n\n//\n// Controls\n//\n\nconst plankControlSpacing = 'px-2';\n\nexport type PlankCompanionControlsProps = {\n primary?: string;\n};\n\nexport const PlankCompanionControls = forwardRef<HTMLDivElement, PlankCompanionControlsProps>(\n ({ primary }, forwardedRef) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const handleCloseCompanion = useCallback(() => {\n return invokePromise(LayoutOperation.UpdateCompanion, { subject: null });\n }, [invokePromise]);\n return (\n <div ref={forwardedRef} className='contents dx-app-no-drag'>\n <PlankControl\n label={t('close-companion.label')}\n variant='ghost'\n icon='ph--x--regular'\n onClick={handleCloseCompanion}\n classNames={plankControlSpacing}\n />\n </div>\n );\n },\n);\n\nconst PlankControl = ({ icon, label, ...props }: Omit<ButtonProps, 'children'> & { label: string; icon: string }) => {\n return <IconButton label={label} icon={icon} iconOnly variant='ghost' tooltipSide='bottom' {...props} />;\n};\n\n//\n// PlankControls\n//\n\nexport type PlankControlsProps = Omit<ButtonGroupProps, 'onClick'> & {\n onClick?: PlankControlHandler;\n variant?: 'hide-disabled' | 'default';\n close?: boolean | 'minify-start' | 'minify-end';\n capabilities: PlankCapabilities;\n layoutMode?: LayoutMode;\n pin?: 'start' | 'end' | 'both';\n};\n\n// TODO(wittjosiah): Duplicate of stack LayoutControls?\n// Translations were to be duplicated between packages.\n// NOTE(thure): Pinning & unpinning are disabled indefinitely.\nexport const PlankControls = forwardRef<HTMLDivElement, PlankControlsProps>(\n (\n { children, classNames, variant = 'default', capabilities, layoutMode, pin, close = false, onClick, ...props },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.profile.key);\n const buttonClassNames =\n variant === 'hide-disabled' ? `disabled:hidden ${plankControlSpacing}` : plankControlSpacing;\n\n const layoutIsAnySolo = !!layoutMode?.startsWith('solo');\n\n return (\n <ButtonGroup {...props} classNames={['dx-app-no-drag opacity-100!', classNames]} ref={forwardedRef}>\n {capabilities.deck ? (\n <>\n {capabilities.solo && (\n <>\n {layoutMode === 'solo' && (\n <PlankControl\n label={t('show-fullscreen-plank.label')}\n classNames={buttonClassNames}\n icon='ph--corners-out--regular'\n onClick={() => onClick?.('solo--fullscreen')}\n />\n )}\n <PlankControl\n label={t(\n layoutMode === 'solo--fullscreen'\n ? 'exit-fullscreen.label'\n : layoutIsAnySolo\n ? 'show-deck-plank.label'\n : 'show-solo-plank.label',\n )}\n classNames={buttonClassNames}\n icon={\n layoutMode === 'solo--fullscreen'\n ? 'ph--corners-in--regular'\n : layoutIsAnySolo\n ? 'ph--arrows-in-line-horizontal--regular'\n : 'ph--arrows-out-line-horizontal--regular'\n }\n onClick={() => onClick?.(layoutMode === 'solo--fullscreen' ? 'solo--fullscreen' : 'solo')}\n />\n </>\n )}\n\n {!layoutIsAnySolo && layoutMode !== 'multi' && (\n <>\n <PlankControl\n label={t('increment-start.label')}\n disabled={!capabilities.incrementStart}\n classNames={buttonClassNames}\n icon='ph--caret-left--regular'\n onClick={() => onClick?.('increment-start')}\n />\n <PlankControl\n label={t('increment-end.label')}\n disabled={!capabilities.incrementEnd}\n classNames={buttonClassNames}\n icon='ph--caret-right--regular'\n onClick={() => onClick?.('increment-end')}\n />\n </>\n )}\n </>\n ) : (\n capabilities.fullscreen && (\n <PlankControl\n label={t(layoutMode === 'solo--fullscreen' ? 'exit-fullscreen.label' : 'show-fullscreen-plank.label')}\n classNames={buttonClassNames}\n icon={layoutMode === 'solo--fullscreen' ? 'ph--corners-in--regular' : 'ph--corners-out--regular'}\n onClick={() => onClick?.('solo--fullscreen')}\n />\n )\n )}\n\n {close && !layoutIsAnySolo && (\n <PlankControl\n label={t(`${typeof close === 'string' ? 'minify' : 'close'}.label`)}\n classNames={buttonClassNames}\n data-testid='plankHeading.close'\n icon={\n close === 'minify-start'\n ? 'ph--caret-line-left--regular'\n : close === 'minify-end'\n ? 'ph--caret-line-right--regular'\n : 'ph--x--regular'\n }\n onClick={() => onClick?.('close')}\n />\n )}\n\n {capabilities.companion && (\n <ButtonGroup>\n <PlankControl\n label={t('open-companion.label')}\n classNames={buttonClassNames}\n data-testid='plankHeading.companion'\n icon='ph--square-split-horizontal--regular'\n onClick={() => onClick?.('companion')}\n />\n <PlankControl\n label={t('open-companion-vertical.label')}\n classNames={buttonClassNames}\n data-testid='plankHeading.companion-vertical'\n icon='ph--square-split-vertical--regular'\n onClick={() => onClick?.('companion-vertical')}\n />\n </ButtonGroup>\n )}\n {children}\n </ButtonGroup>\n );\n },\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { type AttentionSigilAction } from '@dxos/app-toolkit/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Graph, type Node, useActionRunner, useActions, useNode } from '@dxos/plugin-graph';\nimport { getLinkedVariant, useAttention } from '@dxos/react-ui-attention';\n\nimport { useBreakpoints, useCompanions, useDeckState, useSelectedCompanion, useSelectedCompanionVariant } from '#hooks';\nimport { meta } from '#meta';\nimport { DeckOperation, type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '#types';\n\n/** Sigil-menu dispositions surfaced as plank actions. */\nconst PLANK_ACTION_DISPOSITIONS = ['list-item', 'list-item-primary', 'heading-list-item'];\n\n/** Capability flags that gate the plank toolbar controls. */\nexport type PlankCapabilities = {\n deck?: boolean;\n solo?: boolean;\n incrementStart?: boolean;\n incrementEnd?: boolean;\n fullscreen?: boolean;\n companion?: boolean;\n};\n\nexport type UseDeckPlankOptions = {\n id: string;\n /** Resolved part for the primary plank (`solo` | `multi` | `complementary`). */\n part: ResolvedPart;\n layoutMode: LayoutMode;\n /** Ordered active planks (multi mode); enables increment/close-range semantics. */\n active?: string[];\n /** Whether the companion pane should be shown for this plank (gated further by attention in multi-mode). */\n companionShown?: boolean;\n deckEnabled?: boolean;\n};\n\nexport type DeckPlank = {\n node: Node.Node | undefined;\n companions: Node.Node[];\n resolvedCompanionId: string | undefined;\n currentCompanion: Node.Node | undefined;\n hasCompanion: boolean;\n /** Splitter orientation for the companion pane (defaults to `horizontal`). */\n companionOrientation: 'horizontal' | 'vertical';\n capabilities: PlankCapabilities;\n /** Grouped sigil-menu actions, or `undefined` when the node is unresolved. */\n sigilActions: AttentionSigilAction[][] | undefined;\n popoverAnchorId?: string;\n scrollIntoView?: string;\n onAction: (action: AttentionSigilAction) => void;\n onAdjust: (type: DeckOperation.PartAdjustment) => void;\n onResize: (size: number) => void;\n onScrollIntoView: (subject?: string) => void;\n onUpdateCompanion: (companion: string | null) => void;\n};\n\n/**\n * Resolves the graph node, companions, capabilities and sigil actions for a deck plank, and exposes the\n * operation dispatchers that mutate deck layout state. This re-homes the framework wiring that the legacy\n * `PlankContainer`/`PlankHeading` bundled, so the presentational components stay free of capabilities.\n */\nexport const useDeckPlank = ({\n id,\n part,\n layoutMode,\n active,\n companionShown,\n deckEnabled,\n}: UseDeckPlankOptions): DeckPlank => {\n const { graph } = useAppGraph();\n const { invokePromise } = useOperationInvoker();\n const { state, deck } = useDeckState();\n const runAction = useActionRunner();\n const breakpoint = useBreakpoints();\n const node = useNode(graph, id);\n // Subscribe reactively to the node's actions: they are loaded asynchronously by `Graph.expand`\n // below, and the node atom does not re-emit when action edges arrive, so a one-shot read would\n // leave a freshly-created plank's sigil menu empty until an unrelated re-render.\n const actions = useActions(graph, node?.id);\n const companions = useCompanions(id);\n const { hasAttention } = useAttention(id);\n const selectedVariant = useSelectedCompanionVariant();\n\n // The companion is shown when open; in multi mode it attaches only to the attended plank (hidden until\n // a plank gains attention). Which companion shows follows the globally-selected variant (view state),\n // falling back to the first when none is stored.\n const showCompanion = !!companionShown && (layoutMode !== 'multi' || hasAttention);\n const { companionId } = useSelectedCompanion(companions, showCompanion ? selectedVariant : undefined);\n const resolvedCompanionId = showCompanion ? companionId : undefined;\n const currentCompanion = companions.find((companion) => companion.id === resolvedCompanionId);\n const hasCompanion = !!(resolvedCompanionId && currentCompanion);\n const companionOrientation = deck.companionOrientation ?? 'horizontal';\n\n // Ordering within the active stack drives the increment-start/end affordances.\n const index = active ? active.findIndex((entryId) => entryId === id) : -1;\n const isOrdered = !!active && index >= 0;\n const canIncrementStart = isOrdered && index > 0;\n const canIncrementEnd = isOrdered && index < (active?.length ?? 1) - 1;\n\n const isCompanionNode = node?.type === PLANK_COMPANION_TYPE;\n const capabilities = useMemo<PlankCapabilities>(\n () => ({\n deck: deckEnabled ?? true,\n solo: breakpoint !== 'mobile' && (part === 'solo' || part === 'multi'),\n incrementStart: canIncrementStart,\n incrementEnd: canIncrementEnd,\n fullscreen: !isCompanionNode,\n // Offer to open the companion (solo, or the attended plank in multi) when one exists and isn't shown.\n companion: !isCompanionNode && companions.length > 0 && !hasCompanion && (layoutMode !== 'multi' || hasAttention),\n }),\n [\n deckEnabled,\n breakpoint,\n part,\n canIncrementStart,\n canIncrementEnd,\n isCompanionNode,\n layoutMode,\n companions.length,\n hasCompanion,\n hasAttention,\n ],\n );\n\n // Load the node's child actions so the sigil menu is populated.\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n if (node) {\n void Graph.expand(graph, node.id, 'child');\n }\n });\n\n return () => cancelAnimationFrame(frame);\n }, [graph, node]);\n\n const variant = isCompanionNode ? getLinkedVariant(id) : undefined;\n const sigilActions = useMemo<AttentionSigilAction[][] | undefined>(() => {\n if (!node) {\n return undefined;\n }\n if (variant) {\n return [];\n }\n\n return [actions.filter((action) => PLANK_ACTION_DISPOSITIONS.includes(action.properties.disposition))].filter(\n (group) => group.length > 0,\n );\n }, [actions, node, variant]);\n\n const onAction = useCallback(\n (action: AttentionSigilAction) => {\n // Only actions whose `data` is a function are runnable graph actions; the menu-action view type\n // (AttentionSigilAction) is widened, so narrow at this runtime-checked boundary.\n if (typeof action.data === 'function') {\n void runAction(action as Node.Action, { parent: node, caller: meta.profile.key });\n }\n },\n [node, runAction],\n );\n\n const onAdjust = useCallback(\n (type: DeckOperation.PartAdjustment) => {\n if (type === 'close') {\n if (part === 'complementary') {\n return invokePromise(LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n }\n if (active) {\n // Close the plank and everything to its right (stack pop).\n const closeIndex = active.indexOf(id);\n const toClose = closeIndex !== -1 ? active.slice(closeIndex) : [id];\n return invokePromise(LayoutOperation.Close, { subject: toClose });\n }\n return invokePromise(LayoutOperation.Close, { subject: [id] });\n }\n\n return invokePromise(DeckOperation.Adjust, { type, id });\n },\n [invokePromise, part, active, id],\n );\n\n const onResize = useCallback(\n (size: number) => invokePromise(DeckOperation.UpdatePlankSize, { id, size }),\n [invokePromise, id],\n );\n\n const onScrollIntoView = useCallback(\n (subject?: string) => invokePromise(LayoutOperation.ScrollIntoView, { subject }),\n [invokePromise],\n );\n\n const onUpdateCompanion = useCallback(\n (companion: string | null) => invokePromise(LayoutOperation.UpdateCompanion, { subject: companion }),\n [invokePromise],\n );\n\n return {\n node,\n companions,\n resolvedCompanionId,\n currentCompanion,\n hasCompanion,\n companionOrientation,\n capabilities,\n sigilActions,\n popoverAnchorId: state.popoverAnchorId,\n scrollIntoView: state.scrollIntoView,\n onAction,\n onAdjust,\n onResize,\n onScrollIntoView,\n onUpdateCompanion,\n };\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { DeckContent, DeckContentProps } from './DeckContent';\nimport { DeckLayoutChangeRequest, DeckRoot, DeckRootProps } from './DeckRoot';\nimport { DeckContentEmpty, DeckMultiMode, DeckSoloMode, DeckViewport, DeckViewportProps } from './DeckViewport';\n\n/**\n * Radix-style composite Deck component.\n */\nexport const Deck = {\n Root: DeckRoot,\n Content: DeckContent,\n Viewport: DeckViewport,\n ContentEmpty: DeckContentEmpty,\n MultiMode: DeckMultiMode,\n SoloMode: DeckSoloMode,\n};\n\nexport type { DeckContentProps, DeckLayoutChangeRequest, DeckRootProps, DeckViewportProps };\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useOperationInvoker", "LayoutOperation", "IconButton", "useTranslation", "getLinkedVariant", "useDeckCompanions", "useDeckState", "meta", "ToggleSidebarButton", "classNames", "variant", "updateState", "t", "profile", "key", "handleClick", "state", "sidebarState", "icon", "iconOnly", "size", "label", "onClick", "CloseSidebarButton", "ToggleComplementarySidebarButton", "inR0", "current", "invokePromise", "companions", "nextState", "complementarySidebarState", "subject", "complementarySidebarPanel", "id", "UpdateComplementary", "tooltipSide", "undefined", "React", "useCallback", "useEffect", "useMemo", "useState", "Surface", "useOperationInvoker", "LayoutOperation", "AppSurface", "IconButton", "Main", "Panel", "Toolbar", "toLocalizedString", "useTranslation", "getLinkedVariant", "Tabs", "iconSize", "mx", "useBreakpoints", "useDeckCompanions", "useDeckState", "meta", "getMode", "React", "useEffect", "log", "ErrorFallback", "useTranslation", "descriptionMessage", "mx", "meta", "error", "process", "title", "className", "p", "label", "ns", "meta", "profile", "key", "ComplementarySidebar", "current", "invokePromise", "useOperationInvoker", "t", "useTranslation", "state", "deck", "updateState", "useDeckState", "layoutMode", "getMode", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "companions", "useDeckCompanions", "activeCompanion", "find", "companion", "getLinkedVariant", "id", "activeId", "internalValue", "setInternalValue", "useState", "useEffect", "handleTabClick", "useCallback", "event", "nextValue", "currentTarget", "getAttribute", "complementarySidebarState", "LayoutOperation", "UpdateComplementary", "subject", "data", "useMemo", "React", "Main", "classNames", "Tabs", "Root", "orientation", "value", "div", "data-tauri-drag-region", "style", "iconSize", "className", "mx", "Tablist", "map", "Tab", "asChild", "IconButton", "toLocalizedString", "properties", "icon", "iconOnly", "tooltipSide", "data-value", "joyride", "variant", "onClick", "Surface", "type", "AppSurface", "StatusIndicator", "ToggleComplementarySidebarButton", "Panel", "inert", "ComplementarySidebarPanel", "Toolbar", "size", "Content", "deckCompanion", "fallback", "PlankErrorFallback", "placeholder", "PlankLoading", "React", "useMemo", "Surface", "AppSurface", "Main", "useBreakpoints", "useDeckState", "meta", "getMode", "label", "ns", "meta", "profile", "key", "Sidebar", "state", "deck", "useDeckState", "popoverAnchorId", "activeDeck", "current", "breakpoint", "useBreakpoints", "layoutMode", "getMode", "topbar", "layoutAppliesTopbar", "navigationData", "useMemo", "React", "Main", "NavigationSidebar", "classNames", "Surface", "type", "AppSurface", "Navigation", "data", "limit", "React", "useCallback", "useEffect", "useRef", "AttentionCapabilities", "Main", "useMediaQuery", "useBreakpoints", "React", "Surface", "AppSurface", "useTranslation", "mx", "osTranslations", "meta", "VersionInfo", "Banner", "variant", "classNames", "t", "useTranslation", "meta", "profile", "key", "React", "header", "className", "mx", "CloseSidebarButton", "ToggleSidebarButton", "span", "ns", "osTranslations", "div", "Surface", "type", "AppSurface", "SearchInput", "limit", "VersionInfo", "createContext", "React", "DECK_NAME", "DECK_ROOT_NAME", "DeckProvider", "useDeckContext", "DeckRoot", "children", "context", "displayName", "DECK_CONTENT_NAME", "DeckContent", "children", "state", "sidebarState", "complementarySidebarState", "complementarySidebarPanel", "deck", "active", "fullscreen", "solo", "updateState", "layoutMode", "settings", "pluginManager", "onLayoutChange", "useDeckContext", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "useEffect", "attention", "capabilities", "get", "AttentionCapabilities", "Attention", "attended", "getCurrent", "firstId", "length", "document", "querySelector", "focus", "isNotMobile", "useMediaQuery", "shouldRevert", "useRef", "current", "subject", "mode", "revert", "enableDeck", "handleNavigationSidebarStateChange", "useCallback", "next", "s", "handleComplementarySidebarStateChange", "React", "Main", "Root", "navigationSidebarState", "onNavigationSidebarStateChange", "onComplementarySidebarStateChange", "Sidebar", "ComplementarySidebar", "Overlay", "Banner", "variant", "displayName", "React", "useCallback", "useEffect", "useRef", "Surface", "useOperationInvoker", "LayoutOperation", "addEventListener", "invariant", "IconButton", "Main", "ScrollArea", "useOnTransition", "useTranslation", "mainIntrinsicSize", "mainPaddingTransitions", "Mosaic", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useBreakpoints", "useDeckState", "meta", "DeckOperation", "Keyshortcuts", "getMode", "useFocusFinders", "React", "memo", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "AppSurface", "Splitter", "Companion", "Plank", "useCompanionSplit", "React", "forwardRef", "useCallback", "useOperationInvoker", "LayoutOperation", "ButtonGroup", "IconButton", "useTranslation", "meta", "plankControlSpacing", "PlankCompanionControls", "primary", "forwardedRef", "t", "profile", "key", "invokePromise", "handleCloseCompanion", "UpdateCompanion", "subject", "div", "ref", "className", "PlankControl", "label", "variant", "icon", "onClick", "classNames", "props", "iconOnly", "tooltipSide", "PlankControls", "children", "capabilities", "layoutMode", "pin", "close", "buttonClassNames", "layoutIsAnySolo", "startsWith", "deck", "solo", "disabled", "incrementStart", "incrementEnd", "fullscreen", "data-testid", "companion", "useCallback", "useEffect", "useMemo", "useOperationInvoker", "LayoutOperation", "useAppGraph", "Graph", "useActionRunner", "useActions", "useNode", "getLinkedVariant", "useAttention", "useBreakpoints", "useCompanions", "useDeckState", "useSelectedCompanion", "useSelectedCompanionVariant", "meta", "DeckOperation", "PLANK_COMPANION_TYPE", "PLANK_ACTION_DISPOSITIONS", "useDeckPlank", "id", "part", "layoutMode", "active", "companionShown", "deckEnabled", "graph", "invokePromise", "state", "deck", "runAction", "breakpoint", "node", "actions", "companions", "hasAttention", "selectedVariant", "showCompanion", "companionId", "undefined", "resolvedCompanionId", "currentCompanion", "find", "companion", "hasCompanion", "companionOrientation", "index", "findIndex", "entryId", "isOrdered", "canIncrementStart", "canIncrementEnd", "length", "isCompanionNode", "type", "capabilities", "solo", "incrementStart", "incrementEnd", "fullscreen", "frame", "requestAnimationFrame", "expand", "cancelAnimationFrame", "variant", "sigilActions", "filter", "action", "includes", "properties", "disposition", "group", "onAction", "data", "parent", "caller", "profile", "key", "onAdjust", "UpdateComplementary", "closeIndex", "indexOf", "toClose", "slice", "Close", "subject", "Adjust", "onResize", "size", "UpdatePlankSize", "onScrollIntoView", "ScrollIntoView", "onUpdateCompanion", "UpdateCompanion", "popoverAnchorId", "scrollIntoView", "PLANK_LOADING", "React", "PlankLoading", "DeckPlank", "memo", "id", "part", "layoutMode", "active", "companionShown", "settings", "path", "classNames", "findFirstFocusable", "useFocusFinders", "rootRef", "useRef", "node", "companions", "resolvedCompanionId", "hasCompanion", "companionOrientation", "capabilities", "sigilActions", "popoverAnchorId", "scrollIntoView", "onAction", "onAdjust", "onScrollIntoView", "onUpdateCompanion", "useDeckPlank", "deckEnabled", "enableDeck", "size", "companionSize", "onSizeChange", "onCompanionSizeChange", "useCompanionSplit", "useEffect", "current", "focus", "undefined", "handleKeyDown", "useCallback", "event", "target", "currentTarget", "key", "closest", "articleData", "useMemo", "companionMounted", "setCompanionMounted", "useState", "timer", "setTimeout", "clearTimeout", "companionControls", "PlankCompanionControls", "primary", "controls", "PlankControls", "close", "onClick", "navbarEnd", "Surface", "type", "AppSurface", "NavbarEnd", "data", "subject", "sigilFooter", "MenuFooter", "headless", "Splitter", "Root", "orientation", "anchor", "mode", "resizable", "minSize", "Panel", "position", "Plank", "ref", "attendableId", "related", "actions", "fallback", "PlankErrorFallback", "placeholder", "onKeyDown", "Handle", "Companion", "value", "onValueChange", "companionTo", "displayName", "__dxlog_file", "DECK_VIEWPORT_NAME", "DEFAULT_PLANK_SIZE", "MAX_PLANK_SIZE", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "layoutMode", "bounce", "handlesFocus", "classNames", "style", "complementarySidebarState", "children", "DeckViewport", "displayName", "deck", "useDeckState", "getMode", "className", "React", "type", "Keyshortcuts", "Surface", "ToggleSidebarButton", "companionOpen", "fullscreen", "invariant", "solo", "useEffect", "preventDefault", "event", "stopPropagation", "onLayoutChange", "mode", "document", "DeckSidebarToggles", "onExit", "companionShown", "settings", "mx", "invokePromise", "handleSizeChange", "useCallback", "size", "useOperationInvoker", "DeckOperation", "UpdatePlankSize", "id", "round", "minSize", "MIN_PLANK_SIZE", "maxSize", "onSizeChange", "active", "state", "viewportRef", "scrollLeftRef", "useRef", "current", "restoreScroll", "scrollLeft", "useOnTransition", "viewport", "offset", "tile", "getBoundingClientRect", "left", "behavior", "LayoutOperation", "orientation", "mainPaddingTransitions", "ref", "Mosaic", "Stack", "getId", "getPlankId", "items", "Tile", "DeckPlankTile", "draggable", "sidebarToggleStyles", "ToggleComplementarySidebarButton", "ExitFullscreenButton", "meta", "IconButton", "label", "iconOnly", "variant", "tooltipSide", "onClick", "Deck", "Root", "DeckRoot", "Content", "DeckContent", "Viewport", "DeckViewport", "ContentEmpty", "DeckContentEmpty", "MultiMode", "DeckMultiMode", "SoloMode", "DeckSoloMode"]
7
+ }
@@ -6,10 +6,11 @@ import {
6
6
  } from "./chunk-GLB73Q6U.mjs";
7
7
  import {
8
8
  DeckCapabilities_exports
9
- } from "./chunk-CL7JIOI5.mjs";
9
+ } from "./chunk-ICOJ4GMB.mjs";
10
10
  import {
11
11
  computeActiveUpdates
12
- } from "./chunk-NGX6RXNV.mjs";
12
+ } from "./chunk-PP32NEVY.mjs";
13
+ import "./chunk-SONATB35.mjs";
13
14
  import "./chunk-J5LGTIGS.mjs";
14
15
 
15
16
  // src/operations/close.ts
@@ -41,4 +42,4 @@ var close_default = handler;
41
42
  export {
42
43
  close_default as default
43
44
  };
44
- //# sourceMappingURL=close-KJUCFIJ5.mjs.map
45
+ //# sourceMappingURL=close-2YGB5IIP.mjs.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/operations/close.ts"],
4
4
  "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\n\nimport { closeEntry } from '../layout';\nimport { DeckCapabilities } from '../types';\nimport { computeActiveUpdates } from '../util';\nimport { updateActiveDeck } from './helpers';\n\nconst handler: Operation.WithHandler<typeof LayoutOperation.Close> = LayoutOperation.Close.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* (input) {\n const deck = yield* DeckCapabilities.getDeck();\n const attention = yield* Capability.get(AttentionCapabilities.Attention);\n\n const active = deck.solo ? [deck.solo] : deck.active;\n const next = input.subject.reduce((acc, id) => closeEntry(acc, id), active);\n const { deckUpdates, toAttend } = computeActiveUpdates({ next, deck, attention });\n yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => updateActiveDeck(state, deckUpdates));\n\n if (toAttend) {\n yield* Operation.schedule(LayoutOperation.ScrollIntoView, { subject: toAttend });\n }\n }),\n ),\n);\n\nexport default handler;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,6BAA6B;AAOtC,IAAMC,UAA+DC,gBAAgBC,MAAMC,KACzFC,UAAUC,YACDC,kBAAW,WAAWC,OAAK;AAChC,QAAMC,OAAO,OAAOC,yBAAiBC,QAAO;AAC5C,QAAMC,YAAY,OAAOC,WAAWC,IAAIC,sBAAsBC,SAAS;AAEvE,QAAMC,SAASR,KAAKS,OAAO;IAACT,KAAKS;MAAQT,KAAKQ;AAC9C,QAAME,OAAOX,MAAMY,QAAQC,OAAO,CAACC,KAAKC,OAAOC,WAAWF,KAAKC,EAAAA,GAAKN,MAAAA;AACpE,QAAM,EAAEQ,aAAaC,SAAQ,IAAKC,qBAAqB;IAAER;IAAMV;IAAMG;EAAU,CAAA;AAC/E,SAAOgB,aAAaC,gBAAgBnB,yBAAiBoB,OAAO,CAACC,UAAUC,iBAAiBD,OAAON,WAAAA,CAAAA;AAE/F,MAAIC,UAAU;AACZ,WAAOrB,UAAU4B,SAAS/B,gBAAgBgC,gBAAgB;MAAEd,SAASM;IAAS,CAAA;EAChF;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,gBAAezB;",
5
+ "mappings": ";;;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,6BAA6B;AAOtC,IAAMC,UAA+DC,gBAAgBC,MAAMC,KACzFC,UAAUC,YACDC,kBAAW,WAAWC,OAAK;AAChC,QAAMC,OAAO,OAAOC,yBAAiBC,QAAO;AAC5C,QAAMC,YAAY,OAAOC,WAAWC,IAAIC,sBAAsBC,SAAS;AAEvE,QAAMC,SAASR,KAAKS,OAAO;IAACT,KAAKS;MAAQT,KAAKQ;AAC9C,QAAME,OAAOX,MAAMY,QAAQC,OAAO,CAACC,KAAKC,OAAOC,WAAWF,KAAKC,EAAAA,GAAKN,MAAAA;AACpE,QAAM,EAAEQ,aAAaC,SAAQ,IAAKC,qBAAqB;IAAER;IAAMV;IAAMG;EAAU,CAAA;AAC/E,SAAOgB,aAAaC,gBAAgBnB,yBAAiBoB,OAAO,CAACC,UAAUC,iBAAiBD,OAAON,WAAAA,CAAAA;AAE/F,MAAIC,UAAU;AACZ,WAAOrB,UAAU4B,SAAS/B,gBAAgBgC,gBAAgB;MAAEd,SAASM;IAAS,CAAA;EAChF;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,gBAAezB;",
6
6
  "names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "Operation", "AttentionCapabilities", "handler", "LayoutOperation", "Close", "pipe", "Operation", "withHandler", "fnUntraced", "input", "deck", "DeckCapabilities", "getDeck", "attention", "Capability", "get", "AttentionCapabilities", "Attention", "active", "solo", "next", "subject", "reduce", "acc", "id", "closeEntry", "deckUpdates", "toAttend", "computeActiveUpdates", "Capabilities", "updateAtomValue", "State", "state", "updateActiveDeck", "schedule", "ScrollIntoView"]
7
7
  }
@@ -1,20 +1,145 @@
1
1
  import "../chunk-J5LGTIGS.mjs";
2
2
 
3
- // src/components/index.ts
4
- import { lazy } from "react";
3
+ // src/components/Companion/Companion.tsx
4
+ import React2, { useMemo } from "react";
5
+ import { Surface } from "@dxos/app-framework/ui";
6
+ import { AppSurface } from "@dxos/app-toolkit/ui";
7
+ import { toLocalizedString, useTranslation } from "@dxos/react-ui";
8
+ import { getLinkedVariant } from "@dxos/react-ui-attention";
9
+ import { mx as mx2 } from "@dxos/ui-theme";
10
+ import { meta } from "#meta";
11
+
12
+ // src/components/Pane/Pane.tsx
13
+ import { Slot } from "@radix-ui/react-slot";
14
+ import React, { forwardRef } from "react";
15
+ import { AttentionSigilButton } from "@dxos/app-toolkit/ui";
16
+ import { DensityProvider, IconButton, composableProps, slottable } from "@dxos/react-ui";
17
+ import { useAttention } from "@dxos/react-ui-attention";
18
+ import { iconSize, mx } from "@dxos/ui-theme";
19
+ var PaneRoot = /* @__PURE__ */ forwardRef(({ children, ...props }, forwardedRef) => /* @__PURE__ */ React.createElement("div", {
20
+ ...composableProps(props, {
21
+ role: "article",
22
+ classNames: "dx-container flex flex-col dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-lg min-w-0"
23
+ }),
24
+ ref: forwardedRef
25
+ }, children));
26
+ PaneRoot.displayName = "Pane.Root";
27
+ var PaneToolbar = slottable(({ children, asChild, ...props }, forwardedRef) => {
28
+ const Comp = asChild ? Slot : "div";
29
+ return /* @__PURE__ */ React.createElement(Comp, {
30
+ ...composableProps(props, {
31
+ style: iconSize(5),
32
+ classNames: "flex items-center gap-1 px-1 shrink-0 h-(--dx-rail-content) bg-header-surface"
33
+ }),
34
+ ref: forwardedRef
35
+ }, /* @__PURE__ */ React.createElement(DensityProvider, {
36
+ density: "lg"
37
+ }, children));
38
+ });
39
+ PaneToolbar.displayName = "Pane.Toolbar";
40
+ var PaneContent = slottable(({ children, asChild, ...props }, forwardedRef) => {
41
+ const Comp = asChild ? Slot : "div";
42
+ return /* @__PURE__ */ React.createElement(Comp, {
43
+ ...composableProps(props, {
44
+ classNames: "flex-1 min-h-0"
45
+ }),
46
+ ref: forwardedRef
47
+ }, children);
48
+ });
49
+ PaneContent.displayName = "Pane.Content";
50
+ var PaneTitle = /* @__PURE__ */ forwardRef(({ attendableId, related, classNames, ...props }, forwardedRef) => {
51
+ const { hasAttention, isAncestor, isRelated } = useAttention(attendableId);
52
+ return /* @__PURE__ */ React.createElement("h1", {
53
+ ...props,
54
+ "data-attention": (related && isRelated || hasAttention || isAncestor).toString(),
55
+ className: mx("px-1 min-w-0 w-0 grow truncate font-medium text-base-fg data-[attention=true]:text-accent-text self-center", classNames),
56
+ ref: forwardedRef
57
+ });
58
+ });
59
+ PaneTitle.displayName = "Pane.Title";
60
+ var PaneTabs = /* @__PURE__ */ forwardRef(({ tabs, value, onValueChange, maxTabs = 5, attendableId, related, classNames }, forwardedRef) => {
61
+ const { hasAttention, isAncestor, isRelated } = useAttention(attendableId);
62
+ const attended = related && isRelated || hasAttention || isAncestor;
63
+ return /* @__PURE__ */ React.createElement("div", {
64
+ role: "tablist",
65
+ className: mx("flex-1 min-w-0 overflow-x-auto scrollbar-none flex items-center gap-1", classNames),
66
+ ref: forwardedRef
67
+ }, tabs.map(({ id, icon, label }) => /* @__PURE__ */ React.createElement(IconButton, {
68
+ key: id,
69
+ role: "tab",
70
+ "aria-selected": value === id,
71
+ tabIndex: value === id ? 0 : -1,
72
+ "data-id": id,
73
+ icon,
74
+ iconOnly: tabs.length > maxTabs && value !== id,
75
+ label,
76
+ variant: value === id && attended ? "primary" : "ghost",
77
+ onClick: () => onValueChange?.(id)
78
+ })));
79
+ });
80
+ PaneTabs.displayName = "Pane.Tabs";
81
+ var Pane = {
82
+ Root: PaneRoot,
83
+ Toolbar: PaneToolbar,
84
+ Sigil: AttentionSigilButton,
85
+ Title: PaneTitle,
86
+ Tabs: PaneTabs,
87
+ Content: PaneContent
88
+ };
89
+
90
+ // src/components/Companion/Companion.tsx
91
+ var Companion = ({ classNames, companions, value, onValueChange, attendableId, companionTo, controls }) => {
92
+ const { t } = useTranslation(meta.profile.key);
93
+ const selected = value ?? companions[0]?.id;
94
+ const tabs = useMemo(() => companions.map((node) => ({
95
+ id: node.id,
96
+ icon: node.properties?.icon ?? "ph--circle-dashed--regular",
97
+ label: toLocalizedString(node.properties?.label ?? "", t)
98
+ })), [
99
+ companions,
100
+ t
101
+ ]);
102
+ const companionDataList = useMemo(() => companions.map((node) => ({
103
+ attendableId,
104
+ subject: node.data,
105
+ companionTo,
106
+ variant: getLinkedVariant(node.id),
107
+ properties: node.properties
108
+ })), [
109
+ companions,
110
+ attendableId,
111
+ companionTo
112
+ ]);
113
+ return /* @__PURE__ */ React2.createElement(Pane.Root, {
114
+ classNames
115
+ }, /* @__PURE__ */ React2.createElement(Pane.Toolbar, null, /* @__PURE__ */ React2.createElement(Pane.Tabs, {
116
+ tabs,
117
+ value: selected,
118
+ onValueChange,
119
+ attendableId,
120
+ related: true
121
+ }), controls), companions.map((node, index) => /* @__PURE__ */ React2.createElement(Pane.Content, {
122
+ key: node.id,
123
+ classNames: mx2(node.id !== selected && "hidden")
124
+ }, /* @__PURE__ */ React2.createElement(Surface.Surface, {
125
+ type: AppSurface.Article,
126
+ data: companionDataList[index],
127
+ limit: 1
128
+ }))));
129
+ };
5
130
 
6
131
  // src/components/Matrix/Matrix.tsx
7
132
  import { useFocusFinders } from "@fluentui/react-tabster";
8
133
  import { createContext } from "@radix-ui/react-context";
9
- import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from "react";
134
+ import React3, { forwardRef as forwardRef2, useCallback, useEffect, useImperativeHandle, useRef } from "react";
10
135
  import { ScrollArea } from "@dxos/react-ui";
11
- import { composable, composableProps } from "@dxos/react-ui";
136
+ import { composable, composableProps as composableProps2 } from "@dxos/react-ui";
12
137
  import { useAttended } from "@dxos/react-ui-attention";
13
138
  import { Mosaic } from "@dxos/react-ui-mosaic";
14
139
  var MATRIX_NAME = "Matrix";
15
140
  var [MatrixProvider, useMatrixContext] = createContext(MATRIX_NAME);
16
141
  var MATRIX_ROOT_NAME = "Matrix.Root";
17
- var MatrixRoot = /* @__PURE__ */ forwardRef(({ children, items = [], Tile, current, onCurrentChange }, forwardedRef) => {
142
+ var MatrixRoot = /* @__PURE__ */ forwardRef2(({ children, items = [], Tile, current, onCurrentChange }, forwardedRef) => {
18
143
  const viewportRef = useRef(null);
19
144
  const registerViewport = useCallback((element) => {
20
145
  viewportRef.current = element;
@@ -64,7 +189,7 @@ var MatrixRoot = /* @__PURE__ */ forwardRef(({ children, items = [], Tile, curre
64
189
  }
65
190
  }
66
191
  }));
67
- return /* @__PURE__ */ React.createElement(MatrixProvider, {
192
+ return /* @__PURE__ */ React3.createElement(MatrixProvider, {
68
193
  items,
69
194
  Tile,
70
195
  current,
@@ -75,8 +200,8 @@ var MatrixRoot = /* @__PURE__ */ forwardRef(({ children, items = [], Tile, curre
75
200
  MatrixRoot.displayName = MATRIX_ROOT_NAME;
76
201
  var MATRIX_CONTENT_NAME = "Matrix.Content";
77
202
  var MatrixContent = composable(({ children, ...props }, forwardedRef) => {
78
- const { className, ...rest } = composableProps(props);
79
- return /* @__PURE__ */ React.createElement(Mosaic.Container, {
203
+ const { className, ...rest } = composableProps2(props);
204
+ return /* @__PURE__ */ React3.createElement(Mosaic.Container, {
80
205
  ref: forwardedRef,
81
206
  classNames: className,
82
207
  orientation: "horizontal",
@@ -93,15 +218,15 @@ var MatrixViewport = composable(({ ...props }, forwardedRef) => {
93
218
  }, [
94
219
  registerViewport
95
220
  ]);
96
- return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
221
+ return /* @__PURE__ */ React3.createElement(ScrollArea.Root, {
97
222
  orientation: "horizontal",
98
223
  padding: true,
99
224
  snap: true,
100
- ...composableProps(props),
225
+ ...composableProps2(props),
101
226
  ref: forwardedRef
102
- }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, {
227
+ }, /* @__PURE__ */ React3.createElement(ScrollArea.Viewport, {
103
228
  ref: viewportRef
104
- }, /* @__PURE__ */ React.createElement(Mosaic.Stack, {
229
+ }, /* @__PURE__ */ React3.createElement(Mosaic.Stack, {
105
230
  orientation: "horizontal",
106
231
  classNames: "snap-x snap-mandatory gap-2",
107
232
  getId,
@@ -117,10 +242,70 @@ var Matrix = {
117
242
  Viewport: MatrixViewport
118
243
  };
119
244
 
120
- // src/components/index.ts
121
- var DeckSettings = lazy(() => import("../DeckSettings-CQQZJ2YS.mjs"));
245
+ // src/components/Plank/Plank.tsx
246
+ import React4, { Fragment, forwardRef as forwardRef3, useMemo as useMemo2 } from "react";
247
+ import { Surface as Surface2 } from "@dxos/app-framework/ui";
248
+ import { AppSurface as AppSurface2, AttentionSigil } from "@dxos/app-toolkit/ui";
249
+ import { Icon, Popover, toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
250
+ import { useAttentionAttributes } from "@dxos/react-ui-attention";
251
+ import { meta as meta2 } from "#meta";
252
+ var Plank = /* @__PURE__ */ forwardRef3(({ classNames, node, attendableId = node.id, actions, onAction, controls, navbarEnd, sigilFooter, related, pending, popoverAnchorId, articleData, fallback, placeholder, headless, onKeyDown }, forwardedRef) => {
253
+ const { t } = useTranslation2(meta2.profile.key);
254
+ const attentionAttrs = useAttentionAttributes(attendableId);
255
+ const icon = node.properties?.icon ?? "ph--circle-dashed--regular";
256
+ const label = toLocalizedString2(node.properties?.label ?? "", t);
257
+ const data = useMemo2(() => ({
258
+ attendableId,
259
+ subject: node.data,
260
+ properties: node.properties,
261
+ popoverAnchorId,
262
+ ...articleData
263
+ }), [
264
+ attendableId,
265
+ node.data,
266
+ node.properties,
267
+ popoverAnchorId,
268
+ articleData
269
+ ]);
270
+ const ActionRoot = popoverAnchorId === `${meta2.profile.key}:${node.id}` ? Popover.Anchor : Fragment;
271
+ return /* @__PURE__ */ React4.createElement(Pane.Root, {
272
+ ref: forwardedRef,
273
+ classNames,
274
+ tabIndex: 0,
275
+ onKeyDown,
276
+ ...attentionAttrs,
277
+ "data-testid": "deck.plank"
278
+ }, !headless && /* @__PURE__ */ React4.createElement(Pane.Toolbar, null, /* @__PURE__ */ React4.createElement(ActionRoot, null, actions && actions.length > 0 ? /* @__PURE__ */ React4.createElement(AttentionSigil, {
279
+ icon,
280
+ related,
281
+ attendableId,
282
+ actions,
283
+ onAction,
284
+ triggerLabel: label
285
+ }, sigilFooter) : /* @__PURE__ */ React4.createElement(Pane.Sigil, {
286
+ attendableId
287
+ }, /* @__PURE__ */ React4.createElement("span", {
288
+ className: "sr-only"
289
+ }, label), /* @__PURE__ */ React4.createElement(Icon, {
290
+ icon
291
+ }))), /* @__PURE__ */ React4.createElement(Pane.Title, {
292
+ attendableId,
293
+ related,
294
+ classNames: pending && "text-description"
295
+ }, label), navbarEnd, controls), /* @__PURE__ */ React4.createElement(Pane.Content, null, /* @__PURE__ */ React4.createElement(Surface2.Surface, {
296
+ key: node.id,
297
+ type: AppSurface2.Article,
298
+ data,
299
+ limit: 1,
300
+ fallback,
301
+ placeholder
302
+ })));
303
+ });
304
+ Plank.displayName = "Plank";
122
305
  export {
123
- DeckSettings,
124
- Matrix
306
+ Companion,
307
+ Matrix,
308
+ Pane,
309
+ Plank
125
310
  };
126
311
  //# sourceMappingURL=index.mjs.map