@dxos/plugin-deck 0.7.5-main.9d2a38b → 0.7.5-main.e9bb01b

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 (204) hide show
  1. package/dist/lib/browser/{app-graph-builder-67VRUD5K.mjs → app-graph-builder-CI6ZFMNL.mjs} +57 -31
  2. package/dist/lib/browser/app-graph-builder-CI6ZFMNL.mjs.map +7 -0
  3. package/dist/lib/browser/{check-app-scheme-GEX6W2R5.mjs → check-app-scheme-S3EYUPMF.mjs} +3 -3
  4. package/dist/lib/browser/{check-app-scheme-GEX6W2R5.mjs.map → check-app-scheme-S3EYUPMF.mjs.map} +2 -2
  5. package/dist/lib/browser/chunk-M2L53AIH.mjs +126 -0
  6. package/dist/lib/browser/chunk-M2L53AIH.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-JQJ5UWVB.mjs → chunk-N7TEPFVR.mjs} +3 -2
  8. package/dist/lib/browser/{chunk-JQJ5UWVB.mjs.map → chunk-N7TEPFVR.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-NYZJCVAU.mjs +22 -0
  10. package/dist/lib/browser/chunk-NYZJCVAU.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-WXNLVMK2.mjs +1119 -0
  12. package/dist/lib/browser/chunk-WXNLVMK2.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-5VFDMW5M.mjs → chunk-YQ2GWTDU.mjs} +2 -2
  14. package/dist/lib/browser/chunk-YQ2GWTDU.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +32 -78
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/intent-resolver-CSXFDKTC.mjs +494 -0
  18. package/dist/lib/browser/intent-resolver-CSXFDKTC.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-root-UL7ZDRVZ.mjs → react-root-ECDQZYQT.mjs} +10 -14
  21. package/dist/lib/browser/react-root-ECDQZYQT.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-4WIQZW2S.mjs +38 -0
  23. package/dist/lib/browser/react-surface-4WIQZW2S.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-FNWW6WIJ.mjs → settings-WACNLCPB.mjs} +6 -7
  25. package/dist/lib/browser/settings-WACNLCPB.mjs.map +7 -0
  26. package/dist/lib/browser/state-VPOYUKK6.mjs +117 -0
  27. package/dist/lib/browser/state-VPOYUKK6.mjs.map +7 -0
  28. package/dist/lib/browser/types.mjs +16 -4
  29. package/dist/lib/browser/url-handler-HLF42IHP.mjs +70 -0
  30. package/dist/lib/browser/url-handler-HLF42IHP.mjs.map +7 -0
  31. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  32. package/dist/types/src/capabilities/{layout/app-graph-builder.d.ts → app-graph-builder.d.ts} +22 -22
  33. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  34. package/dist/types/src/capabilities/capabilities.d.ts +132 -3
  35. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  36. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +1 -0
  37. package/dist/types/src/capabilities/index.d.ts +187 -3
  38. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  40. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  41. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/set-active.d.ts +9 -0
  43. package/dist/types/src/capabilities/set-active.d.ts.map +1 -0
  44. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  45. package/dist/types/src/capabilities/state.d.ts +76 -0
  46. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  47. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -0
  48. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
  49. package/dist/types/src/components/DeckLayout/ComplementarySidebar.d.ts.map +1 -1
  50. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +1 -1
  51. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts +1 -4
  52. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
  53. package/dist/types/src/components/DeckLayout/Fullscreen.d.ts.map +1 -1
  54. package/dist/types/src/components/DeckLayout/NodePlankHeading.d.ts +3 -3
  55. package/dist/types/src/components/DeckLayout/NodePlankHeading.d.ts.map +1 -1
  56. package/dist/types/src/components/DeckLayout/Plank.d.ts +8 -6
  57. package/dist/types/src/components/DeckLayout/Plank.d.ts.map +1 -1
  58. package/dist/types/src/components/DeckLayout/PlankControls.d.ts +2 -2
  59. package/dist/types/src/components/DeckLayout/PlankControls.d.ts.map +1 -1
  60. package/dist/types/src/components/DeckLayout/PlankError.d.ts +4 -3
  61. package/dist/types/src/components/DeckLayout/PlankError.d.ts.map +1 -1
  62. package/dist/types/src/components/DeckLayout/Sidebar.d.ts.map +1 -1
  63. package/dist/types/src/components/DeckLayout/SidebarButton.d.ts +5 -3
  64. package/dist/types/src/components/DeckLayout/SidebarButton.d.ts.map +1 -1
  65. package/dist/types/src/components/DeckLayout/StatusBar.d.ts.map +1 -1
  66. package/dist/types/src/components/DeckLayout/Toast.d.ts +2 -2
  67. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
  68. package/dist/types/src/components/fragments.d.ts +2 -0
  69. package/dist/types/src/components/fragments.d.ts.map +1 -1
  70. package/dist/types/src/components/index.d.ts +0 -2
  71. package/dist/types/src/components/index.d.ts.map +1 -1
  72. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  73. package/dist/types/src/layout.d.ts +5 -19
  74. package/dist/types/src/layout.d.ts.map +1 -1
  75. package/dist/types/src/meta.d.ts +1 -0
  76. package/dist/types/src/meta.d.ts.map +1 -1
  77. package/dist/types/src/translations.d.ts +3 -3
  78. package/dist/types/src/types.d.ts +107 -2
  79. package/dist/types/src/types.d.ts.map +1 -1
  80. package/dist/types/src/util/index.d.ts +2 -1
  81. package/dist/types/src/util/index.d.ts.map +1 -1
  82. package/dist/types/src/util/layoutAppliesTopbar.d.ts +2 -0
  83. package/dist/types/src/util/layoutAppliesTopbar.d.ts.map +1 -0
  84. package/dist/types/src/util/useHoistStatusbar.d.ts.map +1 -1
  85. package/package.json +30 -30
  86. package/src/DeckPlugin.ts +12 -58
  87. package/src/capabilities/{layout/app-graph-builder.ts → app-graph-builder.ts} +36 -28
  88. package/src/capabilities/capabilities.ts +4 -3
  89. package/src/capabilities/{navigation/check-app-scheme.ts → check-app-scheme.ts} +2 -2
  90. package/src/capabilities/index.ts +11 -3
  91. package/src/capabilities/intent-resolver.ts +350 -0
  92. package/src/capabilities/{layout/react-root.tsx → react-root.tsx} +7 -11
  93. package/src/capabilities/react-surface.tsx +31 -0
  94. package/src/capabilities/set-active.ts +43 -0
  95. package/src/capabilities/{settings/settings.ts → settings.ts} +4 -5
  96. package/src/capabilities/state.ts +102 -0
  97. package/src/capabilities/url-handler.ts +63 -0
  98. package/src/components/DeckLayout/ActiveNode.tsx +2 -3
  99. package/src/components/DeckLayout/ComplementarySidebar.tsx +118 -67
  100. package/src/components/DeckLayout/ContentEmpty.tsx +7 -10
  101. package/src/components/DeckLayout/DeckLayout.tsx +103 -61
  102. package/src/components/DeckLayout/Fullscreen.tsx +2 -3
  103. package/src/components/DeckLayout/NodePlankHeading.tsx +57 -65
  104. package/src/components/DeckLayout/Plank.tsx +32 -41
  105. package/src/components/DeckLayout/PlankControls.tsx +11 -10
  106. package/src/components/DeckLayout/PlankError.tsx +6 -5
  107. package/src/components/DeckLayout/Sidebar.tsx +17 -20
  108. package/src/components/DeckLayout/SidebarButton.tsx +25 -31
  109. package/src/components/DeckLayout/StatusBar.tsx +5 -11
  110. package/src/components/DeckLayout/Toast.tsx +2 -2
  111. package/src/components/LayoutSettings.tsx +8 -8
  112. package/src/components/fragments.ts +8 -0
  113. package/src/components/index.ts +0 -2
  114. package/src/hooks/useMainSize.ts +3 -3
  115. package/src/layout.ts +43 -212
  116. package/src/meta.ts +1 -0
  117. package/src/translations.ts +8 -8
  118. package/src/types.ts +88 -2
  119. package/src/util/index.ts +2 -1
  120. package/src/util/layoutAppliesTopbar.ts +7 -0
  121. package/src/util/useHoistStatusbar.ts +17 -8
  122. package/dist/lib/browser/app-graph-builder-67VRUD5K.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-2M4PXYNB.mjs +0 -1052
  124. package/dist/lib/browser/chunk-2M4PXYNB.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-2PJNBVCY.mjs +0 -39
  126. package/dist/lib/browser/chunk-2PJNBVCY.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-4C2AFTET.mjs +0 -186
  128. package/dist/lib/browser/chunk-4C2AFTET.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-5VFDMW5M.mjs.map +0 -7
  130. package/dist/lib/browser/chunk-KY5WXIXY.mjs +0 -44
  131. package/dist/lib/browser/chunk-KY5WXIXY.mjs.map +0 -7
  132. package/dist/lib/browser/deck-PLCSKPGL.mjs +0 -26
  133. package/dist/lib/browser/deck-PLCSKPGL.mjs.map +0 -7
  134. package/dist/lib/browser/intent-resolver-FVOQSTBX.mjs +0 -152
  135. package/dist/lib/browser/intent-resolver-FVOQSTBX.mjs.map +0 -7
  136. package/dist/lib/browser/intent-resolver-K7GW4A2I.mjs +0 -249
  137. package/dist/lib/browser/intent-resolver-K7GW4A2I.mjs.map +0 -7
  138. package/dist/lib/browser/location-QHRBQBQN.mjs +0 -35
  139. package/dist/lib/browser/location-QHRBQBQN.mjs.map +0 -7
  140. package/dist/lib/browser/react-context-3BDW7W2N.mjs +0 -32
  141. package/dist/lib/browser/react-context-3BDW7W2N.mjs.map +0 -7
  142. package/dist/lib/browser/react-root-UL7ZDRVZ.mjs.map +0 -7
  143. package/dist/lib/browser/react-surface-VPNOGGNN.mjs +0 -28
  144. package/dist/lib/browser/react-surface-VPNOGGNN.mjs.map +0 -7
  145. package/dist/lib/browser/settings-FNWW6WIJ.mjs.map +0 -7
  146. package/dist/lib/browser/state-7I5BD7SE.mjs +0 -34
  147. package/dist/lib/browser/state-7I5BD7SE.mjs.map +0 -7
  148. package/dist/lib/browser/url-handler-Z5B7LD3N.mjs +0 -76
  149. package/dist/lib/browser/url-handler-Z5B7LD3N.mjs.map +0 -7
  150. package/dist/types/src/capabilities/layout/app-graph-builder.d.ts.map +0 -1
  151. package/dist/types/src/capabilities/layout/deck.d.ts +0 -4
  152. package/dist/types/src/capabilities/layout/deck.d.ts.map +0 -1
  153. package/dist/types/src/capabilities/layout/index.d.ts +0 -229
  154. package/dist/types/src/capabilities/layout/index.d.ts.map +0 -1
  155. package/dist/types/src/capabilities/layout/intent-resolver.d.ts.map +0 -1
  156. package/dist/types/src/capabilities/layout/react-context.d.ts +0 -8
  157. package/dist/types/src/capabilities/layout/react-context.d.ts.map +0 -1
  158. package/dist/types/src/capabilities/layout/react-root.d.ts.map +0 -1
  159. package/dist/types/src/capabilities/layout/state.d.ts +0 -42
  160. package/dist/types/src/capabilities/layout/state.d.ts.map +0 -1
  161. package/dist/types/src/capabilities/navigation/check-app-scheme.d.ts.map +0 -1
  162. package/dist/types/src/capabilities/navigation/index.d.ts +0 -5
  163. package/dist/types/src/capabilities/navigation/index.d.ts.map +0 -1
  164. package/dist/types/src/capabilities/navigation/intent-resolver.d.ts +0 -4
  165. package/dist/types/src/capabilities/navigation/intent-resolver.d.ts.map +0 -1
  166. package/dist/types/src/capabilities/navigation/location.d.ts +0 -4
  167. package/dist/types/src/capabilities/navigation/location.d.ts.map +0 -1
  168. package/dist/types/src/capabilities/navigation/set-location.d.ts +0 -10
  169. package/dist/types/src/capabilities/navigation/set-location.d.ts.map +0 -1
  170. package/dist/types/src/capabilities/navigation/url-handler.d.ts.map +0 -1
  171. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  172. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  173. package/dist/types/src/capabilities/settings/react-surface.d.ts.map +0 -1
  174. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  175. package/dist/types/src/components/DeckContext.d.ts +0 -11
  176. package/dist/types/src/components/DeckContext.d.ts.map +0 -1
  177. package/dist/types/src/components/LayoutContext.d.ts +0 -5
  178. package/dist/types/src/components/LayoutContext.d.ts.map +0 -1
  179. package/dist/types/src/layout.test.d.ts +0 -2
  180. package/dist/types/src/layout.test.d.ts.map +0 -1
  181. package/dist/types/src/util/layout-parts.d.ts +0 -7
  182. package/dist/types/src/util/layout-parts.d.ts.map +0 -1
  183. package/src/capabilities/layout/deck.ts +0 -25
  184. package/src/capabilities/layout/index.ts +0 -12
  185. package/src/capabilities/layout/intent-resolver.ts +0 -128
  186. package/src/capabilities/layout/react-context.tsx +0 -26
  187. package/src/capabilities/layout/state.ts +0 -32
  188. package/src/capabilities/navigation/index.ts +0 -10
  189. package/src/capabilities/navigation/intent-resolver.ts +0 -216
  190. package/src/capabilities/navigation/location.ts +0 -28
  191. package/src/capabilities/navigation/set-location.ts +0 -38
  192. package/src/capabilities/navigation/url-handler.ts +0 -67
  193. package/src/capabilities/settings/index.ts +0 -8
  194. package/src/capabilities/settings/react-surface.tsx +0 -23
  195. package/src/components/DeckContext.ts +0 -19
  196. package/src/components/LayoutContext.ts +0 -12
  197. package/src/layout.test.ts +0 -380
  198. package/src/util/layout-parts.ts +0 -12
  199. /package/dist/types/src/capabilities/{navigation/check-app-scheme.d.ts → check-app-scheme.d.ts} +0 -0
  200. /package/dist/types/src/capabilities/{layout/intent-resolver.d.ts → intent-resolver.d.ts} +0 -0
  201. /package/dist/types/src/capabilities/{layout/react-root.d.ts → react-root.d.ts} +0 -0
  202. /package/dist/types/src/capabilities/{settings/react-surface.d.ts → react-surface.d.ts} +0 -0
  203. /package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +0 -0
  204. /package/dist/types/src/capabilities/{navigation/url-handler.d.ts → url-handler.d.ts} +0 -0
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Input, Select, useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormInput } from '@dxos/react-ui-form';
8
+ import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
9
9
 
10
10
  import { DECK_PLUGIN } from '../meta';
11
11
  import {
@@ -22,7 +22,7 @@ export const LayoutSettings = ({ settings }: { settings: DeckSettingsProps }) =>
22
22
  const { t } = useTranslation(DECK_PLUGIN);
23
23
 
24
24
  return (
25
- <>
25
+ <DeprecatedFormContainer>
26
26
  <DeprecatedFormInput label={t('select new plank positioning label')}>
27
27
  <Select.Root
28
28
  value={settings.newPlankPositioning ?? 'start'}
@@ -72,12 +72,12 @@ export const LayoutSettings = ({ settings }: { settings: DeckSettingsProps }) =>
72
72
  />
73
73
  </DeprecatedFormInput>
74
74
  )}
75
- <DeprecatedFormInput label={t('settings custom slots')}>
76
- <Input.Switch checked={settings.customSlots} onCheckedChange={(checked) => (settings.customSlots = checked)} />
75
+ <DeprecatedFormInput label={t('settings enable ide-style statusbar label')}>
76
+ <Input.Switch
77
+ checked={settings.enableIdeStyleStatusbar}
78
+ onCheckedChange={(checked) => (settings.enableIdeStyleStatusbar = checked)}
79
+ />
77
80
  </DeprecatedFormInput>
78
- <DeprecatedFormInput label={t('settings flat deck')}>
79
- <Input.Switch checked={settings.flatDeck} onCheckedChange={(checked) => (settings.flatDeck = checked)} />
80
- </DeprecatedFormInput>
81
- </>
81
+ </DeprecatedFormContainer>
82
82
  );
83
83
  };
@@ -2,5 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { mx } from '@dxos/react-ui-theme';
6
+
5
7
  export const soloInlinePadding =
6
8
  'pis-[calc(env(safe-area-inset-left)+.25rem)] pie-[calc(env(safe-area-inset-left)+.25rem)]';
9
+
10
+ const sidebarToggleStyles = 'bs-[--rail-item] is-[--rail-item] absolute block-end-2 z-[1] !bg-deck lg:hidden';
11
+
12
+ export const fixedSidebarToggleStyles = mx(sidebarToggleStyles, 'inline-start-2');
13
+
14
+ export const fixedComplementarySidebarToggleStyles = mx(sidebarToggleStyles, 'inline-end-2');
@@ -3,6 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './DeckLayout';
6
- export * from './DeckContext';
7
- export * from './LayoutContext';
8
6
  export * from './LayoutSettings';
@@ -5,9 +5,9 @@
5
5
  import { useMainContext } from '@dxos/react-ui';
6
6
 
7
7
  export const useMainSize = () => {
8
- const { navigationSidebarOpen, complementarySidebarOpen } = useMainContext('DeckPluginPlank');
8
+ const { navigationSidebarState, complementarySidebarState } = useMainContext('DeckPluginPlank');
9
9
  return {
10
- 'data-sidebar-inline-start-state': navigationSidebarOpen ? 'open' : 'closed',
11
- 'data-sidebar-inline-end-state': complementarySidebarOpen ? 'open' : 'closed',
10
+ 'data-sidebar-inline-start-state': navigationSidebarState,
11
+ 'data-sidebar-inline-end-state': complementarySidebarState,
12
12
  };
13
13
  };
package/src/layout.ts CHANGED
@@ -4,245 +4,76 @@
4
4
 
5
5
  import { produce } from 'immer';
6
6
 
7
- import {
8
- type LayoutAdjustment,
9
- type LayoutCoordinate,
10
- type LayoutEntry,
11
- type LayoutPart,
12
- type LayoutParts,
13
- SLUG_ENTRY_SEPARATOR,
14
- SLUG_KEY_VALUE_SEPARATOR,
15
- SLUG_LIST_SEPARATOR,
16
- SLUG_PATH_SEPARATOR,
17
- } from '@dxos/app-framework';
7
+ import { type DeckAction, type NewPlankPositioning } from './types';
18
8
 
19
- import { type NewPlankPositioning } from './types';
9
+ type OpenLayoutEntryOptions = { key?: string; positioning?: NewPlankPositioning; pivotId?: string };
20
10
 
21
- // Part feature support
22
- const partsThatSupportIncrement = ['main'] as LayoutPart[];
23
-
24
- //
25
- // --- Layout Parts Manipulation ----------------------------------------------
26
-
27
- type OpenLayoutEntryOptions = { positioning?: NewPlankPositioning; pivotId?: string };
28
-
29
- export const openEntry = (
30
- layout: LayoutParts,
31
- part: LayoutPart,
32
- entry: LayoutEntry,
33
- options?: OpenLayoutEntryOptions,
34
- ): LayoutParts => {
35
- return produce(layout, (draft) => {
36
- const layoutPart = draft[part];
37
- // If the part doesn't exist, create it.
38
- if (!layoutPart) {
39
- draft[part] = [entry];
11
+ export const openEntry = (deck: string[], entryId: string, options?: OpenLayoutEntryOptions): string[] => {
12
+ return produce(deck, (draft) => {
13
+ // Check that the entry is not already in the part
14
+ if (draft.find((id) => id === entryId)) {
40
15
  return;
41
16
  }
42
- if (part === 'main') {
43
- // Check that the entry is not already in the part
44
- if (layoutPart.find((e) => e.id === entry.id)) {
17
+
18
+ const key = options?.key;
19
+ const plankPositioning = options?.positioning ?? 'start';
20
+ const pivotId = options?.pivotId;
21
+
22
+ if (key) {
23
+ const index = draft.findIndex((id) => id.startsWith(key));
24
+ if (index !== -1) {
25
+ draft.splice(index, 1, entryId);
45
26
  return;
46
27
  }
28
+ }
47
29
 
48
- const plankPositioning = options?.positioning ?? 'start';
49
- const pivotId = options?.pivotId;
50
-
51
- if (pivotId) {
52
- const pivotIndex = layoutPart.findIndex((e) => e.id === pivotId);
53
- if (pivotIndex !== -1) {
54
- if (plankPositioning === 'start') {
55
- layoutPart.splice(pivotIndex, 0, entry);
56
- } else {
57
- layoutPart.splice(pivotIndex + 1, 0, entry);
58
- }
59
- return;
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);
60
37
  }
38
+ return;
61
39
  }
40
+ }
62
41
 
63
- // If no pivot found or provided, fall back to original behavior
64
- if (plankPositioning === 'start') {
65
- layoutPart.unshift(entry);
66
- } else {
67
- layoutPart.push(entry);
68
- }
42
+ // If no pivot found or provided, fall back to original behavior
43
+ if (plankPositioning === 'start') {
44
+ draft.unshift(entryId);
69
45
  } else {
70
- // If the part is not main, we're going to replace the single entry in the part with the new entry.
71
- draft[part] = [entry];
46
+ draft.push(entryId);
72
47
  }
73
48
  });
74
49
  };
75
50
 
76
- export const closeEntry = (layout: LayoutParts, layoutCoordinate: LayoutCoordinate): LayoutParts => {
77
- return produce(layout, (draft) => {
78
- const { part, entryId: slugId } = layoutCoordinate;
79
- const layoutPart = draft[part];
80
- if (!layoutPart) {
81
- return;
82
- }
83
-
84
- const index = layoutPart.findIndex((entry) => entry.id === slugId);
85
- if (index === -1) {
86
- return;
87
- }
88
-
89
- // If there's only one entry in the layout part, remove the whole part from the layout.
90
- if (layoutPart.length === 1) {
91
- delete draft[part];
92
- } else {
93
- layoutPart.splice(index, 1);
51
+ export const closeEntry = (deck: string[], entryId: string): string[] => {
52
+ return produce(deck, (draft) => {
53
+ const index = draft.findIndex((id) => id === entryId);
54
+ if (index !== -1) {
55
+ draft.splice(index, 1);
94
56
  }
95
57
  });
96
58
  };
97
59
 
98
- export const incrementPlank = (layout: LayoutParts, adjustment: LayoutAdjustment): LayoutParts => {
99
- return produce(layout, (draft) => {
100
- const { layoutCoordinate, type } = adjustment;
101
- const { part, entryId } = layoutCoordinate;
102
-
103
- // Only allow adjustments in the 'main' part
104
- if (partsThatSupportIncrement.includes(part) === false) {
105
- return;
106
- }
107
-
108
- const layoutPart = draft[part];
109
- if (!layoutPart) {
110
- return;
111
- }
112
- const index = layoutPart.findIndex((entry) => entry.id === entryId);
60
+ export const incrementPlank = (deck: string[], adjustment: DeckAction.Adjustment): string[] => {
61
+ return produce(deck, (draft) => {
62
+ const index = draft.findIndex((id) => id === adjustment.id);
113
63
  if (
114
64
  index === -1 ||
115
- (type === 'increment-start' && index === 0) ||
116
- (type === 'increment-end' && index === layoutPart.length - 1)
65
+ (adjustment.type === 'increment-start' && index === 0) ||
66
+ (adjustment.type === 'increment-end' && index === draft.length - 1)
117
67
  ) {
118
68
  return;
119
69
  }
120
70
 
121
- if (type === 'increment-start') {
71
+ if (adjustment.type === 'increment-start') {
122
72
  // Swap the current item with the previous item.
123
- [layoutPart[index - 1], layoutPart[index]] = [layoutPart[index], layoutPart[index - 1]];
124
- } else if (type === 'increment-end') {
73
+ [draft[index - 1], draft[index]] = [draft[index], draft[index - 1]];
74
+ } else if (adjustment.type === 'increment-end') {
125
75
  // Swap the current item with the next item.
126
- [layoutPart[index], layoutPart[index + 1]] = [layoutPart[index + 1], layoutPart[index]];
76
+ [draft[index], draft[index + 1]] = [draft[index + 1], draft[index]];
127
77
  }
128
78
  });
129
79
  };
130
-
131
- export const removePart = (layout: LayoutParts, part: LayoutPart): LayoutParts => {
132
- return produce(layout, (draft) => {
133
- delete draft[part];
134
- });
135
- };
136
-
137
- export const mergeLayoutParts = (...layoutParts: LayoutParts[]): LayoutParts => {
138
- return layoutParts.reduce(
139
- (merged, current) =>
140
- produce(merged, (draft) => {
141
- Object.entries(current).forEach(([part, entries]) => {
142
- const typedPart = part as LayoutPart;
143
-
144
- if (!draft[typedPart]) {
145
- draft[typedPart] = [];
146
- }
147
-
148
- const partEntries = draft[typedPart] as LayoutEntry[];
149
-
150
- entries.forEach((entry) => {
151
- const existingIndex = partEntries.findIndex((e) => e.id === entry.id);
152
- if (existingIndex !== -1) {
153
- partEntries[existingIndex] = entry;
154
- } else {
155
- partEntries.push(entry);
156
- }
157
- });
158
- });
159
- }),
160
- {} as LayoutParts,
161
- );
162
- };
163
-
164
- //
165
- // URI Projection
166
- //
167
-
168
- const parseLayoutEntry = (itemString: string): LayoutEntry => {
169
- // Layout entries are in the form of 'id~path' or just 'id'
170
- const [id, path] = itemString.split(SLUG_PATH_SEPARATOR);
171
- const entry: LayoutEntry = { id };
172
- if (path) {
173
- entry.path = path;
174
- }
175
- return entry;
176
- };
177
-
178
- export const uriToSoloPart = (uri: string): LayoutParts | undefined => {
179
- // Now after the domain part, there will be a single ID with an optional path
180
- const parts = uri.split('/');
181
- const slug = parts[parts.length - 1]; // Take the last part of the URI
182
-
183
- if (slug.length > 0) {
184
- return {
185
- solo: [parseLayoutEntry(slug)],
186
- };
187
- }
188
-
189
- return undefined;
190
- };
191
-
192
- export const soloPartToUri = (layout: LayoutParts): string => {
193
- const soloPart = layout?.solo;
194
- if (!soloPart || soloPart.length === 0) {
195
- return '';
196
- }
197
-
198
- const entry = soloPart[0];
199
- return `${entry.id}${entry.path ? SLUG_PATH_SEPARATOR + entry.path : ''}`;
200
- };
201
-
202
- /**
203
- * Converts a URI string into a LayoutParts object.
204
- * @deprecated Keeping these as a reference for now. We should remove these once we're sure we don't need them.
205
- */
206
- export const uriToActiveParts = (uri: string): LayoutParts => {
207
- const parts = uri.split('/');
208
- const slug = parts[parts.length - 1]; // Take the last part of the URI
209
-
210
- if (!slug) {
211
- return {}; // Return an empty object if the slug is empty
212
- }
213
-
214
- return slug.split(SLUG_ENTRY_SEPARATOR).reduce((acc: LayoutParts, partDescriptor) => {
215
- const [part, layoutEntry] = partDescriptor.split(SLUG_KEY_VALUE_SEPARATOR);
216
- if (part && layoutEntry) {
217
- // TODO(Zan): Remove this cast.
218
- acc[part as LayoutPart] = layoutEntry.split(SLUG_LIST_SEPARATOR).map(parseLayoutEntry);
219
- }
220
- return acc;
221
- }, {} as LayoutParts);
222
- };
223
-
224
- const formatLayoutEntry = ({ id, path }: LayoutEntry): string => {
225
- // NOTE(Zan): Format = `[SOLO_INDICATOR] ID [PATH_SEPARATOR PATH]`.
226
- let entry = '';
227
- entry += id;
228
- if (path) {
229
- entry += `${SLUG_PATH_SEPARATOR}${path}`;
230
- }
231
- return entry;
232
- };
233
-
234
- const formatPartDescriptor = (part: LayoutPart, layoutEntries: LayoutEntry[]): string => {
235
- const formattedEntries = layoutEntries.map(formatLayoutEntry).join(SLUG_LIST_SEPARATOR);
236
- return `${part}${SLUG_KEY_VALUE_SEPARATOR}${formattedEntries}`;
237
- };
238
-
239
- /**
240
- * Converts a LayoutParts object into a URI string.
241
- * @deprecated Keeping these as a reference for now. We should remove these once we're sure we don't need them.
242
- */
243
- export const activePartsToUri = (activeParts: LayoutParts): string => {
244
- return Object.entries(activeParts)
245
- .filter(([, layoutEntries]) => layoutEntries.length > 0) // Only include non-empty parts
246
- .map(([part, layoutEntries]) => formatPartDescriptor(part as LayoutPart, layoutEntries))
247
- .join(SLUG_ENTRY_SEPARATOR);
248
- };
package/src/meta.ts CHANGED
@@ -9,4 +9,5 @@ export const DECK_PLUGIN = 'dxos.org/plugin/deck' as const;
9
9
  export const meta = {
10
10
  id: DECK_PLUGIN,
11
11
  name: 'Deck',
12
+ icon: 'ph--columns--regular',
12
13
  } satisfies PluginMeta;
@@ -8,11 +8,12 @@ export default [
8
8
  {
9
9
  'en-US': {
10
10
  [DECK_PLUGIN]: {
11
+ 'plugin name': 'Deck',
11
12
  'main header label': 'Main header',
12
- 'open navigation sidebar label': 'Open navigation sidebar',
13
- 'close navigation sidebar label': 'Minimize navigation sidebar',
14
- 'open complementary sidebar label': 'Open sidebar',
15
- 'close complementary sidebar label': 'Minimize sidebar',
13
+ 'open navigation sidebar label': 'Open sidebar',
14
+ 'collapse navigation sidebar label': 'Minimize sidebar',
15
+ 'open complementary sidebar label': 'Open context sidebar',
16
+ 'close complementary sidebar label': 'Minimize context sidebar',
16
17
  'plugin error message': 'Content failed to render.',
17
18
  'content fallback message': 'Unsupported',
18
19
  'content fallback description':
@@ -20,7 +21,6 @@ export default [
20
21
  'toggle fullscreen label': 'Toggle fullscreen',
21
22
  'settings show hints label': 'Show hints',
22
23
  'settings native redirect label': 'Enable native url redirect (experimental)',
23
- 'settings custom slots': 'Theme option (experimental)',
24
24
  'settings new plank position start label': 'Start',
25
25
  'settings new plank position end label': 'End',
26
26
  'select new plank positioning placeholder': 'Select new plank positioning',
@@ -32,7 +32,7 @@ export default [
32
32
  'error fallback message': 'Unable to open this item',
33
33
  'plank heading fallback label': 'Untitled',
34
34
  'actions menu label': 'Options',
35
- 'settings deck label': 'Disable Deck',
35
+ 'settings deck label': 'Disable deck',
36
36
  'reload required message': 'Reload required.',
37
37
  'pending heading': 'Loading…',
38
38
  'insert plank label': 'Open',
@@ -45,11 +45,11 @@ export default [
45
45
  'show solo plank label': 'Maximize',
46
46
  'close label': 'Close',
47
47
  'minify label': 'Minify',
48
- 'settings overscroll label': 'Plank Overscrolling',
48
+ 'settings overscroll label': 'Plank overscrolling',
49
49
  'select overscroll placeholder': 'Select plank overscrolling behavior',
50
50
  'settings overscroll centering label': 'Centering',
51
51
  'settings overscroll none label': 'None',
52
- 'settings flat deck': 'Flatten deck appearance',
52
+ 'settings enable ide-style statusbar label': 'IDE-style statusbar',
53
53
  'close current label': 'Close current plank',
54
54
  'close others label': 'Close other planks',
55
55
  'close all label': 'Close all planks',
package/src/types.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { LayoutAction } from '@dxos/app-framework';
5
6
  import { S } from '@dxos/echo-schema';
6
7
  import { type Label } from '@dxos/react-ui';
7
8
 
@@ -20,9 +21,8 @@ export type Panel = { id: string; label: Label; icon: string };
20
21
  export const DeckSettingsSchema = S.mutable(
21
22
  S.Struct({
22
23
  showHints: S.Boolean,
23
- customSlots: S.Boolean,
24
- flatDeck: S.Boolean,
25
24
  enableNativeRedirect: S.Boolean,
25
+ enableIdeStyleStatusbar: S.Boolean,
26
26
  newPlankPositioning: S.Literal(...NewPlankPositions),
27
27
  overscroll: S.Literal(...OverscrollOptions),
28
28
  }),
@@ -30,9 +30,95 @@ export const DeckSettingsSchema = S.mutable(
30
30
 
31
31
  export type DeckSettingsProps = S.Schema.Type<typeof DeckSettingsSchema>;
32
32
 
33
+ const LayoutMode = S.Union(S.Literal('deck'), S.Literal('solo'), S.Literal('fullscreen'));
34
+ export const isLayoutMode = (value: any): value is LayoutMode => S.is(LayoutMode)(value);
35
+ export type LayoutMode = S.Schema.Type<typeof LayoutMode>;
36
+
37
+ export const PlankSizing = S.Record({ key: S.String, value: S.Number });
38
+ export type PlankSizing = S.Schema.Type<typeof PlankSizing>;
39
+
40
+ export const Deck = S.Struct({
41
+ initialized: S.Boolean.annotations({
42
+ description: "If false, the deck has not yet left solo mode and new planks should be solo'd.",
43
+ }),
44
+ active: S.mutable(S.Array(S.String)),
45
+ inactive: S.mutable(S.Array(S.String)),
46
+ solo: S.optional(S.String),
47
+ fullscreen: S.Boolean,
48
+ plankSizing: S.mutable(PlankSizing),
49
+ });
50
+ export type Deck = S.Schema.Type<typeof Deck>;
51
+
52
+ export const DeckState = S.mutable(
53
+ S.Struct({
54
+ sidebarState: S.Literal('closed', 'collapsed', 'expanded'),
55
+ complementarySidebarState: S.Literal('closed', 'collapsed', 'expanded'),
56
+ complementarySidebarPanel: S.optional(S.String),
57
+
58
+ dialogOpen: S.Boolean,
59
+ /**
60
+ * Data to be passed to the dialog Surface.
61
+ */
62
+ dialogContent: S.optional(S.Any),
63
+ dialogBlockAlign: S.optional(S.Literal('start', 'center')),
64
+ dialogType: S.optional(S.Literal('default', 'alert')),
65
+
66
+ popoverOpen: S.Boolean,
67
+ /**
68
+ * Data to be passed to the popover Surface.
69
+ */
70
+ popoverContent: S.optional(S.Any),
71
+ popoverAnchorId: S.optional(S.String),
72
+
73
+ toasts: S.mutable(S.Array(LayoutAction.Toast)),
74
+ currentUndoId: S.optional(S.String),
75
+
76
+ activeDeck: S.String,
77
+ decks: S.mutable(S.Record({ key: S.String, value: S.mutable(Deck) })),
78
+ previousMode: S.mutable(S.Record({ key: S.String, value: LayoutMode })),
79
+ deck: S.mutable(Deck),
80
+
81
+ /**
82
+ * The identifier of a component to scroll into view when it is mounted.
83
+ */
84
+ scrollIntoView: S.optional(S.String),
85
+ }),
86
+ );
87
+
88
+ export type DeckState = S.Schema.Type<typeof DeckState>;
89
+
90
+ export const getMode = (deck: Deck): LayoutMode => {
91
+ if (deck.solo) {
92
+ return deck.fullscreen ? 'fullscreen' : 'solo';
93
+ }
94
+
95
+ return 'deck';
96
+ };
97
+
98
+ // NOTE: Chosen from RFC 1738’s `safe` characters: http://www.faqs.org/rfcs/rfc1738.html
99
+ export const SLUG_PATH_SEPARATOR = '~';
100
+
33
101
  export const DECK_ACTION = `${DECK_PLUGIN}/action`;
34
102
 
35
103
  export namespace DeckAction {
104
+ const PartAdjustmentSchema = S.Union(
105
+ S.Literal('close').annotations({ description: 'Close the plank.' }),
106
+ S.Literal('solo').annotations({ description: 'Solo the plank.' }),
107
+ S.Literal('increment-start').annotations({ description: 'Move the plank towards the start of the deck.' }),
108
+ S.Literal('increment-end').annotations({ description: 'Move the plank towards the end of the deck.' }),
109
+ );
110
+ export type PartAdjustment = S.Schema.Type<typeof PartAdjustmentSchema>;
111
+ export const Adjustment = S.mutable(S.Struct({ id: S.String, type: PartAdjustmentSchema }));
112
+ export type Adjustment = S.Schema.Type<typeof Adjustment>;
113
+
114
+ /**
115
+ * An atomic transaction to apply to the deck, describing which element to move to which location.
116
+ */
117
+ export class Adjust extends S.TaggedClass<Adjust>()(`${DECK_ACTION}/adjust`, {
118
+ input: Adjustment,
119
+ output: S.Void,
120
+ }) {}
121
+
36
122
  export class UpdatePlankSize extends S.TaggedClass<UpdatePlankSize>()(`${DECK_ACTION}/update-plank-size`, {
37
123
  input: S.Struct({
38
124
  id: S.String,
package/src/util/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './layout-parts';
6
5
  export * from './overscroll';
7
6
  export * from './useBreakpoints';
7
+ export * from './layoutAppliesTopbar';
8
+ export * from './useHoistStatusbar';
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export const layoutAppliesTopbar = (breakpoint: string) => {
6
+ return document.body.getAttribute('data-platform') === 'win' && breakpoint === 'desktop';
7
+ };
@@ -2,14 +2,23 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useLayoutEffect, useState } from 'react';
5
+ import { useMemo } from 'react';
6
+
7
+ import { Capabilities, useCapability } from '@dxos/app-framework';
8
+
9
+ import { DECK_PLUGIN } from '../meta';
10
+ import type { DeckSettingsProps } from '../types';
6
11
 
7
12
  export const useHoistStatusbar = (breakpoint: string) => {
8
- const [safeAreaBottom, setSafeAreaBottom] = useState(Infinity);
9
- useLayoutEffect(
10
- () =>
11
- setSafeAreaBottom(parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--safe-area-bottom'))),
12
- [],
13
- );
14
- return Number.isFinite(safeAreaBottom) && safeAreaBottom < 1 && breakpoint === 'desktop';
13
+ const enableIdeStyleStatusbar = useCapability(Capabilities.SettingsStore).getStore<DeckSettingsProps>(DECK_PLUGIN)!
14
+ .value.enableIdeStyleStatusbar;
15
+ return useMemo(() => {
16
+ return (
17
+ breakpoint === 'desktop' &&
18
+ enableIdeStyleStatusbar &&
19
+ // NOTE(thure): this last predicate depends on a head script that measures `env(safe-area-bottom)` on resize;
20
+ // see that of composer-app for an example.
21
+ document.body.getAttribute('data-safe-area-bottom') === '0'
22
+ );
23
+ }, [enableIdeStyleStatusbar, breakpoint]);
15
24
  };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/layout/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n Capabilities,\n contributes,\n createIntent,\n LayoutAction,\n NavigationAction,\n openIds,\n type PluginsContext,\n} from '@dxos/app-framework';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { createExtension, type Node, ROOT_ID } from '@dxos/plugin-graph';\n\nimport { DECK_PLUGIN } from '../../meta';\n\nexport default (context: PluginsContext) =>\n contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: DECK_PLUGIN,\n filter: (node): node is Node<null> => node.id === ROOT_ID,\n actions: () => {\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.SetLayoutMode._tag}/fullscreen`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(LayoutAction.SetLayoutMode, { layoutMode: 'fullscreen' }));\n },\n properties: {\n label: ['toggle fullscreen label', { ns: DECK_PLUGIN }],\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: `${NavigationAction.Close._tag}/current`,\n data: async () => {\n const attention = context.requestCapability(AttentionCapabilities.Attention);\n const attended = attention.current.at(-1);\n if (attended) {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(NavigationAction.Close, { activeParts: { main: [attended] } }));\n }\n },\n properties: {\n label: ['close current label', { ns: DECK_PLUGIN }],\n icon: 'ph--x--regular',\n },\n };\n\n const closeOthers = {\n id: `${NavigationAction.Close._tag}/others`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const location = context.requestCapability(Capabilities.Location);\n const attention = context.requestCapability(AttentionCapabilities.Attention);\n const attended = attention.current.at(-1);\n const ids = openIds(location.active, ['main']).filter((id) => id !== attended);\n await dispatch(\n createIntent(NavigationAction.Close, {\n activeParts: { main: ids },\n }),\n );\n },\n properties: {\n label: ['close others label', { ns: DECK_PLUGIN }],\n icon: 'ph--x-square--regular',\n },\n };\n\n const closeAll = {\n id: `${NavigationAction.Close._tag}/all`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const location = context.requestCapability(Capabilities.Location);\n await dispatch(\n createIntent(NavigationAction.Close, {\n activeParts: { main: openIds(location.active, ['main']) },\n }),\n );\n },\n properties: {\n label: ['close all label', { ns: DECK_PLUGIN }],\n icon: 'ph--x-circle--regular',\n },\n };\n\n const layoutMode = context.requestCapabilities(Capabilities.Layout)[0]?.layoutMode;\n return layoutMode === 'deck' ? [closeCurrent, closeOthers, closeAll] : [];\n },\n }),\n );\n"],
5
- "mappings": ";;;;;AAIA,SACEA,cACAC,aACAC,cACAC,cACAC,kBACAC,eAEK;AACP,SAASC,6BAA6B;AACtC,SAASC,iBAA4BC,eAAe;AAIpD,IAAA,4BAAe,CAACC,YACdC,YACEC,aAAaC,iBACbC,gBAAgB;EACdC,IAAIC;EACJC,QAAQ,CAACC,SAA6BA,KAAKH,OAAOI;EAClDC,SAAS,MAAA;AAGP,UAAMC,cAAc;MAClBN,IAAI,GAAGO,aAAaC,cAAcC,IAAI;MACtCC,MAAM,YAAA;AACJ,cAAM,EAAEC,iBAAiBC,SAAQ,IAAKjB,QAAQkB,kBAAkBhB,aAAaiB,gBAAgB;AAC7F,cAAMF,SAASG,aAAaR,aAAaC,eAAe;UAAEQ,YAAY;QAAa,CAAA,CAAA;MACrF;MACAC,YAAY;QACVC,OAAO;UAAC;UAA2B;YAAEC,IAAIlB;UAAY;;QACrDmB,MAAM;QACNC,YAAY;UACVC,OAAO;UACPC,SAAS;QACX;MACF;IACF;AAEA,UAAMC,eAAe;MACnBxB,IAAI,GAAGyB,iBAAiBC,MAAMjB,IAAI;MAClCC,MAAM,YAAA;AACJ,cAAMiB,YAAYhC,QAAQkB,kBAAkBe,sBAAsBC,SAAS;AAC3E,cAAMC,WAAWH,UAAUI,QAAQC,GAAG,EAAC;AACvC,YAAIF,UAAU;AACZ,gBAAM,EAAEnB,iBAAiBC,SAAQ,IAAKjB,QAAQkB,kBAAkBhB,aAAaiB,gBAAgB;AAC7F,gBAAMF,SAASG,aAAaU,iBAAiBC,OAAO;YAAEO,aAAa;cAAEC,MAAM;gBAACJ;;YAAU;UAAE,CAAA,CAAA;QAC1F;MACF;MACAb,YAAY;QACVC,OAAO;UAAC;UAAuB;YAAEC,IAAIlB;UAAY;;QACjDmB,MAAM;MACR;IACF;AAEA,UAAMe,cAAc;MAClBnC,IAAI,GAAGyB,iBAAiBC,MAAMjB,IAAI;MAClCC,MAAM,YAAA;AACJ,cAAM,EAAEC,iBAAiBC,SAAQ,IAAKjB,QAAQkB,kBAAkBhB,aAAaiB,gBAAgB;AAC7F,cAAMsB,WAAWzC,QAAQkB,kBAAkBhB,aAAawC,QAAQ;AAChE,cAAMV,YAAYhC,QAAQkB,kBAAkBe,sBAAsBC,SAAS;AAC3E,cAAMC,WAAWH,UAAUI,QAAQC,GAAG,EAAC;AACvC,cAAMM,MAAMC,QAAQH,SAASI,QAAQ;UAAC;SAAO,EAAEtC,OAAO,CAACF,OAAOA,OAAO8B,QAAAA;AACrE,cAAMlB,SACJG,aAAaU,iBAAiBC,OAAO;UACnCO,aAAa;YAAEC,MAAMI;UAAI;QAC3B,CAAA,CAAA;MAEJ;MACArB,YAAY;QACVC,OAAO;UAAC;UAAsB;YAAEC,IAAIlB;UAAY;;QAChDmB,MAAM;MACR;IACF;AAEA,UAAMqB,WAAW;MACfzC,IAAI,GAAGyB,iBAAiBC,MAAMjB,IAAI;MAClCC,MAAM,YAAA;AACJ,cAAM,EAAEC,iBAAiBC,SAAQ,IAAKjB,QAAQkB,kBAAkBhB,aAAaiB,gBAAgB;AAC7F,cAAMsB,WAAWzC,QAAQkB,kBAAkBhB,aAAawC,QAAQ;AAChE,cAAMzB,SACJG,aAAaU,iBAAiBC,OAAO;UACnCO,aAAa;YAAEC,MAAMK,QAAQH,SAASI,QAAQ;cAAC;aAAO;UAAE;QAC1D,CAAA,CAAA;MAEJ;MACAvB,YAAY;QACVC,OAAO;UAAC;UAAmB;YAAEC,IAAIlB;UAAY;;QAC7CmB,MAAM;MACR;IACF;AAEA,UAAMJ,aAAarB,QAAQ+C,oBAAoB7C,aAAa8C,MAAM,EAAE,CAAA,GAAI3B;AACxE,WAAOA,eAAe,SAAS;MAACQ;MAAcW;MAAaM;QAAY,CAAA;EACzE;AACF,CAAA,CAAA;",
6
- "names": ["Capabilities", "contributes", "createIntent", "LayoutAction", "NavigationAction", "openIds", "AttentionCapabilities", "createExtension", "ROOT_ID", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "DECK_PLUGIN", "filter", "node", "ROOT_ID", "actions", "_fullscreen", "LayoutAction", "SetLayoutMode", "_tag", "data", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "createIntent", "layoutMode", "properties", "label", "ns", "icon", "keyBinding", "macos", "windows", "closeCurrent", "NavigationAction", "Close", "attention", "AttentionCapabilities", "Attention", "attended", "current", "at", "activeParts", "main", "closeOthers", "location", "Location", "ids", "openIds", "active", "closeAll", "requestCapabilities", "Layout"]
7
- }