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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs +113 -0
  2. package/dist/lib/browser/CommandsDialogContent-2DKIOLJL.mjs.map +7 -0
  3. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs +33 -0
  4. package/dist/lib/browser/CommandsTrigger-ABODVVMP.mjs.map +7 -0
  5. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.mjs +12 -0
  6. package/dist/lib/browser/NavTreeContainer-IQZCK4Y4.mjs.map +7 -0
  7. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs +26 -0
  8. package/dist/lib/browser/NavTreeDocumentTitle-L6NLLWLD.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-builder-RSMA6I22.mjs → app-graph-builder-Z43OTNI2.mjs} +6 -5
  10. package/dist/lib/browser/app-graph-builder-Z43OTNI2.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-YKTYPINZ.mjs → chunk-A4VDCIJC.mjs} +3 -3
  12. package/dist/lib/browser/{chunk-YKTYPINZ.mjs.map → chunk-A4VDCIJC.mjs.map} +1 -1
  13. package/dist/lib/browser/chunk-DINDC6HE.mjs +14 -0
  14. package/dist/lib/browser/chunk-DINDC6HE.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-AGQDZBPL.mjs → chunk-KF26WA4O.mjs} +5 -5
  16. package/dist/lib/browser/{chunk-AGQDZBPL.mjs.map → chunk-KF26WA4O.mjs.map} +3 -3
  17. package/dist/lib/browser/chunk-OGUYILOW.mjs +1462 -0
  18. package/dist/lib/browser/chunk-OGUYILOW.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +35 -31
  20. package/dist/lib/browser/index.mjs.map +3 -3
  21. package/dist/lib/browser/{keyboard-32EH3N4K.mjs → keyboard-HYGFQO7T.mjs} +11 -6
  22. package/dist/lib/browser/keyboard-HYGFQO7T.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs +49 -0
  25. package/dist/lib/browser/operation-resolver-VDWVUII5.mjs.map +7 -0
  26. package/dist/lib/browser/{react-surface-F6CVMS3Y.mjs → react-surface-LFMKIKNY.mjs} +15 -14
  27. package/dist/lib/browser/react-surface-LFMKIKNY.mjs.map +7 -0
  28. package/dist/lib/browser/{state-EVYQOUI3.mjs → state-CWMNNF7K.mjs} +34 -23
  29. package/dist/lib/browser/state-CWMNNF7K.mjs.map +7 -0
  30. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  31. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  32. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +1 -1
  34. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  36. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  38. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  40. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  42. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/state/state.d.ts +1 -1
  44. package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
  45. package/dist/types/src/components/NavTree/NavTree.d.ts +10 -32
  46. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  47. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +2 -5
  48. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  50. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  51. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  52. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  53. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +4 -2
  54. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  55. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +1 -1
  56. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  57. package/dist/types/src/components/Sidebar/L0Menu.d.ts +4 -1
  58. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  59. package/dist/types/src/components/Sidebar/L1Panel.d.ts +3 -6
  60. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  61. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +3 -2
  62. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  63. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  64. package/dist/types/src/components/index.d.ts +0 -3
  65. package/dist/types/src/components/index.d.ts.map +1 -1
  66. package/dist/types/src/components/types.d.ts +5 -13
  67. package/dist/types/src/components/types.d.ts.map +1 -1
  68. package/dist/types/src/{components/CommandsDialog/CommandsDialog.d.ts → containers/CommandsDialogContent/CommandsDialogContent.d.ts} +1 -1
  69. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  70. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +3 -0
  71. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  72. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  73. package/dist/types/src/containers/CommandsTrigger/index.d.ts +3 -0
  74. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  75. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  76. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  77. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  78. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  79. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  80. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +3 -0
  81. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  82. package/dist/types/src/containers/index.d.ts +7 -0
  83. package/dist/types/src/containers/index.d.ts.map +1 -0
  84. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  85. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  86. package/dist/types/src/hooks/index.d.ts +5 -0
  87. package/dist/types/src/hooks/index.d.ts.map +1 -0
  88. package/dist/types/src/hooks/useActions.d.ts +5 -0
  89. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  90. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  91. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  92. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  93. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  94. package/dist/types/src/{hooks.d.ts → hooks/useNavTreeState.d.ts} +2 -14
  95. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  96. package/dist/types/src/meta.d.ts.map +1 -1
  97. package/dist/types/src/testing/generator.d.ts +3 -3
  98. package/dist/types/src/testing/generator.d.ts.map +1 -1
  99. package/dist/types/src/types/events.d.ts.map +1 -1
  100. package/dist/types/src/util.d.ts +5 -1
  101. package/dist/types/src/util.d.ts.map +1 -1
  102. package/dist/types/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +43 -42
  104. package/src/NavTreePlugin.tsx +22 -24
  105. package/src/capabilities/app-graph-builder/app-graph-builder.ts +4 -3
  106. package/src/capabilities/keyboard/keyboard.ts +6 -5
  107. package/src/capabilities/operation-resolver/operation-resolver.ts +23 -19
  108. package/src/capabilities/react-surface/react-surface.tsx +12 -13
  109. package/src/capabilities/state/state.ts +41 -13
  110. package/src/components/NavTree/NavTree.stories.tsx +20 -18
  111. package/src/components/NavTree/NavTree.tsx +61 -20
  112. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  113. package/src/components/NavTreeContext/index.ts +5 -0
  114. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +2 -2
  115. package/src/components/NavTreeItem/NavTreeItemAction.tsx +40 -23
  116. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +40 -14
  117. package/src/components/Sidebar/L0Menu.tsx +80 -83
  118. package/src/components/Sidebar/L1Panel.tsx +244 -90
  119. package/src/components/Sidebar/L1Tabs.tsx +13 -3
  120. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +2 -3
  121. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +1 -1
  122. package/src/components/index.ts +0 -3
  123. package/src/components/types.ts +12 -17
  124. package/src/{components/CommandsDialog/CommandsDialog.tsx → containers/CommandsDialogContent/CommandsDialogContent.tsx} +19 -13
  125. package/src/containers/CommandsDialogContent/index.ts +7 -0
  126. package/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.tsx +4 -4
  127. package/src/containers/CommandsTrigger/index.ts +7 -0
  128. package/src/{components → containers/NavTreeContainer}/NavTreeContainer.tsx +75 -141
  129. package/src/containers/NavTreeContainer/index.ts +6 -0
  130. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +1 -1
  131. package/src/containers/NavTreeDocumentTitle/index.ts +7 -0
  132. package/src/containers/index.ts +12 -0
  133. package/src/experimental/Tree.stories.tsx +54 -57
  134. package/src/experimental/Tree.tsx +3 -3
  135. package/src/hooks/index.ts +8 -0
  136. package/src/hooks/useActions.ts +34 -0
  137. package/src/hooks/useLoadDescendents.ts +23 -0
  138. package/src/hooks/useNavTreeModel.ts +118 -0
  139. package/src/{hooks.ts → hooks/useNavTreeState.ts} +3 -34
  140. package/src/meta.ts +2 -2
  141. package/src/testing/app-graph-builder.ts +5 -5
  142. package/src/testing/generator.ts +4 -4
  143. package/src/types/capabilities.ts +1 -1
  144. package/src/types/events.ts +3 -2
  145. package/src/util.ts +18 -4
  146. package/dist/lib/browser/app-graph-builder-RSMA6I22.mjs.map +0 -7
  147. package/dist/lib/browser/chunk-6YPQ625I.mjs +0 -1293
  148. package/dist/lib/browser/chunk-6YPQ625I.mjs.map +0 -7
  149. package/dist/lib/browser/keyboard-32EH3N4K.mjs.map +0 -7
  150. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs +0 -52
  151. package/dist/lib/browser/operation-resolver-IB75DC5O.mjs.map +0 -7
  152. package/dist/lib/browser/react-surface-F6CVMS3Y.mjs.map +0 -7
  153. package/dist/lib/browser/state-EVYQOUI3.mjs.map +0 -7
  154. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  155. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  156. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  157. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  158. package/dist/types/src/components/NavTreeContainer.d.ts +0 -16
  159. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  160. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  161. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  162. package/dist/types/src/hooks.d.ts.map +0 -1
  163. package/src/components/CommandsDialog/index.ts +0 -6
  164. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
  165. /package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-navtree",
3
- "version": "0.8.4-main.bc674ce",
3
+ "version": "0.8.4-main.c351d160a8",
4
4
  "description": "DXOS Surface plugin for a tree view visualization of the graph.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -33,57 +33,58 @@
33
33
  "@radix-ui/react-dismissable-layer": "1.1.5",
34
34
  "@radix-ui/react-use-controllable-state": "1.1.0",
35
35
  "date-fns": "^3.3.1",
36
- "@dxos/app-framework": "0.8.4-main.bc674ce",
37
- "@dxos/async": "0.8.4-main.bc674ce",
38
- "@dxos/app-graph": "0.8.4-main.bc674ce",
39
- "@dxos/debug": "0.8.4-main.bc674ce",
40
- "@dxos/echo": "0.8.4-main.bc674ce",
41
- "@dxos/invariant": "0.8.4-main.bc674ce",
42
- "@dxos/keyboard": "0.8.4-main.bc674ce",
43
- "@dxos/lit-ui": "0.8.4-main.bc674ce",
44
- "@dxos/log": "0.8.4-main.bc674ce",
45
- "@dxos/operation": "0.8.4-main.bc674ce",
46
- "@dxos/plugin-deck": "0.8.4-main.bc674ce",
47
- "@dxos/plugin-graph": "0.8.4-main.bc674ce",
48
- "@dxos/plugin-observability": "0.8.4-main.bc674ce",
49
- "@dxos/protocols": "0.8.4-main.bc674ce",
50
- "@dxos/react-client": "0.8.4-main.bc674ce",
51
- "@dxos/react-ui-attention": "0.8.4-main.bc674ce",
52
- "@dxos/react-ui-menu": "0.8.4-main.bc674ce",
53
- "@dxos/react-ui-list": "0.8.4-main.bc674ce",
54
- "@dxos/react-ui-mosaic": "0.8.4-main.bc674ce",
55
- "@dxos/react-ui-stack": "0.8.4-main.bc674ce",
56
- "@dxos/react-ui-tabs": "0.8.4-main.bc674ce",
57
- "@dxos/react-ui-searchlist": "0.8.4-main.bc674ce",
58
- "@dxos/util": "0.8.4-main.bc674ce"
36
+ "@dxos/app-framework": "0.8.4-main.c351d160a8",
37
+ "@dxos/app-graph": "0.8.4-main.c351d160a8",
38
+ "@dxos/app-toolkit": "0.8.4-main.c351d160a8",
39
+ "@dxos/async": "0.8.4-main.c351d160a8",
40
+ "@dxos/echo": "0.8.4-main.c351d160a8",
41
+ "@dxos/debug": "0.8.4-main.c351d160a8",
42
+ "@dxos/invariant": "0.8.4-main.c351d160a8",
43
+ "@dxos/lit-ui": "0.8.4-main.c351d160a8",
44
+ "@dxos/keyboard": "0.8.4-main.c351d160a8",
45
+ "@dxos/operation": "0.8.4-main.c351d160a8",
46
+ "@dxos/log": "0.8.4-main.c351d160a8",
47
+ "@dxos/plugin-deck": "0.8.4-main.c351d160a8",
48
+ "@dxos/plugin-graph": "0.8.4-main.c351d160a8",
49
+ "@dxos/plugin-observability": "0.8.4-main.c351d160a8",
50
+ "@dxos/react-client": "0.8.4-main.c351d160a8",
51
+ "@dxos/protocols": "0.8.4-main.c351d160a8",
52
+ "@dxos/react-ui-attention": "0.8.4-main.c351d160a8",
53
+ "@dxos/react-ui-list": "0.8.4-main.c351d160a8",
54
+ "@dxos/react-ui-mosaic": "0.8.4-main.c351d160a8",
55
+ "@dxos/react-ui-stack": "0.8.4-main.c351d160a8",
56
+ "@dxos/react-ui-searchlist": "0.8.4-main.c351d160a8",
57
+ "@dxos/util": "0.8.4-main.c351d160a8",
58
+ "@dxos/react-ui-tabs": "0.8.4-main.c351d160a8",
59
+ "@dxos/react-ui-menu": "0.8.4-main.c351d160a8"
59
60
  },
60
61
  "devDependencies": {
61
- "@effect-atom/atom-react": "^0.4.6",
62
- "@effect/platform": "0.93.6",
62
+ "@effect-atom/atom-react": "^0.5.0",
63
+ "@effect/platform": "0.94.4",
63
64
  "@types/react": "~19.2.7",
64
65
  "@types/react-dom": "~19.2.3",
65
- "effect": "3.19.11",
66
+ "effect": "3.19.16",
66
67
  "react": "~19.2.3",
67
68
  "react-dom": "~19.2.3",
68
- "vite": "7.1.9",
69
- "@dxos/plugin-client": "0.8.4-main.bc674ce",
70
- "@dxos/plugin-attention": "0.8.4-main.bc674ce",
71
- "@dxos/plugin-space": "0.8.4-main.bc674ce",
72
- "@dxos/random": "0.8.4-main.bc674ce",
73
- "@dxos/plugin-theme": "0.8.4-main.bc674ce",
74
- "@dxos/react-ui": "0.8.4-main.bc674ce",
75
- "@dxos/storybook-utils": "0.8.4-main.bc674ce",
76
- "@dxos/plugin-testing": "0.8.4-main.bc674ce",
77
- "@dxos/ui-theme": "0.8.4-main.bc674ce"
69
+ "vite": "^7.1.11",
70
+ "@dxos/plugin-attention": "0.8.4-main.c351d160a8",
71
+ "@dxos/plugin-space": "0.8.4-main.c351d160a8",
72
+ "@dxos/plugin-client": "0.8.4-main.c351d160a8",
73
+ "@dxos/plugin-testing": "0.8.4-main.c351d160a8",
74
+ "@dxos/plugin-theme": "0.8.4-main.c351d160a8",
75
+ "@dxos/ui-theme": "0.8.4-main.c351d160a8",
76
+ "@dxos/random": "0.8.4-main.c351d160a8",
77
+ "@dxos/storybook-utils": "0.8.4-main.c351d160a8",
78
+ "@dxos/react-ui": "0.8.4-main.c351d160a8"
78
79
  },
79
80
  "peerDependencies": {
80
- "@effect-atom/atom-react": "^0.4.6",
81
- "@effect/platform": "0.93.6",
82
- "effect": "3.19.11",
81
+ "@effect-atom/atom-react": "^0.5.0",
82
+ "@effect/platform": "0.94.4",
83
+ "effect": "3.19.16",
83
84
  "react": "~19.2.3",
84
85
  "react-dom": "~19.2.3",
85
- "@dxos/react-ui": "0.8.4-main.bc674ce",
86
- "@dxos/ui-theme": "0.8.4-main.bc674ce"
86
+ "@dxos/react-ui": "0.8.4-main.c351d160a8",
87
+ "@dxos/ui-theme": "0.8.4-main.c351d160a8"
87
88
  },
88
89
  "publishConfig": {
89
90
  "access": "public"
@@ -4,25 +4,20 @@
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
- import { ActivationEvent, Capability, Common, Plugin } from '@dxos/app-framework';
7
+ import { ActivationEvent, ActivationEvents, Capabilities, Capability, Plugin } from '@dxos/app-framework';
8
+ import { AppActivationEvents, AppCapabilities, AppPlugin, LayoutOperation } from '@dxos/app-toolkit';
8
9
  import { Graph } from '@dxos/plugin-graph';
9
10
  import { type TreeData } from '@dxos/react-ui-list';
10
11
 
11
12
  import { AppGraphBuilder, Keyboard, OperationResolver, ReactSurface, State } from './capabilities';
12
- import { NODE_TYPE } from './components';
13
+ import { NODE_TYPE } from './containers';
13
14
  import { meta } from './meta';
14
15
  import { translations } from './translations';
15
16
  import { NavTreeEvents } from './types';
16
17
 
17
18
  export const NavTreePlugin = Plugin.define(meta).pipe(
18
- Plugin.addModule({
19
- id: 'state',
20
- activatesOn: Common.ActivationEvent.LayoutReady,
21
- activatesAfter: [NavTreeEvents.StateReady],
22
- activate: State,
23
- }),
24
- Common.Plugin.addTranslationsModule({ translations }),
25
- Common.Plugin.addMetadataModule({
19
+ AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
20
+ AppPlugin.addMetadataModule({
26
21
  metadata: {
27
22
  id: NODE_TYPE,
28
23
  metadata: {
@@ -39,23 +34,32 @@ export const NavTreePlugin = Plugin.define(meta).pipe(
39
34
  },
40
35
  },
41
36
  }),
37
+ AppPlugin.addOperationResolverModule({ activate: OperationResolver }),
38
+ AppPlugin.addSurfaceModule({ activate: ReactSurface }),
39
+ AppPlugin.addTranslationsModule({ translations }),
40
+ Plugin.addModule({
41
+ id: 'state',
42
+ activatesOn: AppActivationEvents.LayoutReady,
43
+ activatesAfter: [NavTreeEvents.StateReady],
44
+ activate: State,
45
+ }),
42
46
  Plugin.addModule({
43
47
  id: 'expose',
44
48
  activatesOn: ActivationEvent.allOf(
45
- Common.ActivationEvent.OperationInvokerReady,
46
- Common.ActivationEvent.AppGraphReady,
47
- Common.ActivationEvent.LayoutReady,
49
+ ActivationEvents.OperationInvokerReady,
50
+ AppActivationEvents.AppGraphReady,
51
+ AppActivationEvents.LayoutReady,
48
52
  NavTreeEvents.StateReady,
49
53
  ),
50
54
  activate: Effect.fnUntraced(function* () {
51
- const layout = yield* Common.Capability.getAtomValue(Common.Capability.Layout);
52
- const { invokePromise } = yield* Capability.get(Common.Capability.OperationInvoker);
53
- const { graph } = yield* Capability.get(Common.Capability.AppGraph);
55
+ const layout = yield* Capabilities.getAtomValue(AppCapabilities.Layout);
56
+ const { invokePromise } = yield* Capability.get(Capabilities.OperationInvoker);
57
+ const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
54
58
  if (invokePromise && layout.active.length === 1) {
55
59
  // TODO(wittjosiah): This should really be fired once the navtree renders for the first time.
56
60
  // That is the point at which the graph is expanded and the path should be available.
57
61
  void Graph.waitForPath(graph, { target: layout.active[0] }, { timeout: 30_000 })
58
- .then(() => invokePromise(Common.LayoutOperation.Expose, { subject: layout.active[0] }))
62
+ .then(() => invokePromise(LayoutOperation.Expose, { subject: layout.active[0] }))
59
63
  .catch(() => {});
60
64
  }
61
65
 
@@ -64,14 +68,8 @@ export const NavTreePlugin = Plugin.define(meta).pipe(
64
68
  }),
65
69
  Plugin.addModule({
66
70
  id: 'keyboard',
67
- activatesOn: ActivationEvent.allOf(
68
- Common.ActivationEvent.AppGraphReady,
69
- Common.ActivationEvent.OperationInvokerReady,
70
- ),
71
+ activatesOn: ActivationEvent.allOf(AppActivationEvents.AppGraphReady, ActivationEvents.OperationInvokerReady),
71
72
  activate: Keyboard,
72
73
  }),
73
- Common.Plugin.addSurfaceModule({ activate: ReactSurface }),
74
- Common.Plugin.addOperationResolverModule({ activate: OperationResolver }),
75
- Common.Plugin.addAppGraphModule({ activate: AppGraphBuilder }),
76
74
  Plugin.make,
77
75
  );
@@ -4,7 +4,8 @@
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
- import { Capability, Common } from '@dxos/app-framework';
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
8
9
  import { Operation } from '@dxos/operation';
9
10
  import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
10
11
 
@@ -20,7 +21,7 @@ export default Capability.makeModule(
20
21
  {
21
22
  id: COMMANDS_DIALOG,
22
23
  data: () =>
23
- Operation.invoke(Common.LayoutOperation.UpdateDialog, {
24
+ Operation.invoke(LayoutOperation.UpdateDialog, {
24
25
  subject: COMMANDS_DIALOG,
25
26
  blockAlign: 'start',
26
27
  }),
@@ -36,6 +37,6 @@ export default Capability.makeModule(
36
37
  ]),
37
38
  });
38
39
 
39
- return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);
40
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
40
41
  }),
41
42
  );
@@ -4,7 +4,8 @@
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
6
 
7
- import { Capability, Common } from '@dxos/app-framework';
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities } from '@dxos/app-toolkit';
8
9
  import { debounce } from '@dxos/async';
9
10
  import { Keyboard } from '@dxos/keyboard';
10
11
  import { Graph, Node, runAction } from '@dxos/plugin-graph';
@@ -14,8 +15,8 @@ import { KEY_BINDING } from '../../meta';
14
15
 
15
16
  export default Capability.makeModule(
16
17
  Effect.fnUntraced(function* () {
17
- const { graph } = yield* Capability.get(Common.Capability.AppGraph);
18
- const invoker = yield* Capability.get(Common.Capability.OperationInvoker);
18
+ const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
19
+ const invoker = yield* Capability.get(Capabilities.OperationInvoker);
19
20
  const pluginContext = yield* Capability.Service;
20
21
 
21
22
  // TODO(wittjosiah): Factor out.
@@ -46,7 +47,7 @@ export default Capability.makeModule(
46
47
  };
47
48
 
48
49
  const eventHandler = debounce(() => {
49
- Graph.traverse(graph, { visitor });
50
+ Graph.traverse(graph, { relation: ['child', 'action'], visitor });
50
51
  }, 500);
51
52
 
52
53
  const unsubscribe = graph.onNodeChanged.on(eventHandler);
@@ -55,7 +56,7 @@ export default Capability.makeModule(
55
56
  Keyboard.singleton.initialize();
56
57
  Keyboard.singleton.setCurrentContext(Node.RootId);
57
58
 
58
- return Capability.contributes(Common.Capability.Null, null, () =>
59
+ return Capability.contributes(Capabilities.Null, null, () =>
59
60
  Effect.sync(() => {
60
61
  unsubscribe();
61
62
  Keyboard.singleton.destroy();
@@ -3,8 +3,11 @@
3
3
  //
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
6
7
 
7
- import { Capability, Common } from '@dxos/app-framework';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
10
+ import { expandAttendableId } from '@dxos/react-ui-attention';
8
11
  import { log } from '@dxos/log';
9
12
  import { OperationResolver } from '@dxos/operation';
10
13
  import { Graph } from '@dxos/plugin-graph';
@@ -13,27 +16,28 @@ import { NavTreeCapabilities } from '../../types';
13
16
 
14
17
  export default Capability.makeModule(
15
18
  Effect.fnUntraced(function* () {
16
- return Capability.contributes(Common.Capability.OperationResolver, [
19
+ return Capability.contributes(Capabilities.OperationResolver, [
17
20
  OperationResolver.make({
18
- operation: Common.LayoutOperation.Expose,
21
+ operation: LayoutOperation.Expose,
19
22
  handler: Effect.fnUntraced(function* ({ subject }) {
20
- const { graph } = yield* Capability.get(Common.Capability.AppGraph);
23
+ const { graph } = yield* Capability.get(AppCapabilities.AppGraph);
21
24
  const { getItem, setItem } = yield* Capability.get(NavTreeCapabilities.State);
22
- yield* Effect.tryPromise(() => Graph.waitForPath(graph, { target: subject }, { timeout: 1_000 })).pipe(
23
- Effect.andThen((path) => {
24
- [...Array(path.length)].forEach((_, index) => {
25
- const subpath = path.slice(0, index);
26
- const value = getItem(subpath);
27
- if (!value.open) {
28
- setItem(subpath, 'open', true);
29
- }
30
- });
31
- }),
32
- Effect.catchAll(() => {
33
- log('Path to node not found', { subject });
34
- return Effect.void;
35
- }),
36
- );
25
+
26
+ const prefixes = expandAttendableId(subject);
27
+
28
+ for (const qualifiedId of prefixes) {
29
+ Graph.expand(graph, qualifiedId, 'child');
30
+
31
+ const treePath = prefixes.slice(0, prefixes.indexOf(qualifiedId) + 1);
32
+ const state = getItem(treePath);
33
+ if (!state.open) {
34
+ setItem(treePath, 'open', true);
35
+ }
36
+ }
37
+
38
+ if (Option.isNone(Graph.getNode(graph, subject))) {
39
+ log('Node not found after expansion', { subject });
40
+ }
37
41
  }),
38
42
  }),
39
43
  ]);
@@ -5,46 +5,45 @@
5
5
  import * as Effect from 'effect/Effect';
6
6
  import React from 'react';
7
7
 
8
- import { Capability, Common } from '@dxos/app-framework';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { Surface } from '@dxos/app-framework/ui';
9
10
  import { Node } from '@dxos/plugin-graph';
10
11
 
11
- import { CommandsDialogContent, CommandsTrigger, NavTreeContainer, NavTreeDocumentTitle } from '../../components';
12
+ import { CommandsDialogContent, CommandsTrigger, NavTreeContainer, NavTreeDocumentTitle } from '../../containers';
12
13
  import { COMMANDS_DIALOG, meta } from '../../meta';
13
14
 
14
15
  export default Capability.makeModule(() =>
15
16
  Effect.succeed(
16
- Capability.contributes(Common.Capability.ReactSurface, [
17
- Common.createSurface({
17
+ Capability.contributes(Capabilities.ReactSurface, [
18
+ Surface.create({
18
19
  id: COMMANDS_DIALOG,
19
20
  role: 'dialog',
20
21
  filter: (data): data is { props: { selected?: string } } => data.component === COMMANDS_DIALOG,
21
22
  component: ({ data, ref }) => <CommandsDialogContent {...data.props} ref={ref} />,
22
23
  }),
23
- Common.createSurface({
24
- id: `${meta.id}/navigation`,
24
+ Surface.create({
25
+ id: `${meta.id}.navigation`,
25
26
  role: 'navigation',
26
- filter: (data): data is { popoverAnchorId?: string; topbar: boolean; current: string } =>
27
- typeof data.current === 'string',
27
+ filter: (data): data is { popoverAnchorId?: string; current: string } => typeof data.current === 'string',
28
28
  component: ({ data, ref }) => {
29
29
  return (
30
30
  <NavTreeContainer
31
31
  tab={data.current}
32
32
  popoverAnchorId={data.popoverAnchorId as string | undefined}
33
- topbar={data.topbar as boolean}
34
33
  ref={ref}
35
34
  />
36
35
  );
37
36
  },
38
37
  }),
39
- Common.createSurface({
40
- id: `${meta.id}/document-title`,
38
+ Surface.create({
39
+ id: `${meta.id}.document-title`,
41
40
  role: 'document-title',
42
41
  component: ({ data }) => (
43
42
  <NavTreeDocumentTitle node={Node.isGraphNode(data.subject) ? data.subject : undefined} />
44
43
  ),
45
44
  }),
46
- Common.createSurface({
47
- id: `${meta.id}/search-input`,
45
+ Surface.create({
46
+ id: `${meta.id}.search-input`,
48
47
  role: 'search-input',
49
48
  position: 'fallback',
50
49
  component: () => <CommandsTrigger />,
@@ -5,24 +5,25 @@
5
5
  import { Atom } from '@effect-atom/atom-react';
6
6
  import * as Effect from 'effect/Effect';
7
7
 
8
- import { Capability, Common } from '@dxos/app-framework';
8
+ import { Capabilities, Capability } from '@dxos/app-framework';
9
+ import { AppCapabilities } from '@dxos/app-toolkit';
10
+ import { Graph, Node } from '@dxos/plugin-graph';
9
11
  import { Path } from '@dxos/react-ui-list';
10
12
 
11
13
  import { meta } from '../../meta';
12
14
  import { type NavTreeCapabilities as NC, NavTreeCapabilities } from '../../types';
13
15
 
14
- const KEY = `${meta.id}/state/v1`;
16
+ const KEY = `${meta.id}.state.v1`;
15
17
 
16
18
  /** Default item state for new entries. */
17
19
  const defaultItemState: NC.NavTreeItemState = { open: false, current: false, alternateTree: false };
18
20
 
21
+ /** L0 (top-level workspace) paths are direct children of root — not part of the expandable tree model. */
22
+ const isTopLevelPath = (path: string[]): boolean => path.length === 2 && path[0] === Node.RootId;
23
+
19
24
  /** Default state entries for initial tree structure. */
20
25
  // TODO(thure): Initialize these dynamically.
21
- const defaultStateEntries: [string, NC.NavTreeItemState][] = [
22
- ['root', { open: true, current: false }],
23
- ['root~dxos.org/plugin/space-spaces', { open: true, current: false }],
24
- ['root~dxos.org/plugin/files', { open: true, current: false }],
25
- ];
26
+ const defaultStateEntries: [string, NC.NavTreeItemState][] = [['root', { open: true, current: false }]];
26
27
 
27
28
  const getInitialState = (): Map<string, NC.NavTreeItemState> => {
28
29
  const stringified = localStorage.getItem(KEY);
@@ -40,8 +41,8 @@ const getInitialState = (): Map<string, NC.NavTreeItemState> => {
40
41
 
41
42
  export default Capability.makeModule(
42
43
  Effect.fnUntraced(function* () {
43
- const registry = yield* Capability.get(Common.Capability.AtomRegistry);
44
- const layoutAtom = yield* Capability.get(Common.Capability.Layout);
44
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
45
+ const layoutAtom = yield* Capability.get(AppCapabilities.Layout);
45
46
 
46
47
  // Backing state for persistence (not reactive).
47
48
  const backingState = getInitialState();
@@ -55,6 +56,9 @@ export default Capability.makeModule(
55
56
 
56
57
  const getItemAtom = (path: string[]): Atom.Atom<NC.NavTreeItemState> => {
57
58
  const pathString = Path.create(...path);
59
+ if (!backingState.has(pathString)) {
60
+ backingState.set(pathString, { ...defaultItemState });
61
+ }
58
62
  return itemAtomFamily(pathString);
59
63
  };
60
64
 
@@ -68,12 +72,12 @@ export default Capability.makeModule(
68
72
  const currentValue = registry.get(atom);
69
73
  const newValue = { ...currentValue, [key]: next };
70
74
 
71
- // Update the atom.
72
75
  registry.set(atom, newValue);
73
76
 
74
- // Update backing state and persist to localStorage.
75
- backingState.set(pathString, newValue);
76
- localStorage.setItem(KEY, JSON.stringify(Array.from(backingState.entries())));
77
+ if (!(key === 'open' && isTopLevelPath(path))) {
78
+ backingState.set(pathString, newValue);
79
+ localStorage.setItem(KEY, JSON.stringify(Array.from(backingState.entries())));
80
+ }
77
81
  };
78
82
 
79
83
  // Subscribe to layout changes to update current state.
@@ -108,6 +112,30 @@ export default Capability.makeModule(
108
112
  return () => clearTimeout(timeout);
109
113
  });
110
114
 
115
+ // Once graph is ready, expand every node marked open in state so the graph has children loaded for rendering.
116
+ yield* Effect.gen(function* () {
117
+ const { graph } = yield* Capability.waitFor(AppCapabilities.AppGraph);
118
+
119
+ // Always expand the active workspace so its subtree is initialized.
120
+ const layout = registry.get(layoutAtom);
121
+ if (layout.workspace) {
122
+ Graph.expand(graph, layout.workspace, 'child');
123
+ }
124
+
125
+ // Expand persisted open nodes, skipping inactive workspace tabs.
126
+ const openPaths = Array.from(backingState.entries())
127
+ .filter(([, state]) => state.open)
128
+ .map(([pathString]) => Path.parts(pathString))
129
+ .filter((path) => !isTopLevelPath(path));
130
+ for (const path of openPaths) {
131
+ const nodeId = path[path.length - 1];
132
+ if (!nodeId) {
133
+ continue;
134
+ }
135
+ Graph.expand(graph, nodeId, 'child');
136
+ }
137
+ }).pipe(Effect.forkDaemon);
138
+
111
139
  return Capability.contributes(
112
140
  NavTreeCapabilities.State,
113
141
  {
@@ -8,22 +8,23 @@ import * as Effect from 'effect/Effect';
8
8
  import React, { type KeyboardEvent, useCallback, useRef } from 'react';
9
9
  import { expect, userEvent, within } from 'storybook/test';
10
10
 
11
- import { Capability, Common } from '@dxos/app-framework';
12
- import { useAtomCapability } from '@dxos/app-framework/react';
11
+ import { Capabilities, Capability } from '@dxos/app-framework';
13
12
  import { withPluginManager } from '@dxos/app-framework/testing';
13
+ import { useAtomCapability } from '@dxos/app-framework/ui';
14
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
14
15
  import { OperationResolver } from '@dxos/operation';
15
16
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
16
17
  import { faker } from '@dxos/random';
17
18
  import { IconButton, Input, Main, Toolbar } from '@dxos/react-ui';
18
- import { withTheme } from '@dxos/react-ui/testing';
19
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
19
20
  import { useAttention, useAttentionAttributes } from '@dxos/react-ui-attention';
20
21
  import { Stack, StackItem } from '@dxos/react-ui-stack';
21
22
  import { mx } from '@dxos/ui-theme';
22
23
 
24
+ import { NavTreeContainer } from '../../containers';
23
25
  import { NavTreePlugin } from '../../NavTreePlugin';
24
26
  import { storybookGraphBuilders } from '../../testing';
25
27
  import { translations } from '../../translations';
26
- import { NavTreeContainer } from '../NavTreeContainer';
27
28
 
28
29
  faker.seed(1234);
29
30
 
@@ -39,14 +40,14 @@ const StoryPlankHeading = ({ attendableId }: { attendableId: string }) => {
39
40
  const { hasAttention } = useAttention(attendableId);
40
41
  console.log('hasAttention', hasAttention);
41
42
  return (
42
- <div className='flex p-1 items-center border-be border-separator'>
43
+ <div className='flex p-1 items-center border-b border-separator'>
43
44
  <IconButton
44
45
  density='coarse'
45
46
  icon='ph--atom--regular'
46
47
  label='Test'
47
48
  iconOnly
48
49
  variant={hasAttention ? 'primary' : 'ghost'}
49
- classNames='is-[--rail-action] bs-[--rail-action]'
50
+ classNames='w-(--dx-rail-action) h-(--dx-rail-action)'
50
51
  />
51
52
  <StackItem.ResizeHandle />
52
53
  </div>
@@ -69,22 +70,22 @@ const StoryPlank = ({ attendableId }: { attendableId: string }) => {
69
70
  <StackItem.Root
70
71
  item={{ id: attendableId }}
71
72
  {...attentionAttrs}
72
- classNames='bg-baseSurface border-ie border-separator'
73
+ classNames='bg-base-surface border-e border-separator'
73
74
  size={30}
74
75
  onKeyDown={handleKeyDown}
75
76
  ref={rootElement}
76
77
  >
77
78
  <StoryPlankHeading attendableId={attendableId} />
78
79
  <StackItem.Content toolbar>
79
- <Toolbar.Root classNames='border-be border-subduedSeparator'>
80
+ <Toolbar.Root classNames='border-b border-subdued-separator'>
80
81
  <Toolbar.Button>Test</Toolbar.Button>
81
82
  </Toolbar.Root>
82
83
 
83
- <div className={mx(container, 'm-2 bg-activeSurface')}>
84
+ <div className={mx(container, 'm-2 bg-active-surface')}>
84
85
  <Input.Root>
85
86
  <Input.Label>Level 1 (group)</Input.Label>
86
87
  </Input.Root>
87
- <div className={mx(container, 'bg-baseSurface')}>
88
+ <div className={mx(container, 'bg-base-surface')}>
88
89
  <Input.Root>
89
90
  <Input.Label>Level 2 (base)</Input.Label>
90
91
  <Input.TextArea placeholder='Enter text' />
@@ -115,11 +116,12 @@ const DefaultStory = () => {
115
116
  };
116
117
 
117
118
  const meta = {
118
- title: 'plugins/plugin-navtree/NavTree',
119
+ title: 'plugins/plugin-navtree/components/NavTree',
119
120
  component: NavTreeContainer,
120
121
  render: DefaultStory,
121
122
  decorators: [
122
- withTheme,
123
+ withTheme(),
124
+ withLayout({ layout: 'fullscreen' }),
123
125
  withPluginManager({
124
126
  plugins: [
125
127
  ...corePlugins(),
@@ -130,16 +132,16 @@ const meta = {
130
132
  NavTreePlugin(),
131
133
  ],
132
134
  capabilities: () => {
133
- const storyStateAtom = Atom.make({ tab: 'space-0' }).pipe(Atom.keepAlive);
135
+ const storyStateAtom = Atom.make({ tab: 'root/space-0' }).pipe(Atom.keepAlive);
134
136
  return [
135
137
  Capability.contributes(StoryState, storyStateAtom),
136
- Capability.contributes(Common.Capability.AppGraphBuilder, storybookGraphBuilders()),
137
- Capability.contributes(Common.Capability.OperationResolver, [
138
+ Capability.contributes(AppCapabilities.AppGraphBuilder, storybookGraphBuilders()),
139
+ Capability.contributes(Capabilities.OperationResolver, [
138
140
  OperationResolver.make({
139
- operation: Common.LayoutOperation.SwitchWorkspace,
141
+ operation: LayoutOperation.SwitchWorkspace,
140
142
  handler: ({ subject }) =>
141
143
  Effect.gen(function* () {
142
- const registry: Registry.Registry = yield* Capability.get(Common.Capability.AtomRegistry);
144
+ const registry: Registry.Registry = yield* Capability.get(Capabilities.AtomRegistry);
143
145
  registry.set(storyStateAtom, { tab: subject });
144
146
  }),
145
147
  }),
@@ -159,7 +161,7 @@ export default meta;
159
161
  type Story = StoryObj<typeof NavTreeContainer>;
160
162
 
161
163
  export const Default: Story = {
162
- play: async ({ canvasElement }) => {
164
+ play: async ({ canvasElement }: { canvasElement: HTMLElement }) => {
163
165
  const canvas = within(canvasElement);
164
166
 
165
167
  // Find the element with treegrid role and click on its parent