@adecore/ui 0.31.12 → 0.32.0

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/AccentSwatches.js +290 -13
  2. package/dist/Banner.js +90 -9
  3. package/dist/Button.js +114 -22
  4. package/dist/ButtonGroup.js +62 -8
  5. package/dist/Checkbox.js +73 -4
  6. package/dist/ChoiceCards.js +205 -11
  7. package/dist/CloseButton.js +87 -7
  8. package/dist/ColorSwatch.js +132 -15
  9. package/dist/ColorWheelPicker.js +305 -71
  10. package/dist/ColumnResizeHandle.js +43 -8
  11. package/dist/DisabledReason.js +27 -8
  12. package/dist/DockShell.js +144 -37
  13. package/dist/EmptyState.js +95 -6
  14. package/dist/ErrorBoundary.js +254 -31
  15. package/dist/Field.js +349 -31
  16. package/dist/FileIcon.js +67 -6
  17. package/dist/Icon.js +38 -6
  18. package/dist/IconButton.js +176 -20
  19. package/dist/IconPicker.js +344 -73
  20. package/dist/Input.js +233 -14
  21. package/dist/Kbd.js +150 -10
  22. package/dist/LazyBoundary.js +14 -5
  23. package/dist/ListRow.js +75 -15
  24. package/dist/Meter.js +108 -5
  25. package/dist/MiddleTruncate.js +126 -45
  26. package/dist/PanelEmpty.js +64 -5
  27. package/dist/PanelHeader.js +95 -13
  28. package/dist/Pill.js +114 -19
  29. package/dist/ProjectSwitcher.js +225 -12
  30. package/dist/PromptDialog.js +352 -37
  31. package/dist/SectionLabel.js +62 -8
  32. package/dist/SegmentBar.js +197 -36
  33. package/dist/Segmented.js +130 -23
  34. package/dist/Select.js +310 -19
  35. package/dist/SelectSearch.js +344 -29
  36. package/dist/Separator.js +35 -4
  37. package/dist/ShortcutHints.js +146 -76
  38. package/dist/Skeleton.js +31 -4
  39. package/dist/Slider.js +172 -10
  40. package/dist/SlidingColumn.js +194 -34
  41. package/dist/Spinner.js +100 -3
  42. package/dist/Stepper.js +232 -11
  43. package/dist/Surface.js +62 -8
  44. package/dist/Switch.js +60 -6
  45. package/dist/TextMenu.js +212 -17
  46. package/dist/Tile.js +149 -5
  47. package/dist/Toasts.js +391 -33
  48. package/dist/Tooltip.js +153 -16
  49. package/dist/UIProvider.js +62 -15
  50. package/dist/Waveform.js +362 -93
  51. package/dist/Wipe.js +259 -34
  52. package/dist/ZoomControls.js +356 -14
  53. package/dist/class-name.js +1 -1
  54. package/dist/clipboard.js +15 -17
  55. package/dist/context-menu/index.parts.js +1 -1
  56. package/dist/dialog/index.parts.js +1 -1
  57. package/dist/dialog/parts.js +378 -29
  58. package/dist/dialog-layer.js +51 -18
  59. package/dist/error-boundary.js +19 -19
  60. package/dist/error-message.js +1 -1
  61. package/dist/field-context.js +7 -5
  62. package/dist/file-icon.js +23 -21
  63. package/dist/file-tree/helpers.js +133 -119
  64. package/dist/file-tree/index.parts.js +3 -3
  65. package/dist/file-tree/parts.js +418 -127
  66. package/dist/file-tree/style.js +1 -1
  67. package/dist/file-tree/use-file-tree-shift.js +43 -30
  68. package/dist/file-tree/use-file-tree.js +60 -18
  69. package/dist/file-tree/use-slots.js +220 -192
  70. package/dist/floating.js +2 -2
  71. package/dist/format/datetime.js +88 -38
  72. package/dist/format/duration.js +59 -53
  73. package/dist/format/index.js +1 -1
  74. package/dist/format/locale.js +76 -56
  75. package/dist/format/number.js +77 -61
  76. package/dist/format/regions.js +4 -2
  77. package/dist/format/time-zone.js +1 -1
  78. package/dist/icon-button-size.js +12 -2
  79. package/dist/icon-picker.js +70 -61
  80. package/dist/index.js +57 -57
  81. package/dist/key-value-list/index.parts.js +1 -1
  82. package/dist/key-value-list/parts.js +256 -22
  83. package/dist/lazy-landings.js +10 -10
  84. package/dist/lazy.js +84 -71
  85. package/dist/locales/en.js +80 -80
  86. package/dist/locales/nl.js +80 -80
  87. package/dist/locales.js +10 -7
  88. package/dist/menu/index.parts.js +1 -1
  89. package/dist/menu/parts.js +882 -44
  90. package/dist/merge-refs.js +8 -9
  91. package/dist/middle-truncate.js +24 -25
  92. package/dist/modality.js +27 -19
  93. package/dist/placement.js +11 -20
  94. package/dist/platform.js +6 -6
  95. package/dist/popover/index.parts.js +1 -1
  96. package/dist/popover/parts.js +173 -11
  97. package/dist/popup-layer.js +38 -17
  98. package/dist/prefetch.js +78 -79
  99. package/dist/preview-card/index.parts.js +1 -1
  100. package/dist/project-switcher-row.js +153 -12
  101. package/dist/select-row.js +69 -5
  102. package/dist/select-shared.js +6 -6
  103. package/dist/selection.js +16 -16
  104. package/dist/seti-icons.js +413 -413
  105. package/dist/settings/ConfirmDialog.js +55 -8
  106. package/dist/settings/DetailHeader.js +72 -4
  107. package/dist/settings/MasterDetail.js +119 -7
  108. package/dist/settings/SettingsDialog.js +820 -80
  109. package/dist/settings/SettingsRow.js +205 -18
  110. package/dist/settings/SettingsSection.js +96 -6
  111. package/dist/settings/index.js +7 -7
  112. package/dist/settings/target.js +7 -2
  113. package/dist/shortcut-hints.js +73 -55
  114. package/dist/shortcut.js +140 -104
  115. package/dist/step-places.js +1 -1
  116. package/dist/tabs/index.parts.js +1 -1
  117. package/dist/tabs/overflow.js +18 -18
  118. package/dist/tabs/parts.js +780 -166
  119. package/dist/testing/dedupe.js +82 -75
  120. package/dist/testing/fake-source.js +12 -12
  121. package/dist/testing/index.js +1 -1
  122. package/dist/toast-store.js +65 -46
  123. package/dist/tree/index.parts.js +1 -1
  124. package/dist/tree/parts.js +721 -94
  125. package/dist/tree/shift.js +28 -22
  126. package/dist/tree/style.js +2 -2
  127. package/dist/tree/use-tree-shift.js +178 -117
  128. package/dist/useAsyncAction.js +23 -19
  129. package/dist/useColumnResize.js +36 -34
  130. package/dist/useContentSize.js +62 -18
  131. package/dist/useMeasuredWidth.js +14 -3
  132. package/dist/useNow.js +73 -30
  133. package/dist/wipe-split.js +14 -14
  134. package/dist/workspace/DropPreview.js +60 -7
  135. package/dist/workspace/SplitView.js +1025 -441
  136. package/dist/workspace/TabStrip.js +810 -191
  137. package/dist/workspace/Workspace.js +276 -26
  138. package/dist/workspace/context.js +8 -3
  139. package/dist/workspace/geometry.js +173 -150
  140. package/dist/workspace/model.js +313 -250
  141. package/dist/workspace/preview.js +61 -61
  142. package/dist/zoom.js +2 -2
  143. package/package.json +1 -1
  144. package/src/ErrorBoundary.tsx +1 -1
  145. package/src/Field.tsx +4 -3
  146. package/src/IconPicker.tsx +3 -3
  147. package/src/LazyBoundary.tsx +2 -0
  148. package/src/MiddleTruncate.tsx +2 -2
  149. package/src/SegmentBar.tsx +2 -2
  150. package/src/Toasts.tsx +3 -1
  151. package/src/Tooltip.tsx +7 -10
  152. package/src/Waveform.tsx +3 -3
  153. package/src/file-tree/parts.tsx +6 -9
  154. package/src/file-tree/use-file-tree-shift.tsx +6 -9
  155. package/src/lazy.tsx +4 -0
  156. package/src/locales/en.ts +4 -4
  157. package/src/locales/nl.ts +5 -5
  158. package/src/settings/SettingsDialog.tsx +1 -1
  159. package/src/tree/parts.tsx +5 -8
  160. package/src/useContentSize.ts +3 -3
  161. package/src/workspace/SplitView.tsx +2 -2
  162. package/src/workspace/TabStrip.tsx +2 -3
  163. package/src/workspace/Workspace.tsx +2 -5
@@ -15,110 +15,117 @@ const SHARED = ['react', 'react-dom', 'i18next', 'react-i18next', '@base-ui/reac
15
15
  const NAME = '@adecore/ui';
16
16
  /* The package root, from `src/testing` or `dist/testing` alike. */
17
17
  const library = realpathSync(join(import.meta.dir, '..', '..'));
18
- const manifestOf = (folder) => {
19
- const path = join(folder, 'package.json');
20
- return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : null;
18
+ const manifestOf = folder => {
19
+ const path = join(folder, 'package.json');
20
+ return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : null;
21
21
  };
22
- const dependsOnLibrary = (manifest) => manifest !== null && [manifest.dependencies, manifest.devDependencies, manifest.peerDependencies].some((deps) => deps !== undefined && NAME in deps);
22
+ const dependsOnLibrary = manifest => manifest !== null && [manifest.dependencies, manifest.devDependencies, manifest.peerDependencies].some(deps => deps !== undefined && NAME in deps);
23
23
  const membersOf = (root, manifest) => {
24
- const workspaces = manifest?.workspaces;
25
- const patterns = (Array.isArray(workspaces) ? workspaces : workspaces?.packages) ?? [];
26
- return patterns
27
- .flatMap((pattern) => [...new Glob(`${pattern}/package.json`).scanSync({ cwd: root, onlyFiles: true })])
28
- .map((path) => join(root, dirname(path)));
24
+ const workspaces = manifest?.workspaces;
25
+ const patterns = (Array.isArray(workspaces) ? workspaces : workspaces?.packages) ?? [];
26
+ return patterns.flatMap(pattern => [...new Glob(`${pattern}/package.json`).scanSync({
27
+ cwd: root,
28
+ onlyFiles: true
29
+ })]).map(path => join(root, dirname(path)));
29
30
  };
30
31
  /*
31
32
  * Where the app's copies are found: the folder the tests run in, then each workspace of it that
32
33
  * depends on the library. With an isolated install the root of a monorepo has no React of its own.
33
34
  */
34
35
  const appFolders = () => {
35
- const root = process.cwd();
36
- return [root, ...membersOf(root, manifestOf(root)).filter((folder) => dependsOnLibrary(manifestOf(folder)))];
36
+ const root = process.cwd();
37
+ return [root, ...membersOf(root, manifestOf(root)).filter(folder => dependsOnLibrary(manifestOf(folder)))];
37
38
  };
38
39
  /* Where the checkout keeps its copies: the library's other packages in the same monorepo bring their own. */
39
40
  const checkoutFolders = () => {
40
- for (let folder = dirname(library); dirname(folder) !== folder; folder = dirname(folder)) {
41
- const manifest = manifestOf(folder);
42
- if (manifest?.workspaces !== undefined) {
43
- const members = membersOf(folder, manifest);
44
- return members.includes(library) ? [folder, ...members] : [library];
45
- }
41
+ for (let folder = dirname(library); dirname(folder) !== folder; folder = dirname(folder)) {
42
+ const manifest = manifestOf(folder);
43
+ if (manifest?.workspaces !== undefined) {
44
+ const members = membersOf(folder, manifest);
45
+ return members.includes(library) ? [folder, ...members] : [library];
46
46
  }
47
- return [library];
47
+ }
48
+ return [library];
48
49
  };
49
50
  /* The packages a name of the list stands for in a folder: itself, or every package of the scope for `@scope/*`. */
50
51
  const namesIn = (folder, pattern) => {
51
- if (!pattern.endsWith('/*')) {
52
- return [pattern];
53
- }
54
- const scope = pattern.slice(0, -2);
55
- const path = join(folder, 'node_modules', scope);
56
- return existsSync(path)
57
- ? readdirSync(path)
58
- .filter((entry) => !entry.startsWith('.'))
59
- .map((entry) => `${scope}/${entry}`)
60
- : [];
52
+ if (!pattern.endsWith('/*')) {
53
+ return [pattern];
54
+ }
55
+ const scope = pattern.slice(0, -2);
56
+ const path = join(folder, 'node_modules', scope);
57
+ return existsSync(path) ? readdirSync(path).filter(entry => !entry.startsWith('.')).map(entry => `${scope}/${entry}`) : [];
61
58
  };
62
59
  /* The copy of a package that `from` resolves to, walking up the node_modules folders as Node does. */
63
60
  const copyFrom = (from, name) => {
64
- for (let folder = from;; folder = dirname(folder)) {
65
- const candidate = join(folder, 'node_modules', name);
66
- if (existsSync(candidate)) {
67
- return realpathSync(candidate);
68
- }
69
- if (dirname(folder) === folder) {
70
- return null;
71
- }
61
+ for (let folder = from;; folder = dirname(folder)) {
62
+ const candidate = join(folder, 'node_modules', name);
63
+ if (existsSync(candidate)) {
64
+ return realpathSync(candidate);
65
+ }
66
+ if (dirname(folder) === folder) {
67
+ return null;
72
68
  }
69
+ }
73
70
  };
74
71
  const findCopies = () => {
75
- const checkout = checkoutFolders();
76
- const inside = (path) => path === checkout[0] || path.startsWith(`${checkout[0]}${sep}`);
77
- // A run inside the checkout is the library's own; a node_modules above it belongs to no app.
78
- if (inside(realpathSync(process.cwd()))) {
79
- return [];
72
+ const checkout = checkoutFolders();
73
+ const inside = path => path === checkout[0] || path.startsWith(`${checkout[0]}${sep}`);
74
+ // A run inside the checkout is the library's own; a node_modules above it belongs to no app.
75
+ if (inside(realpathSync(process.cwd()))) {
76
+ return [];
77
+ }
78
+ const folders = appFolders();
79
+ const added = folders.flatMap(folder => {
80
+ const names = manifestOf(folder)?.adecore?.dedupe;
81
+ return Array.isArray(names) ? names.filter(name => typeof name === 'string') : [];
82
+ });
83
+ const names = new Set([...SHARED, ...added].flatMap(pattern => checkout.flatMap(folder => namesIn(folder, pattern))));
84
+ return [...names].flatMap(name => {
85
+ const ours = folders.map(folder => copyFrom(folder, name)).find(copy => copy !== null && !inside(copy));
86
+ if (ours === undefined) {
87
+ return [];
80
88
  }
81
- const folders = appFolders();
82
- const added = folders.flatMap((folder) => {
83
- const names = manifestOf(folder)?.adecore?.dedupe;
84
- return Array.isArray(names) ? names.filter((name) => typeof name === 'string') : [];
85
- });
86
- const names = new Set([...SHARED, ...added].flatMap((pattern) => checkout.flatMap((folder) => namesIn(folder, pattern))));
87
- return [...names].flatMap((name) => {
88
- const ours = folders.map((folder) => copyFrom(folder, name)).find((copy) => copy !== null && !inside(copy));
89
- if (ours === undefined) {
90
- return [];
91
- }
92
- const theirs = new Set(checkout
93
- .map((folder) => join(folder, 'node_modules', name))
94
- .filter((path) => existsSync(path))
95
- .map((path) => realpathSync(path)));
96
- return [...theirs].filter((real) => real !== ours).map((real) => ({ theirs: `${real}${sep}`, ours: `${ours}${sep}` }));
97
- });
89
+ const theirs = new Set(checkout.map(folder => join(folder, 'node_modules', name)).filter(path => existsSync(path)).map(path => realpathSync(path)));
90
+ return [...theirs].filter(real => real !== ours).map(real => ({
91
+ theirs: `${real}${sep}`,
92
+ ours: `${ours}${sep}`
93
+ }));
94
+ });
98
95
  };
99
96
  // From the registry the package manager already decided what to share; a copy nested in the library is on purpose.
100
97
  const copies = library.split(sep).includes('node_modules') ? [] : findCopies();
101
- const escape = (text) => text.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
98
+ const escape = text => text.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
102
99
  let transpiler = null;
103
100
  /*
104
101
  * Re-exports the app's file without running it: `require` refuses an ES module of the app that is
105
102
  * still loading. `export *` skips the default, which CommonJS always has and an ES module only when it says so.
106
103
  */
107
- const standIn = (path) => {
108
- transpiler ??= new Bun.Transpiler({ loader: 'js' });
109
- const { exports, imports } = transpiler.scan(readFileSync(path, 'utf8'));
110
- const esm = exports.length > 0 || imports.some((entry) => entry.kind === 'import-statement');
111
- const target = JSON.stringify(path);
112
- return [`export * from ${target};`, ...(!esm || exports.includes('default') ? [`export { default } from ${target};`] : [])].join('\n');
104
+ const standIn = path => {
105
+ transpiler ??= new Bun.Transpiler({
106
+ loader: 'js'
107
+ });
108
+ const {
109
+ exports,
110
+ imports
111
+ } = transpiler.scan(readFileSync(path, 'utf8'));
112
+ const esm = exports.length > 0 || imports.some(entry => entry.kind === 'import-statement');
113
+ const target = JSON.stringify(path);
114
+ return [`export * from ${target};`, ...(!esm || exports.includes('default') ? [`export { default } from ${target};`] : [])].join('\n');
113
115
  };
114
116
  if (copies.length > 0) {
115
- plugin({
116
- name: 'adecore-ui-dedupe',
117
- setup(build) {
118
- build.onLoad({ filter: new RegExp(`^(${copies.map((copy) => escape(copy.theirs)).join('|')})`) }, (args) => {
119
- const copy = copies.find((candidate) => args.path.startsWith(candidate.theirs));
120
- return { contents: standIn(copy.ours + args.path.slice(copy.theirs.length)), loader: 'js' };
121
- });
122
- }
123
- });
124
- }
117
+ plugin({
118
+ name: 'adecore-ui-dedupe',
119
+ setup(build) {
120
+ build.onLoad({
121
+ filter: new RegExp(`^(${copies.map(copy => escape(copy.theirs)).join('|')})`)
122
+ }, args => {
123
+ const copy = copies.find(candidate => args.path.startsWith(candidate.theirs));
124
+ return {
125
+ contents: standIn(copy.ours + args.path.slice(copy.theirs.length)),
126
+ loader: 'js'
127
+ };
128
+ });
129
+ }
130
+ });
131
+ }
@@ -1,15 +1,15 @@
1
1
  import { FORMAT_LANGUAGE } from '../format/regions.js';
2
2
  /* A source a test sets by hand: English, the region of the language, and no system locale of a shell. */
3
3
  export const fakeFormatSource = () => {
4
- let language = 'en';
5
- let region = FORMAT_LANGUAGE;
6
- return {
7
- language: () => language,
8
- region: () => region,
9
- subscribe: () => () => { },
10
- set: (settings) => {
11
- language = settings.language ?? language;
12
- region = settings.region ?? region;
13
- }
14
- };
15
- };
4
+ let language = 'en';
5
+ let region = FORMAT_LANGUAGE;
6
+ return {
7
+ language: () => language,
8
+ region: () => region,
9
+ subscribe: () => () => {},
10
+ set: settings => {
11
+ language = settings.language ?? language;
12
+ region = settings.region ?? region;
13
+ }
14
+ };
15
+ };
@@ -1,2 +1,2 @@
1
1
  /* Fakes for an app's own tests. Nothing here belongs in a bundle that ships. */
2
- export { fakeFormatSource } from './fake-source.js';
2
+ export { fakeFormatSource } from './fake-source.js';
@@ -10,52 +10,71 @@ export const elapsedOf = (deadline, now) => Math.min(Math.max(now - deadline.sta
10
10
  * one id from progress to its outcome, so a person never watches two cards for one thing.
11
11
  */
12
12
  export const createToastStore = () => {
13
- const timers = new Map();
14
- let counter = 0;
15
- return create((set, get) => {
16
- const stop = (id) => {
17
- clearTimeout(timers.get(id));
18
- timers.delete(id);
13
+ const timers = new Map();
14
+ let counter = 0;
15
+ return create((set, get) => {
16
+ const stop = id => {
17
+ clearTimeout(timers.get(id));
18
+ timers.delete(id);
19
+ };
20
+ /* A toast that went well takes itself away, and so does the offer to undo; a failure and a running action stay. */
21
+ const schedule = (id, kind, persist) => {
22
+ stop(id);
23
+ const lifetime = kind === 'deleted' ? UNDO_MS : kind === 'success' && !persist ? SUCCESS_MS : null;
24
+ if (lifetime === null) {
25
+ return undefined;
26
+ }
27
+ timers.set(id, setTimeout(() => {
28
+ timers.delete(id);
29
+ get().dismiss(id);
30
+ }, lifetime));
31
+ const start = Date.now();
32
+ return {
33
+ start,
34
+ end: start + lifetime
35
+ };
36
+ };
37
+ return {
38
+ toasts: [],
39
+ show(toast) {
40
+ counter += 1;
41
+ const id = toast.id ?? `toast-${counter}`;
42
+ const next = {
43
+ ...toast,
44
+ id,
45
+ deadline: schedule(id, toast.kind, toast.persist === true)
19
46
  };
20
- /* A toast that went well takes itself away, and so does the offer to undo; a failure and a running action stay. */
21
- const schedule = (id, kind, persist) => {
22
- stop(id);
23
- const lifetime = kind === 'deleted' ? UNDO_MS : kind === 'success' && !persist ? SUCCESS_MS : null;
24
- if (lifetime === null) {
25
- return undefined;
26
- }
27
- timers.set(id, setTimeout(() => {
28
- timers.delete(id);
29
- get().dismiss(id);
30
- }, lifetime));
31
- const start = Date.now();
32
- return { start, end: start + lifetime };
47
+ const toasts = get().toasts;
48
+ set({
49
+ toasts: toasts.some(entry => entry.id === id) ? toasts.map(entry => entry.id === id ? next : entry) : [...toasts, next]
50
+ });
51
+ return id;
52
+ },
53
+ update(id, patch) {
54
+ const current = get().toasts.find(entry => entry.id === id);
55
+ if (current === undefined) {
56
+ return;
57
+ }
58
+ const merged = {
59
+ ...current,
60
+ ...patch
33
61
  };
34
- return {
35
- toasts: [],
36
- show(toast) {
37
- counter += 1;
38
- const id = toast.id ?? `toast-${counter}`;
39
- const next = { ...toast, id, deadline: schedule(id, toast.kind, toast.persist === true) };
40
- const toasts = get().toasts;
41
- set({ toasts: toasts.some((entry) => entry.id === id) ? toasts.map((entry) => (entry.id === id ? next : entry)) : [...toasts, next] });
42
- return id;
43
- },
44
- update(id, patch) {
45
- const current = get().toasts.find((entry) => entry.id === id);
46
- if (current === undefined) {
47
- return;
48
- }
49
- const merged = { ...current, ...patch };
50
- const next = { ...merged, deadline: schedule(id, merged.kind, merged.persist === true) };
51
- set({ toasts: get().toasts.map((entry) => (entry.id === id ? next : entry)) });
52
- },
53
- dismiss(id) {
54
- stop(id);
55
- const gone = get().toasts.find((entry) => entry.id === id);
56
- set({ toasts: get().toasts.filter((entry) => entry.id !== id) });
57
- gone?.onClose?.();
58
- }
62
+ const next = {
63
+ ...merged,
64
+ deadline: schedule(id, merged.kind, merged.persist === true)
59
65
  };
60
- });
61
- };
66
+ set({
67
+ toasts: get().toasts.map(entry => entry.id === id ? next : entry)
68
+ });
69
+ },
70
+ dismiss(id) {
71
+ stop(id);
72
+ const gone = get().toasts.find(entry => entry.id === id);
73
+ set({
74
+ toasts: get().toasts.filter(entry => entry.id !== id)
75
+ });
76
+ gone?.onClose?.();
77
+ }
78
+ };
79
+ });
80
+ };
@@ -1 +1 @@
1
- export { TreeRoot as Root, TreeRow as Row, TreeChevron as Chevron, TreeChevronSlot as ChevronSlot, TreeLabel as Label, TreeDecoration as Decoration, TreeControl as Control, TreeCheckbox as Checkbox } from './parts.js';
1
+ export { TreeRoot as Root, TreeRow as Row, TreeChevron as Chevron, TreeChevronSlot as ChevronSlot, TreeLabel as Label, TreeDecoration as Decoration, TreeControl as Control, TreeCheckbox as Checkbox } from "./parts.js";