@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
@@ -13,19 +13,25 @@ import React, {
13
13
  useRef,
14
14
  } from 'react';
15
15
 
16
- import { Common } from '@dxos/app-framework';
17
- import { Surface, useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';
16
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
17
+ import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
18
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
18
19
  import { debounce } from '@dxos/async';
19
20
  import { type Node, useNode } from '@dxos/plugin-graph';
20
- import { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from '@dxos/react-ui-attention';
21
+ import { useAttentionAttributes } from '@dxos/react-ui-attention';
21
22
  import { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';
22
23
  import { mainIntrinsicSize, mx } from '@dxos/ui-theme';
23
24
 
24
- import { useCompanions, useDeckState, useMainSize } from '../../hooks';
25
- import { parseEntryId } from '../../layout';
26
- import { DeckOperation, type DeckSettingsProps, type LayoutMode, type ResolvedPart } from '../../types';
25
+ import { useCompanions, useDeckState, useMainSize, useSelectedCompanion } from '../../hooks';
26
+ import {
27
+ DeckOperation,
28
+ type DeckSettingsProps,
29
+ type LayoutMode,
30
+ PLANK_COMPANION_TYPE,
31
+ type ResolvedPart,
32
+ } from '../../types';
27
33
 
28
- import { PlankContentError, PlankError } from './PlankError';
34
+ import { PlankError, PlankErrorFallback } from './PlankError';
29
35
  import { PlankHeading } from './PlankHeading';
30
36
  import { PlankLoading } from './PlankLoading';
31
37
 
@@ -37,7 +43,7 @@ const UNKNOWN_ID = 'unknown_id';
37
43
 
38
44
  export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path' | 'order' | 'active' | 'settings'> & {
39
45
  id?: string;
40
- companionId?: string;
46
+ companionVariant?: string;
41
47
  };
42
48
 
43
49
  // TODO(burdon): Factor out conditional rendering.
@@ -58,12 +64,14 @@ export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path
58
64
  * A Plank is the main container for surfaces within a Deck.
59
65
  * It may be paired with a companion plank that enables the user to select one of multiple companion surfaces.
60
66
  */
61
- export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProps) => {
67
+ export const Plank = memo(({ id = UNKNOWN_ID, companionVariant, ...props }: PlankProps) => {
62
68
  const { graph } = useAppGraph();
63
69
  const node = useNode(graph, id);
64
70
  const companions = useCompanions(id);
65
- const currentCompanion = companions.find(({ id }) => id === companionId);
66
- const hasCompanion = !!(companionId && currentCompanion);
71
+ const { companionId } = useSelectedCompanion(companions, companionVariant);
72
+ const resolvedCompanionId = companionVariant ? companionId : undefined;
73
+ const currentCompanion = companions.find(({ id }) => id === resolvedCompanionId);
74
+ const hasCompanion = !!(resolvedCompanionId && currentCompanion);
67
75
 
68
76
  return (
69
77
  <PlankContainer
@@ -81,7 +89,7 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
81
89
  />
82
90
  {hasCompanion && (
83
91
  <PlankComponent
84
- id={companionId}
92
+ id={resolvedCompanionId}
85
93
  node={currentCompanion}
86
94
  primary={node}
87
95
  companions={companions}
@@ -112,8 +120,8 @@ const PlankContainer = ({ children, solo, companion, encapsulate }: PlankContain
112
120
  role='none'
113
121
  data-popover-collision-boundary={true}
114
122
  className={mx(
115
- 'absolute inset-[--main-spacing] grid',
116
- encapsulate && 'border border-separator rounded overflow-hidden',
123
+ 'absolute inset-(--main-spacing) grid',
124
+ encapsulate && 'border border-separator rounded-sm overflow-hidden',
117
125
  companion && 'grid-cols-[6fr_4fr]', // TODO(burdon): Resize.
118
126
  railGridHorizontal,
119
127
  mainIntrinsicSize,
@@ -171,8 +179,8 @@ const PlankComponent = memo(
171
179
 
172
180
  const rootElement = useRef<HTMLDivElement | null>(null);
173
181
 
174
- const { variant } = parseEntryId(id);
175
- const sizeKey = `${id.split('+')[0]}${variant ? `${ATTENDABLE_PATH_SEPARATOR}${variant}` : ''}`;
182
+ const variant = node?.type === PLANK_COMPANION_TYPE ? getCompanionVariant(id) : undefined;
183
+ const sizeKey = id.split('+')[0];
176
184
  const size = deck.plankSizing[sizeKey] as number | undefined;
177
185
 
178
186
  const handleSizeChange = useCallback(
@@ -200,7 +208,7 @@ const PlankComponent = memo(
200
208
  if (scrollIntoView === id) {
201
209
  layoutMode === 'deck' && rootElement.current?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
202
210
  // Clear the scroll into view state once it has been actioned.
203
- void invokePromise(Common.LayoutOperation.ScrollIntoView, { subject: undefined });
211
+ void invokePromise(LayoutOperation.ScrollIntoView, { subject: undefined });
204
212
  }
205
213
  }, [id, scrollIntoView, layoutMode, invokePromise]);
206
214
 
@@ -230,18 +238,18 @@ const PlankComponent = memo(
230
238
  const Root = part.startsWith('solo') ? 'article' : StackItem.Root;
231
239
  const fullscreen = layoutMode === 'solo--fullscreen';
232
240
  const className = mx(
233
- 'attention-surface relative dx-focus-ring-inset-over-all density-coarse',
241
+ 'dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-coarse',
234
242
  isSolo && 'absolute inset-0',
235
243
  isSolo && mainIntrinsicSize,
236
244
  railGridHorizontal,
237
245
  part.startsWith('solo') && 'grid',
238
- part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-is-0',
246
+ part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-w-0',
239
247
  fullscreen && 'grid-rows-1',
240
- part === 'deck' && (companioned === 'companion' ? '!border-separator border-ie' : '!border-separator border-li'),
241
- part === 'solo-companion' && '!border-separator border-is',
248
+ part === 'deck' && (companioned === 'companion' ? 'border-separator! border-e' : 'border-separator! border-x'),
249
+ part === 'solo-companion' && 'border-separator! border-s',
242
250
  settings?.encapsulatedPlanks &&
243
251
  !part.startsWith('solo') &&
244
- 'mli-[--main-spacing] !border-separator border rounded overflow-hidden',
252
+ 'mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden',
245
253
  );
246
254
 
247
255
  return (
@@ -280,12 +288,12 @@ const PlankComponent = memo(
280
288
  companions={companions}
281
289
  />
282
290
  )}
283
- <Surface
291
+ <Surface.Surface
284
292
  key={node.id}
285
293
  role='article'
286
294
  data={data}
287
295
  limit={1}
288
- fallback={PlankContentError}
296
+ fallback={PlankErrorFallback}
289
297
  placeholder={placeholder}
290
298
  />
291
299
  </>
@@ -4,8 +4,7 @@
4
4
 
5
5
  import React, { forwardRef, useCallback } from 'react';
6
6
 
7
- import { useOperationInvoker } from '@dxos/app-framework/react';
8
- import { invariant } from '@dxos/invariant';
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
9
8
  import { ButtonGroup, type ButtonGroupProps, type ButtonProps, IconButton, useTranslation } from '@dxos/react-ui';
10
9
 
11
10
  import { meta } from '../../meta';
@@ -35,7 +34,7 @@ const PlankControl = ({ icon, label, ...props }: Omit<ButtonProps, 'children'> &
35
34
  return <IconButton label={label} icon={icon} iconOnly variant='ghost' tooltipSide='bottom' {...props} />;
36
35
  };
37
36
 
38
- const plankControlSpacing = 'pli-2';
37
+ const plankControlSpacing = 'px-2';
39
38
 
40
39
  type PlankComplimentControlsProps = {
41
40
  primary?: string;
@@ -46,11 +45,10 @@ export const PlankCompanionControls = forwardRef<HTMLDivElement, PlankCompliment
46
45
  const { t } = useTranslation(meta.id);
47
46
  const { invokePromise } = useOperationInvoker();
48
47
  const handleCloseCompanion = useCallback(() => {
49
- invariant(primary);
50
- return invokePromise(DeckOperation.ChangeCompanion, { primary, companion: null });
51
- }, [invokePromise, primary]);
48
+ return invokePromise(DeckOperation.ChangeCompanion, { companion: null });
49
+ }, [invokePromise]);
52
50
  return (
53
- <div ref={forwardedRef} className='contents app-no-drag'>
51
+ <div ref={forwardedRef} className='contents dx-app-no-drag'>
54
52
  <PlankControl
55
53
  label={t('close companion label')}
56
54
  variant='ghost'
@@ -78,7 +76,7 @@ export const PlankControls = forwardRef<HTMLDivElement, PlankControlsProps>(
78
76
  const layoutIsAnySolo = !!layoutMode?.startsWith('solo');
79
77
 
80
78
  return (
81
- <ButtonGroup {...props} classNames={['app-no-drag !opacity-100', classNames]} ref={forwardedRef}>
79
+ <ButtonGroup {...props} classNames={['dx-app-no-drag opacity-100!', classNames]} ref={forwardedRef}>
82
80
  {capabilities.deck ? (
83
81
  <>
84
82
  {capabilities.solo && (
@@ -5,7 +5,7 @@
5
5
  import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { type Node } from '@dxos/plugin-graph';
8
- import { useTranslation } from '@dxos/react-ui';
8
+ import { ErrorFallback, type ErrorFallbackProps, useTranslation } from '@dxos/react-ui';
9
9
  import { descriptionMessage, mx } from '@dxos/ui-theme';
10
10
 
11
11
  import { meta } from '../../meta';
@@ -13,18 +13,6 @@ import { meta } from '../../meta';
13
13
  import { PlankHeading, type PlankHeadingProps } from './PlankHeading';
14
14
  import { PlankLoading } from './PlankLoading';
15
15
 
16
- export const PlankContentError = ({ error }: { error?: Error }) => {
17
- const { t } = useTranslation(meta.id);
18
- const errorString = error?.toString() ?? '';
19
- return (
20
- <div role='none' className='overflow-y-auto p-8 attention-surface grid place-items-center'>
21
- <p role='alert' className={mx(descriptionMessage, 'break-all rounded-md p-4')}>
22
- {error ? errorString : t('error fallback message')}
23
- </p>
24
- </div>
25
- );
26
- };
27
-
28
16
  export const PlankError = ({
29
17
  id,
30
18
  part,
@@ -38,12 +26,38 @@ export const PlankError = ({
38
26
  }) => {
39
27
  const [timedOut, setTimedOut] = useState(false);
40
28
  useEffect(() => {
41
- setTimeout(() => setTimedOut(true), 5e3);
29
+ const timer = setTimeout(() => setTimedOut(true), 5_000);
30
+ return () => clearTimeout(timer);
42
31
  }, []);
32
+
43
33
  return (
44
34
  <>
45
35
  <PlankHeading id={id} part={part} node={node} pending={!timedOut} />
46
- {timedOut ? <PlankContentError error={error} /> : <PlankLoading />}
36
+ {timedOut ? <PlankErrorFallback error={error} /> : <PlankLoading />}
47
37
  </>
48
38
  );
49
39
  };
40
+
41
+ /**
42
+ * User facing error fallback.
43
+ */
44
+ export const PlankErrorFallback = ({ error }: ErrorFallbackProps) => {
45
+ const { t } = useTranslation(meta.id);
46
+
47
+ if (process.env.NODE_ENV === 'development') {
48
+ return <ErrorFallback title='Plank Error' error={error} />;
49
+ } else {
50
+ const errorString = error?.toString() ?? '';
51
+ return (
52
+ <div
53
+ role='alert'
54
+ data-testid='plank-content-error'
55
+ className='dx-attention-surface overflow-y-auto p-8 grid place-items-center'
56
+ >
57
+ <p className={mx(descriptionMessage, 'break-all rounded-md p-4')}>
58
+ {error ? errorString : t('error fallback message')}
59
+ </p>
60
+ </div>
61
+ );
62
+ }
63
+ };
@@ -2,18 +2,18 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';
5
+ import React, { CSSProperties, Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';
6
6
 
7
- import { Common } from '@dxos/app-framework';
8
- import { Surface, useAppGraph, useOperationInvoker } from '@dxos/app-framework/react';
7
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
9
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
9
10
  import { Graph, type Node, useActionRunner } from '@dxos/plugin-graph';
10
11
  import { Icon, IconButton, Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
12
  import { StackItem, type StackItemSigilAction } from '@dxos/react-ui-stack';
12
13
  import { TextTooltip } from '@dxos/react-ui-text-tooltip';
13
- import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
14
+ import { hoverableControls, hoverableFocusedWithinControls, largeIconSize } from '@dxos/ui-theme';
14
15
 
15
16
  import { useBreakpoints } from '../../hooks';
16
- import { parseEntryId } from '../../layout';
17
17
  import { meta } from '../../meta';
18
18
  import { DeckOperation, type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '../../types';
19
19
  import { soloInlinePadding } from '../fragments';
@@ -70,7 +70,7 @@ export const PlankHeading = memo(
70
70
  const frame = requestAnimationFrame(() => {
71
71
  // Load actions for the node.
72
72
  if (node) {
73
- void Graph.expand(graph, node.id);
73
+ void Graph.expand(graph, node.id, 'child');
74
74
  }
75
75
  });
76
76
 
@@ -90,7 +90,7 @@ export const PlankHeading = memo(
90
90
  [breakpoint, part, companions, canIncrementStart, canIncrementEnd, isCompanionNode, deckEnabled],
91
91
  );
92
92
 
93
- const { variant } = parseEntryId(id);
93
+ const variant = isCompanionNode ? getCompanionVariant(id) : undefined;
94
94
  const sigilActions = useMemo(() => {
95
95
  if (!node) {
96
96
  return undefined;
@@ -99,8 +99,8 @@ export const PlankHeading = memo(
99
99
  } else {
100
100
  return [
101
101
  actions,
102
- Graph.getActions(graph, node.id).filter((a) =>
103
- ['list-item', 'list-item-primary', 'heading-list-item'].includes(a.properties.disposition),
102
+ Graph.getActions(graph, node.id).filter((action) =>
103
+ ['list-item', 'list-item-primary', 'heading-list-item'].includes(action.properties.disposition),
104
104
  ),
105
105
  ].filter((a) => a.length > 0);
106
106
  }
@@ -121,9 +121,9 @@ export const PlankHeading = memo(
121
121
  return invokePromise(DeckOperation.Adjust, { type: eventType, id });
122
122
  } else if (eventType === 'close') {
123
123
  if (part === 'complementary') {
124
- return invokeSync(Common.LayoutOperation.UpdateComplementary, { state: 'collapsed' });
124
+ return invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
125
125
  } else {
126
- return invokeSync(Common.LayoutOperation.Close, { subject: [id] });
126
+ return invokeSync(LayoutOperation.Close, { subject: [id] });
127
127
  }
128
128
  } else {
129
129
  return invokePromise(DeckOperation.Adjust, { type: eventType, id });
@@ -132,41 +132,39 @@ export const PlankHeading = memo(
132
132
  [invokePromise, invokeSync, id, part],
133
133
  );
134
134
 
135
- const ActionRoot = node && popoverAnchorId === `dxos.org/ui/${meta.id}/${node.id}` ? Popover.Anchor : Fragment;
135
+ const ActionRoot = node && popoverAnchorId === `${meta.id}:${node.id}` ? Popover.Anchor : Fragment;
136
136
 
137
137
  const handleTabClick = useCallback(
138
138
  (event: MouseEvent) => {
139
139
  const target = (event.target as HTMLElement).closest('[data-id]') as HTMLElement | null;
140
140
  const tabId = target?.dataset?.id;
141
- if (primaryId && tabId) {
142
- void invokePromise(DeckOperation.ChangeCompanion, {
143
- primary: primaryId,
144
- companion: tabId,
145
- });
141
+ if (tabId) {
142
+ void invokePromise(DeckOperation.ChangeCompanion, { companion: tabId });
146
143
  }
147
144
  },
148
- [primaryId, invokePromise],
145
+ [invokePromise],
149
146
  );
150
147
 
151
148
  return (
152
149
  <StackItem.Heading
150
+ data-plank-heading
151
+ style={largeIconSize}
153
152
  classNames={[
154
- 'plb-1 items-stretch gap-1 sticky inline-start-12 app-drag min-is-0 contain-layout density-coarse',
155
- part === 'solo' ? soloInlinePadding : 'pli-1',
153
+ 'py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-coarse',
154
+ part === 'solo' ? soloInlinePadding : 'px-1',
156
155
  ...(layoutMode === 'solo--fullscreen'
157
156
  ? [
158
157
  hoverableControls,
159
158
  hoverableFocusedWithinControls,
160
- '*:transition-opacity *:opacity-[--controls-opacity] bg-transparent border-transparent transition-[background-color,border-color]',
161
- 'hover-hover:hover:bg-headerSurface focus-within:bg-headerSurface hover-hover:hover:border-subduedSeparator focus-within:border-subduedSeparator',
159
+ '*:transition-opacity *:opacity-(--controls-opacity) bg-transparent border-transparent transition-[background-color,border-color]',
160
+ 'hover-hover:hover:bg-header-surface focus-within:bg-header-surface hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator',
162
161
  ]
163
162
  : []),
164
163
  ]}
165
- data-plank-heading
166
164
  >
167
165
  {companions && isCompanionNode ? (
168
166
  /* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */
169
- <div role='none' className='flex-1 min-is-0 overflow-x-auto scrollbar-none flex gap-1'>
167
+ <div role='none' className='flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1'>
170
168
  {companions.map(({ id, properties: { icon, label } }) => (
171
169
  <IconButton
172
170
  key={id}
@@ -191,7 +189,7 @@ export const PlankHeading = memo(
191
189
  actions={sigilActions}
192
190
  onAction={handleAction}
193
191
  >
194
- <Surface role='menu-footer' data={{ subject: node.data }} />
192
+ <Surface.Surface role='menu-footer' data={{ subject: node.data }} />
195
193
  </StackItem.Sigil>
196
194
  ) : (
197
195
  <StackItem.SigilButton>
@@ -211,7 +209,7 @@ export const PlankHeading = memo(
211
209
  </TextTooltip>
212
210
  </>
213
211
  )}
214
- {node && part !== 'complementary' && <Surface role='navbar-end' data={{ subject: node.data }} />}
212
+ {node && part !== 'complementary' && <Surface.Surface role='navbar-end' data={{ subject: node.data }} />}
215
213
  {companioned === 'companion' ? (
216
214
  <PlankCompanionControls primary={primaryId} />
217
215
  ) : (
@@ -6,5 +6,5 @@ import React from 'react';
6
6
 
7
7
  // TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259
8
8
  export const PlankLoading = () => {
9
- return <div role='none' className='grid place-items-center attention-surface' />;
9
+ return <div role='none' className='grid place-items-center dx-attention-surface' />;
10
10
  };
@@ -3,6 +3,7 @@
3
3
  //
4
4
 
5
5
  import React, {
6
+ CSSProperties,
6
7
  Fragment,
7
8
  type MouseEvent,
8
9
  type PropsWithChildren,
@@ -12,24 +13,17 @@ import React, {
12
13
  useState,
13
14
  } from 'react';
14
15
 
15
- import { Common } from '@dxos/app-framework';
16
- import { Surface, useOperationInvoker } from '@dxos/app-framework/react';
17
- import { IconButton, type Label, Main, toLocalizedString, useTranslation } from '@dxos/react-ui';
16
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
17
+ import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
18
+ import { IconButton, type Label, Main, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';
18
19
  import { Tabs } from '@dxos/react-ui-tabs';
19
- import { mx } from '@dxos/ui-theme';
20
-
21
- import {
22
- type DeckCompanion,
23
- getCompanionId,
24
- useBreakpoints,
25
- useDeckCompanions,
26
- useDeckState,
27
- useHoistStatusbar,
28
- } from '../../hooks';
20
+ import { largeIconSize, mx } from '@dxos/ui-theme';
21
+
22
+ import { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState, useHoistStatusbar } from '../../hooks';
29
23
  import { meta } from '../../meta';
30
24
  import { getMode } from '../../types';
31
25
  import { layoutAppliesTopbar } from '../../util';
32
- import { PlankContentError, PlankLoading } from '../Plank';
26
+ import { PlankErrorFallback, PlankLoading } from '../Plank';
33
27
 
34
28
  import { ToggleComplementarySidebarButton } from './SidebarButton';
35
29
 
@@ -49,8 +43,8 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
49
43
  const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
50
44
 
51
45
  const companions = useDeckCompanions();
52
- const activeCompanion = companions.find((companion) => getCompanionId(companion.id) === current);
53
- const activeId = activeCompanion && getCompanionId(activeCompanion.id);
46
+ const activeCompanion = companions.find((companion) => getCompanionVariant(companion.id) === current);
47
+ const activeId = activeCompanion && getCompanionVariant(activeCompanion.id);
54
48
  const [internalValue, setInternalValue] = useState(activeId);
55
49
 
56
50
  useEffect(() => {
@@ -61,14 +55,14 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
61
55
  (event: MouseEvent) => {
62
56
  const nextValue = event.currentTarget.getAttribute('data-value') as string;
63
57
  if (nextValue === activeId) {
64
- updateState((s) => ({
65
- ...s,
66
- complementarySidebarState: s.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
58
+ updateState((state) => ({
59
+ ...state,
60
+ complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
67
61
  }));
68
62
  } else {
69
63
  setInternalValue(nextValue);
70
- updateState((s) => ({ ...s, complementarySidebarState: 'expanded' }));
71
- invokeSync(Common.LayoutOperation.UpdateComplementary, { subject: nextValue });
64
+ updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));
65
+ invokeSync(LayoutOperation.UpdateComplementary, { subject: nextValue });
72
66
  }
73
67
  },
74
68
  [state.complementarySidebarState, activeId, invokeSync, updateState],
@@ -85,7 +79,7 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
85
79
 
86
80
  useEffect(() => {
87
81
  if (!activeId) {
88
- invokeSync(Common.LayoutOperation.UpdateComplementary, { state: 'collapsed' });
82
+ invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
89
83
  }
90
84
  }, [activeId, invokeSync]);
91
85
 
@@ -93,30 +87,31 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
93
87
  <Main.ComplementarySidebar
94
88
  label={label}
95
89
  classNames={[
96
- topbar && 'block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',
97
- hoistStatusbar && 'block-end-[--statusbar-size]',
90
+ topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
91
+ hoistStatusbar && 'bottom-(--dx-statusbar-size)',
98
92
  ]}
99
93
  >
100
94
  <Tabs.Root orientation='vertical' verticalVariant='stateless' value={internalValue} classNames='contents'>
101
95
  <div
102
96
  role='none'
97
+ style={largeIconSize}
103
98
  className={mx(
104
- 'absolute z-[1] inset-block-0 inline-end-0 !is-[--r0-size]',
105
- 'pbs-[env(safe-area-inset-top)] pbe-[env(safe-area-inset-bottom)] border-is border-subduedSeparator',
106
- 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-baseSurface contain-layout app-drag',
99
+ 'absolute z-[1] inset-y-0 end-0 !w-(--dx-r0-size)',
100
+ 'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',
101
+ 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-toolbar-surface dx-contain-layout dx-app-drag',
107
102
  )}
108
103
  >
109
- <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-[--rail-action] p-1 gap-1 !overflow-y-auto'>
104
+ <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) p-1 gap-1 overflow-y-auto!'>
110
105
  {companions.map((companion) => (
111
- <Tabs.Tab key={getCompanionId(companion.id)} value={getCompanionId(companion.id)} asChild>
106
+ <Tabs.Tab key={getCompanionVariant(companion.id)} value={getCompanionVariant(companion.id)} asChild>
112
107
  <IconButton
113
108
  label={toLocalizedString(companion.properties.label, t)}
114
109
  icon={companion.properties.icon}
115
110
  iconOnly
116
111
  tooltipSide='left'
117
- data-value={getCompanionId(companion.id)}
112
+ data-value={getCompanionVariant(companion.id)}
118
113
  variant={
119
- activeId === getCompanionId(companion.id)
114
+ activeId === getCompanionVariant(companion.id)
120
115
  ? state.complementarySidebarState === 'expanded'
121
116
  ? 'primary'
122
117
  : 'default'
@@ -128,23 +123,23 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
128
123
  ))}
129
124
  </Tabs.Tablist>
130
125
  {!hoistStatusbar && (
131
- <div role='none' className='grid grid-cols-1 auto-rows-[--rail-item] p-1 overflow-y-auto'>
132
- <Surface role='status-bar--r0-footer' limit={1} />
126
+ <div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-item) p-1 overflow-y-auto'>
127
+ <Surface.Surface role='status-bar--r0-footer' limit={1} />
133
128
  </div>
134
129
  )}
135
- <div role='none' className='hidden lg:grid grid-cols-1 auto-rows-[--rail-action] p-1'>
130
+ <div role='none' className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>
136
131
  <ToggleComplementarySidebarButton />
137
132
  </div>
138
133
  </div>
139
134
  {activeId &&
140
135
  companions.map((companion) => (
141
136
  <Tabs.Tabpanel
142
- key={getCompanionId(companion.id)}
143
- value={getCompanionId(companion.id)}
137
+ key={getCompanionVariant(companion.id)}
138
+ value={getCompanionVariant(companion.id)}
144
139
  classNames={[
145
140
  'absolute data-[state="inactive"]:-z-[1] overflow-hidden',
146
- 'inset-block-0 inline-start-0 is-[calc(100%-var(--r0-size))] lg:is-[--r1-size]',
147
- 'grid grid-cols-1 grid-rows-[var(--rail-size)_1fr_min-content] pbs-[env(safe-area-inset-top)]',
141
+ 'inset-y-0 start-0 w-[calc(100%-var(--dx-r0-size))] lg:w-(--dx-r1-size)',
142
+ 'grid grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr_min-content] py-[env(safe-area-inset-top)]',
148
143
  ]}
149
144
  {...(state.complementarySidebarState !== 'expanded' && { inert: true })}
150
145
  >
@@ -174,48 +169,52 @@ type ComplementarySidebarPanelProps = {
174
169
  const ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }: ComplementarySidebarPanelProps) => {
175
170
  const { t } = useTranslation(meta.id);
176
171
 
177
- if (getCompanionId(companion.id) !== activeId && !data) {
172
+ if (getCompanionVariant(companion.id) !== activeId && !data) {
178
173
  return null;
179
174
  }
180
175
 
181
- const Wrapper = companion.properties.fixed ? Fragment : ScrollArea;
176
+ const Wrapper = companion.properties.fixed ? Fragment : ScrollAreaWrapper;
182
177
 
183
178
  return (
184
179
  <>
185
- <div role='none' className='flex items-center p-1 gap-1 border-be border-subduedSeparator'>
180
+ <div role='none' className='flex items-center p-1 gap-1 border-b border-subdued-separator'>
186
181
  <IconButton
187
182
  label={toLocalizedString(companion.properties.label, t)}
188
183
  icon={companion.properties.icon}
189
184
  iconOnly
190
185
  tooltipSide='left'
191
- data-value={getCompanionId(companion.id)}
192
- classNames='bs-10 is-10'
186
+ data-value={getCompanionVariant(companion.id)}
187
+ classNames='h-10 w-10'
193
188
  variant='default'
194
189
  />
195
- <div role='none' className='pli-1'>
190
+ <div role='none' className='px-1'>
196
191
  {toLocalizedString(companion.properties.label, t)}
197
192
  </div>
198
193
  </div>
199
194
  <Wrapper>
200
- <Surface
201
- role={`deck-companion--${getCompanionId(companion.id)}`}
195
+ <Surface.Surface
196
+ role={`deck-companion--${getCompanionVariant(companion.id)}`}
202
197
  data={data}
203
- fallback={PlankContentError}
198
+ fallback={PlankErrorFallback}
204
199
  placeholder={<PlankLoading />}
205
200
  />
206
201
  </Wrapper>
207
202
  {!hoistStatusbar && (
208
203
  <div
209
204
  role='contentinfo'
210
- className='flex flex-wrap justify-center items-center border-bs border-subduedSeparator pbs-1 pbe-[max(env(safe-area-inset-bottom),0.25rem)]'
205
+ className='flex flex-wrap justify-center items-center border-y border-subdued-separator pt-1 pb-[max(env(safe-area-inset-bottom),0.25rem)]'
211
206
  >
212
- <Surface role='status-bar--r1-footer' limit={1} />
207
+ <Surface.Surface role='status-bar--r1-footer' limit={1} />
213
208
  </div>
214
209
  )}
215
210
  </>
216
211
  );
217
212
  };
218
213
 
219
- const ScrollArea = ({ children }: PropsWithChildren) => {
220
- return <div className='flex flex-col grow overflow-x-hidden overflow-y-auto scrollbar-thin'>{children}</div>;
214
+ const ScrollAreaWrapper = ({ children }: PropsWithChildren) => {
215
+ return (
216
+ <ScrollArea.Root thin orientation='vertical' classNames='grow'>
217
+ <ScrollArea.Viewport>{children}</ScrollArea.Viewport>
218
+ </ScrollArea.Root>
219
+ );
221
220
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useMemo } from 'react';
6
6
 
7
- import { Surface } from '@dxos/app-framework/react';
7
+ import { Surface } from '@dxos/app-framework/ui';
8
8
  import { type Label, Main } from '@dxos/react-ui';
9
9
 
10
10
  import { useBreakpoints, useDeckState, useHoistStatusbar } from '../../hooks';
@@ -32,11 +32,11 @@ export const Sidebar = () => {
32
32
  label={label}
33
33
  classNames={[
34
34
  'grid',
35
- topbar && 'block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',
36
- hoistStatusbar && 'block-end-[--statusbar-size]',
35
+ topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
36
+ hoistStatusbar && 'bottom-(--dx-statusbar-size)',
37
37
  ]}
38
38
  >
39
- <Surface role='navigation' data={navigationData} limit={1} />
39
+ <Surface.Surface role='navigation' data={navigationData} limit={1} />
40
40
  </Main.NavigationSidebar>
41
41
  );
42
42
  };