@dxos/plugin-deck 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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-HXRXEUOZ.mjs +14 -0
  2. package/dist/lib/browser/Banner-HXRXEUOZ.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-EREEXCHO.mjs → chunk-ITNJS5QX.mjs} +214 -276
  14. package/dist/lib/browser/chunk-ITNJS5QX.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-L3RYMAV7.mjs +16 -0
  16. package/dist/lib/browser/chunk-L3RYMAV7.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-UNG4CLLP.mjs → chunk-TAHLKBDO.mjs} +46 -20
  18. package/dist/lib/browser/chunk-TAHLKBDO.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-LYNEKGHM.mjs → react-root-AS4IOYDG.mjs} +8 -7
  25. package/dist/lib/browser/react-root-AS4IOYDG.mjs.map +7 -0
  26. package/dist/lib/browser/react-surface-FH7TC6WW.mjs +44 -0
  27. package/dist/lib/browser/react-surface-FH7TC6WW.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-RN7XXOXY.mjs +15 -0
  38. package/dist/lib/node-esm/Banner-RN7XXOXY.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-DGTRKKWZ.mjs +76 -0
  46. package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-SKEVPQ7E.mjs → chunk-EMU4VIPH.mjs} +46 -20
  48. package/dist/lib/node-esm/chunk-EMU4VIPH.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-XAKTY3EB.mjs → chunk-GZJAQ5IP.mjs} +34 -49
  50. package/dist/lib/node-esm/chunk-GZJAQ5IP.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-V6VEXRD4.mjs → chunk-MBCCNIWY.mjs} +213 -275
  52. package/dist/lib/node-esm/chunk-MBCCNIWY.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-L7H43AS3.mjs → react-root-7DTDLAF4.mjs} +8 -7
  61. package/dist/lib/node-esm/react-root-7DTDLAF4.mjs.map +7 -0
  62. package/dist/lib/node-esm/{react-surface-77DKVMDV.mjs → react-surface-U6Z2K324.mjs} +18 -16
  63. package/dist/lib/node-esm/react-surface-U6Z2K324.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 +45 -43
  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 +28 -27
  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 +34 -8
  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 +20 -23
  176. package/src/components/Plank/PlankLoading.tsx +1 -1
  177. package/src/components/Sidebar/ComplementarySidebar.tsx +46 -49
  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-EREEXCHO.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-NHABISX2.mjs +0 -152
  207. package/dist/lib/browser/chunk-NHABISX2.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-LYNEKGHM.mjs.map +0 -7
  211. package/dist/lib/browser/react-surface-RPKD7XUR.mjs +0 -42
  212. package/dist/lib/browser/react-surface-RPKD7XUR.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-SKEVPQ7E.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-V6VEXRD4.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-L7H43AS3.mjs.map +0 -7
  226. package/dist/lib/node-esm/react-surface-77DKVMDV.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
+ };
@@ -4,8 +4,9 @@
4
4
 
5
5
  import React, { 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';
@@ -13,7 +14,6 @@ import { TextTooltip } from '@dxos/react-ui-text-tooltip';
13
14
  import { hoverableControls, hoverableFocusedWithinControls } 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,33 +132,30 @@ 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
153
150
  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',
151
+ 'py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-coarse',
152
+ part === 'solo' ? soloInlinePadding : 'px-1',
156
153
  ...(layoutMode === 'solo--fullscreen'
157
154
  ? [
158
155
  hoverableControls,
159
156
  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',
157
+ '*:transition-opacity *:opacity-(--controls-opacity) bg-transparent border-transparent transition-[background-color,border-color]',
158
+ 'hover-hover:hover:bg-header-surface focus-within:bg-header-surface hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator',
162
159
  ]
163
160
  : []),
164
161
  ]}
@@ -166,7 +163,7 @@ export const PlankHeading = memo(
166
163
  >
167
164
  {companions && isCompanionNode ? (
168
165
  /* 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'>
166
+ <div role='none' className='flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1'>
170
167
  {companions.map(({ id, properties: { icon, label } }) => (
171
168
  <IconButton
172
169
  key={id}
@@ -191,7 +188,7 @@ export const PlankHeading = memo(
191
188
  actions={sigilActions}
192
189
  onAction={handleAction}
193
190
  >
194
- <Surface role='menu-footer' data={{ subject: node.data }} />
191
+ <Surface.Surface role='menu-footer' data={{ subject: node.data }} />
195
192
  </StackItem.Sigil>
196
193
  ) : (
197
194
  <StackItem.SigilButton>
@@ -211,7 +208,7 @@ export const PlankHeading = memo(
211
208
  </TextTooltip>
212
209
  </>
213
210
  )}
214
- {node && part !== 'complementary' && <Surface role='navbar-end' data={{ subject: node.data }} />}
211
+ {node && part !== 'complementary' && <Surface.Surface role='navbar-end' data={{ subject: node.data }} />}
215
212
  {companioned === 'companion' ? (
216
213
  <PlankCompanionControls primary={primaryId} />
217
214
  ) : (
@@ -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
  };
@@ -12,24 +12,17 @@ import React, {
12
12
  useState,
13
13
  } from 'react';
14
14
 
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';
15
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
16
+ import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
17
+ import { IconButton, type Label, Main, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';
18
18
  import { Tabs } from '@dxos/react-ui-tabs';
19
19
  import { mx } from '@dxos/ui-theme';
20
20
 
21
- import {
22
- type DeckCompanion,
23
- getCompanionId,
24
- useBreakpoints,
25
- useDeckCompanions,
26
- useDeckState,
27
- useHoistStatusbar,
28
- } from '../../hooks';
21
+ import { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState, useHoistStatusbar } from '../../hooks';
29
22
  import { meta } from '../../meta';
30
23
  import { getMode } from '../../types';
31
24
  import { layoutAppliesTopbar } from '../../util';
32
- import { PlankContentError, PlankLoading } from '../Plank';
25
+ import { PlankErrorFallback, PlankLoading } from '../Plank';
33
26
 
34
27
  import { ToggleComplementarySidebarButton } from './SidebarButton';
35
28
 
@@ -49,8 +42,8 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
49
42
  const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
50
43
 
51
44
  const companions = useDeckCompanions();
52
- const activeCompanion = companions.find((companion) => getCompanionId(companion.id) === current);
53
- const activeId = activeCompanion && getCompanionId(activeCompanion.id);
45
+ const activeCompanion = companions.find((companion) => getCompanionVariant(companion.id) === current);
46
+ const activeId = activeCompanion && getCompanionVariant(activeCompanion.id);
54
47
  const [internalValue, setInternalValue] = useState(activeId);
55
48
 
56
49
  useEffect(() => {
@@ -61,14 +54,14 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
61
54
  (event: MouseEvent) => {
62
55
  const nextValue = event.currentTarget.getAttribute('data-value') as string;
63
56
  if (nextValue === activeId) {
64
- updateState((s) => ({
65
- ...s,
66
- complementarySidebarState: s.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
57
+ updateState((state) => ({
58
+ ...state,
59
+ complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
67
60
  }));
68
61
  } else {
69
62
  setInternalValue(nextValue);
70
- updateState((s) => ({ ...s, complementarySidebarState: 'expanded' }));
71
- invokeSync(Common.LayoutOperation.UpdateComplementary, { subject: nextValue });
63
+ updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));
64
+ invokeSync(LayoutOperation.UpdateComplementary, { subject: nextValue });
72
65
  }
73
66
  },
74
67
  [state.complementarySidebarState, activeId, invokeSync, updateState],
@@ -85,7 +78,7 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
85
78
 
86
79
  useEffect(() => {
87
80
  if (!activeId) {
88
- invokeSync(Common.LayoutOperation.UpdateComplementary, { state: 'collapsed' });
81
+ invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
89
82
  }
90
83
  }, [activeId, invokeSync]);
91
84
 
@@ -93,30 +86,30 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
93
86
  <Main.ComplementarySidebar
94
87
  label={label}
95
88
  classNames={[
96
- topbar && 'block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',
97
- hoistStatusbar && 'block-end-[--statusbar-size]',
89
+ topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
90
+ hoistStatusbar && 'bottom-(--dx-statusbar-size)',
98
91
  ]}
99
92
  >
100
93
  <Tabs.Root orientation='vertical' verticalVariant='stateless' value={internalValue} classNames='contents'>
101
94
  <div
102
95
  role='none'
103
96
  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',
97
+ 'absolute z-[1] inset-y-0 end-0 !w-(--dx-r0-size)',
98
+ 'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',
99
+ 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-toolbar-surface dx-contain-layout dx-app-drag',
107
100
  )}
108
101
  >
109
- <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-[--rail-action] p-1 gap-1 !overflow-y-auto'>
102
+ <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) p-1 gap-1 overflow-y-auto!'>
110
103
  {companions.map((companion) => (
111
- <Tabs.Tab key={getCompanionId(companion.id)} value={getCompanionId(companion.id)} asChild>
104
+ <Tabs.Tab key={getCompanionVariant(companion.id)} value={getCompanionVariant(companion.id)} asChild>
112
105
  <IconButton
113
106
  label={toLocalizedString(companion.properties.label, t)}
114
107
  icon={companion.properties.icon}
115
108
  iconOnly
116
109
  tooltipSide='left'
117
- data-value={getCompanionId(companion.id)}
110
+ data-value={getCompanionVariant(companion.id)}
118
111
  variant={
119
- activeId === getCompanionId(companion.id)
112
+ activeId === getCompanionVariant(companion.id)
120
113
  ? state.complementarySidebarState === 'expanded'
121
114
  ? 'primary'
122
115
  : 'default'
@@ -128,23 +121,23 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
128
121
  ))}
129
122
  </Tabs.Tablist>
130
123
  {!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} />
124
+ <div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-item) p-1 overflow-y-auto'>
125
+ <Surface.Surface role='status-bar--r0-footer' limit={1} />
133
126
  </div>
134
127
  )}
135
- <div role='none' className='hidden lg:grid grid-cols-1 auto-rows-[--rail-action] p-1'>
128
+ <div role='none' className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>
136
129
  <ToggleComplementarySidebarButton />
137
130
  </div>
138
131
  </div>
139
132
  {activeId &&
140
133
  companions.map((companion) => (
141
134
  <Tabs.Tabpanel
142
- key={getCompanionId(companion.id)}
143
- value={getCompanionId(companion.id)}
135
+ key={getCompanionVariant(companion.id)}
136
+ value={getCompanionVariant(companion.id)}
144
137
  classNames={[
145
138
  '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)]',
139
+ 'inset-y-0 start-0 w-[calc(100%-var(--dx-r0-size))] lg:w-(--dx-r1-size)',
140
+ 'grid grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr_min-content] py-[env(safe-area-inset-top)]',
148
141
  ]}
149
142
  {...(state.complementarySidebarState !== 'expanded' && { inert: true })}
150
143
  >
@@ -174,48 +167,52 @@ type ComplementarySidebarPanelProps = {
174
167
  const ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }: ComplementarySidebarPanelProps) => {
175
168
  const { t } = useTranslation(meta.id);
176
169
 
177
- if (getCompanionId(companion.id) !== activeId && !data) {
170
+ if (getCompanionVariant(companion.id) !== activeId && !data) {
178
171
  return null;
179
172
  }
180
173
 
181
- const Wrapper = companion.properties.fixed ? Fragment : ScrollArea;
174
+ const Wrapper = companion.properties.fixed ? Fragment : ScrollAreaWrapper;
182
175
 
183
176
  return (
184
177
  <>
185
- <div role='none' className='flex items-center p-1 gap-1 border-be border-subduedSeparator'>
178
+ <div role='none' className='flex items-center p-1 gap-1 border-b border-subdued-separator'>
186
179
  <IconButton
187
180
  label={toLocalizedString(companion.properties.label, t)}
188
181
  icon={companion.properties.icon}
189
182
  iconOnly
190
183
  tooltipSide='left'
191
- data-value={getCompanionId(companion.id)}
192
- classNames='bs-10 is-10'
184
+ data-value={getCompanionVariant(companion.id)}
185
+ classNames='h-10 w-10'
193
186
  variant='default'
194
187
  />
195
- <div role='none' className='pli-1'>
188
+ <div role='none' className='px-1'>
196
189
  {toLocalizedString(companion.properties.label, t)}
197
190
  </div>
198
191
  </div>
199
192
  <Wrapper>
200
- <Surface
201
- role={`deck-companion--${getCompanionId(companion.id)}`}
193
+ <Surface.Surface
194
+ role={`deck-companion--${getCompanionVariant(companion.id)}`}
202
195
  data={data}
203
- fallback={PlankContentError}
196
+ fallback={PlankErrorFallback}
204
197
  placeholder={<PlankLoading />}
205
198
  />
206
199
  </Wrapper>
207
200
  {!hoistStatusbar && (
208
201
  <div
209
202
  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)]'
203
+ 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
204
  >
212
- <Surface role='status-bar--r1-footer' limit={1} />
205
+ <Surface.Surface role='status-bar--r1-footer' limit={1} />
213
206
  </div>
214
207
  )}
215
208
  </>
216
209
  );
217
210
  };
218
211
 
219
- const ScrollArea = ({ children }: PropsWithChildren) => {
220
- return <div className='flex flex-col grow overflow-x-hidden overflow-y-auto scrollbar-thin'>{children}</div>;
212
+ const ScrollAreaWrapper = ({ children }: PropsWithChildren) => {
213
+ return (
214
+ <ScrollArea.Root thin orientation='vertical' classNames='grow'>
215
+ <ScrollArea.Viewport>{children}</ScrollArea.Viewport>
216
+ </ScrollArea.Root>
217
+ );
221
218
  };
@@ -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
  };