@dxos/plugin-navtree 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (199) hide show
  1. package/dist/lib/browser/index.mjs +168 -114
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  5. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  6. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  7. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  8. package/dist/types/src/capabilities/index.d.ts +7 -105
  9. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  10. package/dist/types/src/capabilities/keyboard.d.ts +3 -2
  11. package/dist/types/src/capabilities/keyboard.d.ts.map +1 -1
  12. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  13. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  14. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  15. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  16. package/dist/types/src/capabilities/state.d.ts +4 -18
  17. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  18. package/dist/types/src/components/NavTree/NavTree.d.ts +11 -4
  19. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  20. package/dist/types/src/components/NavTree/NavTree.stories.d.ts +26 -5
  21. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/{NavTreeContext.d.ts → NavTreeContext/NavTreeContext.d.ts} +1 -1
  23. package/dist/types/src/components/NavTreeContext/NavTreeContext.d.ts.map +1 -0
  24. package/dist/types/src/components/NavTreeContext/index.d.ts +2 -0
  25. package/dist/types/src/components/NavTreeContext/index.d.ts.map +1 -0
  26. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +13 -9
  27. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  28. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +33 -4
  29. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts +1 -1
  31. package/dist/types/src/components/NavTreeItem/NavTreeItemColumns.d.ts.map +1 -1
  32. package/dist/types/src/components/Sidebar/L0Menu.d.ts +10 -5
  33. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  34. package/dist/types/src/components/Sidebar/L1Panel.d.ts +4 -7
  35. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  36. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +5 -4
  37. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  38. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.d.ts.map +1 -1
  39. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts +8 -5
  40. package/dist/types/src/components/UserAccountAvatar/UserAccountAvatar.stories.d.ts.map +1 -1
  41. package/dist/types/src/components/index.d.ts +0 -3
  42. package/dist/types/src/components/index.d.ts.map +1 -1
  43. package/dist/types/src/components/types.d.ts +8 -16
  44. package/dist/types/src/components/types.d.ts.map +1 -1
  45. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts +6 -0
  46. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.d.ts.map +1 -0
  47. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts +29 -0
  48. package/dist/types/src/containers/CommandsDialogContent/CommandsDialogContent.stories.d.ts.map +1 -0
  49. package/dist/types/src/containers/CommandsDialogContent/index.d.ts +2 -0
  50. package/dist/types/src/containers/CommandsDialogContent/index.d.ts.map +1 -0
  51. package/dist/types/src/containers/CommandsTrigger/CommandsTrigger.d.ts.map +1 -0
  52. package/dist/types/src/containers/CommandsTrigger/index.d.ts +2 -0
  53. package/dist/types/src/containers/CommandsTrigger/index.d.ts.map +1 -0
  54. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts +9 -0
  55. package/dist/types/src/containers/NavTreeContainer/NavTreeContainer.d.ts.map +1 -0
  56. package/dist/types/src/containers/NavTreeContainer/index.d.ts +3 -0
  57. package/dist/types/src/containers/NavTreeContainer/index.d.ts.map +1 -0
  58. package/dist/types/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.d.ts +1 -1
  59. package/dist/types/src/containers/NavTreeDocumentTitle/NavTreeDocumentTitle.d.ts.map +1 -0
  60. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts +2 -0
  61. package/dist/types/src/containers/NavTreeDocumentTitle/index.d.ts.map +1 -0
  62. package/dist/types/src/containers/index.d.ts +7 -0
  63. package/dist/types/src/containers/index.d.ts.map +1 -0
  64. package/dist/types/src/experimental/Tree.d.ts +1 -2
  65. package/dist/types/src/experimental/Tree.d.ts.map +1 -1
  66. package/dist/types/src/experimental/Tree.stories.d.ts +23 -6
  67. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  68. package/dist/types/src/hooks/index.d.ts +5 -0
  69. package/dist/types/src/hooks/index.d.ts.map +1 -0
  70. package/dist/types/src/hooks/useActions.d.ts +5 -0
  71. package/dist/types/src/hooks/useActions.d.ts.map +1 -0
  72. package/dist/types/src/hooks/useLoadDescendents.d.ts +6 -0
  73. package/dist/types/src/hooks/useLoadDescendents.d.ts.map +1 -0
  74. package/dist/types/src/hooks/useNavTreeModel.d.ts +7 -0
  75. package/dist/types/src/hooks/useNavTreeModel.d.ts.map +1 -0
  76. package/dist/types/src/hooks/useNavTreeState.d.ts +22 -0
  77. package/dist/types/src/hooks/useNavTreeState.d.ts.map +1 -0
  78. package/dist/types/src/index.d.ts +1 -2
  79. package/dist/types/src/index.d.ts.map +1 -1
  80. package/dist/types/src/meta.d.ts +3 -4
  81. package/dist/types/src/meta.d.ts.map +1 -1
  82. package/dist/types/src/operations/expose.d.ts +5 -0
  83. package/dist/types/src/operations/expose.d.ts.map +1 -0
  84. package/dist/types/src/operations/index.d.ts +3 -0
  85. package/dist/types/src/operations/index.d.ts.map +1 -0
  86. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  87. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  88. package/dist/types/src/testing/generator.d.ts +5 -6
  89. package/dist/types/src/testing/generator.d.ts.map +1 -1
  90. package/dist/types/src/testing/update-state.d.ts +2 -2
  91. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  92. package/dist/types/src/translations.d.ts +9 -10
  93. package/dist/types/src/translations.d.ts.map +1 -1
  94. package/dist/types/src/types/capabilities.d.ts +16 -0
  95. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  96. package/dist/types/src/types/events.d.ts +5 -0
  97. package/dist/types/src/types/events.d.ts.map +1 -0
  98. package/dist/types/src/types/index.d.ts +4 -0
  99. package/dist/types/src/types/index.d.ts.map +1 -0
  100. package/dist/types/src/{types.d.ts → types/schema.d.ts} +10 -9
  101. package/dist/types/src/types/schema.d.ts.map +1 -0
  102. package/dist/types/src/util.d.ts +12 -8
  103. package/dist/types/src/util.d.ts.map +1 -1
  104. package/dist/types/tsconfig.tsbuildinfo +1 -1
  105. package/package.json +66 -54
  106. package/src/NavTreePlugin.tsx +66 -85
  107. package/src/capabilities/app-graph-builder.ts +34 -44
  108. package/src/capabilities/index.ts +10 -8
  109. package/src/capabilities/keyboard.ts +58 -51
  110. package/src/capabilities/operation-handler.ts +16 -0
  111. package/src/capabilities/react-surface.tsx +46 -38
  112. package/src/capabilities/state.ts +128 -84
  113. package/src/components/NavTree/NavTree.stories.tsx +108 -100
  114. package/src/components/NavTree/NavTree.tsx +69 -33
  115. package/src/components/{NavTreeContext.tsx → NavTreeContext/NavTreeContext.tsx} +1 -1
  116. package/src/components/NavTreeContext/index.ts +5 -0
  117. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +25 -19
  118. package/src/components/NavTreeItem/NavTreeItemAction.tsx +70 -46
  119. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +68 -36
  120. package/src/components/Sidebar/L0Menu.tsx +175 -209
  121. package/src/components/Sidebar/L1Panel.tsx +260 -104
  122. package/src/components/Sidebar/L1Tabs.tsx +18 -34
  123. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +9 -9
  124. package/src/components/UserAccountAvatar/UserAccountAvatar.tsx +20 -12
  125. package/src/components/index.ts +1 -3
  126. package/src/components/types.ts +14 -19
  127. package/src/containers/CommandsDialogContent/CommandsDialogContent.stories.tsx +45 -0
  128. package/src/containers/CommandsDialogContent/CommandsDialogContent.tsx +127 -0
  129. package/src/containers/CommandsDialogContent/index.ts +5 -0
  130. package/src/containers/CommandsTrigger/CommandsTrigger.tsx +28 -0
  131. package/src/containers/CommandsTrigger/index.ts +5 -0
  132. package/src/containers/NavTreeContainer/NavTreeContainer.tsx +280 -0
  133. package/src/containers/NavTreeContainer/index.ts +6 -0
  134. package/src/{components → containers/NavTreeDocumentTitle}/NavTreeDocumentTitle.tsx +5 -4
  135. package/src/containers/NavTreeDocumentTitle/index.ts +5 -0
  136. package/src/containers/index.ts +12 -0
  137. package/src/experimental/Tree.stories.tsx +105 -110
  138. package/src/experimental/Tree.tsx +6 -23
  139. package/src/hooks/index.ts +8 -0
  140. package/src/hooks/useActions.ts +34 -0
  141. package/src/hooks/useLoadDescendents.ts +23 -0
  142. package/src/hooks/useNavTreeModel.ts +118 -0
  143. package/src/hooks/useNavTreeState.ts +42 -0
  144. package/src/index.ts +1 -2
  145. package/src/meta.ts +11 -8
  146. package/src/operations/expose.ts +42 -0
  147. package/src/operations/index.ts +7 -0
  148. package/src/testing/app-graph-builder.ts +167 -238
  149. package/src/testing/generator.ts +41 -39
  150. package/src/testing/update-state.ts +6 -6
  151. package/src/translations.ts +9 -10
  152. package/src/types/capabilities.ts +21 -0
  153. package/src/types/events.ts +12 -0
  154. package/src/types/index.ts +7 -0
  155. package/src/{types.ts → types/schema.ts} +9 -8
  156. package/src/util.ts +28 -17
  157. package/dist/lib/browser/app-graph-builder-6JDBQ25U.mjs +0 -45
  158. package/dist/lib/browser/app-graph-builder-6JDBQ25U.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-ERDGQTH5.mjs +0 -16
  160. package/dist/lib/browser/chunk-ERDGQTH5.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-SNGLGBFJ.mjs +0 -1469
  162. package/dist/lib/browser/chunk-SNGLGBFJ.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-WCARAZ7J.mjs +0 -15
  164. package/dist/lib/browser/chunk-WCARAZ7J.mjs.map +0 -7
  165. package/dist/lib/browser/intent-resolver-N35ZIHFD.mjs +0 -47
  166. package/dist/lib/browser/intent-resolver-N35ZIHFD.mjs.map +0 -7
  167. package/dist/lib/browser/keyboard-HMTMA33N.mjs +0 -51
  168. package/dist/lib/browser/keyboard-HMTMA33N.mjs.map +0 -7
  169. package/dist/lib/browser/react-surface-WKWXMM2N.mjs +0 -51
  170. package/dist/lib/browser/react-surface-WKWXMM2N.mjs.map +0 -7
  171. package/dist/lib/browser/state-P5DGL7KS.mjs +0 -117
  172. package/dist/lib/browser/state-P5DGL7KS.mjs.map +0 -7
  173. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  174. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  175. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  176. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  177. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts +0 -5
  178. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +0 -1
  179. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +0 -1
  180. package/dist/types/src/components/CommandsDialog/index.d.ts +0 -3
  181. package/dist/types/src/components/CommandsDialog/index.d.ts.map +0 -1
  182. package/dist/types/src/components/NavTreeContainer.d.ts +0 -9
  183. package/dist/types/src/components/NavTreeContainer.d.ts.map +0 -1
  184. package/dist/types/src/components/NavTreeContext.d.ts.map +0 -1
  185. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +0 -1
  186. package/dist/types/src/events.d.ts +0 -4
  187. package/dist/types/src/events.d.ts.map +0 -1
  188. package/dist/types/src/hooks.d.ts +0 -3
  189. package/dist/types/src/hooks.d.ts.map +0 -1
  190. package/dist/types/src/types.d.ts.map +0 -1
  191. package/src/capabilities/capabilities.ts +0 -20
  192. package/src/capabilities/intent-resolver.ts +0 -37
  193. package/src/components/CommandsDialog/CommandsDialog.tsx +0 -118
  194. package/src/components/CommandsDialog/CommandsTrigger.tsx +0 -35
  195. package/src/components/CommandsDialog/index.ts +0 -6
  196. package/src/components/NavTreeContainer.tsx +0 -337
  197. package/src/events.ts +0 -11
  198. package/src/hooks.ts +0 -21
  199. /package/dist/types/src/{components/CommandsDialog → containers/CommandsTrigger}/CommandsTrigger.d.ts +0 -0
@@ -2,12 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
- import { type NodeArg } from '@dxos/app-graph';
8
- import { type Live, Obj, Type } from '@dxos/echo';
9
- import { TypedObject } from '@dxos/echo-schema';
10
- import { faker } from '@dxos/random';
7
+ import { type Node } from '@dxos/app-graph';
8
+ import { Obj, Type } from '@dxos/echo';
9
+ import { TestSchema } from '@dxos/echo/testing';
10
+ import { random } from '@dxos/random';
11
11
  import { range } from '@dxos/util';
12
12
 
13
13
  // TODO(burdon): Reconcile with @dxos/plugin-debug, @dxos/react-ui/testing.
@@ -17,12 +17,12 @@ import { range } from '@dxos/util';
17
17
  export type TestItem = { id: string; type: string } & Record<string, any>;
18
18
 
19
19
  type ObjectDataGenerator = {
20
- createSchema?: () => Schema.Schema.AnyNoContext;
20
+ createSchema?: () => Type.AnyObj;
21
21
  createData: () => any;
22
22
  };
23
23
 
24
- type ObjectFactory<T extends Live<any>> = {
25
- schema?: Schema.Schema.AnyNoContext; // TODO(burdon): Support both typed and expando schema.
24
+ type ObjectFactory<T> = {
25
+ schema?: Type.AnyObj; // TODO(burdon): Support both typed and expando schema.
26
26
  createObject: () => T;
27
27
  };
28
28
 
@@ -32,7 +32,7 @@ const createFactory = ({ createSchema, createData }: ObjectDataGenerator) => {
32
32
  const schema = createSchema?.();
33
33
  return {
34
34
  schema,
35
- createObject: () => (schema ? Obj.make(schema, createData()) : Obj.make(Type.Expando, createData())),
35
+ createObject: () => (schema ? Obj.make(schema, createData()) : Obj.make(TestSchema.Expando, createData())),
36
36
  };
37
37
  };
38
38
 
@@ -43,36 +43,38 @@ export const Priority = [1, 2, 3, 4, 5];
43
43
  export const defaultGenerators: { [type: string]: ObjectDataGenerator } = {
44
44
  document: {
45
45
  createData: () => ({
46
- title: faker.lorem.sentence(3),
47
- body: faker.lorem.sentences({ min: 1, max: faker.number.int({ min: 1, max: 3 }) }),
46
+ title: random.lorem.sentence(3),
47
+ body: random.lorem.sentences({ min: 1, max: random.number.int({ min: 1, max: 3 }) }),
48
48
  }),
49
49
  },
50
50
 
51
51
  image: {
52
52
  createData: () => ({
53
- title: faker.lorem.sentence(3),
54
- image: faker.helpers.arrayElement(data.images),
55
- body: faker.datatype.boolean() ? faker.lorem.sentences() : undefined,
53
+ title: random.lorem.sentence(3),
54
+ image: random.helpers.arrayElement(data.images),
55
+ body: random.datatype.boolean() ? random.lorem.sentences() : undefined,
56
56
  }),
57
57
  },
58
58
 
59
59
  project: {
60
60
  createSchema: () =>
61
- class ProjectType extends TypedObject({
62
- typename: 'example.com/type/Project',
63
- version: '0.1.0',
64
- })({
61
+ Schema.Struct({
65
62
  title: Schema.String,
66
63
  repo: Schema.String,
67
64
  status: Schema.String,
68
65
  priority: Schema.Number,
69
- }) {},
66
+ }).pipe(
67
+ Type.object({
68
+ typename: 'com.example.type.project',
69
+ version: '0.1.0',
70
+ }),
71
+ ),
70
72
 
71
73
  createData: () => ({
72
- title: faker.commerce.productName(),
73
- repo: faker.datatype.boolean({ probability: 0.3 }) ? faker.internet.url() : undefined,
74
- status: faker.helpers.arrayElement(Status),
75
- priority: faker.helpers.arrayElement(Priority),
74
+ title: random.commerce.productName(),
75
+ repo: random.datatype.boolean({ probability: 0.3 }) ? random.internet.url() : undefined,
76
+ status: random.helpers.arrayElement(Status),
77
+ priority: random.helpers.arrayElement(Priority),
76
78
  }),
77
79
  },
78
80
  };
@@ -92,12 +94,12 @@ export class TestObjectGenerator {
92
94
  }, {});
93
95
  }
94
96
 
95
- get schema(): Schema.Schema.AnyNoContext[] {
97
+ get schema(): Type.AnyObj[] {
96
98
  return Object.values(this.factories).map((f) => f.schema!);
97
99
  }
98
100
 
99
101
  createObject({ types }: { types?: string[] } = {}) {
100
- const type = faker.helpers.arrayElement(types ?? Object.keys(this.factories));
102
+ const type = random.helpers.arrayElement(types ?? Object.keys(this.factories));
101
103
  const factory = this.factories[type];
102
104
  return factory?.createObject();
103
105
  }
@@ -134,19 +136,19 @@ export const createTree = () => {
134
136
  nodes: [...Array(4)].map(() => {
135
137
  const l0 = generator.createObject();
136
138
  return {
137
- id: faker.string.uuid(),
139
+ id: random.string.uuid(),
138
140
  data: null,
139
141
  type: 'category',
140
142
  properties: {
141
143
  label: l0.title,
142
144
  icon: 'ph--horse--regular',
143
- disposition: 'collection',
145
+ disposition: 'workspace',
144
146
  },
145
147
  nodes: [
146
148
  ...[...Array(4)].map(() => {
147
149
  const l1 = generator.createObject();
148
150
  return {
149
- id: faker.string.uuid(),
151
+ id: random.string.uuid(),
150
152
  data: null,
151
153
  type: 'document',
152
154
  properties: {
@@ -155,48 +157,48 @@ export const createTree = () => {
155
157
  },
156
158
  nodes: [
157
159
  {
158
- id: `${faker.string.uuid()}__a1`,
160
+ id: `${random.string.uuid()}__a1`,
159
161
  data: () => {},
160
162
  type: 'action',
161
163
  properties: {
162
- label: faker.lorem.words(2),
164
+ label: random.lorem.words(2),
163
165
  icon: 'ph--boat--regular',
164
166
  },
165
167
  },
166
168
  {
167
- id: `${faker.string.uuid()}__a2`,
169
+ id: `${random.string.uuid()}__a2`,
168
170
  data: () => {},
169
171
  type: 'action',
170
172
  properties: {
171
- label: faker.lorem.words(2),
173
+ label: random.lorem.words(2),
172
174
  icon: 'ph--train-simple--regular',
173
175
  },
174
176
  },
175
177
  ],
176
- } satisfies NodeArg<any>;
178
+ } satisfies Node.NodeArg<any>;
177
179
  }),
178
180
  {
179
- id: `${faker.string.uuid()}__a1`,
181
+ id: `${random.string.uuid()}__a1`,
180
182
  data: () => {},
181
183
  type: 'action',
182
184
  properties: {
183
- label: faker.lorem.words(2),
185
+ label: random.lorem.words(2),
184
186
  icon: 'ph--boat--regular',
185
187
  },
186
188
  },
187
189
  {
188
- id: `${faker.string.uuid()}__a2`,
190
+ id: `${random.string.uuid()}__a2`,
189
191
  data: () => {},
190
192
  type: 'action',
191
193
  properties: {
192
- label: faker.lorem.words(2),
194
+ label: random.lorem.words(2),
193
195
  icon: 'ph--train-simple--regular',
194
196
  },
195
197
  },
196
198
  ],
197
- } satisfies NodeArg<any>;
199
+ } satisfies Node.NodeArg<any>;
198
200
  }),
199
- } satisfies NodeArg<any>;
201
+ } satisfies Node.NodeArg<any>;
200
202
 
201
203
  return initialContent;
202
204
  };
@@ -4,22 +4,22 @@
4
4
 
5
5
  import { type Instruction } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';
6
6
 
7
- import { type NodeArg } from '@dxos/app-graph';
7
+ import { type Node } from '@dxos/app-graph';
8
8
  import { log } from '@dxos/log';
9
9
  import { type TreeData } from '@dxos/react-ui-list';
10
10
 
11
- const removeItem = (tree: NodeArg<any>, source: TreeData) => {
11
+ const removeItem = (tree: Node.NodeArg<any>, source: TreeData) => {
12
12
  const parent = getNode(tree, source.path.slice(1, -1));
13
- const index = parent.nodes!.findIndex(({ id }) => id === source.id);
13
+ const index = parent.nodes!.findIndex((node: Node.NodeArg<any>) => node.id === source.id);
14
14
  const item = parent.nodes![index];
15
15
  parent.nodes!.splice(index, 1);
16
16
  return item;
17
17
  };
18
18
 
19
- const getNode = (tree: NodeArg<any>, path: string[]) => {
19
+ const getNode = (tree: Node.NodeArg<any>, path: string[]) => {
20
20
  let node = tree;
21
21
  for (const part of path) {
22
- node = node.nodes!.find(({ id }) => id === part)!;
22
+ node = node.nodes!.find((n: Node.NodeArg<any>) => n.id === part)!;
23
23
  }
24
24
  return node;
25
25
  };
@@ -31,7 +31,7 @@ export const updateState = ({
31
31
  source,
32
32
  target,
33
33
  }: {
34
- state: NodeArg<any>;
34
+ state: Node.NodeArg<any>;
35
35
  instruction: Instruction;
36
36
  source: TreeData;
37
37
  target: TreeData;
@@ -4,21 +4,20 @@
4
4
 
5
5
  import { type Resource } from '@dxos/react-ui';
6
6
 
7
- import { meta } from './meta';
7
+ import { meta } from '#meta';
8
8
 
9
9
  export const translations = [
10
10
  {
11
11
  'en-US': {
12
12
  [meta.id]: {
13
- 'app menu label': 'App menu',
14
- 'open settings label': 'Settings',
15
- 'open commands label': 'Search commands',
16
- 'commands dialog title': 'Commands',
17
- 'command list input placeholder': 'Search for commands…',
18
- 'node actions menu invoker label': 'More options',
19
- 'tree item actions label': 'More actions',
20
- 'empty branch message': ' ',
21
- 'button back': 'Back to Space',
13
+ 'app-menu.label': 'App menu',
14
+ 'open-settings.label': 'Settings',
15
+ 'open-commands.label': 'Search commands',
16
+ 'commands-dialog.title': 'Commands',
17
+ 'command-list-input.placeholder': 'Search for commands…',
18
+ 'node-actions-menu-invoker.label': 'More options',
19
+ 'tree-item-actions.label': 'More actions',
20
+ 'button-back.button': 'Back to Space',
22
21
  },
23
22
  },
24
23
  },
@@ -0,0 +1,21 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Atom } from '@effect-atom/atom-react';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+
9
+ import { meta } from '#meta';
10
+
11
+ export namespace NavTreeCapabilities {
12
+ export type NavTreeItemState = { open: boolean; current: boolean; alternateTree?: boolean };
13
+
14
+ export type NavTreeStateStore = {
15
+ getItem: (path: string[]) => NavTreeItemState;
16
+ getItemAtom: (path: string[]) => Atom.Atom<NavTreeItemState>;
17
+ setItem: (path: string[], key: 'open' | 'current' | 'alternateTree', next: boolean) => void;
18
+ };
19
+
20
+ export const State = Capability.make<NavTreeStateStore>(`${meta.id}.capability.state`);
21
+ }
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ActivationEvent } from '@dxos/app-framework';
6
+ import { AppActivationEvents } from '@dxos/app-toolkit';
7
+
8
+ import { meta } from '#meta';
9
+
10
+ export namespace NavTreeEvents {
11
+ export const StateReady: ActivationEvent.ActivationEvent = AppActivationEvents.createStateEvent(meta.id);
12
+ }
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './capabilities';
6
+ export * from './events';
7
+ export * from './schema';
@@ -2,11 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type Action, type ActionLike, type Node } from '@dxos/app-graph';
5
+ import { type Node } from '@dxos/app-graph';
6
6
  import { type Label } from '@dxos/react-ui';
7
7
  import { type MaybePromise, type Position } from '@dxos/util';
8
8
 
9
- export type NavTreeItemGraphNode = Node<
9
+ export type NavTreeItemGraphNode = Node.Node<
10
10
  any,
11
11
  Partial<
12
12
  NodeProperties & {
@@ -14,7 +14,7 @@ export type NavTreeItemGraphNode = Node<
14
14
  persistenceKey: string;
15
15
  acceptPersistenceClass: Set<string>;
16
16
  acceptPersistenceKey: Set<string>;
17
- onRearrangeChildren: (nextOrder: NavTreeItemGraphNode[]) => MaybePromise<void>;
17
+ onRearrange: (nextOrder: unknown[]) => MaybePromise<void>;
18
18
  onCopy: (activeNode: NavTreeItemGraphNode, index?: number) => MaybePromise<void>;
19
19
  onTransferStart: (activeNode: NavTreeItemGraphNode, index?: number) => MaybePromise<void>;
20
20
  onTransferEnd: (activeNode: NavTreeItemGraphNode, destinationParent: NavTreeItemGraphNode) => MaybePromise<void>;
@@ -23,18 +23,19 @@ export type NavTreeItemGraphNode = Node<
23
23
  >;
24
24
 
25
25
  export type FlattenedActions = {
26
- actions: ActionLike[];
27
- groupedActions: Record<string, Action[]>;
26
+ actions: Node.ActionLike[];
27
+ groupedActions: Record<string, Node.Action[]>;
28
28
  };
29
29
 
30
30
  type SharedProperties = {
31
- label: Label;
32
- icon?: string;
31
+ testId?: string;
33
32
  disabled?: boolean;
34
33
  position?: Position;
35
- testId?: string;
34
+ label: Label;
36
35
  className?: string;
37
36
  headingClassName?: string;
37
+ icon?: string;
38
+ iconHue?: string;
38
39
  };
39
40
 
40
41
  export type NodeProperties = SharedProperties & {
package/src/util.ts CHANGED
@@ -2,22 +2,24 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type Action, type Node, type ReadableGraph, isActionLike } from '@dxos/app-graph';
5
+ import { Graph, Node } from '@dxos/plugin-graph';
6
6
  import { isNonNullable } from '@dxos/util';
7
7
 
8
- import { type NavTreeItemGraphNode } from './types';
8
+ import { type NavTreeItemGraphNode } from '#types';
9
9
 
10
10
  export const getParent = (
11
- graph: ReadableGraph,
11
+ graph: Graph.ReadableGraph,
12
12
  node: NavTreeItemGraphNode,
13
13
  path: string[],
14
14
  ): NavTreeItemGraphNode | undefined => {
15
15
  const parentId = path[path.length - 2];
16
- return graph.getConnections(node.id, 'inbound').find((n) => n.id === parentId) as NavTreeItemGraphNode | undefined;
16
+ return Graph.getConnections(graph, node.id, Node.childRelation('inbound')).find(
17
+ (n: Node.Node) => n.id === parentId,
18
+ ) as NavTreeItemGraphNode | undefined;
17
19
  };
18
20
 
19
21
  export const getPersistenceParent = (
20
- graph: ReadableGraph,
22
+ graph: Graph.ReadableGraph,
21
23
  node: NavTreeItemGraphNode,
22
24
  path: string[],
23
25
  persistenceClass: string,
@@ -31,7 +33,7 @@ export const getPersistenceParent = (
31
33
  };
32
34
 
33
35
  export const resolveMigrationOperation = (
34
- graph: ReadableGraph,
36
+ graph: Graph.ReadableGraph,
35
37
  activeNode: NavTreeItemGraphNode,
36
38
  destinationPath: string[],
37
39
  destinationRelatedNode?: NavTreeItemGraphNode,
@@ -60,7 +62,7 @@ export const resolveMigrationOperation = (
60
62
  };
61
63
 
62
64
  // TODO(wittjosiah): Move into node implementation?
63
- export const sortActions = (actions: Action[]): Action[] =>
65
+ export const sortActions = (actions: Node.Action[]): Node.Action[] =>
64
66
  actions.sort((a, b) => {
65
67
  if (a.properties.disposition === b.properties.disposition) {
66
68
  return 0;
@@ -74,13 +76,12 @@ export const sortActions = (actions: Action[]): Action[] =>
74
76
  });
75
77
 
76
78
  export const getChildren = (
77
- graph: ReadableGraph,
79
+ graph: Graph.ReadableGraph,
78
80
  node: NavTreeItemGraphNode,
79
81
  path: readonly string[] = [],
80
82
  ): NavTreeItemGraphNode[] => {
81
- return graph
82
- .getConnections(node.id, 'outbound')
83
- .map((n) => {
83
+ return Graph.getConnections(graph, node.id, 'child')
84
+ .map((n: Node.Node) => {
84
85
  // Break cycles.
85
86
  const nextPath = [...path, node.id];
86
87
  return nextPath.includes(n.id) ? undefined : (n as NavTreeItemGraphNode);
@@ -88,13 +89,23 @@ export const getChildren = (
88
89
  .filter(isNonNullable) as NavTreeItemGraphNode[];
89
90
  };
90
91
 
91
- export const l0ItemType = (item: Node<any>) => {
92
- if (item.properties.disposition === 'collection') {
93
- return 'collection';
94
- } else if (isActionLike(item)) {
92
+ /**
93
+ * Determines whether a node should be visible based on its disposition.
94
+ */
95
+ export const filterItems = (node: Node.Node, disposition?: string) => {
96
+ if (!disposition && (node.properties.disposition === 'hidden' || node.properties.disposition === 'alternate-tree')) {
97
+ return false;
98
+ } else if (!disposition) {
99
+ const action = Node.isAction(node);
100
+ return !action || node.properties.disposition === 'item';
101
+ } else {
102
+ return node.properties.disposition === disposition;
103
+ }
104
+ };
105
+
106
+ export const l0ItemType = (item: Node.Node) => {
107
+ if (Node.isActionLike(item)) {
95
108
  return 'action';
96
- } else if (item.properties.disposition === 'navigation') {
97
- return 'link';
98
109
  } else {
99
110
  return 'tab';
100
111
  }
@@ -1,45 +0,0 @@
1
- import {
2
- COMMANDS_DIALOG,
3
- NAVTREE_PLUGIN
4
- } from "./chunk-ERDGQTH5.mjs";
5
-
6
- // src/capabilities/app-graph-builder.ts
7
- import { Rx } from "@effect-rx/rx-react";
8
- import { Option, pipe } from "effect";
9
- import { Capabilities, LayoutAction, contributes, createIntent } from "@dxos/app-framework";
10
- import { ROOT_ID, createExtension } from "@dxos/plugin-graph";
11
- var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, createExtension({
12
- id: NAVTREE_PLUGIN,
13
- actions: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => [
14
- {
15
- id: COMMANDS_DIALOG,
16
- data: async () => {
17
- const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
18
- await dispatch(createIntent(LayoutAction.UpdateDialog, {
19
- part: "dialog",
20
- subject: COMMANDS_DIALOG,
21
- options: {
22
- blockAlign: "start"
23
- }
24
- }));
25
- },
26
- properties: {
27
- label: [
28
- "open commands label",
29
- {
30
- ns: NAVTREE_PLUGIN
31
- }
32
- ],
33
- icon: "ph--magnifying-glass--regular",
34
- keyBinding: {
35
- macos: "meta+k",
36
- windows: "ctrl+k"
37
- }
38
- }
39
- }
40
- ]), Option.getOrElse(() => [])))
41
- }));
42
- export {
43
- app_graph_builder_default as default
44
- };
45
- //# sourceMappingURL=app-graph-builder-6JDBQ25U.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';\nimport { ROOT_ID, createExtension } from '@dxos/plugin-graph';\n\nimport { COMMANDS_DIALOG, NAVTREE_PLUGIN } from '../meta';\n\nexport default (context: PluginContext) =>\n contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: NAVTREE_PLUGIN,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => [\n {\n id: COMMANDS_DIALOG,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: COMMANDS_DIALOG,\n options: {\n blockAlign: 'start',\n },\n }),\n );\n },\n properties: {\n label: ['open commands label', { ns: NAVTREE_PLUGIN }],\n icon: 'ph--magnifying-glass--regular',\n keyBinding: {\n macos: 'meta+k',\n windows: 'ctrl+k',\n },\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n );\n"],
5
- "mappings": ";;;;;;AAIA,SAASA,UAAU;AACnB,SAASC,QAAQC,YAAY;AAE7B,SAASC,cAAcC,cAAkCC,aAAaC,oBAAoB;AAC1F,SAASC,SAASC,uBAAuB;AAIzC,IAAA,4BAAe,CAACC,YACdC,YACEC,aAAaC,iBACbC,gBAAgB;EACdC,IAAIC;EACJC,SAAS,CAACC,SACRC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKH,OAAOU,UAAUF,OAAOG,KAAKR,KAAAA,IAAQK,OAAOI,KAAI,CAAA,GAC/EJ,OAAOK,IAAI,MAAM;IACf;MACEb,IAAIc;MACJC,MAAM,YAAA;AACJ,cAAM,EAAEC,iBAAiBC,SAAQ,IAAKtB,QAAQuB,cAAcrB,aAAasB,gBAAgB;AACzF,cAAMF,SACJG,aAAaC,aAAaC,cAAc;UACtCC,MAAM;UACNC,SAASV;UACTW,SAAS;YACPC,YAAY;UACd;QACF,CAAA,CAAA;MAEJ;MACAC,YAAY;QACVC,OAAO;UAAC;UAAuB;YAAEC,IAAI5B;UAAe;;QACpD6B,MAAM;QACNC,YAAY;UACVC,OAAO;UACPC,SAAS;QACX;MACF;IACF;GACD,GACDzB,OAAO0B,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;AAGjC,CAAA,CAAA;",
6
- "names": ["Rx", "Option", "pipe", "Capabilities", "LayoutAction", "contributes", "createIntent", "ROOT_ID", "createExtension", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "NAVTREE_PLUGIN", "actions", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "COMMANDS_DIALOG", "data", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "createIntent", "LayoutAction", "UpdateDialog", "part", "subject", "options", "blockAlign", "properties", "label", "ns", "icon", "keyBinding", "macos", "windows", "getOrElse"]
7
- }
@@ -1,16 +0,0 @@
1
- // src/meta.ts
2
- var NAVTREE_PLUGIN = "dxos.org/plugin/navtree";
3
- var KEY_BINDING = "KeyBinding";
4
- var COMMANDS_DIALOG = `${NAVTREE_PLUGIN}/CommandsDialog`;
5
- var meta = {
6
- id: NAVTREE_PLUGIN,
7
- name: "Navtree"
8
- };
9
-
10
- export {
11
- NAVTREE_PLUGIN,
12
- KEY_BINDING,
13
- COMMANDS_DIALOG,
14
- meta
15
- };
16
- //# sourceMappingURL=chunk-ERDGQTH5.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const NAVTREE_PLUGIN = 'dxos.org/plugin/navtree';\n\n// TODO(wittjosiah): Factor out.\nexport const KEY_BINDING = 'KeyBinding';\n// TODO(wittjosiah): Factor out.\nexport const COMMANDS_DIALOG = `${NAVTREE_PLUGIN}/CommandsDialog`;\n\nexport const meta: PluginMeta = {\n id: NAVTREE_PLUGIN,\n name: 'Navtree',\n};\n"],
5
- "mappings": ";AAMO,IAAMA,iBAAiB;AAGvB,IAAMC,cAAc;AAEpB,IAAMC,kBAAkB,GAAGF,cAAAA;AAE3B,IAAMG,OAAmB;EAC9BC,IAAIJ;EACJK,MAAM;AACR;",
6
- "names": ["NAVTREE_PLUGIN", "KEY_BINDING", "COMMANDS_DIALOG", "meta", "id", "name"]
7
- }