tera-system-ui 0.1.35 → 0.1.41
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.
- package/dist/components/command/command.scss +2 -2
- package/dist/components/command/components/command-empty.svelte +16 -0
- package/dist/components/command/components/command-empty.svelte.d.ts +4 -0
- package/dist/components/command/components/command-group.svelte +31 -0
- package/dist/components/command/components/command-group.svelte.d.ts +7 -0
- package/dist/components/command/components/command-input.svelte +30 -0
- package/dist/components/command/components/command-input.svelte.d.ts +4 -0
- package/dist/components/command/components/command-item.svelte +20 -0
- package/dist/components/command/components/command-item.svelte.d.ts +4 -0
- package/dist/components/command/components/command-link-item.svelte +18 -0
- package/dist/components/command/components/command-link-item.svelte.d.ts +4 -0
- package/dist/components/command/components/command-list.svelte +16 -0
- package/dist/components/command/components/command-list.svelte.d.ts +4 -0
- package/dist/components/command/components/command-separator.svelte +15 -0
- package/dist/components/command/components/command-separator.svelte.d.ts +4 -0
- package/dist/components/command/components/command-shortcut.svelte +19 -0
- package/dist/components/command/components/command-shortcut.svelte.d.ts +5 -0
- package/dist/components/command/components/command.svelte +54 -0
- package/dist/components/command/components/command.svelte.d.ts +5 -0
- package/dist/components/command/index.d.ts +12 -12
- package/dist/components/command/index.js +13 -18
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/tera-i18n/dev-tools/translator/gpt-translator-i18n-message.js +1 -3
- package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-cv-maker.txt +17 -14
- package/dist/tera-i18n/projects/common/all-language-data.js +10 -1
- package/dist/tera-i18n/projects/cv-maker/messages/ar.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/bg.json +18 -18
- package/dist/tera-i18n/projects/cv-maker/messages/bn.json +21 -21
- package/dist/tera-i18n/projects/cv-maker/messages/ca.json +12 -12
- package/dist/tera-i18n/projects/cv-maker/messages/cs.json +11 -11
- package/dist/tera-i18n/projects/cv-maker/messages/da.json +10 -10
- package/dist/tera-i18n/projects/cv-maker/messages/de.json +11 -11
- package/dist/tera-i18n/projects/cv-maker/messages/el.json +14 -14
- package/dist/tera-i18n/projects/cv-maker/messages/en-CA.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/en-GB.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/en-IN.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/en-PK.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/en-US.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/en-ZA.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/es.json +8 -8
- package/dist/tera-i18n/projects/cv-maker/messages/fi.json +5 -5
- package/dist/tera-i18n/projects/cv-maker/messages/fr.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/he.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/hi.json +12 -12
- package/dist/tera-i18n/projects/cv-maker/messages/hu.json +16 -16
- package/dist/tera-i18n/projects/cv-maker/messages/id.json +9 -9
- package/dist/tera-i18n/projects/cv-maker/messages/it.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/ja.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/ko.json +15 -15
- package/dist/tera-i18n/projects/cv-maker/messages/lt.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/lv.json +12 -12
- package/dist/tera-i18n/projects/cv-maker/messages/ms-MY.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/ms.json +10 -10
- package/dist/tera-i18n/projects/cv-maker/messages/nl.json +5 -5
- package/dist/tera-i18n/projects/cv-maker/messages/no.json +8 -8
- package/dist/tera-i18n/projects/cv-maker/messages/pl.json +12 -12
- package/dist/tera-i18n/projects/cv-maker/messages/pt-BR.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/pt-PT.json +51 -0
- package/dist/tera-i18n/projects/cv-maker/messages/pt.json +7 -7
- package/dist/tera-i18n/projects/cv-maker/messages/ro.json +9 -9
- package/dist/tera-i18n/projects/cv-maker/messages/ru.json +13 -13
- package/dist/tera-i18n/projects/cv-maker/messages/sk.json +15 -15
- package/dist/tera-i18n/projects/cv-maker/messages/sl.json +15 -15
- package/dist/tera-i18n/projects/cv-maker/messages/sq.json +34 -34
- package/dist/tera-i18n/projects/cv-maker/messages/sr.json +16 -16
- package/dist/tera-i18n/projects/cv-maker/messages/sv.json +9 -9
- package/dist/tera-i18n/projects/cv-maker/messages/sw.json +15 -15
- package/dist/tera-i18n/projects/cv-maker/messages/ta.json +25 -25
- package/dist/tera-i18n/projects/cv-maker/messages/te.json +25 -25
- package/dist/tera-i18n/projects/cv-maker/messages/th.json +17 -17
- package/dist/tera-i18n/projects/cv-maker/messages/tl.json +16 -16
- package/dist/tera-i18n/projects/cv-maker/messages/tr.json +6 -6
- package/dist/tera-i18n/projects/cv-maker/messages/uk.json +15 -15
- package/dist/tera-i18n/projects/cv-maker/messages/vi.json +18 -18
- package/dist/tera-i18n/projects/cv-maker/messages/zh-CN.json +29 -29
- package/dist/tera-i18n/projects/cv-maker/messages/zh-TW.json +26 -26
- package/dist/tera-i18n/projects/cv-maker/project.inlang/settings.json +68 -59
- package/dist/tera-i18n/projects/cv-maker/supported-language.js +10 -1
- package/dist/utils/index.d.ts +10 -0
- package/package.json +1 -1
- package/dist/components/command/command.d.ts +0 -33
- package/dist/components/command/command.js +0 -512
- package/dist/components/command/components/Command.svelte +0 -120
- package/dist/components/command/components/Command.svelte.d.ts +0 -4
- package/dist/components/command/components/CommandEmpty.svelte +0 -30
- package/dist/components/command/components/CommandEmpty.svelte.d.ts +0 -4
- package/dist/components/command/components/CommandGroup.svelte +0 -110
- package/dist/components/command/components/CommandGroup.svelte.d.ts +0 -4
- package/dist/components/command/components/CommandInput.svelte +0 -92
- package/dist/components/command/components/CommandInput.svelte.d.ts +0 -8
- package/dist/components/command/components/CommandItem.svelte +0 -110
- package/dist/components/command/components/CommandItem.svelte.d.ts +0 -4
- package/dist/components/command/components/CommandList.svelte +0 -56
- package/dist/components/command/components/CommandList.svelte.d.ts +0 -6
- package/dist/components/command/components/CommandLoading.svelte +0 -29
- package/dist/components/command/components/CommandLoading.svelte.d.ts +0 -9
- package/dist/components/command/components/CommandSeparator.svelte +0 -21
- package/dist/components/command/components/CommandSeparator.svelte.d.ts +0 -4
- package/dist/components/command/types.d.ts +0 -227
- package/dist/components/command/types.js +0 -1
|
@@ -1,512 +0,0 @@
|
|
|
1
|
-
import { getContext, setContext, tick } from 'svelte';
|
|
2
|
-
import { commandScore } from '../../internal/command-score';
|
|
3
|
-
import { get, writable } from 'svelte/store';
|
|
4
|
-
import { omit, generateId, toWritableStores, isUndefined, kbd, removeUndefined, effect } from '../../internal';
|
|
5
|
-
import './command.scss';
|
|
6
|
-
const NAME = 'Command';
|
|
7
|
-
const STATE_NAME = 'CommandState';
|
|
8
|
-
const GROUP_NAME = 'CommandGroup';
|
|
9
|
-
export const LIST_SELECTOR = `[data-cmdk-list-sizer]`;
|
|
10
|
-
export const GROUP_SELECTOR = `[data-cmdk-group]`;
|
|
11
|
-
export const GROUP_ITEMS_SELECTOR = `[data-cmdk-group-items]`;
|
|
12
|
-
export const GROUP_HEADING_SELECTOR = `[data-cmdk-group-heading]`;
|
|
13
|
-
export const ITEM_SELECTOR = `[data-cmdk-item]`;
|
|
14
|
-
export const VALID_ITEM_SELECTOR = `${ITEM_SELECTOR}:not([aria-disabled="true"])`;
|
|
15
|
-
export const VALUE_ATTR = `data-value`;
|
|
16
|
-
export const defaultFilter = (value, search) => commandScore(value, search);
|
|
17
|
-
export function getCtx() {
|
|
18
|
-
return getContext(NAME);
|
|
19
|
-
}
|
|
20
|
-
export function getState() {
|
|
21
|
-
return getContext(STATE_NAME);
|
|
22
|
-
}
|
|
23
|
-
export function createGroup(alwaysRender) {
|
|
24
|
-
const id = generateId();
|
|
25
|
-
setContext(GROUP_NAME, {
|
|
26
|
-
id,
|
|
27
|
-
alwaysRender: isUndefined(alwaysRender) ? false : alwaysRender
|
|
28
|
-
});
|
|
29
|
-
return { id };
|
|
30
|
-
}
|
|
31
|
-
export function getGroup() {
|
|
32
|
-
const context = getContext(GROUP_NAME);
|
|
33
|
-
if (!context)
|
|
34
|
-
return undefined;
|
|
35
|
-
return context;
|
|
36
|
-
}
|
|
37
|
-
export function createState(initialValues) {
|
|
38
|
-
const defaultState = {
|
|
39
|
-
search: '',
|
|
40
|
-
value: '',
|
|
41
|
-
filtered: {
|
|
42
|
-
count: 0,
|
|
43
|
-
items: new Map(),
|
|
44
|
-
groups: new Set()
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const state = writable(initialValues ? { ...defaultState, ...removeUndefined(initialValues) } : defaultState);
|
|
48
|
-
return state;
|
|
49
|
-
}
|
|
50
|
-
const defaults = {
|
|
51
|
-
label: 'Command menu',
|
|
52
|
-
shouldFilter: true,
|
|
53
|
-
loop: false,
|
|
54
|
-
onValueChange: undefined,
|
|
55
|
-
value: undefined,
|
|
56
|
-
filter: defaultFilter,
|
|
57
|
-
ids: {
|
|
58
|
-
root: generateId(),
|
|
59
|
-
list: generateId(),
|
|
60
|
-
label: generateId(),
|
|
61
|
-
input: generateId()
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
export function createCommand(props) {
|
|
65
|
-
const ids = {
|
|
66
|
-
root: generateId(),
|
|
67
|
-
list: generateId(),
|
|
68
|
-
label: generateId(),
|
|
69
|
-
input: generateId(),
|
|
70
|
-
...props.ids
|
|
71
|
-
};
|
|
72
|
-
const withDefaults = {
|
|
73
|
-
...defaults,
|
|
74
|
-
...removeUndefined(props)
|
|
75
|
-
};
|
|
76
|
-
const state = props.state ??
|
|
77
|
-
createState({
|
|
78
|
-
value: withDefaults.value
|
|
79
|
-
});
|
|
80
|
-
const allItems = writable(new Set()); // [...itemIds]
|
|
81
|
-
const allGroups = writable(new Map()); // groupId → [...itemIds]
|
|
82
|
-
const allIds = writable(new Map()); // id → value
|
|
83
|
-
const commandEl = writable(null);
|
|
84
|
-
const options = toWritableStores(omit(withDefaults, 'value', 'ids'));
|
|
85
|
-
let $allItems = get(allItems);
|
|
86
|
-
let $allGroups = get(allGroups);
|
|
87
|
-
let $allIds = get(allIds);
|
|
88
|
-
let shouldFilter = get(options.shouldFilter);
|
|
89
|
-
let loop = get(options.loop);
|
|
90
|
-
let label = get(options.label);
|
|
91
|
-
let filter = get(options.filter);
|
|
92
|
-
effect(options.shouldFilter, ($shouldFilter) => {
|
|
93
|
-
shouldFilter = $shouldFilter;
|
|
94
|
-
});
|
|
95
|
-
effect(options.loop, ($loop) => {
|
|
96
|
-
loop = $loop;
|
|
97
|
-
});
|
|
98
|
-
effect(options.filter, ($filter) => {
|
|
99
|
-
filter = $filter;
|
|
100
|
-
});
|
|
101
|
-
effect(options.label, ($label) => {
|
|
102
|
-
label = $label;
|
|
103
|
-
});
|
|
104
|
-
effect(allItems, (v) => {
|
|
105
|
-
$allItems = v;
|
|
106
|
-
});
|
|
107
|
-
effect(allGroups, (v) => {
|
|
108
|
-
$allGroups = v;
|
|
109
|
-
});
|
|
110
|
-
effect(allIds, (v) => {
|
|
111
|
-
$allIds = v;
|
|
112
|
-
});
|
|
113
|
-
const context = {
|
|
114
|
-
value: (id, value) => {
|
|
115
|
-
if (value !== $allIds.get(id)) {
|
|
116
|
-
allIds.update(($allIds) => {
|
|
117
|
-
$allIds.set(id, value);
|
|
118
|
-
return $allIds;
|
|
119
|
-
});
|
|
120
|
-
state.update(($state) => {
|
|
121
|
-
$state.filtered.items.set(id, score(value, $state.search));
|
|
122
|
-
return $state;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
// Track item lifecycle (add/remove)
|
|
127
|
-
item: (id, groupId) => {
|
|
128
|
-
allItems.update(($allItems) => $allItems.add(id));
|
|
129
|
-
// Track this item within the group
|
|
130
|
-
if (groupId) {
|
|
131
|
-
allGroups.update(($allGroups) => {
|
|
132
|
-
if (!$allGroups.has(groupId)) {
|
|
133
|
-
$allGroups.set(groupId, new Set([id]));
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
$allGroups.get(groupId)?.add(id);
|
|
137
|
-
}
|
|
138
|
-
return $allGroups;
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
state.update(($state) => {
|
|
142
|
-
const filteredState = filterItems($state, shouldFilter);
|
|
143
|
-
if (!filteredState.value) {
|
|
144
|
-
const value = selectFirstItem();
|
|
145
|
-
filteredState.value = value ?? '';
|
|
146
|
-
}
|
|
147
|
-
return filteredState;
|
|
148
|
-
});
|
|
149
|
-
return () => {
|
|
150
|
-
allIds.update(($allIds) => {
|
|
151
|
-
$allIds.delete(id);
|
|
152
|
-
return $allIds;
|
|
153
|
-
});
|
|
154
|
-
allItems.update(($allItems) => {
|
|
155
|
-
$allItems.delete(id);
|
|
156
|
-
return $allItems;
|
|
157
|
-
});
|
|
158
|
-
state.update(($state) => {
|
|
159
|
-
$state.filtered.items.delete(id);
|
|
160
|
-
const selectedItem = getSelectedItem();
|
|
161
|
-
const filteredState = filterItems($state);
|
|
162
|
-
if (selectedItem?.getAttribute('id') === id) {
|
|
163
|
-
filteredState.value = selectFirstItem() ?? '';
|
|
164
|
-
}
|
|
165
|
-
return $state;
|
|
166
|
-
});
|
|
167
|
-
};
|
|
168
|
-
},
|
|
169
|
-
group: (id) => {
|
|
170
|
-
allGroups.update(($allGroups) => {
|
|
171
|
-
if (!$allGroups.has(id)) {
|
|
172
|
-
$allGroups.set(id, new Set());
|
|
173
|
-
}
|
|
174
|
-
return $allGroups;
|
|
175
|
-
});
|
|
176
|
-
return () => {
|
|
177
|
-
allIds.update(($allIds) => {
|
|
178
|
-
$allIds.delete(id);
|
|
179
|
-
return $allIds;
|
|
180
|
-
});
|
|
181
|
-
allGroups.update(($allGroups) => {
|
|
182
|
-
$allGroups.delete(id);
|
|
183
|
-
return $allGroups;
|
|
184
|
-
});
|
|
185
|
-
};
|
|
186
|
-
},
|
|
187
|
-
filter: () => {
|
|
188
|
-
return shouldFilter;
|
|
189
|
-
},
|
|
190
|
-
label: label || props['aria-label'] || '',
|
|
191
|
-
commandEl,
|
|
192
|
-
ids,
|
|
193
|
-
updateState
|
|
194
|
-
};
|
|
195
|
-
function updateState(key, value, preventScroll) {
|
|
196
|
-
state.update((curr) => {
|
|
197
|
-
if (Object.is(curr[key], value))
|
|
198
|
-
return curr;
|
|
199
|
-
curr[key] = value;
|
|
200
|
-
if (key === 'search') {
|
|
201
|
-
const filteredState = filterItems(curr, shouldFilter);
|
|
202
|
-
curr = filteredState;
|
|
203
|
-
const sortedState = sort(curr, shouldFilter);
|
|
204
|
-
curr = sortedState;
|
|
205
|
-
tick().then(() => state.update((curr) => {
|
|
206
|
-
curr.value = selectFirstItem() ?? '';
|
|
207
|
-
props.onValueChange?.(curr.value);
|
|
208
|
-
return curr;
|
|
209
|
-
}));
|
|
210
|
-
}
|
|
211
|
-
else if (key === 'value') {
|
|
212
|
-
props.onValueChange?.(curr.value);
|
|
213
|
-
if (!preventScroll) {
|
|
214
|
-
tick().then(() => scrollSelectedIntoView());
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return curr;
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
function filterItems(state, shouldFilterVal) {
|
|
221
|
-
const $shouldFilter = shouldFilterVal ?? shouldFilter;
|
|
222
|
-
if (!state.search || !$shouldFilter) {
|
|
223
|
-
state.filtered.count = $allItems.size;
|
|
224
|
-
return state;
|
|
225
|
-
}
|
|
226
|
-
state.filtered.groups = new Set();
|
|
227
|
-
let itemCount = 0;
|
|
228
|
-
// check which items should be included
|
|
229
|
-
for (const id of $allItems) {
|
|
230
|
-
const value = $allIds.get(id);
|
|
231
|
-
const rank = score(value, state.search);
|
|
232
|
-
state.filtered.items.set(id, rank);
|
|
233
|
-
if (rank > 0) {
|
|
234
|
-
itemCount++;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
// Check which groups have at least 1 item shown
|
|
238
|
-
for (const [groupId, group] of $allGroups) {
|
|
239
|
-
for (const itemId of group) {
|
|
240
|
-
const rank = state.filtered.items.get(itemId);
|
|
241
|
-
if (rank && rank > 0) {
|
|
242
|
-
state.filtered.groups.add(groupId);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
state.filtered.count = itemCount;
|
|
247
|
-
return state;
|
|
248
|
-
}
|
|
249
|
-
function sort(state, shouldFilterVal) {
|
|
250
|
-
const $shouldFilter = shouldFilterVal ?? shouldFilter;
|
|
251
|
-
if (!state.search || !$shouldFilter) {
|
|
252
|
-
return state;
|
|
253
|
-
}
|
|
254
|
-
console.log(state);
|
|
255
|
-
const scores = state.filtered.items;
|
|
256
|
-
// sort groups
|
|
257
|
-
const groups = [];
|
|
258
|
-
for (const value of state.filtered.groups) {
|
|
259
|
-
const items = $allGroups.get(value);
|
|
260
|
-
if (!items)
|
|
261
|
-
continue;
|
|
262
|
-
// get max score of the group's items
|
|
263
|
-
let max = 0;
|
|
264
|
-
for (const item of items) {
|
|
265
|
-
const score = scores.get(item);
|
|
266
|
-
if (isUndefined(score))
|
|
267
|
-
continue;
|
|
268
|
-
max = Math.max(score, max);
|
|
269
|
-
}
|
|
270
|
-
groups.push([value, max]);
|
|
271
|
-
}
|
|
272
|
-
// Sort items within groups to bottom
|
|
273
|
-
// sort items outside of groups
|
|
274
|
-
// sort groups to bottom (pushed all non-grouped items to the top)
|
|
275
|
-
const rootEl = document.getElementById(ids.root);
|
|
276
|
-
if (!rootEl)
|
|
277
|
-
return state;
|
|
278
|
-
const list = rootEl.querySelector(LIST_SELECTOR);
|
|
279
|
-
const validItems = getValidItems(rootEl).sort((a, b) => {
|
|
280
|
-
const valueA = a.getAttribute('id') ?? '';
|
|
281
|
-
const valueB = b.getAttribute('id') ?? '';
|
|
282
|
-
return -(scores.get(valueA) ?? 0) + (scores.get(valueB) ?? 0);
|
|
283
|
-
});
|
|
284
|
-
// console.log('validItems', validItems)
|
|
285
|
-
// console.log(validItems)
|
|
286
|
-
// console.log(scores)
|
|
287
|
-
// console.log(validItems.map(i => {
|
|
288
|
-
// return scores.get(i.getAttribute('id') ?? '');
|
|
289
|
-
// }))
|
|
290
|
-
for (const item of validItems) {
|
|
291
|
-
const group = item.closest(GROUP_ITEMS_SELECTOR);
|
|
292
|
-
const closest = item.closest(`${GROUP_ITEMS_SELECTOR} > *`);
|
|
293
|
-
// console.log(group)
|
|
294
|
-
// console.log(item.textContent)
|
|
295
|
-
if (group) {
|
|
296
|
-
if (item.parentElement === group) {
|
|
297
|
-
group.appendChild(item);
|
|
298
|
-
// console.log('group.appendChild(item)')
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
if (!closest)
|
|
302
|
-
continue;
|
|
303
|
-
group.appendChild(closest);
|
|
304
|
-
// console.log('group.appendChild(closest)')
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
if (item.parentElement === list) {
|
|
309
|
-
list?.appendChild(item);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
if (!closest)
|
|
313
|
-
continue;
|
|
314
|
-
list?.appendChild(closest);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
groups.sort((a, b) => b[1] - a[1]);
|
|
319
|
-
for (const group of groups) {
|
|
320
|
-
let selector = `${GROUP_SELECTOR}[${VALUE_ATTR}="${group[0]}"]`;
|
|
321
|
-
const el = rootEl.querySelector(selector);
|
|
322
|
-
el?.parentElement?.appendChild(el);
|
|
323
|
-
// console.log('el', el, selector, group);
|
|
324
|
-
}
|
|
325
|
-
return state;
|
|
326
|
-
}
|
|
327
|
-
function selectFirstItem() {
|
|
328
|
-
const item = getValidItems().find((item) => !item.ariaDisabled);
|
|
329
|
-
if (!item)
|
|
330
|
-
return;
|
|
331
|
-
const value = item.getAttribute(VALUE_ATTR);
|
|
332
|
-
if (!value)
|
|
333
|
-
return;
|
|
334
|
-
return value;
|
|
335
|
-
}
|
|
336
|
-
function score(value, search) {
|
|
337
|
-
const lowerCaseAndTrimmedValue = value?.toLowerCase().trim();
|
|
338
|
-
const filterFn = filter;
|
|
339
|
-
if (!filterFn) {
|
|
340
|
-
return lowerCaseAndTrimmedValue ? defaultFilter(lowerCaseAndTrimmedValue, search) : 0;
|
|
341
|
-
}
|
|
342
|
-
return lowerCaseAndTrimmedValue ? filterFn(lowerCaseAndTrimmedValue, search) : 0;
|
|
343
|
-
}
|
|
344
|
-
function scrollSelectedIntoView() {
|
|
345
|
-
const item = getSelectedItem();
|
|
346
|
-
if (!item) {
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
if (item.parentElement?.firstChild === item) {
|
|
350
|
-
tick().then(() => item.closest(GROUP_SELECTOR)?.querySelector(GROUP_HEADING_SELECTOR)?.scrollIntoView({
|
|
351
|
-
block: 'nearest'
|
|
352
|
-
}));
|
|
353
|
-
}
|
|
354
|
-
tick().then(() => item.scrollIntoView({ block: 'nearest' }));
|
|
355
|
-
}
|
|
356
|
-
function getValidItems(rootElement) {
|
|
357
|
-
const rootEl = rootElement ?? document.getElementById(ids.root);
|
|
358
|
-
if (!rootEl)
|
|
359
|
-
return [];
|
|
360
|
-
return Array.from(rootEl.querySelectorAll(VALID_ITEM_SELECTOR)).filter((el) => (el ? true : false));
|
|
361
|
-
}
|
|
362
|
-
function getSelectedItem(rootElement) {
|
|
363
|
-
const rootEl = rootElement ?? document.getElementById(ids.root);
|
|
364
|
-
if (!rootEl)
|
|
365
|
-
return;
|
|
366
|
-
const selectedEl = rootEl.querySelector(`${VALID_ITEM_SELECTOR}[aria-selected="true"]`);
|
|
367
|
-
if (!selectedEl)
|
|
368
|
-
return;
|
|
369
|
-
return selectedEl;
|
|
370
|
-
}
|
|
371
|
-
function updateSelectedToIndex(index) {
|
|
372
|
-
const rootEl = document.getElementById(ids.root);
|
|
373
|
-
if (!rootEl)
|
|
374
|
-
return;
|
|
375
|
-
const items = getValidItems(rootEl);
|
|
376
|
-
const item = items[index];
|
|
377
|
-
if (!item)
|
|
378
|
-
return;
|
|
379
|
-
updateState('value', item.getAttribute(VALUE_ATTR) ?? '');
|
|
380
|
-
}
|
|
381
|
-
function updateSelectedByChange(change) {
|
|
382
|
-
const selected = getSelectedItem();
|
|
383
|
-
const items = getValidItems();
|
|
384
|
-
const index = items.findIndex((item) => item === selected);
|
|
385
|
-
// get item at this index
|
|
386
|
-
let newSelected = items[index + change];
|
|
387
|
-
if (loop) {
|
|
388
|
-
if (index + change < 0) {
|
|
389
|
-
newSelected = items[items.length - 1];
|
|
390
|
-
}
|
|
391
|
-
else if (index + change === items.length) {
|
|
392
|
-
newSelected = items[0];
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
newSelected = items[index + change];
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
if (newSelected) {
|
|
399
|
-
updateState('value', newSelected.getAttribute(VALUE_ATTR) ?? '');
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
function updateSelectedToGroup(change) {
|
|
403
|
-
const selected = getSelectedItem();
|
|
404
|
-
let group = selected?.closest(GROUP_SELECTOR);
|
|
405
|
-
let item = undefined;
|
|
406
|
-
while (group && !item) {
|
|
407
|
-
group =
|
|
408
|
-
change > 0
|
|
409
|
-
? findNextSibling(group, GROUP_SELECTOR)
|
|
410
|
-
: findPreviousSibling(group, GROUP_SELECTOR);
|
|
411
|
-
item = group?.querySelector(VALID_ITEM_SELECTOR);
|
|
412
|
-
}
|
|
413
|
-
if (item) {
|
|
414
|
-
updateState('value', item.getAttribute(VALUE_ATTR) ?? '');
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
updateSelectedByChange(change);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
function last() {
|
|
421
|
-
return updateSelectedToIndex(getValidItems().length - 1);
|
|
422
|
-
}
|
|
423
|
-
function next(e) {
|
|
424
|
-
e.preventDefault();
|
|
425
|
-
if (e.metaKey) {
|
|
426
|
-
last();
|
|
427
|
-
}
|
|
428
|
-
else if (e.altKey) {
|
|
429
|
-
updateSelectedToGroup(1);
|
|
430
|
-
}
|
|
431
|
-
else {
|
|
432
|
-
updateSelectedByChange(1);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
function prev(e) {
|
|
436
|
-
e.preventDefault();
|
|
437
|
-
if (e.metaKey) {
|
|
438
|
-
updateSelectedToIndex(0);
|
|
439
|
-
}
|
|
440
|
-
else if (e.altKey) {
|
|
441
|
-
updateSelectedToGroup(-1);
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
updateSelectedByChange(-1);
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
function requestCloseCommand(e) {
|
|
448
|
-
e.preventDefault();
|
|
449
|
-
props.onRequestCloseCommand?.();
|
|
450
|
-
}
|
|
451
|
-
function handleRootKeydown(e) {
|
|
452
|
-
switch (e.key) {
|
|
453
|
-
case kbd.ARROW_DOWN:
|
|
454
|
-
next(e);
|
|
455
|
-
break;
|
|
456
|
-
case kbd.ARROW_UP:
|
|
457
|
-
prev(e);
|
|
458
|
-
break;
|
|
459
|
-
case kbd.HOME:
|
|
460
|
-
// first item
|
|
461
|
-
e.preventDefault();
|
|
462
|
-
updateSelectedToIndex(0);
|
|
463
|
-
break;
|
|
464
|
-
case kbd.END:
|
|
465
|
-
// last item
|
|
466
|
-
e.preventDefault();
|
|
467
|
-
last();
|
|
468
|
-
break;
|
|
469
|
-
case kbd.ESCAPE:
|
|
470
|
-
// last item
|
|
471
|
-
requestCloseCommand(e);
|
|
472
|
-
break;
|
|
473
|
-
case kbd.ENTER: {
|
|
474
|
-
e.preventDefault();
|
|
475
|
-
const item = getSelectedItem();
|
|
476
|
-
if (item) {
|
|
477
|
-
item?.click();
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
setContext(NAME, context);
|
|
483
|
-
const stateStore = {
|
|
484
|
-
subscribe: state.subscribe,
|
|
485
|
-
update: state.update,
|
|
486
|
-
set: state.set,
|
|
487
|
-
updateState
|
|
488
|
-
};
|
|
489
|
-
setContext(STATE_NAME, stateStore);
|
|
490
|
-
return {
|
|
491
|
-
state: stateStore,
|
|
492
|
-
handleRootKeydown,
|
|
493
|
-
commandEl,
|
|
494
|
-
ids
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
function findNextSibling(el, selector) {
|
|
498
|
-
let sibling = el.nextElementSibling;
|
|
499
|
-
while (sibling) {
|
|
500
|
-
if (sibling.matches(selector))
|
|
501
|
-
return sibling;
|
|
502
|
-
sibling = sibling.nextElementSibling;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
function findPreviousSibling(el, selector) {
|
|
506
|
-
let sibling = el.previousElementSibling;
|
|
507
|
-
while (sibling) {
|
|
508
|
-
if (sibling.matches(selector))
|
|
509
|
-
return sibling;
|
|
510
|
-
sibling = sibling.previousElementSibling;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {addEventListener, executeCallbacks, srOnlyStyles, styleToString} from '../../../internal';
|
|
3
|
-
|
|
4
|
-
import {createCommand} from '../command.js';
|
|
5
|
-
import type {CommandProps} from '../types.js';
|
|
6
|
-
|
|
7
|
-
let {
|
|
8
|
-
children,
|
|
9
|
-
childrenWithProps,
|
|
10
|
-
label = undefined,
|
|
11
|
-
shouldFilter = true,
|
|
12
|
-
filter = undefined,
|
|
13
|
-
value = undefined,
|
|
14
|
-
onValueChange = undefined,
|
|
15
|
-
loop = undefined,
|
|
16
|
-
onKeydown = undefined,
|
|
17
|
-
state: commandState = undefined,
|
|
18
|
-
ids = undefined,
|
|
19
|
-
asChild = false,
|
|
20
|
-
onRequestCloseCommand,
|
|
21
|
-
...restProps
|
|
22
|
-
}: CommandProps = $props();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const {
|
|
26
|
-
commandEl,
|
|
27
|
-
handleRootKeydown,
|
|
28
|
-
ids: commandIds,
|
|
29
|
-
state: stateStore
|
|
30
|
-
} = createCommand({
|
|
31
|
-
label,
|
|
32
|
-
shouldFilter,
|
|
33
|
-
filter,
|
|
34
|
-
value,
|
|
35
|
-
onValueChange: (next) => {
|
|
36
|
-
if (next !== value) {
|
|
37
|
-
value = next;
|
|
38
|
-
onValueChange?.(next);
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
loop,
|
|
42
|
-
state: commandState,
|
|
43
|
-
ids,
|
|
44
|
-
onRequestCloseCommand
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
let slotProps = $state()
|
|
48
|
-
|
|
49
|
-
function syncValueAndState(value: string | undefined) {
|
|
50
|
-
if (value && value !== $stateStore.value) {
|
|
51
|
-
$stateStore.value = value;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
function rootAction(node: HTMLDivElement) {
|
|
59
|
-
commandEl.set(node);
|
|
60
|
-
|
|
61
|
-
const unsubEvents = executeCallbacks(addEventListener(node, 'keydown', handleKeydown));
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
destroy: unsubEvents
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const rootAttrs = {
|
|
69
|
-
role: 'application',
|
|
70
|
-
id: commandIds.root,
|
|
71
|
-
'data-cmdk-root': ''
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const labelAttrs = {
|
|
75
|
-
'data-cmdk-label': '',
|
|
76
|
-
for: commandIds.input,
|
|
77
|
-
id: commandIds.label,
|
|
78
|
-
style: styleToString(srOnlyStyles)
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
function handleKeydown(e: KeyboardEvent) {
|
|
82
|
-
onKeydown?.(e);
|
|
83
|
-
if (e.defaultPrevented) return;
|
|
84
|
-
handleRootKeydown(e);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const root = {
|
|
88
|
-
action: rootAction,
|
|
89
|
-
attrs: rootAttrs
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
$effect(() => {
|
|
96
|
-
syncValueAndState(value);
|
|
97
|
-
|
|
98
|
-
slotProps = {
|
|
99
|
-
root,
|
|
100
|
-
label: {attrs: labelAttrs},
|
|
101
|
-
stateStore,
|
|
102
|
-
state: $stateStore
|
|
103
|
-
};
|
|
104
|
-
})
|
|
105
|
-
</script>
|
|
106
|
-
|
|
107
|
-
{#if asChild}
|
|
108
|
-
{@render childrenWithProps?.(slotProps)}
|
|
109
|
-
{:else}
|
|
110
|
-
<div use:rootAction {...rootAttrs} {...restProps}>
|
|
111
|
-
<!-- svelte-ignore a11y_label_has_associated_control applied in attrs -->
|
|
112
|
-
<label {...labelAttrs}>
|
|
113
|
-
{label ?? ''}
|
|
114
|
-
</label>
|
|
115
|
-
<!--{@render childrenWithProps?.(slotProps)}-->
|
|
116
|
-
{@render children?.()}
|
|
117
|
-
<!-- <slot {...slotProps}/>-->
|
|
118
|
-
</div>
|
|
119
|
-
{/if}
|
|
120
|
-
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import {getState} from '../command.js';
|
|
3
|
-
import type {EmptyProps} from '../types.js';
|
|
4
|
-
import {derived} from "svelte/store";
|
|
5
|
-
import {onMount} from "svelte";
|
|
6
|
-
|
|
7
|
-
type $$Props = EmptyProps;
|
|
8
|
-
|
|
9
|
-
let {children, ...restProps}: $$Props = $props()
|
|
10
|
-
|
|
11
|
-
let isFirstRender = $state(true);
|
|
12
|
-
const commandState = getState();
|
|
13
|
-
|
|
14
|
-
let render = derived(commandState, ($commandState) => ($commandState.filtered.count === 0))
|
|
15
|
-
|
|
16
|
-
onMount(() => {
|
|
17
|
-
isFirstRender = false;
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
const attrs = {
|
|
21
|
-
'data-cmdk-empty': '',
|
|
22
|
-
role: 'presentation'
|
|
23
|
-
};
|
|
24
|
-
</script>
|
|
25
|
-
|
|
26
|
-
{#if !isFirstRender && $render}
|
|
27
|
-
<div {...attrs} {...restProps}>
|
|
28
|
-
{@render children?.()}
|
|
29
|
-
</div>
|
|
30
|
-
{/if}
|