@streamscloud/kit 0.2.1 → 0.2.2

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 (104) hide show
  1. package/dist/styles/_input.scss +98 -0
  2. package/dist/styles/_mixins.scss +2 -2
  3. package/dist/styles/reset.css +1 -1
  4. package/dist/ui/color-picker/cmp.color-picker.svelte +3 -12
  5. package/dist/ui/color-picker/cmp.color-picker.svelte.d.ts +3 -9
  6. package/dist/ui/dialog/cmp.dialog.svelte +1 -1
  7. package/dist/ui/dropdown/cmp.dropdown-item.svelte +93 -0
  8. package/dist/ui/dropdown/cmp.dropdown-item.svelte.d.ts +32 -0
  9. package/dist/ui/dropdown/cmp.dropdown-panel.svelte +29 -0
  10. package/dist/ui/dropdown/cmp.dropdown-panel.svelte.d.ts +18 -0
  11. package/dist/ui/dropdown/cmp.dropdown.svelte +72 -7
  12. package/dist/ui/dropdown/cmp.dropdown.svelte.d.ts +3 -1
  13. package/dist/ui/dropdown/index.d.ts +2 -0
  14. package/dist/ui/dropdown/index.js +2 -0
  15. package/dist/ui/dynamic-component/cmp.dynamic-component.svelte +0 -5
  16. package/dist/ui/dynamic-component/cmp.dynamic-component.svelte.d.ts +2 -8
  17. package/dist/ui/emoji-picker/cmp.emoji-panel.svelte +186 -0
  18. package/dist/ui/emoji-picker/cmp.emoji-panel.svelte.d.ts +21 -0
  19. package/dist/ui/emoji-picker/cmp.emoji-picker.svelte +35 -0
  20. package/dist/ui/emoji-picker/cmp.emoji-picker.svelte.d.ts +15 -0
  21. package/dist/ui/emoji-picker/emoji-list.d.ts +2 -0
  22. package/dist/ui/emoji-picker/emoji-list.js +1754 -0
  23. package/dist/ui/emoji-picker/emoji-picker-localization.d.ts +5 -0
  24. package/dist/ui/emoji-picker/emoji-picker-localization.js +40 -0
  25. package/dist/ui/emoji-picker/index.d.ts +2 -0
  26. package/dist/ui/emoji-picker/index.js +2 -0
  27. package/dist/ui/emoji-picker/types.d.ts +8 -0
  28. package/dist/ui/emoji-picker/types.js +1 -0
  29. package/dist/ui/form-group/cmp.form-group-label.svelte.d.ts +1 -0
  30. package/dist/ui/form-group/cmp.form-group.svelte.d.ts +1 -0
  31. package/dist/ui/icon-text/cmp.icon-text.svelte +0 -9
  32. package/dist/ui/icon-text/cmp.icon-text.svelte.d.ts +4 -9
  33. package/dist/ui/inputs/index.d.ts +6 -0
  34. package/dist/ui/inputs/index.js +5 -0
  35. package/dist/ui/inputs/input/cmp.input-validatable.svelte +57 -0
  36. package/dist/ui/inputs/input/cmp.input-validatable.svelte.d.ts +56 -0
  37. package/dist/ui/inputs/input/cmp.input.svelte +235 -0
  38. package/dist/ui/inputs/input/cmp.input.svelte.d.ts +60 -0
  39. package/dist/ui/inputs/input/index.d.ts +2 -0
  40. package/dist/ui/inputs/input/index.js +2 -0
  41. package/dist/ui/inputs/input-emoji-picker/cmp.input-emoji-picker.svelte +44 -0
  42. package/dist/ui/inputs/input-emoji-picker/cmp.input-emoji-picker.svelte.d.ts +9 -0
  43. package/dist/ui/inputs/input-emoji-picker/index.d.ts +2 -0
  44. package/dist/ui/inputs/input-emoji-picker/index.js +2 -0
  45. package/dist/ui/inputs/input-emoji-picker/input-emoji-picker-container.d.ts +2 -0
  46. package/dist/ui/inputs/input-emoji-picker/input-emoji-picker-container.js +16 -0
  47. package/dist/ui/inputs/numeral-input/cmp.numeral-input-validatable.svelte +55 -0
  48. package/dist/ui/inputs/numeral-input/cmp.numeral-input-validatable.svelte.d.ts +62 -0
  49. package/dist/ui/inputs/numeral-input/cmp.numeral-input.svelte +248 -0
  50. package/dist/ui/inputs/numeral-input/cmp.numeral-input.svelte.d.ts +66 -0
  51. package/dist/ui/inputs/numeral-input/index.d.ts +2 -0
  52. package/dist/ui/inputs/numeral-input/index.js +2 -0
  53. package/dist/ui/inputs/pin-input/cmp.pin-input.svelte +58 -0
  54. package/dist/ui/inputs/pin-input/cmp.pin-input.svelte.d.ts +23 -0
  55. package/dist/ui/inputs/pin-input/index.d.ts +1 -0
  56. package/dist/ui/inputs/pin-input/index.js +1 -0
  57. package/dist/ui/inputs/pin-input/pin-input-generator.d.ts +27 -0
  58. package/dist/ui/inputs/pin-input/pin-input-generator.js +114 -0
  59. package/dist/ui/inputs/rich-text-input/cmp.rich-text-input.svelte +55 -0
  60. package/dist/ui/inputs/rich-text-input/cmp.rich-text-input.svelte.d.ts +43 -0
  61. package/dist/ui/inputs/rich-text-input/index.d.ts +2 -0
  62. package/dist/ui/inputs/rich-text-input/index.js +1 -0
  63. package/dist/ui/inputs/rich-text-input/rich-text-input-localization.d.ts +12 -0
  64. package/dist/ui/inputs/rich-text-input/rich-text-input-localization.js +48 -0
  65. package/dist/ui/inputs/rich-text-input/tinymce-input.svelte +250 -0
  66. package/dist/ui/inputs/rich-text-input/tinymce-input.svelte.d.ts +25 -0
  67. package/dist/ui/inputs/rich-text-input/tinymce.declarations.d.ts +7 -0
  68. package/dist/ui/inputs/rich-text-input/types.d.ts +4 -0
  69. package/dist/ui/inputs/rich-text-input/types.js +1 -0
  70. package/dist/ui/inputs/rich-text-input/validated-link-button.d.ts +3 -0
  71. package/dist/ui/inputs/rich-text-input/validated-link-button.js +78 -0
  72. package/dist/ui/inputs/textarea/cmp.textarea-validatable.svelte +35 -0
  73. package/dist/ui/inputs/textarea/cmp.textarea-validatable.svelte.d.ts +53 -0
  74. package/dist/ui/inputs/textarea/cmp.textarea.svelte +247 -0
  75. package/dist/ui/inputs/textarea/cmp.textarea.svelte.d.ts +57 -0
  76. package/dist/ui/inputs/textarea/index.d.ts +2 -0
  77. package/dist/ui/inputs/textarea/index.js +2 -0
  78. package/dist/ui/media-viewer-dialog/cmp.media-viewer-dialog.svelte.d.ts +2 -0
  79. package/dist/ui/selects/_multiselect.scss +282 -0
  80. package/dist/ui/selects/_singleselect.scss +175 -0
  81. package/dist/ui/selects/cmp.multiselect.svelte +530 -0
  82. package/dist/ui/selects/cmp.multiselect.svelte.d.ts +85 -0
  83. package/dist/ui/selects/cmp.search-multiselect.svelte +532 -0
  84. package/dist/ui/selects/cmp.search-multiselect.svelte.d.ts +67 -0
  85. package/dist/ui/selects/cmp.singleselect.svelte +381 -0
  86. package/dist/ui/selects/cmp.singleselect.svelte.d.ts +78 -0
  87. package/dist/ui/selects/index.d.ts +5 -0
  88. package/dist/ui/selects/index.js +4 -0
  89. package/dist/ui/selects/select-localization.d.ts +6 -0
  90. package/dist/ui/selects/select-localization.js +27 -0
  91. package/dist/ui/selects/types.d.ts +29 -0
  92. package/dist/ui/selects/types.js +1 -0
  93. package/dist/ui/time-ago/cmp.time-ago.svelte +0 -6
  94. package/dist/ui/time-ago/cmp.time-ago.svelte.d.ts +2 -6
  95. package/dist/ui/validatable/_validatable.scss +34 -0
  96. package/dist/ui/validatable/cmp.validatable.svelte +57 -0
  97. package/dist/ui/validatable/cmp.validatable.svelte.d.ts +49 -0
  98. package/dist/ui/validatable/cmp.validation-error.svelte +52 -0
  99. package/dist/ui/validatable/cmp.validation-error.svelte.d.ts +42 -0
  100. package/dist/ui/validatable/index.d.ts +2 -0
  101. package/dist/ui/validatable/index.js +2 -0
  102. package/package.json +31 -5
  103. package/dist/ui/color-picker/cmp.input-stub.svelte +0 -98
  104. package/dist/ui/color-picker/cmp.input-stub.svelte.d.ts +0 -40
@@ -0,0 +1,532 @@
1
+ <script lang="ts" generics="T">import { Icon } from '../icon';
2
+ import { SelectLocalization } from './select-localization';
3
+ import IconAdd from '@fluentui/svg-icons/icons/add_16_filled.svg?raw';
4
+ import IconChevronDown from '@fluentui/svg-icons/icons/chevron_down_20_regular.svg?raw';
5
+ import IconDismiss from '@fluentui/svg-icons/icons/dismiss_20_regular.svg?raw';
6
+ import IconReorderDotsVertical from '@fluentui/svg-icons/icons/re_order_dots_vertical_20_regular.svg?raw';
7
+ import IconSearch from '@fluentui/svg-icons/icons/search_20_regular.svg?raw';
8
+ import Fuse from 'fuse.js';
9
+ import { nanoid } from 'nanoid';
10
+ import { dndzone } from 'svelte-dnd-action';
11
+ import Select from 'svelte-select';
12
+ let { value = null, loadOptions: loadOptionsFn, debounce = 350, placeholder = '', disabled = false, loading = false, creatable = null, inlineSelection = false, hideEmptyState = false, showFullItem = false, showChevron = false, maxVisibleItems = undefined, reorderable = false, on, icon, chevronIcon, optionSnippet } = $props();
13
+ const loc = new SelectLocalization();
14
+ let listOpen = $state(false);
15
+ let filterText = $state('');
16
+ const floatingConfig = { strategy: 'absolute' };
17
+ let loadingIndicatorShown = $state(false);
18
+ let loadingIndicatorTimeout = null;
19
+ $effect(() => {
20
+ if (loading) {
21
+ if (!loadingIndicatorTimeout) {
22
+ loadingIndicatorTimeout = window.setTimeout(() => {
23
+ loadingIndicatorShown = true;
24
+ }, 700);
25
+ }
26
+ }
27
+ else {
28
+ if (loadingIndicatorTimeout) {
29
+ clearTimeout(loadingIndicatorTimeout);
30
+ loadingIndicatorTimeout = null;
31
+ }
32
+ loadingIndicatorShown = false;
33
+ }
34
+ });
35
+ let selectValue = $derived(value?.map((v) => ({
36
+ id: nanoid(),
37
+ label: v.label,
38
+ value: v.value,
39
+ $isCreated: false
40
+ })) ?? []);
41
+ const nonInlineSelectionItems = $derived(maxVisibleItems ? selectValue.slice(0, maxVisibleItems) : selectValue);
42
+ const nonInlineSelectionHiddenItemsCount = $derived(selectValue.length - nonInlineSelectionItems.length);
43
+ let createOption = $state(null);
44
+ let actualOptions = $state([]);
45
+ const generateOptions = (selected, actual, created) => {
46
+ const generated = actual
47
+ .filter((x) => !selected.some((v) => v.value === x.value))
48
+ .map((x) => ({
49
+ label: x.label,
50
+ value: x.value,
51
+ $isCreated: false
52
+ }));
53
+ if (created) {
54
+ const createdOptionExists = generated.some((x) => x.label.toLowerCase() === created.label.toLowerCase()) ||
55
+ selectValue.some((x) => x.label.toLowerCase() === created.label.toLowerCase());
56
+ if (!createdOptionExists) {
57
+ generated.unshift({
58
+ label: created.label,
59
+ value: created.value,
60
+ $isCreated: true
61
+ });
62
+ }
63
+ }
64
+ return generated;
65
+ };
66
+ let optionItems = $state([]);
67
+ $effect(() => {
68
+ if (!listOpen) {
69
+ createOption = null;
70
+ }
71
+ optionItems = generateOptions(selectValue, actualOptions, createOption);
72
+ });
73
+ const loadOptions = async (search) => {
74
+ actualOptions = await loadOptionsFn(search);
75
+ return generateOptions(selectValue, actualOptions, createOption);
76
+ };
77
+ const onSelectChange = (items) => {
78
+ const isExistentOption = (opt) => !opt.$isCreated;
79
+ const createdItem = items.find((x) => !isExistentOption(x));
80
+ if (createdItem?.$isCreated === true) {
81
+ on?.create?.(createdItem.value);
82
+ createOption = null;
83
+ }
84
+ else {
85
+ on?.change?.(items.filter(isExistentOption).map((x) => ({ label: x.label, value: x.value })));
86
+ }
87
+ };
88
+ const itemFilter = (label, query) => {
89
+ if (!query) {
90
+ return true;
91
+ }
92
+ const fuse = new Fuse([label]);
93
+ const result = fuse.search(query);
94
+ return result.length > 0;
95
+ };
96
+ const onSelectFilter = () => {
97
+ if (!creatable || loading) {
98
+ return;
99
+ }
100
+ if (!creatable.validateFn(filterText)) {
101
+ return;
102
+ }
103
+ if (selectValue.some((x) => x.value === filterText)) {
104
+ return;
105
+ }
106
+ if (createOption?.label !== filterText) {
107
+ createOption = { label: filterText, value: filterText, $isCreated: true };
108
+ }
109
+ };
110
+ const onClear = (item) => {
111
+ const items = Array.isArray(item) ? item : [item];
112
+ const itemsRemaining = selectValue.filter((x) => !items.some((i) => i.value === x.value));
113
+ on?.change?.(itemsRemaining.map((x) => ({ label: x.label, value: x.value })));
114
+ };
115
+ const removeItem = (item) => {
116
+ const itemsRemaining = selectValue.filter((x) => x.value !== item.value);
117
+ on?.change?.(itemsRemaining.map((x) => ({ label: x.label, value: x.value })));
118
+ };
119
+ const flipDurationMs = 200;
120
+ const handleDndConsider = (e) => {
121
+ selectValue = e.detail.items;
122
+ };
123
+ const handleDndFinalize = (e) => {
124
+ selectValue = e.detail.items;
125
+ on?.change?.(selectValue.map((x) => ({ label: x.label, value: x.value })));
126
+ };
127
+ </script>
128
+
129
+ <div
130
+ class="search-multiselect"
131
+ class:search-multiselect--disabled={disabled}
132
+ class:search-multiselect--loading={loadingIndicatorShown}
133
+ class:search-multiselect--inline={inlineSelection}
134
+ class:search-multiselect--inline-full-item={inlineSelection && showFullItem}
135
+ class:search-multiselect--list-hidden={hideEmptyState && !optionItems?.length}>
136
+ {#if !inlineSelection && nonInlineSelectionItems.length}
137
+ {#if reorderable}
138
+ <div
139
+ class="search-multiselect-tags"
140
+ use:dndzone={{
141
+ items: nonInlineSelectionItems,
142
+ flipDurationMs,
143
+ dragDisabled: disabled || nonInlineSelectionItems.length < 2,
144
+ type: 'search-multiselect-tags',
145
+ dropTargetStyle: {}
146
+ }}
147
+ onconsider={handleDndConsider}
148
+ onfinalize={handleDndFinalize}>
149
+ {#each nonInlineSelectionItems as option (option.id)}
150
+ <div class="search-multiselect-tags__item" data-id={option.id}>
151
+ <span class="search-multiselect-tags__drag-handle" data-dnd-handle title="Drag to reorder">
152
+ <Icon src={IconReorderDotsVertical} />
153
+ </span>
154
+ <span class="search-multiselect-tags__item-text">
155
+ {option.label}
156
+ </span>
157
+ <button
158
+ type="button"
159
+ class="search-multiselect-tags__deselect"
160
+ inert={disabled}
161
+ onclick={() => removeItem({ label: option.label, value: option.value })}>
162
+ <Icon src={IconDismiss} />
163
+ </button>
164
+ </div>
165
+ {/each}
166
+ </div>
167
+ {#if nonInlineSelectionHiddenItemsCount > 0}
168
+ <div class="search-multiselect-tags-others">
169
+ {loc.nMore(nonInlineSelectionHiddenItemsCount)}
170
+ </div>
171
+ {/if}
172
+ {:else}
173
+ <div class="search-multiselect-tags">
174
+ {#each nonInlineSelectionItems as option (option.value)}
175
+ <div class="search-multiselect-tags__item">
176
+ <span class="search-multiselect-tags__item-text">
177
+ {option.label}
178
+ </span>
179
+ <button
180
+ type="button"
181
+ class="search-multiselect-tags__deselect"
182
+ inert={disabled}
183
+ onclick={() => removeItem({ label: option.label, value: option.value })}>
184
+ <Icon src={IconDismiss} />
185
+ </button>
186
+ </div>
187
+ {/each}
188
+ {#if nonInlineSelectionHiddenItemsCount > 0}
189
+ <div class="search-multiselect-tags__item">
190
+ <span class="search-multiselect-tags__item-text">
191
+ {loc.nMore(nonInlineSelectionHiddenItemsCount)}
192
+ </span>
193
+ </div>
194
+ {/if}
195
+ </div>
196
+ {/if}
197
+ {/if}
198
+ <Select
199
+ containerStyles="font-size: 1em;"
200
+ value={selectValue}
201
+ items={optionItems}
202
+ multiple={true}
203
+ disabled={disabled}
204
+ floatingConfig={floatingConfig}
205
+ placeholder={placeholder}
206
+ bind:loading={loading}
207
+ clearable={false}
208
+ bind:listOpen={listOpen}
209
+ listOffset={2}
210
+ showChevron={!loading}
211
+ placeholderAlwaysShow={!inlineSelection}
212
+ itemFilter={itemFilter}
213
+ bind:filterText={filterText}
214
+ hideEmptyState={hideEmptyState}
215
+ loadOptions={loadOptions}
216
+ debounceWait={debounce}
217
+ on:change={({ detail }) => onSelectChange(detail)}
218
+ on:filter={onSelectFilter}
219
+ on:clear={({ detail }) => onClear(detail)}>
220
+ <div slot="item" let:item class="search-multiselect__option">
221
+ {#if optionSnippet}
222
+ {@render optionSnippet({ item })}
223
+ {:else}
224
+ {#if item.$isCreated}
225
+ <Icon src={IconAdd} />
226
+ {/if}
227
+ {item.label}
228
+ {/if}
229
+ </div>
230
+ <div class="search-multiselect__selection" slot="selection" let:selection>
231
+ <span class="search-multiselect__selection-text">
232
+ {selection.label}
233
+ </span>
234
+ </div>
235
+ <span slot="prepend" class="search-multiselect__icon search-multiselect__icon--prepend">
236
+ {#if icon}
237
+ {@render icon()}
238
+ {/if}
239
+ </span>
240
+ <span slot="chevron-icon" class="search-multiselect__icon">
241
+ {#if chevronIcon}
242
+ {@render chevronIcon()}
243
+ {:else if showChevron}
244
+ <Icon src={IconChevronDown} />
245
+ {:else}
246
+ <Icon src={IconSearch} />
247
+ {/if}
248
+ </span>
249
+ <span slot="multi-clear-icon" class="search-multiselect__icon">
250
+ <Icon src={IconDismiss} />
251
+ </span>
252
+ <svelte:fragment slot="empty">
253
+ <div class="search-multiselect__no-options">{loc.noMatch}</div>
254
+ </svelte:fragment>
255
+ </Select>
256
+ </div>
257
+
258
+ <!--
259
+ @component
260
+ Multi-value select with async search, built on svelte-select with fuzzy search. Supports debounced loading, external tags with drag-and-drop reordering, inline selection mode, and item creation.
261
+
262
+ ### CSS Custom Properties
263
+ Uses the same `--sc-kit--multiselect--*` variables as the Multiselect component.
264
+ -->
265
+
266
+ <style>.search-multiselect {
267
+ --_multiselect--root--font-size: var(--sc-kit--multiselect--root--font-size, 1rem);
268
+ --_multiselect--height: var(--sc-kit--multiselect--height, 2em);
269
+ --_multiselect--width: var(--sc-kit--multiselect--width, 100%);
270
+ --_multiselect--background: var(--sc-kit--multiselect--background, light-dark(#ffffff, #1c1c1c));
271
+ --_multiselect--background--disabled: var(--sc-kit--multiselect--background--disabled, light-dark(#f9fafb, #1f2937));
272
+ --_multiselect--border-color: var(--sc-kit--multiselect--border-color, light-dark(#d1d5db, #4b5563));
273
+ --_multiselect--border-radius: var(--sc-kit--multiselect--border-radius, 0.25em);
274
+ --_multiselect--text--font-size: var(--sc-kit--multiselect--text--font-size, 0.875em);
275
+ --_multiselect--text--color: var(--sc-kit--multiselect--text--color, light-dark(#2e2e2e, #ffffff));
276
+ --_multiselect--placeholder--color: var(--sc-kit--multiselect--placeholder--color, var(--_multiselect--border-color));
277
+ --_multiselect--icon--color: var(--sc-kit--multiselect--icon--color, var(--_multiselect--border-color));
278
+ --_multiselect--padding-inline: var(--sc-kit--multiselect--padding-inline, 0.5em);
279
+ --_multiselect--padding-block: var(--sc-kit--multiselect--padding-block, 0.25em);
280
+ --_multiselect--options--max-height: var(--sc-kit--multiselect--options--max-height, 20em);
281
+ --_multiselect--item--hover--background: var(
282
+ --sc-kit--multiselect--item--hover--background,
283
+ light-dark(#f2f2f2, #2e2e2e)
284
+ );
285
+ --_multiselect--item--active--background: var(
286
+ --sc-kit--multiselect--item--active--background,
287
+ light-dark(#f9fafb, #374151)
288
+ );
289
+ --_multiselect--tag--color: var(--sc-kit--multiselect--tag--color, var(--_multiselect--text--color));
290
+ --_multiselect--tag--background: var(--sc-kit--multiselect--tag--background, var(--_multiselect--background));
291
+ --_multiselect--tag--border-color: var(--sc-kit--multiselect--tag--border-color, var(--_multiselect--border-color));
292
+ --_multiselect--tag--border-radius: var(--sc-kit--multiselect--tag--border-radius, var(--_multiselect--border-radius));
293
+ --_multiselect--tag--font-size: var(--sc-kit--multiselect--tag--font-size, calc(var(--_multiselect--text--font-size) * 0.9));
294
+ --_multiselect--tag--padding-inline: var(--sc-kit--multiselect--tag--padding-inline, var(--_multiselect--padding-inline));
295
+ --_multiselect--tag--padding-block: var(--sc-kit--multiselect--tag--padding-block, var(--_multiselect--padding-block));
296
+ --_multiselect--chevron--pointer-events: var(--sc-kit--multiselect--chevron--pointer-events, none);
297
+ --_multiselect--group-header--color: var(--sc-kit--multiselect--group-header--color, var(--_multiselect--placeholder--color));
298
+ --_multiselect--group-header--font-weight: var(--sc-kit--multiselect--group-header--font-weight, 500);
299
+ --_multiselect--group-item--padding-left: var(--sc-kit--multiselect--group-item--padding-left, 1em);
300
+ --_multiselect--inline--tag--background: var(
301
+ --sc-kit--multiselect--inline--tag--background,
302
+ light-dark(#f2f2f3, #374151)
303
+ );
304
+ --background: var(--_multiselect--background);
305
+ --border: 1px solid var(--_multiselect--border-color);
306
+ --border-focused: var(--border);
307
+ --border-hover: var(--border);
308
+ --border-radius: var(--_multiselect--border-radius);
309
+ --border-radius-focused: var(--border-radius);
310
+ --box-sizing: border-box;
311
+ --chevron-background: transparent;
312
+ --chevron-border: transparent;
313
+ --chevron-color: transparent;
314
+ --chevron-height: auto;
315
+ --chevron-pointer-events: var(--_multiselect--chevron--pointer-events);
316
+ --chevron-width: auto;
317
+ --disabled-background: var(--_multiselect--background--disabled);
318
+ --disabled-border-color: var(--_multiselect--border-color);
319
+ --disabled-color: var(--_multiselect--text--color);
320
+ --disabled-placeholder-color: var(--placeholder-color);
321
+ --disabled-placeholder-opacity: var(--placeholder-opacity);
322
+ --font-size: var(--_multiselect--text--font-size);
323
+ --height: var(--_multiselect--height);
324
+ --icons-color: var(--_multiselect--icon--color);
325
+ --indicators-bottom: auto;
326
+ --indicators-position: static;
327
+ --indicators-right: auto;
328
+ --indicators-top: auto;
329
+ --input--color: var(--_multiselect--text--color);
330
+ --input-left: 0;
331
+ --input-letter-spacing: 1;
332
+ --input-margin: 0;
333
+ --input-padding: 0 var(--_multiselect--padding-inline) 0 0;
334
+ --item-active-background: var(--_multiselect--item--active--background);
335
+ --item-color: var(--_multiselect--text--color);
336
+ --item-first-border-radius: 0;
337
+ --item-height: auto;
338
+ --item-hover-bg: var(--_multiselect--item--hover--background);
339
+ --item-hover-color: var(--_multiselect--text--color);
340
+ --item-is-active-bg: var(--_multiselect--item--active--background);
341
+ --item-is-active-color: var(--_multiselect--text--color);
342
+ --item-is-not-selectable-color: var(--_multiselect--group-header--color);
343
+ --item-line-height: 1;
344
+ --item-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
345
+ --item-transition: auto;
346
+ --list-background: var(--background);
347
+ --list-border: var(--border);
348
+ --list-border-radius: var(--border-radius);
349
+ --list-max-height: var(--_multiselect--options--max-height);
350
+ --list-position: absolute;
351
+ --list-shadow: none;
352
+ --list-z-index: 2;
353
+ --loading--margin: 0;
354
+ --loading-color: var(--icons-color);
355
+ --loading-height: max-content;
356
+ --loading-width: max-content;
357
+ --margin: 0;
358
+ --max-height: var(--height);
359
+ --multi-item-active-outline: none;
360
+ --multi-item-bg: transparent;
361
+ --multi-item-border-radius: 0;
362
+ --multi-item-clear-icon-color: transparent;
363
+ --multi-item-color: transparent;
364
+ --multi-item-gap: 0;
365
+ --multi-item-height: 0;
366
+ --multi-item-margin: 0;
367
+ --multi-item-outline: none;
368
+ --multi-item-padding: 0;
369
+ --multi-max-width: 0;
370
+ --multi-select-input-margin: 0;
371
+ --multi-select-input-padding: 0;
372
+ --multi-select-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline) var(--_multiselect--padding-block) 0;
373
+ --padding: 0;
374
+ --placeholder-color: var(--_multiselect--placeholder--color);
375
+ --placeholder-opacity: 0.8;
376
+ --selected-item-color: auto;
377
+ --selected-item-overflow: auto;
378
+ --selected-item-padding: auto;
379
+ --spinner-color: var(--icons-color);
380
+ --spinner-height: var(--_multiselect--text--font-size);
381
+ --spinner-width: var(--_multiselect--text--font-size);
382
+ --value-container-overflow: hidden;
383
+ --value-container-padding: 0 var(--_multiselect--padding-inline) 0 0;
384
+ --width: var(--_multiselect--width);
385
+ --group-title-color: var(--_multiselect--group-header--color);
386
+ --group-title-font-weight: var(--_multiselect--group-header--font-weight);
387
+ --group-title-font-size: var(--_multiselect--text--font-size);
388
+ --group-title-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
389
+ --group-item-padding-left: var(--_multiselect--group-item--padding-left);
390
+ font-size: var(--_multiselect--root--font-size);
391
+ width: var(--_multiselect--width);
392
+ position: relative;
393
+ }
394
+ .search-multiselect__icon {
395
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
396
+ --sc-kit--icon--size: 1.25em;
397
+ display: flex;
398
+ align-items: center;
399
+ }
400
+ .search-multiselect__icon--prepend {
401
+ padding: 0 var(--_multiselect--padding-inline);
402
+ }
403
+ :global(.search-multiselect__icon--prepend:not(:has(*))) {
404
+ padding-right: 0 !important;
405
+ }
406
+ .search-multiselect__option {
407
+ font-size: var(--_multiselect--text--font-size);
408
+ }
409
+ .search-multiselect__selection {
410
+ font-size: var(--_multiselect--tag--font-size);
411
+ width: 100%;
412
+ min-width: 100%;
413
+ max-width: 100%;
414
+ height: 100%;
415
+ min-height: 100%;
416
+ max-height: 100%;
417
+ display: flex;
418
+ align-items: center;
419
+ min-width: 0;
420
+ }
421
+ .search-multiselect__selection-text {
422
+ text-overflow: ellipsis;
423
+ max-width: 100%;
424
+ white-space: nowrap;
425
+ overflow: hidden;
426
+ }
427
+ .search-multiselect__no-options {
428
+ color: var(--_multiselect--placeholder--color);
429
+ padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
430
+ }
431
+ .search-multiselect--disabled {
432
+ cursor: default;
433
+ pointer-events: none;
434
+ }
435
+ .search-multiselect--loading {
436
+ pointer-events: none;
437
+ }
438
+ .search-multiselect--loading::after {
439
+ content: "";
440
+ position: absolute;
441
+ top: 0;
442
+ left: 0;
443
+ width: 100%;
444
+ height: 100%;
445
+ background: light-dark(hsl(0, 0%, 97%), hsl(0, 0%, 3%));
446
+ opacity: 0.5;
447
+ }
448
+ .search-multiselect :global(.value-container) {
449
+ gap: 0 !important;
450
+ }
451
+ .search-multiselect--inline {
452
+ --max-height: auto;
453
+ --multi-item-active-outline: none;
454
+ --multi-item-bg: var(--_multiselect--inline--tag--background);
455
+ --multi-item-border-radius: var(--_multiselect--border-radius);
456
+ --multi-item-clear-icon-color: var(--_multiselect--icon--color);
457
+ --multi-item-color: var(--_multiselect--text--color);
458
+ --multi-item-gap: var(--_multiselect--padding-inline);
459
+ --multi-item-height: calc(var(--_multiselect--height) - 2 * var(--_multiselect--padding-block));
460
+ --multi-item-margin: 0;
461
+ --multi-item-outline: 1px solid var(--_multiselect--border-color);
462
+ --multi-item-padding: var(--_multiselect--tag--padding-block) var(--_multiselect--tag--padding-inline);
463
+ --multi-max-width: 9.375em;
464
+ --multi-select-input-margin: 0;
465
+ --multi-select-input-padding: 0;
466
+ --multi-select-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline) var(--_multiselect--padding-block) 0;
467
+ }
468
+ .search-multiselect--inline :global(.value-container) {
469
+ gap: 0.25em !important;
470
+ }
471
+ .search-multiselect--inline-full-item {
472
+ --multi-max-width: none;
473
+ }
474
+ .search-multiselect--list-hidden {
475
+ --list-border: none;
476
+ }
477
+
478
+ .search-multiselect-tags {
479
+ -webkit-user-drag: none;
480
+ user-select: none;
481
+ }
482
+ .search-multiselect-tags :global([contenteditable]) {
483
+ user-select: text;
484
+ }
485
+ .search-multiselect-tags {
486
+ display: flex;
487
+ flex-wrap: wrap;
488
+ gap: 0.25em;
489
+ margin-bottom: 0.25em;
490
+ min-width: 0;
491
+ width: 100%;
492
+ }
493
+ .search-multiselect-tags__item {
494
+ display: flex;
495
+ gap: 0.375em;
496
+ vertical-align: middle;
497
+ border: 1px solid var(--_multiselect--tag--border-color);
498
+ font-size: var(--_multiselect--tag--font-size);
499
+ padding: var(--_multiselect--tag--padding-block) var(--_multiselect--tag--padding-inline);
500
+ color: var(--_multiselect--tag--color);
501
+ background: var(--_multiselect--tag--background);
502
+ border-radius: var(--_multiselect--tag--border-radius);
503
+ max-width: 100%;
504
+ }
505
+ .search-multiselect-tags__item-text {
506
+ text-overflow: ellipsis;
507
+ max-width: 100%;
508
+ white-space: nowrap;
509
+ overflow: hidden;
510
+ }
511
+ .search-multiselect-tags__deselect {
512
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
513
+ --sc-kit--icon--size: 1.25rem;
514
+ cursor: pointer;
515
+ display: flex;
516
+ align-items: center;
517
+ }
518
+ .search-multiselect-tags__drag-handle {
519
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
520
+ --sc-kit--icon--size: 1rem;
521
+ cursor: grab;
522
+ display: flex;
523
+ align-items: center;
524
+ font-size: 0.7em;
525
+ user-select: none;
526
+ }
527
+
528
+ .search-multiselect-tags-others {
529
+ color: var(--_multiselect--placeholder--color);
530
+ font-size: var(--_multiselect--tag--font-size);
531
+ padding: var(--_multiselect--tag--padding-block) 0;
532
+ }</style>
@@ -0,0 +1,67 @@
1
+ import type { SelectCreateItemSettings, SelectOption } from './types';
2
+ import type { Snippet } from 'svelte';
3
+ declare function $$render<T>(): {
4
+ props: {
5
+ value?: SelectOption<T>[] | null;
6
+ /** Async function to load options based on search query */
7
+ loadOptions: (query: string) => Promise<SelectOption<T>[]>;
8
+ /** Debounce wait time in ms for search input @default 350 */
9
+ debounce?: number;
10
+ placeholder?: string;
11
+ disabled?: boolean;
12
+ loading?: boolean;
13
+ /** Settings for creating new items in the dropdown */
14
+ creatable?: SelectCreateItemSettings | null;
15
+ /** Show selected items as inline tags inside the control */
16
+ inlineSelection?: boolean;
17
+ /** Hide the dropdown when there are no matching options */
18
+ hideEmptyState?: boolean;
19
+ /** Do not truncate inline tag text */
20
+ showFullItem?: boolean;
21
+ /** Show chevron icon instead of search icon */
22
+ showChevron?: boolean;
23
+ /** Maximum number of visible tags in external selection @default unlimited */
24
+ maxVisibleItems?: number;
25
+ /** Enable drag-and-drop reordering of external tags */
26
+ reorderable?: boolean;
27
+ on?: {
28
+ change?: (value: SelectOption<T>[]) => void;
29
+ create?: (label: string) => void;
30
+ };
31
+ /** Left icon snippet */
32
+ icon?: Snippet;
33
+ /** Custom chevron icon snippet */
34
+ chevronIcon?: Snippet;
35
+ /** Custom option rendering */
36
+ optionSnippet?: Snippet<[{
37
+ item: SelectOption<T>;
38
+ }]>;
39
+ };
40
+ exports: {};
41
+ bindings: "";
42
+ slots: {};
43
+ events: {};
44
+ };
45
+ declare class __sveltets_Render<T> {
46
+ props(): ReturnType<typeof $$render<T>>['props'];
47
+ events(): ReturnType<typeof $$render<T>>['events'];
48
+ slots(): ReturnType<typeof $$render<T>>['slots'];
49
+ bindings(): "";
50
+ exports(): {};
51
+ }
52
+ interface $$IsomorphicComponent {
53
+ new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
54
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
55
+ } & ReturnType<__sveltets_Render<T>['exports']>;
56
+ <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
57
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
58
+ }
59
+ /**
60
+ * Multi-value select with async search, built on svelte-select with fuzzy search. Supports debounced loading, external tags with drag-and-drop reordering, inline selection mode, and item creation.
61
+ *
62
+ * ### CSS Custom Properties
63
+ * Uses the same `--sc-kit--multiselect--*` variables as the Multiselect component.
64
+ */
65
+ declare const Cmp: $$IsomorphicComponent;
66
+ type Cmp<T> = InstanceType<typeof Cmp<T>>;
67
+ export default Cmp;