@dxos/plugin-simple-layout 0.0.0 → 0.8.4-main.1c7ec43d41

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 (207) hide show
  1. package/dist/lib/browser/SimpleLayoutPlugin-Q5BZE6KD.mjs +50 -0
  2. package/dist/lib/browser/SimpleLayoutPlugin-Q5BZE6KD.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +25 -0
  4. package/dist/lib/browser/index.mjs.map +7 -0
  5. package/dist/lib/browser/meta.json +1 -0
  6. package/dist/lib/browser/translations.mjs +34 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/SimpleLayoutPlugin-OD45TNPO.mjs +52 -0
  9. package/dist/lib/node-esm/SimpleLayoutPlugin-OD45TNPO.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +27 -0
  11. package/dist/lib/node-esm/index.mjs.map +7 -0
  12. package/dist/lib/node-esm/meta.json +1 -0
  13. package/dist/lib/node-esm/translations.mjs +36 -0
  14. package/dist/lib/node-esm/translations.mjs.map +7 -0
  15. package/dist/types/src/SimpleLayoutPlugin.d.ts +8 -0
  16. package/dist/types/src/SimpleLayoutPlugin.d.ts.map +1 -0
  17. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  18. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  19. package/dist/types/src/capabilities/index.d.ts +22 -0
  20. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  21. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  22. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  23. package/dist/types/src/capabilities/react-root.d.ts +9 -0
  24. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  25. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  26. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  27. package/dist/types/src/capabilities/spotlight-dismiss.d.ts +14 -0
  28. package/dist/types/src/capabilities/spotlight-dismiss.d.ts.map +1 -0
  29. package/dist/types/src/capabilities/state.d.ts +19 -0
  30. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  31. package/dist/types/src/capabilities/url-handler.d.ts +12 -0
  32. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -0
  33. package/dist/types/src/components/ContentError.stories.d.ts +46 -0
  34. package/dist/types/src/components/ContentError.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts +19 -0
  36. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts.map +1 -0
  37. package/dist/types/src/components/DebugOverlay/index.d.ts +2 -0
  38. package/dist/types/src/components/DebugOverlay/index.d.ts.map +1 -0
  39. package/dist/types/src/components/Dialog/Dialog.d.ts +3 -0
  40. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  41. package/dist/types/src/components/Dialog/index.d.ts +2 -0
  42. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Home/Home.d.ts +7 -0
  44. package/dist/types/src/components/Home/Home.d.ts.map +1 -0
  45. package/dist/types/src/components/Home/index.d.ts +2 -0
  46. package/dist/types/src/components/Home/index.d.ts.map +1 -0
  47. package/dist/types/src/components/Loading/Loading.d.ts +3 -0
  48. package/dist/types/src/components/Loading/Loading.d.ts.map +1 -0
  49. package/dist/types/src/components/Loading/Loading.stories.d.ts +13 -0
  50. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +1 -0
  51. package/dist/types/src/components/Loading/index.d.ts +2 -0
  52. package/dist/types/src/components/Loading/index.d.ts.map +1 -0
  53. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts +35 -0
  54. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts.map +1 -0
  55. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts +7 -0
  56. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts.map +1 -0
  57. package/dist/types/src/components/MobileLayout/index.d.ts +2 -0
  58. package/dist/types/src/components/MobileLayout/index.d.ts.map +1 -0
  59. package/dist/types/src/components/NavBranch/NavBranch.d.ts +11 -0
  60. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -0
  61. package/dist/types/src/components/NavBranch/index.d.ts +2 -0
  62. package/dist/types/src/components/NavBranch/index.d.ts.map +1 -0
  63. package/dist/types/src/components/Popover/Popover.d.ts +4 -0
  64. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -0
  65. package/dist/types/src/components/Popover/index.d.ts +2 -0
  66. package/dist/types/src/components/Popover/index.d.ts.map +1 -0
  67. package/dist/types/src/components/SimpleLayout/AppBar.d.ts +24 -0
  68. package/dist/types/src/components/SimpleLayout/AppBar.d.ts.map +1 -0
  69. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts +54 -0
  70. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/SimpleLayout/Drawer.d.ts +6 -0
  72. package/dist/types/src/components/SimpleLayout/Drawer.d.ts.map +1 -0
  73. package/dist/types/src/components/SimpleLayout/Main.d.ts +6 -0
  74. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -0
  75. package/dist/types/src/components/SimpleLayout/NavBar.d.ts +16 -0
  76. package/dist/types/src/components/SimpleLayout/NavBar.d.ts.map +1 -0
  77. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts +49 -0
  78. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/SimpleLayout/SimpleLayout.d.ts +3 -0
  80. package/dist/types/src/components/SimpleLayout/SimpleLayout.d.ts.map +1 -0
  81. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts +48 -0
  82. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/SimpleLayout/index.d.ts +5 -0
  84. package/dist/types/src/components/SimpleLayout/index.d.ts.map +1 -0
  85. package/dist/types/src/components/hooks.d.ts +7 -0
  86. package/dist/types/src/components/hooks.d.ts.map +1 -0
  87. package/dist/types/src/components/index.d.ts +8 -0
  88. package/dist/types/src/components/index.d.ts.map +1 -0
  89. package/dist/types/src/hooks/actions.d.ts +19 -0
  90. package/dist/types/src/hooks/actions.d.ts.map +1 -0
  91. package/dist/types/src/hooks/index.d.ts +7 -0
  92. package/dist/types/src/hooks/index.d.ts.map +1 -0
  93. package/dist/types/src/hooks/useAppBarProps.d.ts +7 -0
  94. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -0
  95. package/dist/types/src/hooks/useCompanions.d.ts +12 -0
  96. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -0
  97. package/dist/types/src/hooks/useDrawerActions.d.ts +13 -0
  98. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -0
  99. package/dist/types/src/hooks/useNavbarActions.d.ts +14 -0
  100. package/dist/types/src/hooks/useNavbarActions.d.ts.map +1 -0
  101. package/dist/types/src/hooks/useSimpleLayoutState.d.ts +7 -0
  102. package/dist/types/src/hooks/useSimpleLayoutState.d.ts.map +1 -0
  103. package/dist/types/src/index.d.ts +4 -0
  104. package/dist/types/src/index.d.ts.map +1 -0
  105. package/dist/types/src/meta.d.ts +3 -0
  106. package/dist/types/src/meta.d.ts.map +1 -0
  107. package/dist/types/src/operations/close.d.ts +5 -0
  108. package/dist/types/src/operations/close.d.ts.map +1 -0
  109. package/dist/types/src/operations/index.d.ts +3 -0
  110. package/dist/types/src/operations/index.d.ts.map +1 -0
  111. package/dist/types/src/operations/open.d.ts +5 -0
  112. package/dist/types/src/operations/open.d.ts.map +1 -0
  113. package/dist/types/src/operations/revert-workspace.d.ts +5 -0
  114. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -0
  115. package/dist/types/src/operations/set-layout-mode.d.ts +5 -0
  116. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -0
  117. package/dist/types/src/operations/set.d.ts +5 -0
  118. package/dist/types/src/operations/set.d.ts.map +1 -0
  119. package/dist/types/src/operations/state-access.d.ts +8 -0
  120. package/dist/types/src/operations/state-access.d.ts.map +1 -0
  121. package/dist/types/src/operations/switch-workspace.d.ts +5 -0
  122. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -0
  123. package/dist/types/src/operations/update-complementary.d.ts +5 -0
  124. package/dist/types/src/operations/update-complementary.d.ts.map +1 -0
  125. package/dist/types/src/operations/update-dialog.d.ts +5 -0
  126. package/dist/types/src/operations/update-dialog.d.ts.map +1 -0
  127. package/dist/types/src/operations/update-popover.d.ts +5 -0
  128. package/dist/types/src/operations/update-popover.d.ts.map +1 -0
  129. package/dist/types/src/operations/update-sidebar.d.ts +5 -0
  130. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -0
  131. package/dist/types/src/translations.d.ts +32 -0
  132. package/dist/types/src/translations.d.ts.map +1 -0
  133. package/dist/types/src/types/capabilities.d.ts +44 -0
  134. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  135. package/dist/types/src/types/events.d.ts +6 -0
  136. package/dist/types/src/types/events.d.ts.map +1 -0
  137. package/dist/types/src/types/index.d.ts +3 -0
  138. package/dist/types/src/types/index.d.ts.map +1 -0
  139. package/dist/types/tsconfig.tsbuildinfo +1 -0
  140. package/package.json +58 -29
  141. package/src/SimpleLayoutPlugin.ts +39 -11
  142. package/src/capabilities/app-graph-builder.ts +21 -0
  143. package/src/capabilities/index.ts +13 -3
  144. package/src/capabilities/operation-handler.ts +14 -0
  145. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +4 -4
  146. package/src/capabilities/react-surface.tsx +50 -0
  147. package/src/{hooks/useSpotlightDismiss.ts → capabilities/spotlight-dismiss.ts} +31 -40
  148. package/src/capabilities/state.tsx +52 -0
  149. package/src/capabilities/url-handler.ts +161 -0
  150. package/src/components/ContentError.stories.tsx +9 -8
  151. package/src/components/DebugOverlay/DebugOverlay.tsx +96 -0
  152. package/src/components/DebugOverlay/index.ts +5 -0
  153. package/src/components/Dialog/Dialog.tsx +26 -15
  154. package/src/components/Home/Home.tsx +80 -80
  155. package/src/components/{ContentLoading.stories.tsx → Loading/Loading.stories.tsx} +5 -5
  156. package/src/components/{ContentLoading.tsx → Loading/Loading.tsx} +2 -2
  157. package/src/components/Loading/index.ts +5 -0
  158. package/src/components/MobileLayout/MobileLayout.stories.tsx +133 -0
  159. package/src/components/MobileLayout/MobileLayout.tsx +374 -0
  160. package/src/components/MobileLayout/index.ts +5 -0
  161. package/src/components/NavBranch/NavBranch.tsx +124 -0
  162. package/src/components/NavBranch/index.ts +5 -0
  163. package/src/components/Popover/Popover.tsx +49 -27
  164. package/src/components/SimpleLayout/AppBar.stories.tsx +144 -0
  165. package/src/components/SimpleLayout/AppBar.tsx +94 -0
  166. package/src/components/SimpleLayout/Drawer.tsx +104 -0
  167. package/src/components/SimpleLayout/Main.tsx +54 -61
  168. package/src/components/SimpleLayout/NavBar.stories.tsx +164 -0
  169. package/src/components/SimpleLayout/NavBar.tsx +19 -83
  170. package/src/components/SimpleLayout/SimpleLayout.stories.tsx +44 -61
  171. package/src/components/SimpleLayout/SimpleLayout.tsx +45 -8
  172. package/src/components/SimpleLayout/index.ts +3 -0
  173. package/src/components/hooks.ts +26 -0
  174. package/src/components/index.ts +4 -1
  175. package/src/hooks/actions.ts +84 -0
  176. package/src/hooks/index.ts +6 -1
  177. package/src/hooks/useAppBarProps.ts +95 -0
  178. package/src/hooks/useCompanions.ts +22 -0
  179. package/src/hooks/useDrawerActions.ts +100 -0
  180. package/src/hooks/useNavbarActions.ts +87 -0
  181. package/src/hooks/useSimpleLayoutState.ts +30 -0
  182. package/src/index.ts +7 -1
  183. package/src/meta.ts +2 -1
  184. package/src/operations/close.ts +34 -0
  185. package/src/operations/index.ts +16 -0
  186. package/src/operations/open.ts +63 -0
  187. package/src/operations/revert-workspace.ts +22 -0
  188. package/src/operations/set-layout-mode.ts +12 -0
  189. package/src/operations/set.ts +23 -0
  190. package/src/operations/state-access.ts +19 -0
  191. package/src/operations/switch-workspace.ts +26 -0
  192. package/src/operations/update-complementary.ts +35 -0
  193. package/src/operations/update-dialog.ts +28 -0
  194. package/src/operations/update-popover.ts +35 -0
  195. package/src/operations/update-sidebar.ts +12 -0
  196. package/src/translations.ts +21 -13
  197. package/src/types/capabilities.ts +23 -7
  198. package/src/types/events.ts +15 -0
  199. package/src/types/index.ts +1 -0
  200. package/src/capabilities/operation-resolver/index.ts +0 -10
  201. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -135
  202. package/src/capabilities/react-root/index.ts +0 -7
  203. package/src/capabilities/state/index.ts +0 -9
  204. package/src/capabilities/state/state.tsx +0 -60
  205. package/src/components/ContentError.tsx +0 -23
  206. package/src/components/SimpleLayout/Banner.tsx +0 -60
  207. package/src/components/SimpleLayout/NavBarstories.tsx +0 -59
@@ -2,36 +2,52 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { type Atom } from '@effect-atom/atom-react';
6
+
5
7
  import { Capability } from '@dxos/app-framework';
8
+ import { type Label } from '@dxos/react-ui';
9
+
10
+ import { meta } from '#meta';
6
11
 
7
- import { meta } from '../meta';
12
+ export type DrawerState = 'closed' | 'open' | 'expanded';
8
13
 
9
14
  // TODO(wittjosiah): Handle toasts.
10
15
  export type SimpleLayoutState = {
11
16
  /** Data to be passed to the main content Surface. */
12
17
  content?: any;
13
18
 
19
+ previousWorkspace: string;
20
+ workspace: string;
21
+ active?: string;
22
+
14
23
  dialogOpen: boolean;
15
24
  dialogType?: 'default' | 'alert';
16
25
  dialogBlockAlign?: 'start' | 'center' | 'end';
17
26
  dialogOverlayClasses?: string;
18
27
  dialogOverlayStyle?: Record<string, any>;
19
28
  /** Data to be passed to the dialog Surface. */
20
- dialogContent?: any;
29
+ dialogContent?: { component: string; props?: any } | null;
21
30
 
22
31
  popoverOpen?: boolean;
23
32
  popoverSide?: 'top' | 'right' | 'bottom' | 'left';
24
33
  popoverVariant?: 'virtual' | 'react';
25
34
  popoverAnchor?: HTMLButtonElement;
26
35
  popoverAnchorId?: string;
27
- popoverContent?: any;
36
+ popoverKind?: 'base' | 'card';
37
+ popoverTitle?: Label;
38
+ popoverContent?: { component: string; props?: any } | { subject: any } | null;
28
39
 
29
- workspace: string;
30
- previousWorkspace: string;
31
- active?: string;
40
+ /** Bottom drawer state. */
41
+ drawerState: DrawerState;
42
+
43
+ /** Stack of previously active item IDs for back navigation. */
44
+ history: string[];
32
45
 
33
46
  /** Whether running in popover window context (hides mobile-specific UI). */
34
47
  isPopover?: boolean;
48
+
49
+ /** Variant of the companion to display in the drawer (e.g., "comments", "assistant-chat"). */
50
+ companionVariant?: string;
35
51
  };
36
52
 
37
- export const SimpleLayoutState = Capability.make<SimpleLayoutState>(`${meta.id}/state`);
53
+ export const SimpleLayoutState = Capability.make<Atom.Writable<SimpleLayoutState>>(`${meta.id}.state`);
@@ -0,0 +1,15 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ActivationEvent } from '@dxos/app-framework';
6
+ import { AppActivationEvents } from '@dxos/app-toolkit/events';
7
+
8
+ import { SimpleLayoutState } from './capabilities';
9
+
10
+ export namespace SimpleLayoutEvents {
11
+ /** Fired when SimpleLayoutState capability is ready. */
12
+ export const StateReady: ActivationEvent.ActivationEvent = AppActivationEvents.createStateEvent(
13
+ SimpleLayoutState.identifier,
14
+ );
15
+ }
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './capabilities';
6
+ export * from './events';
@@ -1,10 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Capability, Capability as Capability$ } from '@dxos/app-framework';
6
-
7
- export const OperationResolver: Capability.LazyCapability = Capability$.lazy(
8
- 'OperationResolver',
9
- () => import('./operation-resolver'),
10
- );
@@ -1,135 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
-
7
- import { Capability, Common } from '@dxos/app-framework';
8
- import { Operation, OperationResolver } from '@dxos/operation';
9
-
10
- import { SimpleLayoutState } from '../../types';
11
-
12
- export default Capability.makeModule(
13
- Effect.fnUntraced(function* () {
14
- return Capability.contributes(Common.Capability.OperationResolver, [
15
- //
16
- // UpdateSidebar - No-op for simple layout.
17
- //
18
- OperationResolver.make({
19
- operation: Common.LayoutOperation.UpdateSidebar,
20
- handler: () => Effect.void,
21
- }),
22
-
23
- //
24
- // UpdateComplementary - No-op for simple layout.
25
- //
26
- OperationResolver.make({
27
- operation: Common.LayoutOperation.UpdateComplementary,
28
- handler: () => Effect.void,
29
- }),
30
-
31
- //
32
- // UpdateDialog
33
- //
34
- OperationResolver.make({
35
- operation: Common.LayoutOperation.UpdateDialog,
36
- handler: Effect.fnUntraced(function* (input) {
37
- const layout = yield* Capability.get(SimpleLayoutState);
38
- layout.dialogOpen = input.state ?? Boolean(input.subject);
39
- layout.dialogType = input.type ?? 'default';
40
- layout.dialogBlockAlign = input.blockAlign ?? 'center';
41
- layout.dialogOverlayClasses = input.overlayClasses;
42
- layout.dialogOverlayStyle = input.overlayStyle;
43
- layout.dialogContent = input.subject ? { component: input.subject, props: input.props } : null;
44
- }),
45
- }),
46
-
47
- //
48
- // UpdatePopover
49
- //
50
- OperationResolver.make({
51
- operation: Common.LayoutOperation.UpdatePopover,
52
- handler: Effect.fnUntraced(function* (input) {
53
- const layout = yield* Capability.get(SimpleLayoutState);
54
- layout.popoverOpen = input.state ?? Boolean(input.subject);
55
- layout.popoverContent =
56
- typeof input.subject === 'string'
57
- ? { component: input.subject, props: input.props }
58
- : input.subject
59
- ? { subject: input.subject }
60
- : undefined;
61
- layout.popoverSide = input.side;
62
- layout.popoverVariant = input.variant;
63
- if (input.variant === 'virtual') {
64
- layout.popoverAnchor = input.anchor;
65
- } else {
66
- layout.popoverAnchorId = input.anchorId;
67
- }
68
- }),
69
- }),
70
-
71
- //
72
- // SwitchWorkspace
73
- //
74
- OperationResolver.make({
75
- operation: Common.LayoutOperation.SwitchWorkspace,
76
- handler: Effect.fnUntraced(function* (input) {
77
- const layout = yield* Capability.get(SimpleLayoutState);
78
- // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.
79
- // Ideally this should be worked into the data model in a generic way.
80
- if (!layout.workspace.startsWith('!')) {
81
- layout.previousWorkspace = layout.workspace;
82
- }
83
- layout.workspace = input.subject;
84
- layout.active = undefined;
85
- }),
86
- }),
87
-
88
- //
89
- // RevertWorkspace
90
- //
91
- OperationResolver.make({
92
- operation: Common.LayoutOperation.RevertWorkspace,
93
- handler: Effect.fnUntraced(function* () {
94
- const layout = yield* Capability.get(SimpleLayoutState);
95
- yield* Operation.invoke(Common.LayoutOperation.SwitchWorkspace, {
96
- subject: layout.previousWorkspace,
97
- });
98
- }),
99
- }),
100
-
101
- //
102
- // Open
103
- //
104
- OperationResolver.make({
105
- operation: Common.LayoutOperation.Open,
106
- handler: Effect.fnUntraced(function* (input) {
107
- const layout = yield* Capability.get(SimpleLayoutState);
108
- layout.active = input.subject[0];
109
- }),
110
- }),
111
-
112
- //
113
- // Close
114
- //
115
- OperationResolver.make({
116
- operation: Common.LayoutOperation.Close,
117
- handler: Effect.fnUntraced(function* () {
118
- const layout = yield* Capability.get(SimpleLayoutState);
119
- layout.active = undefined;
120
- }),
121
- }),
122
-
123
- //
124
- // Set
125
- //
126
- OperationResolver.make({
127
- operation: Common.LayoutOperation.Set,
128
- handler: Effect.fnUntraced(function* (input) {
129
- const layout = yield* Capability.get(SimpleLayoutState);
130
- layout.active = input.subject[0];
131
- }),
132
- }),
133
- ]);
134
- }),
135
- );
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const ReactRoot = Capability.lazy('ReactRoot', () => import('./react-root'));
@@ -1,9 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capability } from '@dxos/app-framework';
6
-
7
- export const State = Capability.lazy('State', () => import('./state'));
8
-
9
- export type { SimpleLayoutStateOptions } from './state';
@@ -1,60 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import * as Effect from 'effect/Effect';
6
-
7
- import { Capability, Common } from '@dxos/app-framework';
8
- import { live } from '@dxos/live-object';
9
-
10
- import { type SimpleLayoutState } from '../../types';
11
- import { SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';
12
-
13
- const defaultState: SimpleLayoutState = {
14
- dialogOpen: false,
15
- workspace: 'default',
16
- previousWorkspace: 'default',
17
- isPopover: false,
18
- };
19
-
20
- export type SimpleLayoutStateOptions = {
21
- initialState?: Partial<SimpleLayoutState>;
22
- };
23
-
24
- export default Capability.makeModule(({ initialState }: SimpleLayoutStateOptions = {}) =>
25
- Effect.sync(() => {
26
- const state = live<SimpleLayoutState>({ ...defaultState, ...initialState });
27
-
28
- const layout = live<Common.Capability.Layout>({
29
- get mode() {
30
- return 'simple';
31
- },
32
- get dialogOpen() {
33
- return state.dialogOpen;
34
- },
35
- get sidebarOpen() {
36
- return false;
37
- },
38
- get complementarySidebarOpen() {
39
- return false;
40
- },
41
- get workspace() {
42
- return state.workspace;
43
- },
44
- get active() {
45
- return state.active ? [state.active] : [];
46
- },
47
- get inactive() {
48
- return [];
49
- },
50
- get scrollIntoView() {
51
- return undefined;
52
- },
53
- });
54
-
55
- return [
56
- Capability.contributes(SimpleLayoutStateCapability, state),
57
- Capability.contributes(Common.Capability.Layout, layout),
58
- ];
59
- }),
60
- );
@@ -1,23 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { useTranslation } from '@dxos/react-ui';
8
- import { descriptionMessage, mx } from '@dxos/ui-theme';
9
-
10
- import { meta } from '../meta';
11
-
12
- // TODO(burdon): Factor out.
13
- export const ContentError = ({ error }: { error?: Error }) => {
14
- const { t } = useTranslation(meta.id);
15
- const errorString = error?.toString() ?? '';
16
- return (
17
- <div role='none' className='grid place-items-center overflow-y-auto attention-surface'>
18
- <p role='alert' className={mx(descriptionMessage, 'p-2 break-all rounded-sm')}>
19
- {error ? errorString : t('error fallback message')}
20
- </p>
21
- </div>
22
- );
23
- };
@@ -1,60 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React, { useCallback } from 'react';
6
-
7
- import { Common } from '@dxos/app-framework';
8
- import { useCapability, useOperationInvoker } from '@dxos/app-framework/react';
9
- import { type Node } from '@dxos/plugin-graph';
10
- import { IconButton, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
- import { mx, osTranslations, surfaceZIndex } from '@dxos/ui-theme';
12
-
13
- import { meta } from '../../meta';
14
- import { SimpleLayoutState } from '../../types';
15
-
16
- export type BannerProps = {
17
- node?: Node.Node;
18
- };
19
-
20
- export const Banner = ({ node }: BannerProps) => {
21
- const { t } = useTranslation(meta.id);
22
- const layout = useCapability(SimpleLayoutState);
23
- const { invokePromise } = useOperationInvoker();
24
- const label = node ? toLocalizedString(node.properties.label, t) : t('current app name', { ns: osTranslations });
25
-
26
- const handleClick = useCallback(async () => {
27
- if (layout.active) {
28
- await invokePromise(Common.LayoutOperation.Close, { subject: [layout.active] });
29
- } else {
30
- await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: 'default' });
31
- }
32
- }, [invokePromise, layout.active]);
33
-
34
- return (
35
- // Note that the HTML5 element `header` has a default role of `banner`, hence the name of this component.
36
- // It should not be confused with the `heading` role (elements h1-6).
37
- // TODO(burdon): Fixed or not?
38
- <header
39
- className={mx(
40
- '_fixed flex items-center gap-2 pli-2 block-start-0 inset-inline-0 bs-[--dx-mobile-topbar-content-height,48px] bg-baseSurface border-be border-separator',
41
- 'grid grid-cols-[min-content_1fr_min-content]',
42
- surfaceZIndex({ level: 'menu' }),
43
- )}
44
- >
45
- {node ? (
46
- <IconButton
47
- iconOnly
48
- variant='ghost'
49
- icon='ph--caret-left--regular'
50
- label={t('back label')}
51
- onClick={handleClick}
52
- />
53
- ) : (
54
- <div />
55
- )}
56
- <h1 className={'grow text-center truncate font-medium'}>{label}</h1>
57
- {/* TODO(burdon): Menu. */}
58
- </header>
59
- );
60
- };
@@ -1,59 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Meta, type StoryObj } from '@storybook/react-vite';
6
-
7
- import { withPluginManager } from '@dxos/app-framework/testing';
8
- import { corePlugins } from '@dxos/plugin-testing';
9
- import { withTheme } from '@dxos/react-ui/testing';
10
-
11
- import { translations } from '../../translations';
12
-
13
- import { NavBar } from './NavBar';
14
-
15
- const meta = {
16
- title: 'plugins/plugin-simple-layout/NavBar',
17
- component: NavBar,
18
- decorators: [
19
- withTheme,
20
- withPluginManager({
21
- plugins: [...corePlugins()],
22
- }),
23
- ],
24
- parameters: {
25
- layout: 'fullscreen',
26
- translations,
27
- },
28
- argTypes: {
29
- onActiveIdChange: { action: 'activeIdChanged' },
30
- },
31
- } satisfies Meta<typeof NavBar>;
32
-
33
- export default meta;
34
-
35
- type Story = StoryObj<typeof meta>;
36
-
37
- export const Default: Story = {
38
- args: {
39
- activeId: undefined,
40
- },
41
- };
42
-
43
- export const BrowseActive: Story = {
44
- args: {
45
- activeId: 'some-document',
46
- },
47
- };
48
-
49
- export const NotificationsActive: Story = {
50
- args: {
51
- activeId: 'notifications',
52
- },
53
- };
54
-
55
- export const ProfileActive: Story = {
56
- args: {
57
- activeId: 'profile',
58
- },
59
- };