@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
package/dist/file-icon.js CHANGED
@@ -6,18 +6,20 @@ const SPRITE_ELEMENT_ID = 'adecore-ui-file-icon-sprite';
6
6
  sprite brings the rules that color it. Everything drawn beside a tree calls `fileIconFor`, so a tab,
7
7
  a picker row and a tree row never disagree about what a file is. */
8
8
  export const FILE_TREE_ICONS = {
9
- set: 'none',
10
- spriteSheet: SETI_SPRITE_SHEET,
11
- remap: { 'file-tree-icon-file': SETI_DEFAULT_SYMBOL },
12
- byFileName: SETI_BY_FILE_NAME,
13
- byFileExtension: SETI_BY_FILE_EXTENSION,
14
- byFileNameContains: SETI_BY_FILE_NAME_CONTAINS
9
+ set: 'none',
10
+ spriteSheet: SETI_SPRITE_SHEET,
11
+ remap: {
12
+ 'file-tree-icon-file': SETI_DEFAULT_SYMBOL
13
+ },
14
+ byFileName: SETI_BY_FILE_NAME,
15
+ byFileExtension: SETI_BY_FILE_EXTENSION,
16
+ byFileNameContains: SETI_BY_FILE_NAME_CONTAINS
15
17
  };
16
18
  let resolver = null;
17
19
  /* Built on the first icon rather than on import, so a bundle that never draws one never builds it. */
18
20
  const resolveIcon = (...args) => {
19
- resolver ??= createFileTreeIconResolver(FILE_TREE_ICONS);
20
- return resolver.resolveIcon(...args);
21
+ resolver ??= createFileTreeIconResolver(FILE_TREE_ICONS);
22
+ return resolver.resolveIcon(...args);
21
23
  };
22
24
  /*
23
25
  * The id of the `<symbol>` the set gives a file, in the sprite `mountFileIconSprite` puts in the
@@ -26,19 +28,19 @@ const resolveIcon = (...args) => {
26
28
  * `ts`). Anything else falls back to the generic file icon, a directory included: the tree marks a
27
29
  * folder with its chevron, not a glyph.
28
30
  */
29
- export const fileIconFor = (path) => resolveIcon('file-tree-icon-file', path).name;
31
+ export const fileIconFor = path => resolveIcon('file-tree-icon-file', path).name;
30
32
  /* The tree carries the sprite into its own shadow root, out of reach of anything that draws an
31
33
  icon next to it, so the document gets a copy of the same sheet to point `<use>` at. */
32
34
  export const mountFileIconSprite = () => {
33
- if (document.getElementById(SPRITE_ELEMENT_ID) !== null) {
34
- return;
35
- }
36
- const holder = document.createElement('div');
37
- holder.innerHTML = SETI_SPRITE_SHEET;
38
- const sprite = holder.firstElementChild;
39
- if (sprite === null) {
40
- return;
41
- }
42
- sprite.id = SPRITE_ELEMENT_ID;
43
- (document.body ?? document.documentElement).append(sprite);
44
- };
35
+ if (document.getElementById(SPRITE_ELEMENT_ID) !== null) {
36
+ return;
37
+ }
38
+ const holder = document.createElement('div');
39
+ holder.innerHTML = SETI_SPRITE_SHEET;
40
+ const sprite = holder.firstElementChild;
41
+ if (sprite === null) {
42
+ return;
43
+ }
44
+ sprite.id = SPRITE_ELEMENT_ID;
45
+ (document.body ?? document.documentElement).append(sprite);
46
+ };
@@ -2,175 +2,189 @@ import { nameOrder } from '../format/locale.js';
2
2
  // Expanded folders can reveal more flattened rows; cap custom-key cycles.
3
3
  const EXPANSION_PASSES = 32;
4
4
  export function directoryHandle(model, path) {
5
- const item = model.getItem(path);
6
- return item?.isDirectory() ? item : null;
5
+ const item = model.getItem(path);
6
+ return item?.isDirectory() ? item : null;
7
7
  }
8
8
  export function pathOfRow(row) {
9
- return row.isFlattened ? (row.flattenedSegments?.findLast((segment) => segment.isTerminal)?.path ?? row.path) : row.path;
9
+ return row.isFlattened ? row.flattenedSegments?.findLast(segment => segment.isTerminal)?.path ?? row.path : row.path;
10
10
  }
11
11
  export function visibleRows(model) {
12
- return model.getVisibleRows(0, model.getVisibleCount()).map((row) => ({ ...row, path: pathOfRow(row) }));
12
+ return model.getVisibleRows(0, model.getVisibleCount()).map(row => ({
13
+ ...row,
14
+ path: pathOfRow(row)
15
+ }));
13
16
  }
14
17
  /* The `count` rows from `start` and one on each side, for a neighbor's selection, without copying the whole list. */
15
18
  export function visibleRowsAround(model, start, count) {
16
- const first = Math.max(0, start - 1);
17
- const last = Math.min(model.getVisibleCount() - 1, start + count);
18
- if (last < first) {
19
- return [];
20
- }
21
- return model.getVisibleRows(first, last).map((row) => ({ ...row, path: pathOfRow(row) }));
19
+ const first = Math.max(0, start - 1);
20
+ const last = Math.min(model.getVisibleCount() - 1, start + count);
21
+ if (last < first) {
22
+ return [];
23
+ }
24
+ return model.getVisibleRows(first, last).map(row => ({
25
+ ...row,
26
+ path: pathOfRow(row)
27
+ }));
22
28
  }
23
29
  export function applyExpansion(model, collapsed, keyOf) {
24
- for (let pass = 0; pass < EXPANSION_PASSES; pass++) {
25
- const { collapse, expand } = expansionChanges(visibleRows(model), collapsed, keyOf);
26
- if (collapse.length === 0 && expand.length === 0) {
27
- return;
28
- }
29
- for (const path of collapse) {
30
- directoryHandle(model, path)?.collapse();
31
- }
32
- for (const path of expand) {
33
- directoryHandle(model, path)?.expand();
34
- }
30
+ for (let pass = 0; pass < EXPANSION_PASSES; pass++) {
31
+ const {
32
+ collapse,
33
+ expand
34
+ } = expansionChanges(visibleRows(model), collapsed, keyOf);
35
+ if (collapse.length === 0 && expand.length === 0) {
36
+ return;
37
+ }
38
+ for (const path of collapse) {
39
+ directoryHandle(model, path)?.collapse();
40
+ }
41
+ for (const path of expand) {
42
+ directoryHandle(model, path)?.expand();
35
43
  }
44
+ }
36
45
  }
37
46
  export function resetExpandedPaths(model, paths, expanded) {
38
- model.resetPaths(paths, { initialExpandedPaths: [...expanded] });
39
- // @pierre/trees beta.6 restores expansion with its default sort, so custom sorting needs a second pass.
40
- for (const path of expanded) {
41
- directoryHandle(model, path)?.expand();
42
- }
47
+ model.resetPaths(paths, {
48
+ initialExpandedPaths: [...expanded]
49
+ });
50
+ // @pierre/trees beta.6 restores expansion with its default sort, so custom sorting needs a second pass.
51
+ for (const path of expanded) {
52
+ directoryHandle(model, path)?.expand();
53
+ }
43
54
  }
44
55
  export function rowPathOf(event) {
45
- for (const node of event.nativeEvent.composedPath()) {
46
- const path = node instanceof HTMLElement ? node.dataset.itemPath : undefined;
47
- if (path) {
48
- return path;
49
- }
56
+ for (const node of event.nativeEvent.composedPath()) {
57
+ const path = node instanceof HTMLElement ? node.dataset.itemPath : undefined;
58
+ if (path) {
59
+ return path;
50
60
  }
51
- return null;
61
+ }
62
+ return null;
52
63
  }
53
64
  export function menuTargetsOf(row, selected) {
54
- return selected.includes(row) && selected.length > 1 ? [...selected] : [row];
65
+ return selected.includes(row) && selected.length > 1 ? [...selected] : [row];
55
66
  }
56
67
  export function extendsSelection(event) {
57
- return event.shiftKey || event.metaKey || event.ctrlKey;
68
+ return event.shiftKey || event.metaKey || event.ctrlKey;
58
69
  }
59
70
  const FOCUS_KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End']);
60
71
  export function movesFocus(event) {
61
- return FOCUS_KEYS.has(event.key) && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey;
72
+ return FOCUS_KEYS.has(event.key) && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey;
62
73
  }
63
74
  export function selectOnly(model, path) {
64
- for (const selected of model.getSelectedPaths()) {
65
- if (selected !== path) {
66
- model.getItem(selected)?.deselect();
67
- }
68
- }
69
- const item = path === null ? null : model.getItem(path);
70
- if (item && !item.isSelected()) {
71
- item.select();
75
+ for (const selected of model.getSelectedPaths()) {
76
+ if (selected !== path) {
77
+ model.getItem(selected)?.deselect();
72
78
  }
79
+ }
80
+ const item = path === null ? null : model.getItem(path);
81
+ if (item && !item.isSelected()) {
82
+ item.select();
83
+ }
73
84
  }
74
85
  export function followFocus(model, onMoved) {
75
- const from = model.getFocusedPath();
76
- const timer = window.setTimeout(() => {
77
- const path = model.getFocusedPath();
78
- selectOnly(model, path);
79
- if (path !== null && path !== from) {
80
- onMoved?.(path);
81
- }
82
- }, 0);
83
- return () => window.clearTimeout(timer);
86
+ const from = model.getFocusedPath();
87
+ const timer = window.setTimeout(() => {
88
+ const path = model.getFocusedPath();
89
+ selectOnly(model, path);
90
+ if (path !== null && path !== from) {
91
+ onMoved?.(path);
92
+ }
93
+ }, 0);
94
+ return () => window.clearTimeout(timer);
84
95
  }
85
96
  export function focusRow(model, path) {
86
- const selector = `[data-type="item"][data-item-path="${CSS.escape(path)}"]:not([data-item-parked="true"])`;
87
- const row = model.getFileTreeContainer()?.shadowRoot?.querySelector(selector) ?? null;
88
- row?.focus();
89
- return row !== null;
97
+ const selector = `[data-type="item"][data-item-path="${CSS.escape(path)}"]:not([data-item-parked="true"])`;
98
+ const row = model.getFileTreeContainer()?.shadowRoot?.querySelector(selector) ?? null;
99
+ row?.focus();
100
+ return row !== null;
90
101
  }
91
102
  export function ancestorDirsOf(treePath) {
92
- const segments = treePath.split('/').filter((segment) => segment !== '');
93
- segments.pop();
94
- const dirs = [];
95
- let prefix = '';
96
- for (const segment of segments) {
97
- prefix = `${prefix}${segment}/`;
98
- dirs.push(prefix);
99
- }
100
- return dirs;
103
+ const segments = treePath.split('/').filter(segment => segment !== '');
104
+ segments.pop();
105
+ const dirs = [];
106
+ let prefix = '';
107
+ for (const segment of segments) {
108
+ prefix = `${prefix}${segment}/`;
109
+ dirs.push(prefix);
110
+ }
111
+ return dirs;
101
112
  }
102
113
  export function withoutClosedBranches(open, known) {
103
- return new Set([...open].filter((path) => ancestorDirsOf(path).every((dir) => open.has(dir) || !known.has(dir))));
114
+ return new Set([...open].filter(path => ancestorDirsOf(path).every(dir => open.has(dir) || !known.has(dir))));
104
115
  }
105
116
  export function newlyExpanded(before, after) {
106
- return [...after].filter((path) => !before.has(path));
117
+ return [...after].filter(path => !before.has(path));
107
118
  }
108
119
  export function mergeExpanded(remembered, reported, known) {
109
- const merged = new Set(reported);
110
- for (const path of remembered) {
111
- if (!known.has(path)) {
112
- merged.add(path);
113
- }
120
+ const merged = new Set(reported);
121
+ for (const path of remembered) {
122
+ if (!known.has(path)) {
123
+ merged.add(path);
114
124
  }
115
- return merged;
125
+ }
126
+ return merged;
116
127
  }
117
128
  export function compareRows(left, right) {
118
- const shared = Math.min(left.segments.length, right.segments.length);
119
- for (let i = 0; i < shared; i++) {
120
- const leftSegment = left.segments[i];
121
- const rightSegment = right.segments[i];
122
- if (leftSegment === rightSegment) {
123
- continue;
124
- }
125
- const leftIsDirectory = left.isDirectory || i < left.segments.length - 1;
126
- const rightIsDirectory = right.isDirectory || i < right.segments.length - 1;
127
- if (leftIsDirectory !== rightIsDirectory) {
128
- return leftIsDirectory ? -1 : 1;
129
- }
130
- return nameOrder(leftSegment, rightSegment);
129
+ const shared = Math.min(left.segments.length, right.segments.length);
130
+ for (let i = 0; i < shared; i++) {
131
+ const leftSegment = left.segments[i];
132
+ const rightSegment = right.segments[i];
133
+ if (leftSegment === rightSegment) {
134
+ continue;
135
+ }
136
+ const leftIsDirectory = left.isDirectory || i < left.segments.length - 1;
137
+ const rightIsDirectory = right.isDirectory || i < right.segments.length - 1;
138
+ if (leftIsDirectory !== rightIsDirectory) {
139
+ return leftIsDirectory ? -1 : 1;
131
140
  }
132
- // One path is the head of the other, so the shorter one is the directory the longer one sits in.
133
- return left.segments.length - right.segments.length;
141
+ return nameOrder(leftSegment, rightSegment);
142
+ }
143
+ // One path is the head of the other, so the shorter one is the directory the longer one sits in.
144
+ return left.segments.length - right.segments.length;
134
145
  }
135
146
  export function dirPathOf(rowPath) {
136
- return rowPath.endsWith('/') ? rowPath.slice(0, -1) : rowPath;
147
+ return rowPath.endsWith('/') ? rowPath.slice(0, -1) : rowPath;
137
148
  }
138
149
  function plainKey(rowPath) {
139
- return dirPathOf(rowPath);
150
+ return dirPathOf(rowPath);
140
151
  }
141
152
  export function collapsedPathsOf(rows, keyOf = plainKey) {
142
- return rows.flatMap((row) => {
143
- const key = row.kind === 'directory' && !row.isExpanded ? keyOf(row.path) : null;
144
- return key === null ? [] : [key];
145
- });
153
+ return rows.flatMap(row => {
154
+ const key = row.kind === 'directory' && !row.isExpanded ? keyOf(row.path) : null;
155
+ return key === null ? [] : [key];
156
+ });
146
157
  }
147
158
  export function mergeCollapsedPaths(current, rows, keyOf = plainKey) {
148
- const known = new Set(rows.flatMap((row) => (row.kind === 'directory' ? [keyOf(row.path)] : [])));
149
- const folded = new Set(collapsedPathsOf(rows, keyOf));
150
- const next = current.filter((dir) => !known.has(dir) || folded.has(dir));
151
- const existing = new Set(current);
152
- for (const dir of folded) {
153
- if (!existing.has(dir)) {
154
- next.push(dir);
155
- }
159
+ const known = new Set(rows.flatMap(row => row.kind === 'directory' ? [keyOf(row.path)] : []));
160
+ const folded = new Set(collapsedPathsOf(rows, keyOf));
161
+ const next = current.filter(dir => !known.has(dir) || folded.has(dir));
162
+ const existing = new Set(current);
163
+ for (const dir of folded) {
164
+ if (!existing.has(dir)) {
165
+ next.push(dir);
156
166
  }
157
- // Selection also notifies subscribers; unchanged folds must not restart the shared-state cycle.
158
- return next.length === current.length && next.every((dir, index) => dir === current[index]) ? current : next;
167
+ }
168
+ // Selection also notifies subscribers; unchanged folds must not restart the shared-state cycle.
169
+ return next.length === current.length && next.every((dir, index) => dir === current[index]) ? current : next;
159
170
  }
160
171
  export function expansionChanges(rows, collapsed, keyOf = plainKey) {
161
- const changes = { collapse: [], expand: [] };
162
- for (const row of rows) {
163
- const key = row.kind === 'directory' ? keyOf(row.path) : null;
164
- if (key === null) {
165
- continue;
166
- }
167
- const folded = collapsed.has(key);
168
- if (folded && row.isExpanded) {
169
- changes.collapse.push(row.path);
170
- }
171
- if (!folded && !row.isExpanded) {
172
- changes.expand.push(row.path);
173
- }
172
+ const changes = {
173
+ collapse: [],
174
+ expand: []
175
+ };
176
+ for (const row of rows) {
177
+ const key = row.kind === 'directory' ? keyOf(row.path) : null;
178
+ if (key === null) {
179
+ continue;
174
180
  }
175
- return changes;
176
- }
181
+ const folded = collapsed.has(key);
182
+ if (folded && row.isExpanded) {
183
+ changes.collapse.push(row.path);
184
+ }
185
+ if (!folded && !row.isExpanded) {
186
+ changes.expand.push(row.path);
187
+ }
188
+ }
189
+ return changes;
190
+ }
@@ -1,3 +1,3 @@
1
- export { FileTreeRoot as Root } from './parts.js';
2
- export { TreeCheckbox as Checkbox, TreeControl as Control, TreeDecoration as Decoration } from '../tree/parts.js';
3
- export { ancestorDirsOf, applyExpansion, collapsedPathsOf, compareRows, directoryHandle, dirPathOf, expansionChanges, extendsSelection, focusRow, followFocus, menuTargetsOf, mergeCollapsedPaths, mergeExpanded, movesFocus, newlyExpanded, pathOfRow, resetExpandedPaths, rowPathOf, selectOnly, visibleRows, withoutClosedBranches } from './helpers.js';
1
+ export { FileTreeRoot as Root } from "./parts.js";
2
+ export { TreeCheckbox as Checkbox, TreeControl as Control, TreeDecoration as Decoration } from "../tree/parts.js";
3
+ export { ancestorDirsOf, applyExpansion, collapsedPathsOf, compareRows, directoryHandle, dirPathOf, expansionChanges, extendsSelection, focusRow, followFocus, menuTargetsOf, mergeCollapsedPaths, mergeExpanded, movesFocus, newlyExpanded, pathOfRow, resetExpandedPaths, rowPathOf, selectOnly, visibleRows, withoutClosedBranches } from './helpers.js';