@dxos/plugin-navtree 0.8.4-main.3c1ae3b → 0.8.4-main.3eb6e50203

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 (163) hide show
  1. package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs +44 -0
  2. package/dist/lib/browser/app-graph-builder-XGA4GPGL.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-63YLDLLE.mjs +1373 -0
  4. package/dist/lib/browser/chunk-63YLDLLE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-X2HDG62A.mjs +23 -0
  6. package/dist/lib/browser/chunk-X2HDG62A.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-E6MZBCU5.mjs → chunk-YKTYPINZ.mjs} +1 -1
  8. package/dist/lib/browser/chunk-YKTYPINZ.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +83 -91
  10. package/dist/lib/browser/index.mjs.map +4 -4
  11. package/dist/lib/browser/{keyboard-YJEK2HTH.mjs → keyboard-46XQHY2O.mjs} +18 -14
  12. package/dist/lib/browser/keyboard-46XQHY2O.mjs.map +7 -0
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/operation-resolver-NNNDII45.mjs +53 -0
  15. package/dist/lib/browser/operation-resolver-NNNDII45.mjs.map +7 -0
  16. package/dist/lib/browser/{react-surface-RPXGIV45.mjs → react-surface-APSEG23H.mjs} +16 -14
  17. package/dist/lib/browser/react-surface-APSEG23H.mjs.map +7 -0
  18. package/dist/lib/browser/state-M5YUCIQU.mjs +121 -0
  19. package/dist/lib/browser/state-M5YUCIQU.mjs.map +7 -0
  20. package/dist/types/src/NavTreePlugin.d.ts +2 -1
  21. package/dist/types/src/NavTreePlugin.d.ts.map +1 -1
  22. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  23. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  24. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  25. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  26. package/dist/types/src/capabilities/index.d.ts +5 -108
  27. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  28. package/dist/types/src/capabilities/keyboard/index.d.ts +3 -0
  29. package/dist/types/src/capabilities/keyboard/index.d.ts.map +1 -0
  30. package/dist/types/src/capabilities/keyboard/keyboard.d.ts +5 -0
  31. package/dist/types/src/capabilities/keyboard/keyboard.d.ts.map +1 -0
  32. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  33. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  34. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  35. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  36. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  37. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  38. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  39. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  40. package/dist/types/src/capabilities/state/index.d.ts +3 -0
  41. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  42. package/dist/types/src/capabilities/state/state.d.ts +6 -0
  43. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  44. package/dist/types/src/components/CommandsDialog/CommandsDialog.d.ts.map +1 -1
  45. package/dist/types/src/components/CommandsDialog/CommandsTrigger.d.ts.map +1 -1
  46. package/dist/types/src/components/NavTree/NavTree.d.ts +2 -2
  47. package/dist/types/src/components/NavTree/NavTree.d.ts.map +1 -1
  48. package/dist/types/src/components/NavTree/NavTree.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/NavTreeContainer.d.ts.map +1 -1
  50. package/dist/types/src/components/NavTreeDocumentTitle.d.ts +1 -1
  51. package/dist/types/src/components/NavTreeDocumentTitle.d.ts.map +1 -1
  52. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts +6 -6
  53. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.d.ts.map +1 -1
  54. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts +2 -1
  55. package/dist/types/src/components/NavTreeItem/NavTreeItemAction.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Sidebar/L0Menu.d.ts +4 -4
  57. package/dist/types/src/components/Sidebar/L0Menu.d.ts.map +1 -1
  58. package/dist/types/src/components/Sidebar/L1Panel.d.ts +2 -2
  59. package/dist/types/src/components/Sidebar/L1Panel.d.ts.map +1 -1
  60. package/dist/types/src/components/Sidebar/L1Tabs.d.ts +2 -2
  61. package/dist/types/src/components/Sidebar/L1Tabs.d.ts.map +1 -1
  62. package/dist/types/src/components/types.d.ts +7 -7
  63. package/dist/types/src/components/types.d.ts.map +1 -1
  64. package/dist/types/src/experimental/Tree.stories.d.ts +18 -4
  65. package/dist/types/src/experimental/Tree.stories.d.ts.map +1 -1
  66. package/dist/types/src/hooks.d.ts +32 -1
  67. package/dist/types/src/hooks.d.ts.map +1 -1
  68. package/dist/types/src/index.d.ts +1 -2
  69. package/dist/types/src/index.d.ts.map +1 -1
  70. package/dist/types/src/meta.d.ts +2 -2
  71. package/dist/types/src/meta.d.ts.map +1 -1
  72. package/dist/types/src/testing/app-graph-builder.d.ts +2 -3
  73. package/dist/types/src/testing/app-graph-builder.d.ts.map +1 -1
  74. package/dist/types/src/testing/generator.d.ts +5 -6
  75. package/dist/types/src/testing/generator.d.ts.map +1 -1
  76. package/dist/types/src/testing/update-state.d.ts +2 -2
  77. package/dist/types/src/testing/update-state.d.ts.map +1 -1
  78. package/dist/types/src/types/capabilities.d.ts +16 -0
  79. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  80. package/dist/types/src/types/events.d.ts +5 -0
  81. package/dist/types/src/types/events.d.ts.map +1 -0
  82. package/dist/types/src/types/index.d.ts +4 -0
  83. package/dist/types/src/types/index.d.ts.map +1 -0
  84. package/dist/types/src/{types.d.ts → types/schema.d.ts} +6 -6
  85. package/dist/types/src/types/schema.d.ts.map +1 -0
  86. package/dist/types/src/util.d.ts +7 -7
  87. package/dist/types/src/util.d.ts.map +1 -1
  88. package/dist/types/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +54 -52
  90. package/src/NavTreePlugin.tsx +53 -72
  91. package/src/capabilities/app-graph-builder/app-graph-builder.ts +42 -0
  92. package/src/capabilities/app-graph-builder/index.ts +7 -0
  93. package/src/capabilities/index.ts +5 -9
  94. package/src/capabilities/keyboard/index.ts +7 -0
  95. package/src/capabilities/keyboard/keyboard.ts +66 -0
  96. package/src/capabilities/operation-resolver/index.ts +7 -0
  97. package/src/capabilities/operation-resolver/operation-resolver.ts +42 -0
  98. package/src/capabilities/react-surface/index.ts +7 -0
  99. package/src/capabilities/react-surface/react-surface.tsx +55 -0
  100. package/src/capabilities/state/index.ts +7 -0
  101. package/src/capabilities/state/state.ts +122 -0
  102. package/src/components/CommandsDialog/CommandsDialog.tsx +62 -64
  103. package/src/components/CommandsDialog/CommandsTrigger.tsx +4 -14
  104. package/src/components/NavTree/NavTree.stories.tsx +35 -43
  105. package/src/components/NavTree/NavTree.tsx +1 -11
  106. package/src/components/NavTreeContainer.tsx +70 -114
  107. package/src/components/NavTreeDocumentTitle.tsx +3 -2
  108. package/src/components/NavTreeItem/NavTreeItemAction.stories.tsx +17 -7
  109. package/src/components/NavTreeItem/NavTreeItemAction.tsx +18 -12
  110. package/src/components/NavTreeItem/NavTreeItemColumns.tsx +5 -5
  111. package/src/components/Sidebar/L0Menu.tsx +67 -96
  112. package/src/components/Sidebar/L1Panel.tsx +151 -70
  113. package/src/components/Sidebar/L1Tabs.tsx +6 -31
  114. package/src/components/UserAccountAvatar/UserAccountAvatar.stories.tsx +1 -1
  115. package/src/components/types.ts +7 -7
  116. package/src/experimental/Tree.stories.tsx +44 -50
  117. package/src/experimental/Tree.tsx +1 -1
  118. package/src/hooks.ts +54 -2
  119. package/src/index.ts +1 -2
  120. package/src/meta.ts +2 -2
  121. package/src/testing/app-graph-builder.ts +158 -234
  122. package/src/testing/generator.ts +12 -12
  123. package/src/testing/update-state.ts +6 -6
  124. package/src/types/capabilities.ts +21 -0
  125. package/src/types/events.ts +12 -0
  126. package/src/types/index.ts +7 -0
  127. package/src/{types.ts → types/schema.ts} +5 -5
  128. package/src/util.ts +13 -16
  129. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs +0 -46
  130. package/dist/lib/browser/app-graph-builder-OHSCN3GX.mjs.map +0 -7
  131. package/dist/lib/browser/chunk-5DWDYPGQ.mjs +0 -1492
  132. package/dist/lib/browser/chunk-5DWDYPGQ.mjs.map +0 -7
  133. package/dist/lib/browser/chunk-5VLWX4PK.mjs +0 -15
  134. package/dist/lib/browser/chunk-5VLWX4PK.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-E6MZBCU5.mjs.map +0 -7
  136. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs +0 -47
  137. package/dist/lib/browser/intent-resolver-YUVXVPHG.mjs.map +0 -7
  138. package/dist/lib/browser/keyboard-YJEK2HTH.mjs.map +0 -7
  139. package/dist/lib/browser/react-surface-RPXGIV45.mjs.map +0 -7
  140. package/dist/lib/browser/state-BFD5KJCV.mjs +0 -117
  141. package/dist/lib/browser/state-BFD5KJCV.mjs.map +0 -7
  142. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  143. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  144. package/dist/types/src/capabilities/capabilities.d.ts +0 -21
  145. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  146. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  147. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  148. package/dist/types/src/capabilities/keyboard.d.ts +0 -4
  149. package/dist/types/src/capabilities/keyboard.d.ts.map +0 -1
  150. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  151. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  152. package/dist/types/src/capabilities/state.d.ts +0 -20
  153. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  154. package/dist/types/src/events.d.ts +0 -4
  155. package/dist/types/src/events.d.ts.map +0 -1
  156. package/dist/types/src/types.d.ts.map +0 -1
  157. package/src/capabilities/app-graph-builder.ts +0 -53
  158. package/src/capabilities/capabilities.ts +0 -20
  159. package/src/capabilities/intent-resolver.ts +0 -37
  160. package/src/capabilities/keyboard.ts +0 -57
  161. package/src/capabilities/react-surface.tsx +0 -48
  162. package/src/capabilities/state.ts +0 -104
  163. package/src/events.ts +0 -11
@@ -3,39 +3,17 @@
3
3
  //
4
4
 
5
5
  import { type Meta } from '@storybook/react-vite';
6
- import React, { type JSX, type PropsWithChildren, useEffect, useState } from 'react';
6
+ import React, { useEffect, useState } from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
- import { Icon, IconButton } from '@dxos/react-ui';
9
+ import { Icon, IconButton, Layout, ScrollArea } from '@dxos/react-ui';
10
10
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
- import { mx } from '@dxos/react-ui-theme';
11
+ import { mx } from '@dxos/ui-theme';
12
12
 
13
13
  import { type ItemMap, Tree, type TreeNodeData, type TreeProps, visitNodes, visitor } from './Tree';
14
14
 
15
15
  faker.seed(1234);
16
16
 
17
- /**
18
- * Space:
19
- * - Space panels are separated from each other to give them more weight than folders.
20
- * - Private space isn't different (just first, different icon).
21
- * - Edit titles in place.
22
- *
23
- * Navigation:
24
- * - up/down across spaces/folder peers
25
- * - right to enter space/folder children
26
- * - left to parent
27
- */
28
- const Container = ({ children, sidebar }: PropsWithChildren<{ sidebar: JSX.Element }>) => {
29
- return (
30
- <div className='flex'>
31
- {/* TODO(burdon): Custom thin scrollbar. */}
32
- {/* TODO(burdon): Horizontal scrolling within navtree? */}
33
- <div className='flex flex-col overflow-y-auto is-[300px] bg-neutral-100 dark:bg-neutral-950'>{sidebar}</div>
34
- <div className='flex flex-col grow overflow-hidden'>{children}</div>
35
- </div>
36
- );
37
- };
38
-
39
17
  // TODO(burdon): Generate.
40
18
  const data: TreeNodeData[] = [
41
19
  {
@@ -134,7 +112,7 @@ const Sidebar = ({ mutate }: { mutate?: boolean }) => {
134
112
  }
135
113
  }, []);
136
114
 
137
- const handleCreateItem: TreeProps['onMenuAction'] = (id, action) => {
115
+ const handleCreateItem: TreeProps['onMenuAction'] = (id) => {
138
116
  setItems((items) => {
139
117
  let parent: TreeNodeData | undefined;
140
118
  visitNodes(root, (node) => {
@@ -167,27 +145,29 @@ const Sidebar = ({ mutate }: { mutate?: boolean }) => {
167
145
  };
168
146
 
169
147
  return (
170
- <div className='flex flex-col overflow-hidden'>
171
- <div className='flex flex-col overflow-y-auto'>
172
- <Tree
173
- className='p-0.5 gap-1'
174
- node={root}
175
- open={openItems}
176
- selected={selectedItems}
177
- active={activeItems}
178
- onChangeOpen={(id, open) => setOpenItems((items) => ({ ...items, [id]: open }))}
179
- onChangeSelected={(id, open) => setSelectedItems((items) => ({ ...items, [id]: open }))}
180
- onMenuAction={handleCreateItem}
181
- getSlots={(node, open, depth, ancestors) => {
182
- if (depth === 1) {
183
- return {
184
- root: 'rounded bg-white dark:bg-neutral-850',
185
- header: mx('rounded-t bg-neutral-50 dark:bg-neutral-900', !open && 'rounded-b'),
186
- };
187
- }
188
- }}
189
- />
190
- </div>
148
+ <Layout.Main>
149
+ <ScrollArea.Root orientation='vertical' thin>
150
+ <ScrollArea.Viewport>
151
+ <Tree
152
+ className='p-0.5 gap-1'
153
+ node={root}
154
+ open={openItems}
155
+ selected={selectedItems}
156
+ active={activeItems}
157
+ onChangeOpen={(id, open) => setOpenItems((items) => ({ ...items, [id]: open }))}
158
+ onChangeSelected={(id, open) => setSelectedItems((items) => ({ ...items, [id]: open }))}
159
+ onMenuAction={handleCreateItem}
160
+ getSlots={(node, open, depth) => {
161
+ if (depth === 1) {
162
+ return {
163
+ root: 'rounded bg-white dark:bg-neutral-850',
164
+ header: mx('rounded-t bg-neutral-50 dark:bg-neutral-900', !open && 'rounded-b'),
165
+ };
166
+ }
167
+ }}
168
+ />
169
+ </ScrollArea.Viewport>
170
+ </ScrollArea.Root>
191
171
 
192
172
  <div className='flex items-center my-2 pli-2 gap-2'>
193
173
  <IconButton icon='ph--plus-circle--regular' iconOnly label='Create space' onClick={handleCreateSpace} />
@@ -196,20 +176,34 @@ const Sidebar = ({ mutate }: { mutate?: boolean }) => {
196
176
  </span>
197
177
  <Icon icon='ph--list--regular' />
198
178
  </div>
199
- </div>
179
+ </Layout.Main>
200
180
  );
201
181
  };
202
182
 
203
183
  const meta = {
204
184
  title: 'plugins/plugin-navtree/experimental/Tree',
205
185
  component: Tree,
206
- decorators: [withTheme, withLayout({ container: 'column' })],
186
+ decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'is-[20rem]' })],
187
+ parameters: {
188
+ layout: 'fullscreen',
189
+ },
207
190
  } satisfies Meta<typeof Tree>;
208
191
 
209
192
  export default meta;
210
193
 
194
+ /**
195
+ * Space:
196
+ * - Space panels are separated from each other to give them more weight than folders.
197
+ * - Private space isn't different (just first, different icon).
198
+ * - Edit titles in place.
199
+ *
200
+ * Navigation:
201
+ * - up/down across spaces/folder peers
202
+ * - right to enter space/folder children
203
+ * - left to parent
204
+ */
211
205
  export const Default = () => {
212
- return <Container sidebar={<Sidebar mutate />} />;
206
+ return <Sidebar mutate />;
213
207
  };
214
208
 
215
209
  export const Visitor = () => {
@@ -5,7 +5,7 @@
5
5
  import React, { type HTMLAttributes, type PropsWithChildren } from 'react';
6
6
 
7
7
  import { type ClassNameValue, Icon, type Size } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
8
+ import { mx } from '@dxos/ui-theme';
9
9
 
10
10
  export const IconButton = ({
11
11
  iconName,
package/src/hooks.ts CHANGED
@@ -2,13 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useEffect } from 'react';
5
+ import { type Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useEffect, useMemo } from 'react';
6
7
 
8
+ import { useCapability } from '@dxos/app-framework/ui';
7
9
  import { type Node } from '@dxos/app-graph';
8
10
 
9
11
  import { useNavTreeContext } from './components';
12
+ import { NavTreeCapabilities } from './types';
10
13
 
11
- export const useLoadDescendents = (root?: Node) => {
14
+ export const useLoadDescendents = (root?: Node.Node) => {
12
15
  const { loadDescendents } = useNavTreeContext();
13
16
  useEffect(() => {
14
17
  const frame = requestAnimationFrame(() => {
@@ -19,3 +22,52 @@ export const useLoadDescendents = (root?: Node) => {
19
22
  return () => cancelAnimationFrame(frame);
20
23
  }, [root]);
21
24
  };
25
+
26
+ export type UseNavTreeStateResult = {
27
+ getItem: (path: string[]) => NavTreeCapabilities.NavTreeItemState;
28
+ getItemAtom: (path: string[]) => Atom.Atom<NavTreeCapabilities.NavTreeItemState>;
29
+ setItem: (path: string[], key: 'open' | 'current' | 'alternateTree', next: boolean) => void;
30
+ };
31
+
32
+ /**
33
+ * Hook that provides access to navtree state functions.
34
+ * For reactive subscriptions, use `useNavTreeItemState` or `useAtomValue(getItemAtom(path))`.
35
+ */
36
+ export const useNavTreeState = (): UseNavTreeStateResult => {
37
+ return useCapability(NavTreeCapabilities.State);
38
+ };
39
+
40
+ /**
41
+ * Hook that subscribes to a single navtree item's state.
42
+ * Use this for fine-grained reactivity.
43
+ */
44
+ export const useNavTreeItemState = (path: string[]): NavTreeCapabilities.NavTreeItemState => {
45
+ const { getItemAtom } = useCapability(NavTreeCapabilities.State);
46
+ // Memoize the path to avoid creating new atoms on every render.
47
+ const pathKey = useMemo(() => path.join('~'), [path]);
48
+ const atom = useMemo(() => getItemAtom(path), [getItemAtom, pathKey]);
49
+ return useAtomValue(atom);
50
+ };
51
+
52
+ /**
53
+ * Hook that subscribes to the open state for a tree item.
54
+ * Designed to be passed to Tree component as useIsOpen prop.
55
+ */
56
+ export const useIsOpen = (path: string[], _item?: any): boolean => {
57
+ return useNavTreeItemState(path).open;
58
+ };
59
+
60
+ /**
61
+ * Hook that subscribes to the current state for a tree item.
62
+ * Designed to be passed to Tree component as useIsCurrent prop.
63
+ */
64
+ export const useIsCurrent = (path: string[], _item?: any): boolean => {
65
+ return useNavTreeItemState(path).current;
66
+ };
67
+
68
+ /**
69
+ * Hook that subscribes to the alternateTree state for a tree item.
70
+ */
71
+ export const useIsAlternateTree = (path: string[], _item?: any): boolean => {
72
+ return useNavTreeItemState(path).alternateTree ?? false;
73
+ };
package/src/index.ts CHANGED
@@ -2,8 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { NavTreeCapabilities } from './capabilities';
6
- export { NavTreeEvents } from './events';
5
+ export { NavTreeCapabilities, NavTreeEvents } from './types';
7
6
  export * from './NavTreePlugin';
8
7
  export * from './meta';
9
8
  export * from './util';
package/src/meta.ts CHANGED
@@ -2,10 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import { type Plugin } from '@dxos/app-framework';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
- export const meta: PluginMeta = {
8
+ export const meta: Plugin.Meta = {
9
9
  id: 'dxos.org/plugin/navtree',
10
10
  name: 'Navtree',
11
11
  description: trim`