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

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 (234) hide show
  1. package/dist/lib/browser/Banner-AJW6225V.mjs +14 -0
  2. package/dist/lib/browser/Banner-AJW6225V.mjs.map +7 -0
  3. package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs +96 -0
  4. package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-builder-DTVCULQ4.mjs → app-graph-builder-MP6INIM2.mjs} +16 -13
  6. package/dist/lib/browser/app-graph-builder-MP6INIM2.mjs.map +7 -0
  7. package/dist/lib/browser/{check-app-scheme-JSRXXIYF.mjs → check-app-scheme-AUNCD2Y6.mjs} +9 -8
  8. package/dist/lib/browser/check-app-scheme-AUNCD2Y6.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-ATFPDN6J.mjs → chunk-3P2FJVXC.mjs} +35 -49
  10. package/dist/lib/browser/chunk-3P2FJVXC.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BJDEG7YZ.mjs +74 -0
  12. package/dist/lib/browser/chunk-BJDEG7YZ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-L3RYMAV7.mjs +16 -0
  14. package/dist/lib/browser/chunk-L3RYMAV7.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-UNG4CLLP.mjs → chunk-TAHLKBDO.mjs} +46 -20
  16. package/dist/lib/browser/chunk-TAHLKBDO.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-S4A5UO4K.mjs → chunk-WTNYSXY5.mjs} +221 -281
  18. package/dist/lib/browser/chunk-WTNYSXY5.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +39 -35
  20. package/dist/lib/browser/index.mjs.map +3 -3
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{operation-resolver-CDYBLZJ4.mjs → operation-resolver-2TEGT4PG.mjs} +166 -122
  23. package/dist/lib/browser/operation-resolver-2TEGT4PG.mjs.map +7 -0
  24. package/dist/lib/browser/{react-root-XDCMNENQ.mjs → react-root-XBFHPSCP.mjs} +8 -7
  25. package/dist/lib/browser/react-root-XBFHPSCP.mjs.map +7 -0
  26. package/dist/lib/browser/react-surface-4J3BZNT2.mjs +44 -0
  27. package/dist/lib/browser/react-surface-4J3BZNT2.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-OMHVGZ6V.mjs → settings-PTMGCSJH.mjs} +8 -5
  29. package/dist/lib/browser/settings-PTMGCSJH.mjs.map +7 -0
  30. package/dist/lib/browser/{state-OC3BSB6E.mjs → state-MA4SQ7BE.mjs} +11 -8
  31. package/dist/lib/browser/state-MA4SQ7BE.mjs.map +7 -0
  32. package/dist/lib/browser/{toolkit-R53LD3EA.mjs → toolkit-6B34QFU3.mjs} +10 -8
  33. package/dist/lib/browser/toolkit-6B34QFU3.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +4 -5
  35. package/dist/lib/browser/{url-handler-53TE6JZO.mjs → url-handler-FEUFPQIP.mjs} +22 -17
  36. package/dist/lib/browser/url-handler-FEUFPQIP.mjs.map +7 -0
  37. package/dist/lib/node-esm/Banner-XBH2IIDR.mjs +15 -0
  38. package/dist/lib/node-esm/Banner-XBH2IIDR.mjs.map +7 -0
  39. package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs +97 -0
  40. package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs.map +7 -0
  41. package/dist/lib/node-esm/{app-graph-builder-473BNZDJ.mjs → app-graph-builder-ACHG5HY7.mjs} +16 -13
  42. package/dist/lib/node-esm/app-graph-builder-ACHG5HY7.mjs.map +7 -0
  43. package/dist/lib/node-esm/{check-app-scheme-IVYRHKRH.mjs → check-app-scheme-WN76GWVC.mjs} +9 -8
  44. package/dist/lib/node-esm/check-app-scheme-WN76GWVC.mjs.map +7 -0
  45. package/dist/lib/node-esm/{chunk-D34L3ECT.mjs → chunk-CQ3XYTNJ.mjs} +220 -280
  46. package/dist/lib/node-esm/chunk-CQ3XYTNJ.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs +76 -0
  48. package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-SKEVPQ7E.mjs → chunk-EMU4VIPH.mjs} +46 -20
  50. package/dist/lib/node-esm/chunk-EMU4VIPH.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-XAKTY3EB.mjs → chunk-GZJAQ5IP.mjs} +34 -49
  52. package/dist/lib/node-esm/chunk-GZJAQ5IP.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-XCNF4COU.mjs +18 -0
  54. package/dist/lib/node-esm/chunk-XCNF4COU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +39 -35
  56. package/dist/lib/node-esm/index.mjs.map +3 -3
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{operation-resolver-WUOE33ID.mjs → operation-resolver-GCMCCI7A.mjs} +166 -122
  59. package/dist/lib/node-esm/operation-resolver-GCMCCI7A.mjs.map +7 -0
  60. package/dist/lib/node-esm/{react-root-O6GZO62Z.mjs → react-root-32LZ6APH.mjs} +8 -7
  61. package/dist/lib/node-esm/react-root-32LZ6APH.mjs.map +7 -0
  62. package/dist/lib/node-esm/{react-surface-IHDJDGC5.mjs → react-surface-CO4ZDZKM.mjs} +18 -16
  63. package/dist/lib/node-esm/react-surface-CO4ZDZKM.mjs.map +7 -0
  64. package/dist/lib/node-esm/{settings-2HB6FKIK.mjs → settings-LPPFLXNJ.mjs} +8 -5
  65. package/dist/lib/node-esm/settings-LPPFLXNJ.mjs.map +7 -0
  66. package/dist/lib/node-esm/{state-JRQ45ACJ.mjs → state-KNRU3GDC.mjs} +11 -8
  67. package/dist/lib/node-esm/state-KNRU3GDC.mjs.map +7 -0
  68. package/dist/lib/node-esm/{toolkit-JLPZNNKB.mjs → toolkit-SOWYKJY3.mjs} +10 -8
  69. package/dist/lib/node-esm/toolkit-SOWYKJY3.mjs.map +7 -0
  70. package/dist/lib/node-esm/types/index.mjs +4 -5
  71. package/dist/lib/node-esm/{url-handler-QGF2R24T.mjs → url-handler-4LEB7UWF.mjs} +22 -17
  72. package/dist/lib/node-esm/url-handler-4LEB7UWF.mjs.map +7 -0
  73. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  75. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +1 -1
  77. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  79. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/react-root/react-root.d.ts +1 -1
  81. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  83. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  85. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/settings/index.d.ts +1 -1
  87. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/settings/settings.d.ts +4 -3
  89. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/state/index.d.ts +6 -6
  91. package/dist/types/src/capabilities/state/state.d.ts +7 -7
  92. package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/toolkit/index.d.ts +1 -1
  94. package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/toolkit/toolkit.d.ts +4 -3
  96. package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/tools/tools.d.ts +1 -1
  98. package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +1 -1
  100. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -1
  101. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
  102. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +1 -0
  103. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -1
  105. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
  106. package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +1 -1
  107. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
  108. package/dist/types/src/components/DeckLayout/Toast.d.ts +3 -3
  109. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
  110. package/dist/types/src/components/Plank/Plank.d.ts +2 -2
  111. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
  112. package/dist/types/src/components/Plank/Plank.stories.d.ts +3 -2
  113. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
  115. package/dist/types/src/components/Plank/PlankError.d.ts +5 -3
  116. package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
  117. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
  118. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  119. package/dist/types/src/components/fragments.d.ts +4 -1
  120. package/dist/types/src/components/fragments.d.ts.map +1 -1
  121. package/dist/types/src/components/index.d.ts +0 -1
  122. package/dist/types/src/components/index.d.ts.map +1 -1
  123. package/dist/types/src/containers/Banner/Banner.d.ts +2 -0
  124. package/dist/types/src/containers/Banner/Banner.d.ts.map +1 -0
  125. package/dist/types/src/containers/Banner/index.d.ts +3 -0
  126. package/dist/types/src/containers/Banner/index.d.ts.map +1 -0
  127. package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts.map +1 -1
  128. package/dist/types/src/containers/DeckSettings/index.d.ts +3 -0
  129. package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
  130. package/dist/types/src/containers/index.d.ts +4 -0
  131. package/dist/types/src/containers/index.d.ts.map +1 -0
  132. package/dist/types/src/hooks/index.d.ts +1 -0
  133. package/dist/types/src/hooks/index.d.ts.map +1 -1
  134. package/dist/types/src/hooks/useDeckCompanions.d.ts +0 -1
  135. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  137. package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
  138. package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
  139. package/dist/types/src/layout.d.ts +1 -7
  140. package/dist/types/src/layout.d.ts.map +1 -1
  141. package/dist/types/src/translations.d.ts +1 -0
  142. package/dist/types/src/translations.d.ts.map +1 -1
  143. package/dist/types/src/types/capabilities.d.ts +6 -6
  144. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  145. package/dist/types/src/types/events.d.ts.map +1 -1
  146. package/dist/types/src/types/schema.d.ts +18 -16
  147. package/dist/types/src/types/schema.d.ts.map +1 -1
  148. package/dist/types/tsconfig.tsbuildinfo +1 -1
  149. package/package.json +48 -44
  150. package/src/DeckPlugin.ts +12 -11
  151. package/src/capabilities/app-graph-builder/app-graph-builder.ts +11 -10
  152. package/src/capabilities/check-app-scheme/check-app-scheme.ts +12 -8
  153. package/src/capabilities/operation-resolver/operation-resolver.ts +110 -107
  154. package/src/capabilities/react-root/react-root.tsx +2 -2
  155. package/src/capabilities/react-surface/react-surface.tsx +11 -10
  156. package/src/capabilities/settings/settings.ts +3 -2
  157. package/src/capabilities/state/state.ts +6 -5
  158. package/src/capabilities/toolkit/toolkit.ts +7 -6
  159. package/src/capabilities/tools/tools.ts +0 -1
  160. package/src/capabilities/url-handler/url-handler.ts +16 -13
  161. package/src/components/DeckLayout/ActiveNode.tsx +3 -2
  162. package/src/components/DeckLayout/Banner.tsx +8 -8
  163. package/src/components/DeckLayout/ContentEmpty.tsx +3 -3
  164. package/src/components/DeckLayout/DeckLayout.stories.tsx +8 -6
  165. package/src/components/DeckLayout/DeckMain.tsx +26 -25
  166. package/src/components/DeckLayout/Dialog.tsx +10 -4
  167. package/src/components/DeckLayout/Fallback.tsx +2 -6
  168. package/src/components/DeckLayout/Popover.tsx +46 -14
  169. package/src/components/DeckLayout/StatusBar.tsx +4 -4
  170. package/src/components/DeckLayout/Toast.tsx +3 -3
  171. package/src/components/Plank/Plank.stories.tsx +7 -5
  172. package/src/components/Plank/Plank.tsx +32 -24
  173. package/src/components/Plank/PlankControls.tsx +6 -8
  174. package/src/components/Plank/PlankError.tsx +29 -15
  175. package/src/components/Plank/PlankHeading.tsx +24 -26
  176. package/src/components/Plank/PlankLoading.tsx +1 -1
  177. package/src/components/Sidebar/ComplementarySidebar.tsx +50 -51
  178. package/src/components/Sidebar/Sidebar.tsx +4 -4
  179. package/src/components/Sidebar/SidebarButton.tsx +12 -12
  180. package/src/components/fragments.ts +9 -4
  181. package/src/components/index.ts +0 -1
  182. package/src/containers/Banner/Banner.tsx +5 -0
  183. package/src/containers/Banner/index.ts +7 -0
  184. package/src/{components → containers}/DeckSettings/DeckSettings.tsx +23 -23
  185. package/src/containers/DeckSettings/index.ts +7 -0
  186. package/src/containers/index.ts +8 -0
  187. package/src/hooks/index.ts +1 -0
  188. package/src/hooks/useCompanions.ts +2 -2
  189. package/src/hooks/useDeckCompanions.ts +3 -8
  190. package/src/hooks/useDeckState.ts +3 -3
  191. package/src/hooks/useHoistStatusbar.ts +1 -1
  192. package/src/hooks/useMainSize.ts +2 -2
  193. package/src/hooks/useNodeActionExpander.ts +1 -1
  194. package/src/hooks/useSelectedCompanion.ts +32 -0
  195. package/src/layout.ts +1 -14
  196. package/src/meta.ts +1 -1
  197. package/src/translations.ts +1 -0
  198. package/src/types/capabilities.ts +5 -5
  199. package/src/types/events.ts +5 -4
  200. package/src/types/schema.ts +22 -21
  201. package/src/util/overscroll.ts +3 -3
  202. package/dist/lib/browser/app-graph-builder-DTVCULQ4.mjs.map +0 -7
  203. package/dist/lib/browser/check-app-scheme-JSRXXIYF.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-ATFPDN6J.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-NHABISX2.mjs +0 -152
  206. package/dist/lib/browser/chunk-NHABISX2.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-S4A5UO4K.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-UNG4CLLP.mjs.map +0 -7
  209. package/dist/lib/browser/operation-resolver-CDYBLZJ4.mjs.map +0 -7
  210. package/dist/lib/browser/react-root-XDCMNENQ.mjs.map +0 -7
  211. package/dist/lib/browser/react-surface-HODERLOL.mjs +0 -42
  212. package/dist/lib/browser/react-surface-HODERLOL.mjs.map +0 -7
  213. package/dist/lib/browser/settings-OMHVGZ6V.mjs.map +0 -7
  214. package/dist/lib/browser/state-OC3BSB6E.mjs.map +0 -7
  215. package/dist/lib/browser/toolkit-R53LD3EA.mjs.map +0 -7
  216. package/dist/lib/browser/url-handler-53TE6JZO.mjs.map +0 -7
  217. package/dist/lib/node-esm/app-graph-builder-473BNZDJ.mjs.map +0 -7
  218. package/dist/lib/node-esm/check-app-scheme-IVYRHKRH.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-ADPMWKLL.mjs +0 -154
  220. package/dist/lib/node-esm/chunk-ADPMWKLL.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-D34L3ECT.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-SKEVPQ7E.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-XAKTY3EB.mjs.map +0 -7
  224. package/dist/lib/node-esm/operation-resolver-WUOE33ID.mjs.map +0 -7
  225. package/dist/lib/node-esm/react-root-O6GZO62Z.mjs.map +0 -7
  226. package/dist/lib/node-esm/react-surface-IHDJDGC5.mjs.map +0 -7
  227. package/dist/lib/node-esm/settings-2HB6FKIK.mjs.map +0 -7
  228. package/dist/lib/node-esm/state-JRQ45ACJ.mjs.map +0 -7
  229. package/dist/lib/node-esm/toolkit-JLPZNNKB.mjs.map +0 -7
  230. package/dist/lib/node-esm/url-handler-QGF2R24T.mjs.map +0 -7
  231. package/dist/types/src/components/DeckSettings/index.d.ts +0 -2
  232. package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
  233. package/src/components/DeckSettings/index.ts +0 -5
  234. /package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/url-handler/url-handler.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\n\nimport { DeckCapabilities, type DeckStateProps, defaultDeck } from '../../types';\n\n// TODO(wittjosiah): Cleanup the url handling. May justify introducing routing capabilities.\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const { invokeSync } = yield* Capability.get(Common.Capability.OperationInvoker);\n const registry = yield* Capability.get(Common.Capability.AtomRegistry);\n const stateAtom = yield* Capability.get(DeckCapabilities.State);\n\n // Helper to get state.\n const getState = () => registry.get(stateAtom);\n\n // Helper to get computed deck from state.\n const getDeck = () => {\n const state = getState();\n const deck = state.decks[state.activeDeck];\n invariant(deck, `Deck not found: ${state.activeDeck}`);\n return deck;\n };\n\n // Helper to update state.\n const updateState = (fn: (current: DeckStateProps) => DeckStateProps) => {\n registry.set(stateAtom, fn(getState()));\n };\n\n const handleNavigation = () => {\n const pathname = window.location.pathname;\n const state = getState();\n if (pathname === '/reset') {\n updateState((s) => ({\n ...s,\n activeDeck: 'default',\n decks: {\n default: { ...defaultDeck },\n },\n }));\n window.location.pathname = '/';\n return;\n }\n\n const [_, nextDeck, nextSolo] = pathname.split('/');\n if (nextDeck && nextDeck !== state.activeDeck) {\n invokeSync(Common.LayoutOperation.SwitchWorkspace, { subject: nextDeck });\n }\n\n const deck = getDeck();\n if (nextSolo && nextSolo !== deck.solo) {\n invokeSync(Common.LayoutOperation.SetLayoutMode, { subject: nextSolo, mode: 'solo' });\n } else if (!nextSolo && deck.solo) {\n invokeSync(Common.LayoutOperation.SetLayoutMode, { mode: 'deck' });\n }\n };\n\n yield* Effect.sync(() => handleNavigation());\n window.addEventListener('popstate', handleNavigation);\n\n // Subscribe to state changes to update the URL.\n let lastSolo: string | undefined;\n let lastActiveDeck: string | undefined;\n const unsubscribe = registry.subscribe(stateAtom, () => {\n const state = getState();\n const deck = getDeck();\n const solo = deck.solo;\n const activeDeck = state.activeDeck;\n\n // Only update URL if relevant state changed.\n if (solo !== lastSolo || activeDeck !== lastActiveDeck) {\n lastSolo = solo;\n lastActiveDeck = activeDeck;\n\n const path = solo ? `/${activeDeck}/${solo}` : `/${activeDeck}`;\n if (window.location.pathname !== path) {\n // TODO(thure): In some browsers, this only preserves the most recent state change, even though this is not `history.replace`…\n history.pushState(null, '', `${path}${window.location.search}`);\n }\n }\n });\n\n return Capability.contributes(Common.Capability.Null, null, () =>\n Effect.sync(() => {\n window.removeEventListener('popstate', handleNavigation);\n unsubscribe();\n }),\n );\n }),\n);\n"],
5
- "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,iBAAiB;;AAK1B,IAAA,sBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAM,EAAEC,WAAU,IAAK,OAAOH,WAAWI,IAAIC,OAAOL,WAAWM,gBAAgB;AAC/E,QAAMC,WAAW,OAAOP,WAAWI,IAAIC,OAAOL,WAAWQ,YAAY;AACrE,QAAMC,YAAY,OAAOT,WAAWI,IAAIM,iBAAiBC,KAAK;AAG9D,QAAMC,WAAW,MAAML,SAASH,IAAIK,SAAAA;AAGpC,QAAMI,UAAU,MAAA;AACd,UAAMC,QAAQF,SAAAA;AACd,UAAMG,OAAOD,MAAME,MAAMF,MAAMG,UAAU;AACzCC,cAAUH,MAAM,mBAAmBD,MAAMG,UAAU,IAAE;;;;;;;;;AACrD,WAAOF;EACT;AAGA,QAAMI,cAAc,CAACC,OAAAA;AACnBb,aAASc,IAAIZ,WAAWW,GAAGR,SAAAA,CAAAA,CAAAA;EAC7B;AAEA,QAAMU,mBAAmB,MAAA;AACvB,UAAMC,WAAWC,OAAOC,SAASF;AACjC,UAAMT,QAAQF,SAAAA;AACd,QAAIW,aAAa,UAAU;AACzBJ,kBAAY,CAACO,OAAO;QAClB,GAAGA;QACHT,YAAY;QACZD,OAAO;UACLW,SAAS;YAAE,GAAGC;UAAY;QAC5B;MACF,EAAA;AACAJ,aAAOC,SAASF,WAAW;AAC3B;IACF;AAEA,UAAM,CAACM,GAAGC,UAAUC,QAAAA,IAAYR,SAASS,MAAM,GAAA;AAC/C,QAAIF,YAAYA,aAAahB,MAAMG,YAAY;AAC7Cd,iBAAWE,OAAO4B,gBAAgBC,iBAAiB;QAAEC,SAASL;MAAS,CAAA;IACzE;AAEA,UAAMf,OAAOF,QAAAA;AACb,QAAIkB,YAAYA,aAAahB,KAAKqB,MAAM;AACtCjC,iBAAWE,OAAO4B,gBAAgBI,eAAe;QAAEF,SAASJ;QAAUO,MAAM;MAAO,CAAA;IACrF,WAAW,CAACP,YAAYhB,KAAKqB,MAAM;AACjCjC,iBAAWE,OAAO4B,gBAAgBI,eAAe;QAAEC,MAAM;MAAO,CAAA;IAClE;EACF;AAEA,SAAcC,YAAK,MAAMjB,iBAAAA,CAAAA;AACzBE,SAAOgB,iBAAiB,YAAYlB,gBAAAA;AAGpC,MAAImB;AACJ,MAAIC;AACJ,QAAMC,cAAcpC,SAASqC,UAAUnC,WAAW,MAAA;AAChD,UAAMK,QAAQF,SAAAA;AACd,UAAMG,OAAOF,QAAAA;AACb,UAAMuB,OAAOrB,KAAKqB;AAClB,UAAMnB,aAAaH,MAAMG;AAGzB,QAAImB,SAASK,YAAYxB,eAAeyB,gBAAgB;AACtDD,iBAAWL;AACXM,uBAAiBzB;AAEjB,YAAM4B,OAAOT,OAAO,IAAInB,UAAAA,IAAcmB,IAAAA,KAAS,IAAInB,UAAAA;AACnD,UAAIO,OAAOC,SAASF,aAAasB,MAAM;AAErCC,gBAAQC,UAAU,MAAM,IAAI,GAAGF,IAAAA,GAAOrB,OAAOC,SAASuB,MAAM,EAAE;MAChE;IACF;EACF,CAAA;AAEA,SAAOhD,WAAWiD,YAAY5C,OAAOL,WAAWkD,MAAM,MAAM,MACnDX,YAAK,MAAA;AACVf,WAAO2B,oBAAoB,YAAY7B,gBAAAA;AACvCqB,gBAAAA;EACF,CAAA,CAAA;AAEJ,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "Common", "invariant", "Capability", "makeModule", "fnUntraced", "invokeSync", "get", "Common", "OperationInvoker", "registry", "AtomRegistry", "stateAtom", "DeckCapabilities", "State", "getState", "getDeck", "state", "deck", "decks", "activeDeck", "invariant", "updateState", "fn", "set", "handleNavigation", "pathname", "window", "location", "s", "default", "defaultDeck", "_", "nextDeck", "nextSolo", "split", "LayoutOperation", "SwitchWorkspace", "subject", "solo", "SetLayoutMode", "mode", "sync", "addEventListener", "lastSolo", "lastActiveDeck", "unsubscribe", "subscribe", "path", "history", "pushState", "search", "contributes", "Null", "removeEventListener"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Operation } from '@dxos/operation';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\n\nimport { meta } from '../../meta';\nimport { DeckCapabilities } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n actions: (_node, get) =>\n Effect.gen(function* () {\n // NOTE(Zan): This is currently disabled.\n // TODO(Zan): Fullscreen needs to know the active node and provide that to the layout part.\n // const _fullscreen = {\n // id: `${LayoutAction.UpdateLayout._tag}/fullscreen`,\n // data: async () => {\n // const { dispatchPromise: dispatch } = context.get(Capabilities.IntentDispatcher);\n // await dispatch(\n // createIntent(LayoutAction.SetLayoutMode, { part: 'mode', options: { mode: 'fullscreen' } }),\n // );\n // },\n // properties: {\n // label: ['toggle fullscreen label', { ns: meta.id }],\n // icon: 'ph--arrows-out--regular',\n // keyBinding: {\n // macos: 'ctrl+meta+f',\n // windows: 'shift+ctrl+f',\n // },\n // },\n // };\n\n const closeCurrent = {\n id: `${Common.LayoutOperation.Close.meta.key}/current`,\n data: Effect.fnUntraced(function* () {\n const attention = yield* Capability.get(AttentionCapabilities.Attention);\n const attended = attention.getCurrent().at(-1);\n if (attended) {\n yield* Operation.invoke(Common.LayoutOperation.Close, { subject: [attended] });\n }\n }),\n properties: {\n label: ['close current label', { ns: meta.id }],\n icon: 'ph--x--regular',\n },\n };\n\n const closeOthers = {\n id: `${Common.LayoutOperation.Close.meta.key}/others`,\n data: Effect.fnUntraced(function* () {\n const attention = yield* Capability.get(AttentionCapabilities.Attention);\n const deck = yield* DeckCapabilities.getDeck();\n const attended = attention.getCurrent().at(-1);\n const ids = deck.active.filter((id: string) => id !== attended) ?? [];\n yield* Operation.invoke(Common.LayoutOperation.Close, { subject: ids });\n }),\n properties: {\n label: ['close others label', { ns: meta.id }],\n icon: 'ph--x-square--regular',\n },\n };\n\n const closeAll = {\n id: `${Common.LayoutOperation.Close.meta.key}/all`,\n data: Effect.fnUntraced(function* () {\n const deck = yield* DeckCapabilities.getDeck();\n yield* Operation.invoke(Common.LayoutOperation.Close, { subject: deck.active });\n }),\n properties: {\n label: ['close all label', { ns: meta.id }],\n icon: 'ph--x-circle--regular',\n },\n };\n\n const state = get(yield* Capability.get(DeckCapabilities.State));\n const deck = state.decks[state.activeDeck];\n\n const toggleSidebar = {\n id: `${Common.LayoutOperation.UpdateSidebar.meta.key}/nav`,\n data: Effect.fnUntraced(function* () {\n yield* Common.Capability.updateAtomValue(DeckCapabilities.State, (s) => ({\n ...s,\n sidebarState: s.sidebarState === 'expanded' ? ('collapsed' as const) : ('expanded' as const),\n }));\n }),\n properties: {\n label: [\n state.sidebarState === 'expanded'\n ? 'collapse navigation sidebar label'\n : 'open navigation sidebar label',\n { ns: meta.id },\n ],\n icon: 'ph--sidebar--regular',\n keyBinding: {\n macos: \"meta+'\",\n },\n disposition: 'pin-end',\n position: 'hoist',\n l0Breakpoint: 'lg',\n },\n };\n\n return !deck?.solo ? [closeCurrent, closeOthers, closeAll, toggleSidebar] : [toggleSidebar];\n }),\n });\n\n return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);\n }),\n);\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "Capability", "Common", "Operation", "AttentionCapabilities", "GraphBuilder", "NodeMatcher", "Capability", "makeModule", "fnUntraced", "extensions", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenRoot", "actions", "_node", "get", "gen", "closeCurrent", "Common", "LayoutOperation", "Close", "key", "data", "attention", "AttentionCapabilities", "Attention", "attended", "getCurrent", "at", "Operation", "invoke", "subject", "properties", "label", "ns", "icon", "closeOthers", "deck", "DeckCapabilities", "getDeck", "ids", "active", "filter", "closeAll", "state", "State", "decks", "activeDeck", "toggleSidebar", "UpdateSidebar", "updateAtomValue", "s", "sidebarState", "keyBinding", "macos", "disposition", "position", "l0Breakpoint", "solo", "contributes", "AppGraphBuilder"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/check-app-scheme/check-app-scheme.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\n\nimport { DeckCapabilities } from '../../types';\n\nconst isSocket = !!(globalThis as any).__args;\n\n// TODO(mjamesderocher): Can we get this directly from Socket?\nconst appScheme = 'composer://';\n\n// TODO(mjamesderocher): Factor out as part of NavigationPlugin.\nconst checkAppScheme = (url: string) => {\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n document.body.appendChild(iframe);\n\n iframe.src = url + window.location.pathname.replace(/^\\/+/, '') + window.location.search;\n\n const timer = setTimeout(() => {\n document.body.removeChild(iframe);\n }, 3000);\n\n window.addEventListener('pagehide', (event) => {\n clearTimeout(timer);\n document.body.removeChild(iframe);\n });\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const settings = yield* Common.Capability.getAtomValue(DeckCapabilities.Settings);\n if (!isSocket && settings?.enableNativeRedirect) {\n checkAppScheme(appScheme);\n }\n }),\n);\n"],
5
- "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AAInC,IAAMC,WAAW,CAAC,CAAEC,WAAmBC;AAGvC,IAAMC,YAAY;AAGlB,IAAMC,iBAAiB,CAACC,QAAAA;AACtB,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOG,MAAMC,UAAU;AACvBH,WAASI,KAAKC,YAAYN,MAAAA;AAE1BA,SAAOO,MAAMR,MAAMS,OAAOC,SAASC,SAASC,QAAQ,QAAQ,EAAA,IAAMH,OAAOC,SAASG;AAElF,QAAMC,QAAQC,WAAW,MAAA;AACvBb,aAASI,KAAKU,YAAYf,MAAAA;EAC5B,GAAG,GAAA;AAEHQ,SAAOQ,iBAAiB,YAAY,CAACC,UAAAA;AACnCC,iBAAaL,KAAAA;AACbZ,aAASI,KAAKU,YAAYf,MAAAA;EAC5B,CAAA;AACF;AAEA,IAAA,2BAAemB,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,WAAW,OAAOC,OAAOJ,WAAWK,aAAaC,iBAAiBC,QAAQ;AAChF,MAAI,CAAChC,YAAY4B,UAAUK,sBAAsB;AAC/C7B,mBAAeD,SAAAA;EACjB;AACF,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "Common", "isSocket", "globalThis", "__args", "appScheme", "checkAppScheme", "url", "iframe", "document", "createElement", "style", "display", "body", "appendChild", "src", "window", "location", "pathname", "replace", "search", "timer", "setTimeout", "removeChild", "addEventListener", "event", "clearTimeout", "Capability", "makeModule", "fnUntraced", "settings", "Common", "getAtomValue", "DeckCapabilities", "Settings", "enableNativeRedirect"]
7
- }
@@ -1,154 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/layout.ts
4
- import { produce } from "immer";
5
- import { ATTENDABLE_PATH_SEPARATOR } from "@dxos/react-ui-attention";
6
- var createEntryId = (entryId, variant) => variant ? `${entryId}${ATTENDABLE_PATH_SEPARATOR}${variant}` : entryId;
7
- var parseEntryId = (entryId) => {
8
- const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);
9
- return {
10
- id,
11
- variant
12
- };
13
- };
14
- var openEntry = (deck, _entryId, options) => {
15
- return produce(deck, (draft) => {
16
- const entryId = createEntryId(_entryId, options?.variant);
17
- if (draft.find((id) => id === entryId)) {
18
- return;
19
- }
20
- const key = options?.key;
21
- const plankPositioning = options?.positioning ?? "start";
22
- const pivotId = options?.pivotId;
23
- if (key) {
24
- const index = draft.findIndex((id) => id.split("+")[0] === key);
25
- if (index !== -1) {
26
- draft.splice(index, 1, entryId);
27
- return;
28
- }
29
- }
30
- if (pivotId) {
31
- const pivotIndex = draft.findIndex((id) => id === pivotId);
32
- if (pivotIndex !== -1) {
33
- if (plankPositioning === "start") {
34
- draft.splice(pivotIndex, 0, entryId);
35
- } else {
36
- draft.splice(pivotIndex + 1, 0, entryId);
37
- }
38
- return;
39
- }
40
- }
41
- if (plankPositioning === "start") {
42
- draft.unshift(entryId);
43
- } else {
44
- draft.push(entryId);
45
- }
46
- });
47
- };
48
- var closeEntry = (deck, entryId) => {
49
- return produce(deck, (draft) => {
50
- const index = draft.findIndex((id) => id === entryId);
51
- if (index !== -1) {
52
- draft.splice(index, 1);
53
- }
54
- });
55
- };
56
- var incrementPlank = (deck, adjustment) => {
57
- return produce(deck, (draft) => {
58
- const index = draft.findIndex((id) => id === adjustment.id);
59
- if (index === -1 || adjustment.type === "increment-start" && index === 0 || adjustment.type === "increment-end" && index === draft.length - 1) {
60
- return;
61
- }
62
- if (adjustment.type === "increment-start") {
63
- [draft[index - 1], draft[index]] = [
64
- draft[index],
65
- draft[index - 1]
66
- ];
67
- } else if (adjustment.type === "increment-end") {
68
- [draft[index], draft[index + 1]] = [
69
- draft[index + 1],
70
- draft[index]
71
- ];
72
- }
73
- });
74
- };
75
-
76
- // src/util/set-active.ts
77
- var computeActiveUpdates = ({ next, deck, attention }) => {
78
- const active = deck.solo ? [
79
- deck.solo
80
- ] : deck.active;
81
- const removed = active.filter((id) => !next.includes(id));
82
- const closed = Array.from(/* @__PURE__ */ new Set([
83
- ...deck.inactive.filter((id) => !next.includes(id)),
84
- ...removed
85
- ]));
86
- const updates = {
87
- inactive: closed,
88
- solo: deck.solo,
89
- active: deck.active,
90
- fullscreen: deck.fullscreen
91
- };
92
- if (deck.solo || !deck.initialized) {
93
- updates.solo = next[0];
94
- } else {
95
- updates.active = next;
96
- }
97
- if (deck.fullscreen && !updates.solo) {
98
- updates.fullscreen = false;
99
- }
100
- let toAttend;
101
- if (attention) {
102
- const attended = attention.getCurrent();
103
- const [attendedId] = Array.from(attended);
104
- const isAttendedAvailable = !!attendedId && next.includes(attendedId);
105
- if (!isAttendedAvailable) {
106
- const attendedIndex = active.indexOf(attendedId);
107
- const index = attendedIndex === -1 ? 0 : attendedIndex >= next.length ? next.length - 1 : attendedIndex;
108
- toAttend = next[index];
109
- }
110
- }
111
- return {
112
- deckUpdates: updates,
113
- toAttend
114
- };
115
- };
116
-
117
- // src/util/layoutAppliesTopbar.ts
118
- var layoutAppliesTopbar = (breakpoint, layoutMode) => {
119
- return document.body.getAttribute("data-platform") === "windows" && breakpoint === "desktop" && layoutMode !== "solo--fullscreen";
120
- };
121
-
122
- // src/util/overscroll.ts
123
- var calculateOverscroll = (planksCount) => {
124
- if (!planksCount) {
125
- return {
126
- paddingInlineStart: 0,
127
- paddingInlineEnd: 0
128
- };
129
- }
130
- if (planksCount === 1) {
131
- const overscrollPadding = "max(0px, calc(((100dvw - var(--dx-main-sidebarWidth) - var(--dx-main-complementaryWidth) - (var(--dx-main-contentFirstWidth) + 1px)) / 2)))";
132
- return {
133
- paddingInlineStart: overscrollPadding,
134
- paddingInlineEnd: overscrollPadding
135
- };
136
- } else {
137
- return {
138
- paddingInlineStart: "max(0px, calc(((100dvw - (var(--dx-main-contentFirstWidth) + 1px)) / 2) - var(--dx-main-sidebarWidth)))",
139
- paddingInlineEnd: "max(0px, calc(((100dvw - (var(--dx-main-contentLastWidth) + 1px)) / 2) - var(--dx-main-complementaryWidth)))"
140
- };
141
- }
142
- };
143
-
144
- export {
145
- createEntryId,
146
- parseEntryId,
147
- openEntry,
148
- closeEntry,
149
- incrementPlank,
150
- layoutAppliesTopbar,
151
- calculateOverscroll,
152
- computeActiveUpdates
153
- };
154
- //# sourceMappingURL=chunk-ADPMWKLL.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/layout.ts", "../../../src/util/set-active.ts", "../../../src/util/layoutAppliesTopbar.ts", "../../../src/util/overscroll.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { produce } from 'immer';\n\nimport { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';\n\nimport { type DeckAction, type NewPlankPositioning } from './types';\n\nexport const createEntryId = (entryId: string, variant?: string) =>\n variant ? `${entryId}${ATTENDABLE_PATH_SEPARATOR}${variant}` : entryId;\n\nexport const parseEntryId = (entryId: string) => {\n const [id, variant] = entryId.split(ATTENDABLE_PATH_SEPARATOR);\n return { id, variant };\n};\n\ntype OpenLayoutEntryOptions = {\n key?: string;\n positioning?: NewPlankPositioning;\n pivotId?: string;\n variant?: string;\n};\n\nexport const openEntry = (deck: string[], _entryId: string, options?: OpenLayoutEntryOptions): string[] => {\n return produce(deck, (draft) => {\n const entryId = createEntryId(_entryId, options?.variant);\n\n // Check that the entry is not already in the part\n if (draft.find((id) => id === entryId)) {\n return;\n }\n\n const key = options?.key;\n const plankPositioning = options?.positioning ?? 'start';\n const pivotId = options?.pivotId;\n\n if (key) {\n const index = draft.findIndex((id) => id.split('+')[0] === key);\n if (index !== -1) {\n draft.splice(index, 1, entryId);\n return;\n }\n }\n\n if (pivotId) {\n const pivotIndex = draft.findIndex((id) => id === pivotId);\n if (pivotIndex !== -1) {\n if (plankPositioning === 'start') {\n draft.splice(pivotIndex, 0, entryId);\n } else {\n draft.splice(pivotIndex + 1, 0, entryId);\n }\n return;\n }\n }\n\n // If no pivot found or provided, fall back to original behavior\n if (plankPositioning === 'start') {\n draft.unshift(entryId);\n } else {\n draft.push(entryId);\n }\n });\n};\n\nexport const closeEntry = (deck: string[], entryId: string): string[] => {\n return produce(deck, (draft) => {\n const index = draft.findIndex((id) => id === entryId);\n if (index !== -1) {\n draft.splice(index, 1);\n }\n });\n};\n\nexport const incrementPlank = (deck: string[], adjustment: DeckAction.Adjustment): string[] => {\n return produce(deck, (draft) => {\n const index = draft.findIndex((id) => id === adjustment.id);\n if (\n index === -1 ||\n (adjustment.type === 'increment-start' && index === 0) ||\n (adjustment.type === 'increment-end' && index === draft.length - 1)\n ) {\n return;\n }\n\n if (adjustment.type === 'increment-start') {\n // Swap the current item with the previous item.\n [draft[index - 1], draft[index]] = [draft[index], draft[index - 1]];\n } else if (adjustment.type === 'increment-end') {\n // Swap the current item with the next item.\n [draft[index], draft[index + 1]] = [draft[index + 1], draft[index]];\n }\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type AttentionManager } from '@dxos/plugin-attention';\n\nimport { type DeckState } from '../types';\n\nexport type SetActiveOptions = {\n next: string[];\n deck: DeckState;\n attention?: AttentionManager;\n};\n\nexport type SetActiveResult = {\n /** Updates to apply to the deck. */\n deckUpdates: {\n inactive: string[];\n solo: string | undefined;\n active: string[];\n fullscreen: boolean;\n };\n /** ID of the item to attend (scroll into view) if attention changed. */\n toAttend?: string;\n};\n\n/**\n * Computes the new active state for the deck without mutating.\n * Returns the updates to apply and optionally an item to attend.\n */\nexport const computeActiveUpdates = ({ next, deck, attention }: SetActiveOptions): SetActiveResult => {\n const active = deck.solo ? [deck.solo] : deck.active;\n const removed = active.filter((id) => !next.includes(id));\n const closed = Array.from(new Set([...deck.inactive.filter((id) => !next.includes(id)), ...removed]));\n\n const updates = {\n inactive: closed,\n solo: deck.solo,\n active: deck.active,\n fullscreen: deck.fullscreen,\n };\n\n if (deck.solo || !deck.initialized) {\n updates.solo = next[0];\n } else {\n updates.active = next;\n }\n\n if (deck.fullscreen && !updates.solo) {\n updates.fullscreen = false;\n }\n\n let toAttend: string | undefined;\n if (attention) {\n const attended = attention.getCurrent();\n const [attendedId] = Array.from(attended);\n const isAttendedAvailable = !!attendedId && next.includes(attendedId);\n if (!isAttendedAvailable) {\n const attendedIndex = active.indexOf(attendedId);\n // If outside of bounds, focus on the first/last plank, otherwise focus on the new plank in the same position.\n const index = attendedIndex === -1 ? 0 : attendedIndex >= next.length ? next.length - 1 : attendedIndex;\n toAttend = next[index];\n }\n }\n\n return { deckUpdates: updates, toAttend };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type LayoutMode } from '../types';\n\nexport const layoutAppliesTopbar = (breakpoint: string, layoutMode?: LayoutMode) => {\n return (\n document.body.getAttribute('data-platform') === 'windows' &&\n breakpoint === 'desktop' &&\n layoutMode !== 'solo--fullscreen'\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { CSSProperties } from 'react';\n\n/**\n * ┌────────────────────────────────────────────────────────────────────────────────────────────────────┐\n * | Overscroll Padding Calculation for Centering Planks on Screen. │\n * ├────────────────────────────────────────────────────────────────────────────────────────────────────┤\n * │ NOTE(Zan): I found the way you calculate the overscroll padding to center a plank on the screen │\n * │ at the edges of the scroll context a bit confusing, so I've diagrammed it here. │\n * │ │\n * │ Multiple Planks: │\n * │ ─────────────── │\n * | Use the following overscroll padding calculation centering the boundary planks on the SCREEN. │\n * │ │\n * │ Left Padding: Right Padding: │\n * │ ┌───┬────┬──────────────────┬──────┐ ┌──────┬──────────────────┬────┬───┐ │\n * │ │ │████│ Ideal │ │ │ │ Ideal │████│ │ │\n * │ │ S │█PL█│ first │ │ │ │ last │█PR█│ C │ │\n * │ │ │████│ plank │ │ │ │ plank │████│ │ │\n * │ └───┴────┴──────────────────┴──────┘ └──────┴──────────────────┴────┴───┘ │\n * │ <--------- screen width -----------> <---------- screen width ----------> │\n * │ │\n * │ PL = ((screen width - Plank Width) / 2) - S │\n * │ PR = ((screen width - Plank Width) / 2) - C │\n * │ │\n * │ S = Sidebar width C = Complementary sidebar width │\n * │ PL = Padding Left PR = Padding Right │\n * │ │\n * │ Single Plank: │\n * │ ───────────── │\n * │ For a single plank we use the following overscroll padding calculation to center the plank in │\n * │ the content area: │\n * │ │\n * │ ┌───┬───────────────────────┬───┬───────────────────────┬───┐ │\n * │ │ │███████████████████████│ │███████████████████████│ │ │\n * │ │ S │█████ Left Padding ████│ P │████ Right Padding ████│ C │ │\n * │ │ │███████████████████████│ │███████████████████████│ │ │\n * │ └───┴───────────────────────┴───┴───────────────────────┴───┘ │\n * │ <------------------------ screen width ---------------------> │\n * │ │\n * │ Left/Right Padding Width = (screen width - S - P - C) / 2 │\n * │ │\n * │ S = Sidebar width (may be 0) │\n * │ P = Plank width (centered) │\n * │ C = Complementary sidebar width (may be 0) │\n * └────────────────────────────────────────────────────────────────────────────────────────────────────┘\n */\nexport const calculateOverscroll = (\n planksCount: number,\n): Pick<CSSProperties, 'paddingInlineStart' | 'paddingInlineEnd'> | undefined => {\n if (!planksCount) {\n return { paddingInlineStart: 0, paddingInlineEnd: 0 };\n }\n if (planksCount === 1) {\n const overscrollPadding =\n 'max(0px, calc(((100dvw - var(--dx-main-sidebarWidth) - var(--dx-main-complementaryWidth) - (var(--dx-main-contentFirstWidth) + 1px)) / 2)))';\n return { paddingInlineStart: overscrollPadding, paddingInlineEnd: overscrollPadding };\n } else {\n return {\n paddingInlineStart:\n 'max(0px, calc(((100dvw - (var(--dx-main-contentFirstWidth) + 1px)) / 2) - var(--dx-main-sidebarWidth)))',\n paddingInlineEnd:\n 'max(0px, calc(((100dvw - (var(--dx-main-contentLastWidth) + 1px)) / 2) - var(--dx-main-complementaryWidth)))',\n };\n }\n};\n"],
5
- "mappings": "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",
6
- "names": ["produce", "ATTENDABLE_PATH_SEPARATOR", "createEntryId", "entryId", "variant", "ATTENDABLE_PATH_SEPARATOR", "parseEntryId", "id", "split", "openEntry", "deck", "_entryId", "options", "produce", "draft", "find", "key", "plankPositioning", "positioning", "pivotId", "index", "findIndex", "splice", "pivotIndex", "unshift", "push", "closeEntry", "incrementPlank", "adjustment", "type", "length", "computeActiveUpdates", "next", "deck", "attention", "active", "solo", "removed", "filter", "id", "includes", "closed", "Array", "from", "Set", "inactive", "updates", "fullscreen", "initialized", "toAttend", "attended", "getCurrent", "attendedId", "isAttendedAvailable", "attendedIndex", "indexOf", "index", "length", "deckUpdates", "layoutAppliesTopbar", "breakpoint", "layoutMode", "document", "body", "getAttribute", "calculateOverscroll", "planksCount", "paddingInlineStart", "paddingInlineEnd", "overscrollPadding"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/DeckLayout/Banner.tsx", "../../../src/components/Sidebar/ComplementarySidebar.tsx", "../../../src/components/Plank/Plank.tsx", "../../../src/components/Plank/PlankError.tsx", "../../../src/components/Plank/PlankHeading.tsx", "../../../src/components/fragments.ts", "../../../src/components/Plank/PlankControls.tsx", "../../../src/components/Plank/PlankLoading.tsx", "../../../src/components/Sidebar/SidebarButton.tsx", "../../../src/components/Sidebar/Sidebar.tsx", "../../../src/components/DeckLayout/DeckLayout.tsx", "../../../src/components/DeckLayout/ActiveNode.tsx", "../../../src/components/DeckLayout/DeckMain.tsx", "../../../src/components/DeckLayout/ContentEmpty.tsx", "../../../src/components/DeckLayout/StatusBar.tsx", "../../../src/components/DeckLayout/Topbar.tsx", "../../../src/components/DeckLayout/Dialog.tsx", "../../../src/components/DeckLayout/Popover.tsx", "../../../src/components/DeckLayout/Toast.tsx", "../../../src/components/DeckSettings/DeckSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { CloseSidebarButton, ToggleSidebarButton } from '../Sidebar';\n\nexport const Banner = ({ variant, classNames }: ThemedClassName<{ variant?: 'topbar' | 'sidebar' }>) => {\n const { t } = useTranslation(meta.id);\n return (\n <header\n className={mx(\n 'flex items-stretch relative plb-1 pis-1 pie-2',\n variant === 'topbar' &&\n 'fixed inset-inline-0 block-start-[env(safe-area-inset-top)] bs-[--rail-size] border-be border-separator',\n classNames,\n )}\n >\n {variant === 'sidebar' ? <CloseSidebarButton /> : <ToggleSidebarButton />}\n <span className='self-center grow mis-1'>{t('current app name', { ns: osTranslations })}</span>\n {variant === 'topbar' && (\n <div role='none' className='absolute inset-0 pointer-events-none'>\n <div role='none' className='grid bs-full pointer-fine:p-1 max-is-md mli-auto pointer-events-auto'>\n <Surface role='search-input' limit={1} />\n </div>\n </div>\n )}\n <span role='none' className='grow' />\n <Surface role='header-end' limit={1} />\n <Surface role='notch-start' limit={1} />\n </header>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n Fragment,\n type MouseEvent,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/react';\nimport { IconButton, type Label, Main, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { mx } from '@dxos/ui-theme';\n\nimport {\n type DeckCompanion,\n getCompanionId,\n useBreakpoints,\n useDeckCompanions,\n useDeckState,\n useHoistStatusbar,\n} from '../../hooks';\nimport { meta } from '../../meta';\nimport { getMode } from '../../types';\nimport { layoutAppliesTopbar } from '../../util';\nimport { PlankContentError, PlankLoading } from '../Plank';\n\nimport { ToggleComplementarySidebarButton } from './SidebarButton';\n\nconst label = ['complementary sidebar title', { ns: meta.id }] satisfies Label;\n\nexport type ComplementarySidebarProps = {\n current?: string;\n};\n\nexport const ComplementarySidebar = ({ current }: ComplementarySidebarProps) => {\n const { t } = useTranslation(meta.id);\n const { invokeSync } = useOperationInvoker();\n const { state, deck, updateState } = useDeckState();\n const layoutMode = getMode(deck);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);\n\n const companions = useDeckCompanions();\n const activeCompanion = companions.find((companion) => getCompanionId(companion.id) === current);\n const activeId = activeCompanion && getCompanionId(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((s) => ({\n ...s,\n complementarySidebarState: s.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',\n }));\n } else {\n setInternalValue(nextValue);\n updateState((s) => ({ ...s, complementarySidebarState: 'expanded' }));\n invokeSync(Common.LayoutOperation.UpdateComplementary, { subject: nextValue });\n }\n },\n [state.complementarySidebarState, activeId, invokeSync, 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 invokeSync(Common.LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n }\n }, [activeId, invokeSync]);\n\n return (\n <Main.ComplementarySidebar\n label={label}\n classNames={[\n topbar && 'block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',\n hoistStatusbar && 'block-end-[--statusbar-size]',\n ]}\n >\n <Tabs.Root orientation='vertical' verticalVariant='stateless' value={internalValue} classNames='contents'>\n <div\n role='none'\n className={mx(\n 'absolute z-[1] inset-block-0 inline-end-0 !is-[--r0-size]',\n 'pbs-[env(safe-area-inset-top)] pbe-[env(safe-area-inset-bottom)] border-is border-subduedSeparator',\n 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-baseSurface contain-layout app-drag',\n )}\n >\n <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-[--rail-action] p-1 gap-1 !overflow-y-auto'>\n {companions.map((companion) => (\n <Tabs.Tab key={getCompanionId(companion.id)} value={getCompanionId(companion.id)} asChild>\n <IconButton\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getCompanionId(companion.id)}\n variant={\n activeId === getCompanionId(companion.id)\n ? state.complementarySidebarState === 'expanded'\n ? 'primary'\n : 'default'\n : 'ghost'\n }\n onClick={handleTabClick}\n />\n </Tabs.Tab>\n ))}\n </Tabs.Tablist>\n {!hoistStatusbar && (\n <div role='none' className='grid grid-cols-1 auto-rows-[--rail-item] p-1 overflow-y-auto'>\n <Surface role='status-bar--r0-footer' limit={1} />\n </div>\n )}\n <div role='none' className='hidden lg:grid grid-cols-1 auto-rows-[--rail-action] p-1'>\n <ToggleComplementarySidebarButton />\n </div>\n </div>\n {activeId &&\n companions.map((companion) => (\n <Tabs.Tabpanel\n key={getCompanionId(companion.id)}\n value={getCompanionId(companion.id)}\n classNames={[\n 'absolute data-[state=\"inactive\"]:-z-[1] overflow-hidden',\n 'inset-block-0 inline-start-0 is-[calc(100%-var(--r0-size))] lg:is-[--r1-size]',\n 'grid grid-cols-1 grid-rows-[var(--rail-size)_1fr_min-content] pbs-[env(safe-area-inset-top)]',\n ]}\n {...(state.complementarySidebarState !== 'expanded' && { inert: true })}\n >\n <ComplementarySidebarPanel\n companion={companion}\n activeId={activeId}\n data={data}\n hoistStatusbar={hoistStatusbar}\n />\n </Tabs.Tabpanel>\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 hoistStatusbar: boolean;\n};\n\nconst ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }: ComplementarySidebarPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n if (getCompanionId(companion.id) !== activeId && !data) {\n return null;\n }\n\n const Wrapper = companion.properties.fixed ? Fragment : ScrollArea;\n\n return (\n <>\n <div role='none' className='flex items-center p-1 gap-1 border-be border-subduedSeparator'>\n <IconButton\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getCompanionId(companion.id)}\n classNames='bs-10 is-10'\n variant='default'\n />\n <div role='none' className='pli-1'>\n {toLocalizedString(companion.properties.label, t)}\n </div>\n </div>\n <Wrapper>\n <Surface\n role={`deck-companion--${getCompanionId(companion.id)}`}\n data={data}\n fallback={PlankContentError}\n placeholder={<PlankLoading />}\n />\n </Wrapper>\n {!hoistStatusbar && (\n <div\n role='contentinfo'\n className='flex flex-wrap justify-center items-center border-bs border-subduedSeparator pbs-1 pbe-[max(env(safe-area-inset-bottom),0.25rem)]'\n >\n <Surface role='status-bar--r1-footer' limit={1} />\n </div>\n )}\n </>\n );\n};\n\nconst ScrollArea = ({ children }: PropsWithChildren) => {\n return <div className='flex flex-col grow overflow-x-hidden overflow-y-auto scrollbar-thin'>{children}</div>;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport React, {\n type KeyboardEvent,\n type PropsWithChildren,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { Surface, useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { debounce } from '@dxos/async';\nimport { type Node, useNode } from '@dxos/plugin-graph';\nimport { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from '@dxos/react-ui-attention';\nimport { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';\nimport { mainIntrinsicSize, mx } from '@dxos/ui-theme';\n\nimport { useCompanions, useDeckState, useMainSize } from '../../hooks';\nimport { parseEntryId } from '../../layout';\nimport { DeckOperation, type DeckSettingsProps, type LayoutMode, type ResolvedPart } from '../../types';\n\nimport { PlankContentError, PlankError } from './PlankError';\nimport { PlankHeading } from './PlankHeading';\nimport { PlankLoading } from './PlankLoading';\n\nconst UNKNOWN_ID = 'unknown_id';\n\n//\n// Plank\n//\n\nexport type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path' | 'order' | 'active' | 'settings'> & {\n id?: string;\n companionId?: string;\n};\n\n// TODO(burdon): Factor out conditional rendering.\n// Remove this wrapper component and render the entire set of planks in the deck with conditional visibility\n// to obviate mounting and unmounting when switching between solo and companion mode?\n// NOTE(thure, in reply): Whether any surface should be rendered and hidden is a performance matter — remember that\n// article surfaces contain full experiences, so being able to unmount them will yield relatively large performance\n// benefits. I think where we anticipate users will definitely want to quickly switch between showing and hiding entire\n// articles, over the (again probably large) performance benefit that unmounting them would confer, we can mount and\n// hide them, but I think that scenario in its most unambiguous form is probably rare. You could extrapolate\n// the scenario to include all \"potential\" planks such as companions, which we could keep mounted and hidden, but I\n// don't think the resulting performance would be acceptable. I think the real issue is \"perceived performance\" which\n// has mitigations that are in between mounting and un-mounting since both of those have tradeoffs; we may need one or more\n// \"partially-mounted\" experiences, like loading skeletons at the simple end, or screenshots of \"sleeping\" planks at\n// the advanced end.\n\n/**\n * A Plank is the main container for surfaces within a Deck.\n * It may be paired with a companion plank that enables the user to select one of multiple companion surfaces.\n */\nexport const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProps) => {\n const { graph } = useAppGraph();\n const node = useNode(graph, id);\n const companions = useCompanions(id);\n const currentCompanion = companions.find(({ id }) => id === companionId);\n const hasCompanion = !!(companionId && currentCompanion);\n\n return (\n <PlankContainer\n solo={props.part === 'solo'}\n companion={hasCompanion}\n encapsulate={!!props.settings?.encapsulatedPlanks}\n >\n <PlankComponent\n id={id}\n node={node}\n companioned={hasCompanion ? 'primary' : undefined}\n companions={hasCompanion ? [] : companions}\n {...props}\n {...(props.part === 'solo' ? { part: 'solo-primary' } : {})}\n />\n {hasCompanion && (\n <PlankComponent\n id={companionId}\n node={currentCompanion}\n primary={node}\n companions={companions}\n companioned='companion'\n {...props}\n {...(props.part === 'solo' ? { part: 'solo-companion' } : { order: (props.order ?? 0) + 1 })}\n />\n )}\n </PlankContainer>\n );\n});\n\n//\n// PlankContainer\n//\n\ntype PlankContainerProps = PropsWithChildren<{ solo: boolean; companion: boolean; encapsulate: boolean }>;\n\nconst PlankContainer = ({ children, solo, companion, encapsulate }: PlankContainerProps) => {\n const sizeAttrs = useMainSize();\n if (!solo) {\n return children;\n }\n\n // TODO(burdon): Make resizable.\n return (\n <div\n role='none'\n data-popover-collision-boundary={true}\n className={mx(\n 'absolute inset-[--main-spacing] grid',\n encapsulate && 'border border-separator rounded overflow-hidden',\n companion && 'grid-cols-[6fr_4fr]', // TODO(burdon): Resize.\n railGridHorizontal,\n mainIntrinsicSize,\n )}\n {...sizeAttrs}\n >\n {children}\n </div>\n );\n};\n\n//\n// PlankComponent\n//\n\ntype PlankComponentProps = {\n layoutMode: LayoutMode;\n id: string;\n part: ResolvedPart;\n path?: string[];\n order?: number;\n active?: string[];\n companioned?: 'primary' | 'companion';\n node?: Node.Node;\n primary?: Node.Node;\n companions?: Node.Node[];\n settings?: DeckSettingsProps;\n};\n\nconst PlankComponent = memo(\n ({\n layoutMode,\n id,\n part,\n path,\n order,\n active,\n companioned,\n node,\n primary,\n companions,\n settings,\n }: PlankComponentProps) => {\n const { invokePromise } = useOperationInvoker();\n const { state, deck } = useDeckState();\n const { popoverAnchorId, scrollIntoView } = state;\n const { findFirstFocusable } = useFocusFinders();\n const canResize = layoutMode === 'deck';\n\n const attentionAttrs = useAttentionAttributes(primary?.id ?? id);\n const index = active ? active.findIndex((entryId) => entryId === id) : 0;\n const length = active?.length ?? 1;\n const canIncrementStart = active && index !== undefined && index > 0 && length !== undefined && length > 1;\n const canIncrementEnd = active && index !== undefined && index < length - 1 && length !== undefined;\n\n const rootElement = useRef<HTMLDivElement | null>(null);\n\n const { variant } = parseEntryId(id);\n const sizeKey = `${id.split('+')[0]}${variant ? `${ATTENDABLE_PATH_SEPARATOR}${variant}` : ''}`;\n const size = deck.plankSizing[sizeKey] as number | undefined;\n\n const handleSizeChange = useCallback(\n debounce((nextSize: number) => {\n return invokePromise(DeckOperation.UpdatePlankSize, { id: sizeKey, size: nextSize });\n }, 200),\n [invokePromise, sizeKey],\n );\n\n // TODO(thure): Tabster's focus group should handle moving focus to Main, but something is blocking it.\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.target === event.currentTarget) {\n switch (event.key) {\n case 'Escape':\n rootElement.current?.closest('main')?.focus();\n break;\n case 'Enter':\n rootElement.current && findFirstFocusable(rootElement.current)?.focus();\n break;\n }\n }\n }, []);\n\n useLayoutEffect(() => {\n if (scrollIntoView === id) {\n layoutMode === 'deck' && rootElement.current?.scrollIntoView({ behavior: 'smooth', inline: 'center' });\n // Clear the scroll into view state once it has been actioned.\n void invokePromise(Common.LayoutOperation.ScrollIntoView, { subject: undefined });\n }\n }, [id, scrollIntoView, layoutMode, invokePromise]);\n\n const isSolo = layoutMode.startsWith('solo') && part === 'solo';\n const isAttendable =\n (layoutMode.startsWith('solo') && part.startsWith('solo')) || (layoutMode === 'deck' && part === 'deck');\n\n const sizeAttrs = useMainSize();\n\n const data = useMemo(\n () =>\n node && {\n attendableId: id,\n subject: node.data,\n companionTo: primary?.data,\n properties: node.properties,\n variant,\n path,\n popoverAnchorId,\n },\n [node, node?.data, node?.properties, path, popoverAnchorId, primary?.data, variant],\n );\n\n // TODO(wittjosiah): Change prop to accept a component.\n const placeholder = useMemo(() => <PlankLoading />, []);\n\n const Root = part.startsWith('solo') ? 'article' : StackItem.Root;\n const fullscreen = layoutMode === 'solo--fullscreen';\n const className = mx(\n 'attention-surface relative dx-focus-ring-inset-over-all density-coarse',\n isSolo && 'absolute inset-0',\n isSolo && mainIntrinsicSize,\n railGridHorizontal,\n part.startsWith('solo') && 'grid',\n part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-is-0',\n fullscreen && 'grid-rows-1',\n part === 'deck' && (companioned === 'companion' ? '!border-separator border-ie' : '!border-separator border-li'),\n part === 'solo-companion' && '!border-separator border-is',\n settings?.encapsulatedPlanks &&\n !part.startsWith('solo') &&\n 'mli-[--main-spacing] !border-separator border rounded overflow-hidden',\n );\n\n return (\n <Root\n ref={rootElement}\n data-testid='deck.plank'\n data-popover-collision-boundary={true}\n tabIndex={0}\n {...(part.startsWith('solo')\n ? ({ ...sizeAttrs, className } as any)\n : {\n item: { id },\n size,\n onSizeChange: handleSizeChange,\n classNames: className,\n order,\n role: 'article',\n })}\n {...(isAttendable ? attentionAttrs : {})}\n onKeyDown={handleKeyDown}\n >\n {node ? (\n <>\n {!fullscreen && (\n <PlankHeading\n id={id}\n part={part.startsWith('solo-') ? 'solo' : part}\n node={node}\n layoutMode={layoutMode}\n deckEnabled={settings?.enableDeck}\n canIncrementStart={canIncrementStart}\n canIncrementEnd={canIncrementEnd}\n popoverAnchorId={popoverAnchorId}\n primaryId={primary?.id}\n companioned={companioned}\n companions={companions}\n />\n )}\n <Surface\n key={node.id}\n role='article'\n data={data}\n limit={1}\n fallback={PlankContentError}\n placeholder={placeholder}\n />\n </>\n ) : (\n <PlankError id={id} part={part} />\n )}\n {canResize && <StackItem.ResizeHandle />}\n </Root>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useState } from 'react';\n\nimport { type Node } from '@dxos/plugin-graph';\nimport { useTranslation } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nimport { PlankHeading, type PlankHeadingProps } from './PlankHeading';\nimport { PlankLoading } from './PlankLoading';\n\nexport const PlankContentError = ({ error }: { error?: Error }) => {\n const { t } = useTranslation(meta.id);\n const errorString = error?.toString() ?? '';\n return (\n <div role='none' className='overflow-y-auto p-8 attention-surface grid place-items-center'>\n <p role='alert' className={mx(descriptionMessage, 'break-all rounded-md p-4')}>\n {error ? errorString : t('error fallback message')}\n </p>\n </div>\n );\n};\n\nexport const PlankError = ({\n id,\n part,\n node,\n error,\n}: {\n id: string;\n part: PlankHeadingProps['part'];\n node?: Node.Node;\n error?: Error;\n}) => {\n const [timedOut, setTimedOut] = useState(false);\n useEffect(() => {\n setTimeout(() => setTimedOut(true), 5e3);\n }, []);\n return (\n <>\n <PlankHeading id={id} part={part} node={node} pending={!timedOut} />\n {timedOut ? <PlankContentError error={error} /> : <PlankLoading />}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { Surface, useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Graph, type Node, useActionRunner } from '@dxos/plugin-graph';\nimport { Icon, IconButton, Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { StackItem, type StackItemSigilAction } from '@dxos/react-ui-stack';\nimport { TextTooltip } from '@dxos/react-ui-text-tooltip';\nimport { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';\n\nimport { useBreakpoints } from '../../hooks';\nimport { parseEntryId } from '../../layout';\nimport { meta } from '../../meta';\nimport { DeckOperation, type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '../../types';\nimport { soloInlinePadding } from '../fragments';\n\nimport { PlankCompanionControls, PlankControls } from './PlankControls';\n\nconst MAX_COMPANIONS = 5;\n\nexport type PlankHeadingProps = {\n id: string;\n part: ResolvedPart;\n layoutMode?: LayoutMode;\n node?: Node.Node;\n deckEnabled?: boolean;\n canIncrementStart?: boolean;\n canIncrementEnd?: boolean;\n popoverAnchorId?: string;\n primaryId?: string;\n pending?: boolean;\n companioned?: 'primary' | 'companion';\n companions?: Node.Node[];\n actions?: StackItemSigilAction[];\n};\n\nexport const PlankHeading = memo(\n ({\n id,\n part,\n node,\n deckEnabled,\n canIncrementStart,\n canIncrementEnd,\n popoverAnchorId,\n primaryId,\n pending,\n companioned,\n companions,\n layoutMode,\n actions = [],\n }: PlankHeadingProps) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise, invokeSync } = useOperationInvoker();\n const runAction = useActionRunner();\n const { graph } = useAppGraph();\n const breakpoint = useBreakpoints();\n const icon = node?.properties?.icon ?? 'ph--placeholder--regular';\n const label = pending\n ? t('pending heading')\n : toLocalizedString(node?.properties?.label ?? ['plank heading fallback label', { ns: meta.id }], t);\n\n const isCompanionNode = node?.type === PLANK_COMPANION_TYPE;\n\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n // Load actions for the node.\n if (node) {\n void Graph.expand(graph, node.id);\n }\n });\n\n return () => cancelAnimationFrame(frame);\n }, [node]);\n\n const attendableId = primaryId ?? id;\n const capabilities = useMemo(\n () => ({\n deck: deckEnabled ?? true,\n solo: breakpoint !== 'mobile' && (part === 'solo' || part === 'deck'),\n incrementStart: canIncrementStart,\n incrementEnd: canIncrementEnd,\n fullscreen: !isCompanionNode,\n companion: !isCompanionNode && companions && companions.length > 0,\n }),\n [breakpoint, part, companions, canIncrementStart, canIncrementEnd, isCompanionNode, deckEnabled],\n );\n\n const { variant } = parseEntryId(id);\n const sigilActions = useMemo(() => {\n if (!node) {\n return undefined;\n } else if (variant) {\n return [];\n } else {\n return [\n actions,\n Graph.getActions(graph, node.id).filter((a) =>\n ['list-item', 'list-item-primary', 'heading-list-item'].includes(a.properties.disposition),\n ),\n ].filter((a) => a.length > 0);\n }\n }, [actions, node, variant, graph]);\n\n const handleAction = useCallback(\n (action: StackItemSigilAction) => {\n if (typeof action.data === 'function') {\n void runAction(action as Node.Action, { parent: node, caller: meta.id });\n }\n },\n [node, runAction],\n );\n\n const handlePlankAction = useCallback(\n (eventType: DeckOperation.PartAdjustment) => {\n if (eventType.startsWith('solo')) {\n return invokePromise(DeckOperation.Adjust, { type: eventType, id });\n } else if (eventType === 'close') {\n if (part === 'complementary') {\n return invokeSync(Common.LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n } else {\n return invokeSync(Common.LayoutOperation.Close, { subject: [id] });\n }\n } else {\n return invokePromise(DeckOperation.Adjust, { type: eventType, id });\n }\n },\n [invokePromise, invokeSync, id, part],\n );\n\n const ActionRoot = node && popoverAnchorId === `dxos.org/ui/${meta.id}/${node.id}` ? Popover.Anchor : Fragment;\n\n const handleTabClick = useCallback(\n (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('[data-id]') as HTMLElement | null;\n const tabId = target?.dataset?.id;\n if (primaryId && tabId) {\n void invokePromise(DeckOperation.ChangeCompanion, {\n primary: primaryId,\n companion: tabId,\n });\n }\n },\n [primaryId, invokePromise],\n );\n\n return (\n <StackItem.Heading\n classNames={[\n 'plb-1 items-stretch gap-1 sticky inline-start-12 app-drag min-is-0 contain-layout density-coarse',\n part === 'solo' ? soloInlinePadding : 'pli-1',\n ...(layoutMode === 'solo--fullscreen'\n ? [\n hoverableControls,\n hoverableFocusedWithinControls,\n '*:transition-opacity *:opacity-[--controls-opacity] bg-transparent border-transparent transition-[background-color,border-color]',\n 'hover-hover:hover:bg-headerSurface focus-within:bg-headerSurface hover-hover:hover:border-subduedSeparator focus-within:border-subduedSeparator',\n ]\n : []),\n ]}\n data-plank-heading\n >\n {companions && isCompanionNode ? (\n /* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */\n <div role='none' className='flex-1 min-is-0 overflow-x-auto scrollbar-none flex gap-1'>\n {companions.map(({ id, properties: { icon, label } }) => (\n <IconButton\n key={id}\n data-id={id}\n icon={icon}\n iconOnly={companions.length > MAX_COMPANIONS && node?.id !== id}\n label={toLocalizedString(label, t)}\n variant={node?.id === id ? 'primary' : 'ghost'}\n onClick={handleTabClick}\n />\n ))}\n </div>\n ) : (\n <>\n <ActionRoot>\n {node && sigilActions ? (\n <StackItem.Sigil\n icon={icon}\n related={part === 'complementary'}\n attendableId={attendableId}\n triggerLabel={t('actions menu label')}\n actions={sigilActions}\n onAction={handleAction}\n >\n <Surface role='menu-footer' data={{ subject: node.data }} />\n </StackItem.Sigil>\n ) : (\n <StackItem.SigilButton>\n <span className='sr-only'>{label}</span>\n <Icon icon={icon} />\n </StackItem.SigilButton>\n )}\n </ActionRoot>\n <TextTooltip text={label} onlyWhenTruncating>\n <StackItem.HeadingLabel\n attendableId={attendableId}\n related={part === 'complementary'}\n {...(pending && { classNames: 'text-description' })}\n >\n {label}\n </StackItem.HeadingLabel>\n </TextTooltip>\n </>\n )}\n {node && part !== 'complementary' && <Surface role='navbar-end' data={{ subject: node.data }} />}\n {companioned === 'companion' ? (\n <PlankCompanionControls primary={primaryId} />\n ) : (\n <PlankControls\n capabilities={capabilities}\n layoutMode={layoutMode}\n close={part === 'complementary' ? 'minify-end' : true}\n onClick={handlePlankAction}\n />\n )}\n </StackItem.Heading>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { mx } from '@dxos/ui-theme';\n\nexport const soloInlinePadding =\n 'pis-[calc(env(safe-area-inset-left)+.25rem)] pie-[calc(env(safe-area-inset-left)+.25rem)]';\n\nconst sidebarToggleStyles = 'bs-[--rail-item] is-[--rail-item] absolute block-end-2 z-[1] !bg-deckSurface lg:hidden';\n\nexport const fixedSidebarToggleStyles = mx(sidebarToggleStyles, 'inline-start-2');\n\nexport const fixedComplementarySidebarToggleStyles = mx(sidebarToggleStyles, 'inline-end-2');\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { invariant } from '@dxos/invariant';\nimport { ButtonGroup, type ButtonGroupProps, type ButtonProps, IconButton, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '../../meta';\nimport { type DeckAction, DeckOperation, type LayoutMode } from '../../types';\n\nexport type PlankControlHandler = (event: DeckAction.PartAdjustment) => void;\n\nexport type PlankCapabilities = {\n incrementStart?: boolean;\n incrementEnd?: boolean;\n deck?: boolean;\n solo?: boolean;\n fullscreen?: boolean;\n companion?: boolean;\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\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\nconst plankControlSpacing = 'pli-2';\n\ntype PlankComplimentControlsProps = {\n primary?: string;\n};\n\nexport const PlankCompanionControls = forwardRef<HTMLDivElement, PlankComplimentControlsProps>(\n ({ primary }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const handleCloseCompanion = useCallback(() => {\n invariant(primary);\n return invokePromise(DeckOperation.ChangeCompanion, { primary, companion: null });\n }, [invokePromise, primary]);\n return (\n <div ref={forwardedRef} className='contents 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\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.id);\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={['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 && (\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 <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 )}\n {children}\n </ButtonGroup>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\n// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259\nexport const PlankLoading = () => {\n return <div role='none' className='grid place-items-center attention-surface' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { IconButton, type IconButtonProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { getCompanionId, useDeckCompanions, useDeckState } from '../../hooks';\nimport { meta } from '../../meta';\n\nexport const ToggleSidebarButton = ({\n classNames,\n variant = 'ghost',\n}: ThemedClassName<Pick<IconButtonProps, 'variant'>>) => {\n const { state, updateState } = useDeckState();\n const { t } = useTranslation(meta.id);\n\n const handleClick = useCallback(() => {\n updateState((s) => ({\n ...s,\n sidebarState: s.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.id);\n\n const handleClick = useCallback(() => {\n updateState((s) => ({ ...s, 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 label')}\n onClick={handleClick}\n classNames='rounded-none pli-1 dx-focus-ring-inset pie-[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 { invokeSync } = useOperationInvoker();\n const { state, updateState } = useDeckState();\n const { t } = useTranslation(meta.id);\n\n const companions = useDeckCompanions();\n const handleClick = useCallback(() => {\n const nextState = state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded';\n updateState((s) => ({ ...s, complementarySidebarState: nextState }));\n\n const subject = state.complementarySidebarPanel ?? (companions[0] && getCompanionId(companions[0].id));\n if (nextState === 'expanded' && !current && subject) {\n invokeSync(Common.LayoutOperation.UpdateComplementary, { subject });\n }\n }, [state, updateState, current, companions, invokeSync]);\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={t('open complementary sidebar label')}\n size={inR0 ? 5 : 4}\n tooltipSide={inR0 ? 'left' : undefined}\n onClick={handleClick}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { type Label, Main } from '@dxos/react-ui';\n\nimport { useBreakpoints, useDeckState, useHoistStatusbar } from '../../hooks';\nimport { meta } from '../../meta';\nimport { getMode } from '../../types';\nimport { layoutAppliesTopbar } from '../../util';\n\nconst label = ['sidebar title', { ns: meta.id }] 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 const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);\n\n const navigationData = useMemo(\n () => ({ popoverAnchorId, topbar, hoistStatusbar, current }),\n [popoverAnchorId, topbar, hoistStatusbar, current],\n );\n\n return (\n <Main.NavigationSidebar\n label={label}\n classNames={[\n 'grid',\n topbar && 'block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',\n hoistStatusbar && 'block-end-[--statusbar-size]',\n ]}\n >\n <Surface role='navigation' data={navigationData} limit={1} />\n </Main.NavigationSidebar>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Mosaic } from '@dxos/react-ui-mosaic';\n\nimport { useDeckState } from '../../hooks';\n\nimport { ActiveNode } from './ActiveNode';\nimport { DeckMain } from './DeckMain';\nimport { Dialog } from './Dialog';\nimport { PopoverContent, PopoverRoot } from './Popover';\nimport { Toaster, type ToasterProps } from './Toast';\n\nexport type DeckLayoutProps = Pick<ToasterProps, 'onDismissToast'>;\n\nexport const DeckLayout = ({ onDismissToast }: DeckLayoutProps) => {\n const { state } = useDeckState();\n const { toasts } = state;\n\n return (\n <Mosaic.Root>\n <PopoverRoot>\n <ActiveNode />\n <DeckMain />\n <PopoverContent />\n <Dialog />\n <Toaster toasts={toasts} onDismissToast={onDismissToast} />\n </PopoverRoot>\n </Mosaic.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface, useAppGraph } from '@dxos/app-framework/react';\nimport { useNode } from '@dxos/plugin-graph';\nimport { useAttended } from '@dxos/react-ui-attention';\n\nimport { useNodeActionExpander } from '../../hooks';\n\n// TODO(burdon): Factor out to effect in plugin set document title.\nexport const ActiveNode = () => {\n const [id] = useAttended();\n const { graph } = useAppGraph();\n const activeNode = useNode(graph, id);\n useNodeActionExpander(activeNode);\n\n return (\n <div role='none' className='sr-only'>\n {/* TODO(wittjosiah): Weird that this is a surface, feel like it's not really render logic.\n Probably this lives in React-land currently in order to access translations? */}\n <Surface role='document-title' data={{ subject: activeNode }} limit={1} />\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Fragment, type UIEvent, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useAtomCapability, useOperationInvoker, usePluginManager } from '@dxos/app-framework/react';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { Main, type MainContentProps, useMediaQuery, useOnTransition } from '@dxos/react-ui';\nimport { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from '@dxos/react-ui-stack';\nimport { mainPaddingTransitions, mx } from '@dxos/ui-theme';\n\nimport { useBreakpoints, useDeckState, useHoistStatusbar } from '../../hooks';\nimport { DeckCapabilities, getMode } from '../../types';\nimport { calculateOverscroll, layoutAppliesTopbar } from '../../util';\nimport { fixedComplementarySidebarToggleStyles, fixedSidebarToggleStyles } from '../fragments';\nimport { Plank } from '../Plank';\nimport { ComplementarySidebar, Sidebar, ToggleComplementarySidebarButton, ToggleSidebarButton } from '../Sidebar';\n\nimport { ContentEmpty } from './ContentEmpty';\nimport { StatusBar } from './StatusBar';\nimport { Topbar } from './Topbar';\n\nexport const DeckMain = () => {\n const { invokeSync } = useOperationInvoker();\n const settings = useAtomCapability(DeckCapabilities.Settings);\n const { state, deck, updateState } = useDeckState();\n const { sidebarState, complementarySidebarState, complementarySidebarPanel } = state;\n const { active, activeCompanions, fullscreen, solo, plankSizing } = deck;\n const layoutMode = getMode(deck);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);\n const pluginManager = usePluginManager();\n\n const scrollLeftRef = useRef<number>(null);\n const deckRef = useRef<HTMLDivElement>(null);\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 === 'deck') {\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\n shouldRevert.current = true;\n invokeSync(Common.LayoutOperation.SetLayoutMode, { subject: attended[0], mode: 'solo' });\n } else if (isNotMobile && layoutMode === 'solo' && shouldRevert.current) {\n invokeSync(Common.LayoutOperation.SetLayoutMode, { revert: true });\n }\n // NOTE: Using `layoutMode` instead of `deck` to avoid infinite loops caused by object reference changes.\n }, [isNotMobile, layoutMode, invokeSync]);\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 === 'deck') {\n invokeSync(Common.LayoutOperation.SetLayoutMode, { subject: active[0], mode: 'solo' });\n }\n }, [settings?.enableDeck, invokeSync, active, layoutMode]);\n\n /**\n * Clear scroll restoration state if the window is resized.\n */\n const handleResize = useCallback(() => {\n scrollLeftRef.current = null;\n }, []);\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [handleResize]);\n\n const restoreScroll = useCallback(() => {\n if (deckRef.current && scrollLeftRef.current != null) {\n deckRef.current.scrollLeft = scrollLeftRef.current;\n }\n }, []);\n useOnTransition(layoutMode, (mode) => mode !== 'deck', 'deck', restoreScroll);\n\n /**\n * Save scroll position as the user scrolls.\n */\n const handleScroll = useCallback(\n (event: UIEvent) => {\n if (!solo && event.currentTarget === event.target) {\n scrollLeftRef.current = (event.target as HTMLDivElement).scrollLeft;\n }\n },\n [solo],\n );\n\n const isEmpty = !solo && active.length === 0;\n\n const padding = useMemo(() => {\n if (!solo && settings?.overscroll === 'centering') {\n return calculateOverscroll(active.length);\n }\n return {};\n }, [solo, settings?.overscroll, deck]);\n\n const mainPosition = useMemo(\n () => [\n 'grid !block-start-[env(safe-area-inset-top)]',\n topbar && '!block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',\n hoistStatusbar && 'lg:block-end-[--statusbar-size]',\n ],\n [topbar, hoistStatusbar],\n );\n\n const { order, itemsCount }: { order: Record<string, number>; itemsCount: number } = useMemo(() => {\n return active.reduce(\n (acc: { order: Record<string, number>; itemsCount: number }, entryId) => {\n acc.order[entryId] = acc.itemsCount + 1;\n acc.itemsCount += activeCompanions?.[entryId] ? 3 : 2;\n return acc;\n },\n { order: {}, itemsCount: 0 },\n );\n }, [active, activeCompanions]);\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 {/* Left sidebar. */}\n <Sidebar />\n\n {/* Right sidebar. */}\n <ComplementarySidebar current={complementarySidebarPanel} />\n\n {/* Dialog overlay to dismiss dialogs. */}\n <Main.Overlay />\n\n {/* No content. */}\n {isEmpty && (\n <Main.Content bounce handlesFocus classNames={mainPosition}>\n <ContentEmpty />\n </Main.Content>\n )}\n\n {/* Solo/deck mode. */}\n {!isEmpty && (\n <Main.Content\n bounce\n handlesFocus\n classNames={mainPosition}\n style={\n {\n '--main-spacing': settings?.encapsulatedPlanks ? '0.75rem' : '0',\n '--dx-main-sidebarWidth':\n sidebarState === 'expanded'\n ? 'var(--nav-sidebar-size)'\n : sidebarState === 'collapsed'\n ? 'var(--l0-size)'\n : '0',\n '--dx-main-complementaryWidth':\n complementarySidebarState === 'expanded'\n ? 'var(--complementary-sidebar-size)'\n : complementarySidebarState === 'collapsed'\n ? 'var(--rail-size)'\n : '0',\n '--dx-main-contentFirstWidth': `${plankSizing[active[0] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,\n '--dx-main-contentLastWidth': `${plankSizing[active[(active.length ?? 1) - 1] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,\n } as MainContentProps['style']\n }\n >\n {/* Deck mode. */}\n <div\n role='none'\n className={!solo ? 'relative bg-deckSurface overflow-hidden' : 'sr-only'}\n {...(solo && { inert: true })}\n >\n {!topbar && !fullscreen && <ToggleSidebarButton classNames={fixedSidebarToggleStyles} />}\n {!topbar && !fullscreen && (\n <ToggleComplementarySidebarButton classNames={fixedComplementarySidebarToggleStyles} />\n )}\n <Stack\n ref={deckRef}\n orientation='horizontal'\n size='contain'\n itemsCount={itemsCount - 1}\n classNames={[\n 'absolute inset-block-[--main-spacing] -inset-inline-px bs-[calc(100%-2*var(--main-spacing))]',\n mainPaddingTransitions,\n ]}\n style={padding}\n onScroll={handleScroll}\n >\n {active.map((entryId) => (\n <Fragment key={entryId}>\n <PlankSeparator order={order[entryId] - 1} encapsulate={!!settings?.enableDeck} />\n <Plank\n id={entryId}\n companionId={activeCompanions?.[entryId]}\n part='deck'\n order={order[entryId]}\n active={active}\n layoutMode={layoutMode}\n settings={settings}\n />\n </Fragment>\n ))}\n </Stack>\n </div>\n\n {/* Solo mode. */}\n <div\n role='none'\n className={solo ? 'relative overflow-hidden bg-deckSurface' : 'sr-only'}\n {...(!solo && { inert: true })}\n >\n {!topbar && !fullscreen && <ToggleSidebarButton classNames={fixedSidebarToggleStyles} />}\n {!topbar && !fullscreen && (\n <ToggleComplementarySidebarButton classNames={fixedComplementarySidebarToggleStyles} />\n )}\n <StackContext.Provider\n value={{\n orientation: 'horizontal',\n size: 'contain',\n rail: true,\n }}\n >\n <Plank\n id={solo}\n companionId={solo ? activeCompanions?.[solo] : undefined}\n part='solo'\n layoutMode={layoutMode}\n settings={settings}\n />\n </StackContext.Provider>\n </div>\n </Main.Content>\n )}\n\n {/* Topbar. */}\n {topbar && <Topbar />}\n\n {/* Status bar. */}\n {hoistStatusbar && <StatusBar showHints={settings?.showHints} />}\n </Main.Root>\n );\n};\n\nconst PlankSeparator = ({ order, encapsulate }: { order: number; encapsulate?: boolean }) =>\n order > 0 ? (\n <span\n role='separator'\n className={mx('row-span-2 bg-deckSurface', encapsulate ? 'is-0' : 'is-4')}\n style={{ gridColumn: order }}\n />\n ) : null;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\n\nimport { useBreakpoints, useDeckState } from '../../hooks';\nimport { getMode } from '../../types';\nimport { layoutAppliesTopbar } from '../../util';\nimport { fixedSidebarToggleStyles } from '../fragments';\nimport { ToggleSidebarButton } from '../Sidebar';\n\nexport const ContentEmpty = () => {\n const breakpoint = useBreakpoints();\n const { deck } = useDeckState();\n const layoutMode = getMode(deck);\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n return (\n <div\n role='none'\n className='grid place-items-center p-8 relative bg-deckSurface'\n data-testid='layoutPlugin.firstRunMessage'\n >\n <Surface role='keyshortcuts' />\n {!topbar && <ToggleSidebarButton variant='default' classNames={fixedSidebarToggleStyles} />}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { useLandmarkMover } from '@dxos/react-ui';\n\nexport const StatusBar = ({ showHints }: { showHints?: boolean }) => {\n const mover = useLandmarkMover(undefined, '3');\n return (\n <div\n role='contentinfo'\n className='fixed block-end-0 inset-inline-0 bs-[--statusbar-size] border-bs border-separator z-[2] flex text-description'\n {...mover}\n >\n {showHints && <Surface role='hints' limit={1} />}\n <Surface role='status-bar' limit={1} />\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Banner } from './Banner';\n\nexport const Topbar = () => {\n return <Banner variant='topbar' />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';\n\nimport { useDeckState } from '../../hooks';\nimport { PlankContentError } from '../Plank';\n\nexport const Dialog = () => {\n const { state, updateEphemeral } = useDeckState();\n const { dialogOpen, dialogType, dialogBlockAlign, dialogOverlayClasses, dialogOverlayStyle, dialogContent } = state;\n const Root = dialogType === 'alert' ? AlertDialog.Root : NaturalDialog.Root;\n const Overlay = dialogType === 'alert' ? AlertDialog.Overlay : NaturalDialog.Overlay;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n updateEphemeral((s) => ({ ...s, dialogOpen: nextOpen }));\n },\n [updateEphemeral],\n );\n\n // TODO(thure): End block alignment affecting `modal` and whether the surface renders in an overlay is tailored to the needs of the ambient chat dialog. As the feature matures, consider separating concerns.\n return (\n <Root modal={dialogBlockAlign !== 'end'} open={dialogOpen} onOpenChange={handleOpenChange}>\n {dialogBlockAlign === 'end' ? (\n // TODO(burdon): Placeholder creates a suspense boundary; replace with defaults.\n <Surface role='dialog' data={dialogContent} limit={1} fallback={PlankContentError} placeholder={<div />} />\n ) : (\n <Overlay blockAlign={dialogBlockAlign} classNames={dialogOverlayClasses} style={dialogOverlayStyle}>\n <Surface role='dialog' data={dialogContent} limit={1} fallback={PlankContentError} />\n </Overlay>\n )}\n </Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui-mosaic';\n\nimport { useDeckState } from '../../hooks';\nimport { meta } from '../../meta';\n\nexport type DeckPopoverRootProps = PropsWithChildren<{}>;\n\nconst DEBOUNCE_DELAY = 40;\n\ntype DeckPopoverContextValue = {\n setOpen: (open: boolean) => void;\n};\n\nconst [DeckPopoverProvider, useDeckPopoverContext] = createContext<DeckPopoverContextValue>('DeckPopover');\n\nexport const PopoverRoot = ({ children }: DeckPopoverRootProps) => {\n const { state } = useDeckState();\n const virtualRef = useRef<HTMLButtonElement | null>(null);\n const [virtualIter, setVirtualIter] = useState(0);\n const [open, setOpen] = useState(false);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n\n // TODO(thure): This is a workaround for the race condition between displaying a Popover and either rendering\n // the anchor further down the tree or measuring the virtual trigger's client rect.\n useEffect(() => {\n setOpen(false);\n if (state.popoverOpen) {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {\n virtualRef.current = state.popoverAnchor ?? null;\n setVirtualIter((iter) => iter + 1);\n }\n debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);\n }\n }, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);\n\n return (\n <DeckPopoverProvider setOpen={setOpen}>\n <Popover.Root modal={false} open={open}>\n {state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}\n {children}\n </Popover.Root>\n </DeckPopoverProvider>\n );\n};\n\nexport const PopoverContent = () => {\n const { t } = useTranslation(meta.id);\n const { state, updateEphemeral } = useDeckState();\n const { setOpen } = useDeckPopoverContext('PopoverContent');\n\n const handleClose = useCallback(() => {\n setOpen(false);\n updateEphemeral((state) => ({\n ...state,\n popoverOpen: false,\n popoverAnchor: undefined,\n popoverAnchorId: undefined,\n popoverSide: undefined,\n }));\n }, [updateEphemeral]);\n\n const handleInteractOutside = useCallback(\n (event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {\n if (\n // TODO(thure): CodeMirror should not focus itself when it updates.\n event.type === 'dismissableLayer.focusOutside' &&\n (event.currentTarget as HTMLElement | undefined)?.classList.contains('cm-content')\n ) {\n event.preventDefault();\n } else {\n handleClose();\n }\n },\n [handleClose],\n );\n\n return (\n <Popover.Portal>\n <Popover.Content\n side={state.popoverSide}\n sticky='always'\n hideWhenDetached\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleInteractOutside}\n >\n <Popover.Viewport>\n {state.popoverKind === 'card' && (\n <Card.Root>\n <Card.Toolbar>\n {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}\n <span />\n {state.popoverTitle ? <Card.Title>{toLocalizedString(state.popoverTitle, t)}</Card.Title> : <span />}\n <Card.Close onClick={handleClose} />\n </Card.Toolbar>\n <Surface role='card--content' data={state.popoverContent} limit={1} />\n </Card.Root>\n )}\n {state.popoverKind === 'base' && <Surface role='popover' data={state.popoverContent} limit={1} />}\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Common } from '@dxos/app-framework';\nimport {\n Button,\n Icon,\n Toast as NaturalToast,\n type ToastRootProps,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { meta } from '../../meta';\n\n// TODO(wittjosiah): Render remaining duration as a progress bar within the toast.\nexport const Toast = ({\n id,\n title,\n description,\n icon,\n duration,\n actionLabel,\n actionAlt,\n closeLabel,\n onAction,\n onOpenChange,\n}: Common.LayoutOperation.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <NaturalToast.Root data-testid={id} defaultOpen duration={duration} onOpenChange={onOpenChange}>\n <NaturalToast.Body>\n <NaturalToast.Title classNames='items-center'>\n {icon && <Icon icon={icon} classNames='inline mr-1' />}\n {title && <span>{toLocalizedString(title, t)}</span>}\n </NaturalToast.Title>\n {description && (\n <NaturalToast.Description>{description && toLocalizedString(description, t)}</NaturalToast.Description>\n )}\n </NaturalToast.Body>\n <NaturalToast.Actions>\n {onAction && actionAlt && actionLabel && (\n <NaturalToast.Action altText={toLocalizedString(actionAlt, t)} asChild>\n <Button data-testid='toast.action' variant='primary' onClick={() => onAction?.()}>\n {toLocalizedString(actionLabel, t)}\n </Button>\n </NaturalToast.Action>\n )}\n {closeLabel && (\n <NaturalToast.Close asChild>\n <Button data-testid='toast.close'>{toLocalizedString(closeLabel, t)}</Button>\n </NaturalToast.Close>\n )}\n </NaturalToast.Actions>\n </NaturalToast.Root>\n );\n};\n\nexport type ToasterProps = {\n toasts?: Common.LayoutOperation.Toast[];\n onDismissToast?: (id: string) => void;\n};\n\nexport const Toaster = ({ toasts, onDismissToast }: ToasterProps) => {\n return (\n <>\n {toasts?.map((toast) => (\n <Toast\n {...toast}\n key={toast.id}\n onOpenChange={(open: boolean) => {\n if (!open) {\n onDismissToast?.(toast.id);\n }\n\n return open;\n }}\n />\n ))}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input, Select, useTranslation } from '@dxos/react-ui';\nimport { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport {\n type DeckSettingsProps,\n type NewPlankPositioning,\n NewPlankPositions,\n type Overscroll,\n OverscrollOptions,\n} from '../../types';\n\nconst isSocket = !!(globalThis as any).__args;\n\nexport type DeckSettingsComponentProps = {\n settings: DeckSettingsProps;\n onSettingsChange: (fn: (current: DeckSettingsProps) => DeckSettingsProps) => void;\n};\n\nexport const DeckSettings = ({ settings, onSettingsChange }: DeckSettingsComponentProps) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <ControlPage>\n <ControlSection title={t('settings title', { ns: meta.id })}>\n <ControlGroup>\n <ControlItemInput title={t('settings enable deck label')}>\n <Input.Switch\n checked={settings.enableDeck}\n onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, enableDeck: checked }))}\n />\n </ControlItemInput>\n <ControlItemInput title={t('settings encapsulated planks label')}>\n <Input.Switch\n checked={settings.encapsulatedPlanks ?? false}\n onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, encapsulatedPlanks: checked }))}\n />\n </ControlItemInput>\n <ControlItemInput title={t('select new plank positioning label')}>\n <Select.Root\n disabled={!settings.enableDeck}\n value={settings.newPlankPositioning ?? 'start'}\n onValueChange={(value) =>\n onSettingsChange((s) => ({ ...s, newPlankPositioning: value as NewPlankPositioning }))\n }\n >\n <Select.TriggerButton placeholder={t('select new plank positioning placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {NewPlankPositions.map((position) => (\n <Select.Option key={position} value={position}>\n {t(`settings new plank position ${position} label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </ControlItemInput>\n <ControlItemInput title={t('settings overscroll label')}>\n <Select.Root\n disabled={!settings.enableDeck}\n value={settings.overscroll ?? 'none'}\n onValueChange={(value) => onSettingsChange((s) => ({ ...s, overscroll: value as Overscroll }))}\n >\n <Select.TriggerButton placeholder={t('select overscroll placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {OverscrollOptions.map((option) => (\n <Select.Option key={option} value={option}>\n {t(`settings overscroll ${option} label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </ControlItemInput>\n <ControlItemInput title={t('settings enable statusbar label')}>\n <Input.Switch\n checked={settings.enableStatusbar}\n onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, enableStatusbar: checked }))}\n />\n </ControlItemInput>\n <ControlItemInput title={t('settings show hints label')}>\n <Input.Switch\n checked={settings.showHints}\n onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, showHints: checked }))}\n />\n </ControlItemInput>\n {!isSocket && (\n <ControlItemInput title={t('settings native redirect label')}>\n <Input.Switch\n checked={settings.enableNativeRedirect}\n onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, enableNativeRedirect: checked }))}\n />\n </ControlItemInput>\n )}\n </ControlGroup>\n </ControlSection>\n </ControlPage>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "Surface", "useTranslation", "mx", "osTranslations", "React", "Fragment", "useCallback", "useEffect", "useMemo", "useState", "Common", "Surface", "useOperationInvoker", "IconButton", "Main", "toLocalizedString", "useTranslation", "Tabs", "mx", "useFocusFinders", "React", "memo", "useCallback", "useLayoutEffect", "useMemo", "useRef", "Common", "Surface", "useAppGraph", "useOperationInvoker", "debounce", "useNode", "ATTENDABLE_PATH_SEPARATOR", "useAttentionAttributes", "StackItem", "railGridHorizontal", "mainIntrinsicSize", "mx", "React", "useEffect", "useState", "useTranslation", "descriptionMessage", "mx", "React", "Fragment", "memo", "useCallback", "useEffect", "useMemo", "Common", "Surface", "useAppGraph", "useOperationInvoker", "Graph", "useActionRunner", "Icon", "IconButton", "Popover", "toLocalizedString", "useTranslation", "StackItem", "TextTooltip", "hoverableControls", "hoverableFocusedWithinControls", "mx", "soloInlinePadding", "sidebarToggleStyles", "fixedSidebarToggleStyles", "mx", "fixedComplementarySidebarToggleStyles", "React", "forwardRef", "useCallback", "useOperationInvoker", "invariant", "ButtonGroup", "IconButton", "useTranslation", "PlankControl", "icon", "label", "props", "IconButton", "iconOnly", "variant", "tooltipSide", "plankControlSpacing", "PlankCompanionControls", "forwardRef", "primary", "forwardedRef", "t", "useTranslation", "meta", "id", "invokePromise", "useOperationInvoker", "handleCloseCompanion", "useCallback", "invariant", "DeckOperation", "ChangeCompanion", "companion", "div", "ref", "className", "onClick", "classNames", "PlankControls", "children", "capabilities", "layoutMode", "pin", "close", "buttonClassNames", "layoutIsAnySolo", "startsWith", "ButtonGroup", "deck", "solo", "disabled", "incrementStart", "incrementEnd", "fullscreen", "data-testid", "MAX_COMPANIONS", "PlankHeading", "memo", "id", "part", "node", "deckEnabled", "canIncrementStart", "canIncrementEnd", "popoverAnchorId", "primaryId", "pending", "companioned", "companions", "layoutMode", "actions", "t", "useTranslation", "meta", "invokePromise", "invokeSync", "useOperationInvoker", "runAction", "useActionRunner", "graph", "useAppGraph", "breakpoint", "useBreakpoints", "icon", "properties", "label", "toLocalizedString", "ns", "isCompanionNode", "type", "PLANK_COMPANION_TYPE", "useEffect", "frame", "requestAnimationFrame", "Graph", "expand", "cancelAnimationFrame", "attendableId", "capabilities", "useMemo", "deck", "solo", "incrementStart", "incrementEnd", "fullscreen", "companion", "length", "variant", "parseEntryId", "sigilActions", "undefined", "getActions", "filter", "a", "includes", "disposition", "handleAction", "useCallback", "action", "data", "parent", "caller", "handlePlankAction", "eventType", "startsWith", "DeckOperation", "Adjust", "Common", "LayoutOperation", "UpdateComplementary", "state", "Close", "subject", "ActionRoot", "Popover", "Anchor", "Fragment", "handleTabClick", "event", "target", "closest", "tabId", "dataset", "ChangeCompanion", "primary", "React", "StackItem", "Heading", "classNames", "soloInlinePadding", "hoverableControls", "hoverableFocusedWithinControls", "data-plank-heading", "div", "role", "className", "map", "IconButton", "key", "data-id", "iconOnly", "onClick", "Sigil", "related", "triggerLabel", "onAction", "Surface", "SigilButton", "span", "Icon", "TextTooltip", "text", "onlyWhenTruncating", "HeadingLabel", "PlankCompanionControls", "PlankControls", "close", "React", "PlankLoading", "React", "div", "role", "className", "PlankContentError", "error", "t", "useTranslation", "meta", "id", "errorString", "toString", "React", "div", "role", "className", "p", "mx", "descriptionMessage", "PlankError", "part", "node", "timedOut", "setTimedOut", "useState", "useEffect", "setTimeout", "PlankHeading", "pending", "PlankLoading", "UNKNOWN_ID", "Plank", "memo", "id", "companionId", "props", "graph", "useAppGraph", "node", "useNode", "companions", "useCompanions", "currentCompanion", "find", "hasCompanion", "React", "PlankContainer", "solo", "part", "companion", "encapsulate", "settings", "encapsulatedPlanks", "PlankComponent", "companioned", "undefined", "primary", "order", "children", "sizeAttrs", "useMainSize", "div", "role", "data-popover-collision-boundary", "className", "mx", "railGridHorizontal", "mainIntrinsicSize", "layoutMode", "path", "active", "invokePromise", "useOperationInvoker", "state", "deck", "useDeckState", "popoverAnchorId", "scrollIntoView", "findFirstFocusable", "useFocusFinders", "canResize", "attentionAttrs", "useAttentionAttributes", "index", "findIndex", "entryId", "length", "canIncrementStart", "canIncrementEnd", "rootElement", "useRef", "variant", "parseEntryId", "sizeKey", "split", "ATTENDABLE_PATH_SEPARATOR", "size", "plankSizing", "handleSizeChange", "useCallback", "debounce", "nextSize", "DeckOperation", "UpdatePlankSize", "handleKeyDown", "event", "target", "currentTarget", "key", "current", "closest", "focus", "useLayoutEffect", "behavior", "inline", "Common", "LayoutOperation", "ScrollIntoView", "subject", "isSolo", "startsWith", "isAttendable", "data", "useMemo", "attendableId", "companionTo", "properties", "placeholder", "PlankLoading", "Root", "StackItem", "fullscreen", "ref", "data-testid", "tabIndex", "item", "onSizeChange", "classNames", "onKeyDown", "PlankHeading", "deckEnabled", "enableDeck", "primaryId", "Surface", "limit", "fallback", "PlankContentError", "PlankError", "ResizeHandle", "React", "useCallback", "Common", "useOperationInvoker", "IconButton", "useTranslation", "ToggleSidebarButton", "classNames", "variant", "state", "updateState", "useDeckState", "t", "useTranslation", "meta", "id", "handleClick", "useCallback", "s", "sidebarState", "React", "IconButton", "icon", "iconOnly", "size", "label", "onClick", "CloseSidebarButton", "ToggleComplementarySidebarButton", "inR0", "current", "invokeSync", "useOperationInvoker", "companions", "useDeckCompanions", "nextState", "complementarySidebarState", "subject", "complementarySidebarPanel", "getCompanionId", "Common", "LayoutOperation", "UpdateComplementary", "tooltipSide", "undefined", "label", "ns", "meta", "id", "ComplementarySidebar", "current", "t", "useTranslation", "invokeSync", "useOperationInvoker", "state", "deck", "updateState", "useDeckState", "layoutMode", "getMode", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "hoistStatusbar", "useHoistStatusbar", "companions", "useDeckCompanions", "activeCompanion", "find", "companion", "getCompanionId", "activeId", "internalValue", "setInternalValue", "useState", "useEffect", "handleTabClick", "useCallback", "event", "nextValue", "currentTarget", "getAttribute", "s", "complementarySidebarState", "Common", "LayoutOperation", "UpdateComplementary", "subject", "data", "useMemo", "React", "Main", "classNames", "Tabs", "Root", "orientation", "verticalVariant", "value", "div", "role", "className", "mx", "Tablist", "map", "Tab", "key", "asChild", "IconButton", "toLocalizedString", "properties", "icon", "iconOnly", "tooltipSide", "data-value", "variant", "onClick", "Surface", "limit", "ToggleComplementarySidebarButton", "Tabpanel", "inert", "ComplementarySidebarPanel", "Wrapper", "fixed", "Fragment", "ScrollArea", "fallback", "PlankContentError", "placeholder", "PlankLoading", "children", "React", "useMemo", "Surface", "Main", "label", "ns", "meta", "id", "Sidebar", "state", "deck", "useDeckState", "popoverAnchorId", "activeDeck", "current", "breakpoint", "useBreakpoints", "layoutMode", "getMode", "topbar", "layoutAppliesTopbar", "hoistStatusbar", "useHoistStatusbar", "navigationData", "useMemo", "React", "Main", "NavigationSidebar", "classNames", "Surface", "role", "data", "limit", "Banner", "variant", "classNames", "t", "useTranslation", "meta", "id", "React", "header", "className", "mx", "CloseSidebarButton", "ToggleSidebarButton", "span", "ns", "osTranslations", "div", "role", "Surface", "limit", "React", "Mosaic", "React", "Surface", "useAppGraph", "useNode", "useAttended", "ActiveNode", "id", "useAttended", "graph", "useAppGraph", "activeNode", "useNode", "useNodeActionExpander", "React", "div", "role", "className", "Surface", "data", "subject", "limit", "React", "Fragment", "useCallback", "useEffect", "useMemo", "useRef", "Common", "useAtomCapability", "useOperationInvoker", "usePluginManager", "AttentionCapabilities", "Main", "useMediaQuery", "useOnTransition", "DEFAULT_HORIZONTAL_SIZE", "Stack", "StackContext", "mainPaddingTransitions", "mx", "React", "Surface", "ContentEmpty", "breakpoint", "useBreakpoints", "deck", "useDeckState", "layoutMode", "getMode", "topbar", "layoutAppliesTopbar", "React", "div", "role", "className", "data-testid", "Surface", "ToggleSidebarButton", "variant", "classNames", "fixedSidebarToggleStyles", "React", "Surface", "useLandmarkMover", "StatusBar", "showHints", "mover", "useLandmarkMover", "undefined", "React", "div", "role", "className", "Surface", "limit", "React", "Topbar", "React", "Banner", "variant", "DeckMain", "invokeSync", "useOperationInvoker", "settings", "useAtomCapability", "DeckCapabilities", "Settings", "state", "deck", "updateState", "useDeckState", "sidebarState", "complementarySidebarState", "complementarySidebarPanel", "active", "activeCompanions", "fullscreen", "solo", "plankSizing", "layoutMode", "getMode", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "hoistStatusbar", "useHoistStatusbar", "pluginManager", "usePluginManager", "scrollLeftRef", "useRef", "deckRef", "useEffect", "attention", "capabilities", "get", "AttentionCapabilities", "Attention", "attended", "getCurrent", "firstId", "length", "document", "querySelector", "focus", "isNotMobile", "useMediaQuery", "shouldRevert", "current", "Common", "LayoutOperation", "SetLayoutMode", "subject", "mode", "revert", "enableDeck", "handleResize", "useCallback", "window", "addEventListener", "removeEventListener", "restoreScroll", "scrollLeft", "useOnTransition", "handleScroll", "event", "currentTarget", "target", "isEmpty", "padding", "useMemo", "overscroll", "calculateOverscroll", "mainPosition", "order", "itemsCount", "reduce", "acc", "entryId", "handleNavigationSidebarStateChange", "next", "s", "handleComplementarySidebarStateChange", "React", "Main", "Root", "navigationSidebarState", "onNavigationSidebarStateChange", "onComplementarySidebarStateChange", "Sidebar", "ComplementarySidebar", "Overlay", "Content", "bounce", "handlesFocus", "classNames", "ContentEmpty", "style", "encapsulatedPlanks", "DEFAULT_HORIZONTAL_SIZE", "div", "role", "className", "inert", "ToggleSidebarButton", "fixedSidebarToggleStyles", "ToggleComplementarySidebarButton", "fixedComplementarySidebarToggleStyles", "Stack", "ref", "orientation", "size", "mainPaddingTransitions", "onScroll", "map", "Fragment", "key", "PlankSeparator", "encapsulate", "Plank", "id", "companionId", "part", "StackContext", "Provider", "value", "rail", "undefined", "Topbar", "StatusBar", "showHints", "span", "mx", "gridColumn", "React", "useCallback", "Surface", "AlertDialog", "Dialog", "NaturalDialog", "Dialog", "state", "updateEphemeral", "useDeckState", "dialogOpen", "dialogType", "dialogBlockAlign", "dialogOverlayClasses", "dialogOverlayStyle", "dialogContent", "Root", "AlertDialog", "NaturalDialog", "Overlay", "handleOpenChange", "useCallback", "nextOpen", "s", "React", "modal", "open", "onOpenChange", "Surface", "role", "data", "limit", "fallback", "PlankContentError", "placeholder", "div", "blockAlign", "classNames", "style", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "Surface", "Popover", "toLocalizedString", "useTranslation", "Card", "DEBOUNCE_DELAY", "DeckPopoverProvider", "useDeckPopoverContext", "createContext", "PopoverRoot", "children", "state", "useDeckState", "virtualRef", "useRef", "virtualIter", "setVirtualIter", "useState", "open", "setOpen", "debounceRef", "useEffect", "popoverOpen", "current", "clearTimeout", "popoverAnchor", "iter", "setTimeout", "popoverAnchorId", "popoverContent", "React", "Popover", "Root", "modal", "VirtualTrigger", "key", "PopoverContent", "t", "useTranslation", "meta", "id", "updateEphemeral", "handleClose", "useCallback", "undefined", "popoverSide", "handleInteractOutside", "event", "type", "currentTarget", "classList", "contains", "preventDefault", "Portal", "Content", "side", "sticky", "hideWhenDetached", "onInteractOutside", "onEscapeKeyDown", "Viewport", "popoverKind", "Card", "Toolbar", "span", "popoverTitle", "Title", "toLocalizedString", "Close", "onClick", "Surface", "role", "data", "limit", "Arrow", "React", "Button", "Icon", "Toast", "NaturalToast", "toLocalizedString", "useTranslation", "Toast", "id", "title", "description", "icon", "duration", "actionLabel", "actionAlt", "closeLabel", "onAction", "onOpenChange", "t", "useTranslation", "meta", "React", "NaturalToast", "Root", "data-testid", "defaultOpen", "Body", "Title", "classNames", "Icon", "span", "toLocalizedString", "Description", "Actions", "Action", "altText", "asChild", "Button", "variant", "onClick", "Close", "Toaster", "toasts", "onDismissToast", "map", "toast", "key", "open", "DeckLayout", "onDismissToast", "state", "useDeckState", "toasts", "React", "Mosaic", "Root", "PopoverRoot", "ActiveNode", "DeckMain", "PopoverContent", "Dialog", "Toaster", "React", "Input", "Select", "useTranslation", "ControlGroup", "ControlItemInput", "ControlPage", "ControlSection", "isSocket", "globalThis", "__args", "DeckSettings", "settings", "onSettingsChange", "t", "useTranslation", "meta", "id", "React", "ControlPage", "ControlSection", "title", "ns", "ControlGroup", "ControlItemInput", "Input", "Switch", "checked", "enableDeck", "onCheckedChange", "s", "encapsulatedPlanks", "Select", "Root", "disabled", "value", "newPlankPositioning", "onValueChange", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "NewPlankPositions", "map", "position", "Option", "key", "Arrow", "overscroll", "OverscrollOptions", "option", "enableStatusbar", "showHints", "enableNativeRedirect"]
7
- }