@streamscloud/kit 0.2.0 → 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 (106) 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/media-viewer-dialog/index.d.ts +2 -1
  80. package/dist/ui/media-viewer-dialog/index.js +4 -2
  81. package/dist/ui/selects/_multiselect.scss +282 -0
  82. package/dist/ui/selects/_singleselect.scss +175 -0
  83. package/dist/ui/selects/cmp.multiselect.svelte +530 -0
  84. package/dist/ui/selects/cmp.multiselect.svelte.d.ts +85 -0
  85. package/dist/ui/selects/cmp.search-multiselect.svelte +532 -0
  86. package/dist/ui/selects/cmp.search-multiselect.svelte.d.ts +67 -0
  87. package/dist/ui/selects/cmp.singleselect.svelte +381 -0
  88. package/dist/ui/selects/cmp.singleselect.svelte.d.ts +78 -0
  89. package/dist/ui/selects/index.d.ts +5 -0
  90. package/dist/ui/selects/index.js +4 -0
  91. package/dist/ui/selects/select-localization.d.ts +6 -0
  92. package/dist/ui/selects/select-localization.js +27 -0
  93. package/dist/ui/selects/types.d.ts +29 -0
  94. package/dist/ui/selects/types.js +1 -0
  95. package/dist/ui/time-ago/cmp.time-ago.svelte +0 -6
  96. package/dist/ui/time-ago/cmp.time-ago.svelte.d.ts +2 -6
  97. package/dist/ui/validatable/_validatable.scss +34 -0
  98. package/dist/ui/validatable/cmp.validatable.svelte +57 -0
  99. package/dist/ui/validatable/cmp.validatable.svelte.d.ts +49 -0
  100. package/dist/ui/validatable/cmp.validation-error.svelte +52 -0
  101. package/dist/ui/validatable/cmp.validation-error.svelte.d.ts +42 -0
  102. package/dist/ui/validatable/index.d.ts +2 -0
  103. package/dist/ui/validatable/index.js +2 -0
  104. package/package.json +31 -5
  105. package/dist/ui/color-picker/cmp.input-stub.svelte +0 -98
  106. package/dist/ui/color-picker/cmp.input-stub.svelte.d.ts +0 -40
@@ -0,0 +1,247 @@
1
+ <script lang="ts">import { DomHelper, HtmlHelper, Utils } from '../../../core/utils';
2
+ import { InputEmojiPicker, inputEmojiPickerContainer } from '../input-emoji-picker';
3
+ import { untrack } from 'svelte';
4
+ let { value, placeholder = '', debounce = 0, hidePlaceholderOnFocus = true, submitOnEnter = false, singleLine = false, rows = 0, maxlength = 50000, id = '', disabled = false, autofocus = false, emoji = false, borderless = false, title = '', on } = $props();
5
+ let textareaRef = $state(undefined);
6
+ let placeholderInternal = $state(untrack(() => placeholder));
7
+ const initTextarea = (node) => {
8
+ textareaRef = node;
9
+ if (rows) {
10
+ node.style.minHeight = DomHelper.calcHeightBasedOnRows(node, rows);
11
+ }
12
+ on?.mounted?.({ textarea: node });
13
+ autoHeightTextArea();
14
+ if (autofocus) {
15
+ node.focus();
16
+ }
17
+ };
18
+ const autoHeightTextArea = () => {
19
+ if (!textareaRef) {
20
+ return;
21
+ }
22
+ textareaRef.style.overflow = 'hidden';
23
+ textareaRef.style.height = 'auto';
24
+ textareaRef.style.height = textareaRef.scrollHeight + 'px';
25
+ textareaRef.style.overflow = '';
26
+ };
27
+ $effect(() => {
28
+ if (value !== undefined) {
29
+ autoHeightTextArea();
30
+ }
31
+ });
32
+ const onFocus = () => {
33
+ placeholderInternal = !hidePlaceholderOnFocus ? placeholder : '';
34
+ };
35
+ const onBlur = () => {
36
+ placeholderInternal = placeholder;
37
+ };
38
+ const sanitizeLineBreaks = (text) => text.replace(/[\r\n]+/g, ' ');
39
+ const textChanged = () => {
40
+ if (textareaRef) {
41
+ on?.change?.(textareaRef.value);
42
+ }
43
+ };
44
+ const onBeforeInput = (event) => {
45
+ if (!singleLine || !textareaRef) {
46
+ return;
47
+ }
48
+ if (event.inputType === 'insertLineBreak' || event.inputType === 'insertParagraph') {
49
+ event.preventDefault();
50
+ return;
51
+ }
52
+ if (event.data && /[\r\n]/.test(event.data)) {
53
+ event.preventDefault();
54
+ const start = textareaRef.selectionStart;
55
+ const end = textareaRef.selectionEnd;
56
+ const clean = sanitizeLineBreaks(event.data);
57
+ textareaRef.setRangeText(clean, start, end, 'end');
58
+ textareaRef.dispatchEvent(new Event('input', { bubbles: true }));
59
+ }
60
+ };
61
+ const onKeyDown = (event) => {
62
+ if (submitOnEnter && event.key === 'Enter' && !(event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)) {
63
+ event.preventDefault();
64
+ on?.submit?.();
65
+ }
66
+ };
67
+ const handleChangeDebounced = $derived(debounce ? Utils.debounce(textChanged, debounce) : textChanged);
68
+ const onEmojiSelected = (emojiChar) => {
69
+ if (textareaRef) {
70
+ HtmlHelper.pasteIntoInput(emojiChar, textareaRef);
71
+ }
72
+ };
73
+ </script>
74
+
75
+ <div
76
+ class="textarea-input"
77
+ class:textarea-input--disabled={disabled}
78
+ class:textarea-input--borderless={borderless}
79
+ class:textarea-input--has-emoji={emoji}
80
+ use:inputEmojiPickerContainer>
81
+ <textarea
82
+ use:initTextarea
83
+ disabled={disabled}
84
+ placeholder={placeholderInternal}
85
+ maxlength={maxlength}
86
+ class="textarea-input__textarea"
87
+ class:textarea-input--disabled={disabled}
88
+ rows="1"
89
+ id={id}
90
+ title={title}
91
+ oninput={(e) => {
92
+ autoHeightTextArea();
93
+ handleChangeDebounced(e);
94
+ }}
95
+ onbeforeinput={onBeforeInput}
96
+ onfocus={onFocus}
97
+ onblur={onBlur}
98
+ onkeydown={onKeyDown}>{singleLine && value ? sanitizeLineBreaks(value) : value}</textarea>
99
+ {#if emoji}
100
+ <InputEmojiPicker on={{ select: onEmojiSelected }} />
101
+ {/if}
102
+ </div>
103
+
104
+ <!--
105
+ @component
106
+ Auto-resizing textarea with optional emoji picker, single-line mode, and submit-on-enter.
107
+
108
+ ### CSS Custom Properties
109
+ | Property | Description | Default |
110
+ |---|---|---|
111
+ | `--sc-kit--textarea--root--font-size` | Root font size for em scaling | `1rem` |
112
+ | `--sc-kit--textarea--width` | Container width | `100%` |
113
+ | `--sc-kit--textarea--min-height` | Minimum height | `none` |
114
+ | `--sc-kit--textarea--max-height` | Maximum height | `none` |
115
+ | `--sc-kit--textarea--padding--block` | Block (vertical) padding | `0.5em` |
116
+ | `--sc-kit--textarea--padding--inline` | Inline (horizontal) padding | `0.5em` |
117
+ | `--sc-kit--textarea--accent-color` | Focus accent color | light-dark primary-500/primary-400 |
118
+ | `--sc-kit--textarea--background` | Background color | light-dark white/gray-900 |
119
+ | `--sc-kit--textarea--background--disabled` | Disabled background | light-dark neutral-50/neutral-800 |
120
+ | `--sc-kit--textarea--border-color` | Border color | light-dark neutral-300/neutral-600 |
121
+ | `--sc-kit--textarea--border-radius` | Border radius | `0.25em` |
122
+ | `--sc-kit--textarea--text--font-size` | Text font size | `0.875em` |
123
+ | `--sc-kit--textarea--text--color` | Text color | light-dark gray-800/white |
124
+ | `--sc-kit--textarea--text-align` | Text alignment | inherited |
125
+ | `--sc-kit--textarea--placeholder--color` | Placeholder text color | inherited from border |
126
+ -->
127
+
128
+ <style>.textarea-input {
129
+ --_textarea--padding-block: var(--sc-kit--textarea--padding--block, 0.5em);
130
+ --_textarea--text-align: var(--sc-kit--textarea--text-align);
131
+ --_textarea--max-height: var(--sc-kit--textarea--max-height);
132
+ --_textarea--min-height: var(--sc-kit--textarea--min-height, none);
133
+ --_--input--root--font-size: var(--sc-kit--textarea--root--font-size);
134
+ --_--input--height: auto;
135
+ --_--input--width: var(--sc-kit--textarea--width);
136
+ --_--input--background: var(--sc-kit--textarea--background);
137
+ --_--input--background--disabled: var(--sc-kit--textarea--background--disabled);
138
+ --_--input--border-color: var(--sc-kit--textarea--border-color);
139
+ --_--input--border-radius: var(--sc-kit--textarea--border-radius);
140
+ --_--input--text--font-size: var(--sc-kit--textarea--text--font-size);
141
+ --_--input--text--color: var(--sc-kit--textarea--text--color);
142
+ --_--input--placeholder--color: var(--sc-kit--textarea--placeholder--color);
143
+ --_--input--accent-color: var(--sc-kit--textarea--accent-color);
144
+ --_--input--padding--inline: var(--sc-kit--textarea--padding--inline);
145
+ --_--input--padding--block: var(--_textarea--padding-block);
146
+ --_input--root--font-size: var(--_--input--root--font-size, 1rem);
147
+ --_input--height: var(--_--input--height, 2em);
148
+ --_input--width: var(--_--input--width, 100%);
149
+ --_input--background: var(--_--input--background, light-dark(#ffffff, #1c1c1c));
150
+ --_input--background--disabled: var(--_--input--background--disabled, light-dark(#f9fafb, #1f2937));
151
+ --_input--border-color: var(--_--input--border-color, light-dark(#d1d5db, #4b5563));
152
+ --_input--border-radius: var(--_--input--border-radius, 0.25em);
153
+ --_input--icon--size: var(--_--input--icon--size, 1em);
154
+ --_input--icon--color: var(--_--input--icon--color, var(--_input--border-color));
155
+ --_input--text--font-size: var(--_--input--text--font-size, 0.875em);
156
+ --_input--text--color: var(--_--input--text--color, light-dark(#2e2e2e, #ffffff));
157
+ --_input--placeholder--color: var(--_--input--placeholder--color, var(--_input--border-color));
158
+ --_input--accent-color: var(--_--input--accent-color, light-dark(#144ab0, #5a8dec));
159
+ --_input--padding--inline: var(--_--input--padding--inline, 0.5em);
160
+ --_input--padding--block: var(--_--input--padding--block, 0);
161
+ --_input--padding-top: var(--_--input--padding-top, var(--_input--padding--block));
162
+ --_input--padding-right: var(--_--input--padding-right, var(--_input--padding--inline));
163
+ --_input--padding-bottom: var(--_--input--padding-bottom, var(--_input--padding--block));
164
+ --_input--padding-left: var(--_--input--padding-left, var(--_input--padding--inline));
165
+ font-size: var(--_input--root--font-size);
166
+ height: var(--_input--height);
167
+ color: var(--_input--text--color);
168
+ border: 1px solid var(--_input--border-color);
169
+ border-radius: var(--_input--border-radius);
170
+ width: var(--_input--width);
171
+ min-width: var(--_input--width);
172
+ background: var(--_input--background);
173
+ padding-top: var(--_input--padding-top);
174
+ padding-right: var(--_input--padding-right);
175
+ padding-bottom: var(--_input--padding-bottom);
176
+ padding-left: var(--_input--padding-left);
177
+ --_input--default-shadow-color: transparent;
178
+ --_input--accent-shadow: var(--_input--explicit-shadow-color, var(--_input--default-shadow-color));
179
+ position: relative;
180
+ box-shadow: inset 0 -0.13em var(--_input--accent-shadow);
181
+ transition: box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1);
182
+ }
183
+ .textarea-input:focus, .textarea-input:focus-within {
184
+ --_input--default-shadow-color: var(--_input--accent-color);
185
+ }
186
+ .textarea-input--disabled {
187
+ background-color: var(--_input--background--disabled);
188
+ cursor: default;
189
+ }
190
+ .textarea-input {
191
+ position: relative;
192
+ }
193
+ .textarea-input--borderless {
194
+ --_input--border-color: transparent;
195
+ --_input--background: transparent;
196
+ --_input--background--disabled: transparent;
197
+ --_input--accent-color: transparent;
198
+ --_input--explicit-shadow-color: transparent;
199
+ --_input--height: auto;
200
+ }
201
+ .textarea-input--has-emoji {
202
+ --_--input--padding-right: 1.5em;
203
+ }
204
+ .textarea-input__textarea {
205
+ min-height: var(--_textarea--min-height);
206
+ height: auto;
207
+ max-height: var(--_textarea--max-height);
208
+ width: 100%;
209
+ resize: none;
210
+ text-align: var(--_textarea--text-align);
211
+ padding: 0;
212
+ background-color: transparent !important;
213
+ font-size: var(--_input--text--font-size);
214
+ color: var(--_input--text--color);
215
+ }
216
+ .textarea-input__textarea::placeholder {
217
+ color: var(--_input--placeholder--color);
218
+ }
219
+ .textarea-input__textarea:-webkit-autofill {
220
+ -webkit-text-fill-color: var(--_input--text--color) !important;
221
+ }
222
+ .textarea-input__textarea {
223
+ --_cross-browser-scrollbar--thumb-color: transparent;
224
+ --_cross-browser-scrollbar--track-color: transparent;
225
+ }
226
+ .textarea-input__textarea:hover {
227
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, light-dark(#d1d5db, #4b5563));
228
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
229
+ }
230
+ .textarea-input__textarea::-webkit-scrollbar {
231
+ width: 6px;
232
+ height: 6px;
233
+ }
234
+ .textarea-input__textarea::-webkit-scrollbar-track {
235
+ background: var(--_cross-browser-scrollbar--track-color);
236
+ border-radius: 100vw;
237
+ }
238
+ .textarea-input__textarea::-webkit-scrollbar-thumb {
239
+ background: var(--_cross-browser-scrollbar--thumb-color);
240
+ border-radius: 100vw;
241
+ }
242
+ @supports (scrollbar-color: transparent transparent) {
243
+ .textarea-input__textarea {
244
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
245
+ scrollbar-width: thin;
246
+ }
247
+ }</style>
@@ -0,0 +1,57 @@
1
+ type Props = {
2
+ value: string | null | undefined;
3
+ placeholder?: string;
4
+ /** Debounce delay in ms for change events @default 0 */
5
+ debounce?: number;
6
+ /** Hide placeholder text when textarea is focused @default true */
7
+ hidePlaceholderOnFocus?: boolean;
8
+ /** Fire submit callback on Enter key @default false */
9
+ submitOnEnter?: boolean;
10
+ /** Prevent line breaks, sanitize pasted text @default false */
11
+ singleLine?: boolean;
12
+ /** Minimum visible rows (0 = auto height) @default 0 */
13
+ rows?: number;
14
+ maxlength?: number;
15
+ id?: string;
16
+ disabled?: boolean;
17
+ autofocus?: boolean;
18
+ /** Show emoji picker trigger */
19
+ emoji?: boolean;
20
+ /** Remove border, background, and accent shadow */
21
+ borderless?: boolean;
22
+ title?: string;
23
+ on: {
24
+ change?: (value: string) => void;
25
+ /** Fires on Enter when submitOnEnter is enabled */
26
+ submit?: () => void;
27
+ /** Fires after mount, provides the textarea element ref */
28
+ mounted?: (data: {
29
+ textarea: HTMLTextAreaElement;
30
+ }) => void;
31
+ };
32
+ };
33
+ /**
34
+ * Auto-resizing textarea with optional emoji picker, single-line mode, and submit-on-enter.
35
+ *
36
+ * ### CSS Custom Properties
37
+ * | Property | Description | Default |
38
+ * |---|---|---|
39
+ * | `--sc-kit--textarea--root--font-size` | Root font size for em scaling | `1rem` |
40
+ * | `--sc-kit--textarea--width` | Container width | `100%` |
41
+ * | `--sc-kit--textarea--min-height` | Minimum height | `none` |
42
+ * | `--sc-kit--textarea--max-height` | Maximum height | `none` |
43
+ * | `--sc-kit--textarea--padding--block` | Block (vertical) padding | `0.5em` |
44
+ * | `--sc-kit--textarea--padding--inline` | Inline (horizontal) padding | `0.5em` |
45
+ * | `--sc-kit--textarea--accent-color` | Focus accent color | light-dark primary-500/primary-400 |
46
+ * | `--sc-kit--textarea--background` | Background color | light-dark white/gray-900 |
47
+ * | `--sc-kit--textarea--background--disabled` | Disabled background | light-dark neutral-50/neutral-800 |
48
+ * | `--sc-kit--textarea--border-color` | Border color | light-dark neutral-300/neutral-600 |
49
+ * | `--sc-kit--textarea--border-radius` | Border radius | `0.25em` |
50
+ * | `--sc-kit--textarea--text--font-size` | Text font size | `0.875em` |
51
+ * | `--sc-kit--textarea--text--color` | Text color | light-dark gray-800/white |
52
+ * | `--sc-kit--textarea--text-align` | Text alignment | inherited |
53
+ * | `--sc-kit--textarea--placeholder--color` | Placeholder text color | inherited from border |
54
+ */
55
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
56
+ type Cmp = ReturnType<typeof Cmp>;
57
+ export default Cmp;
@@ -0,0 +1,2 @@
1
+ export { default as Textarea } from './cmp.textarea.svelte';
2
+ export { default as TextareaValidatable } from './cmp.textarea-validatable.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Textarea } from './cmp.textarea.svelte';
2
+ export { default as TextareaValidatable } from './cmp.textarea-validatable.svelte';
@@ -1,7 +1,9 @@
1
1
  import { type DialogController } from '../dialog';
2
2
  import type { MediaViewerData } from './types';
3
3
  type Props = {
4
+ /** Dialog controller instance */
4
5
  controller: DialogController;
6
+ /** Media items and viewer configuration */
5
7
  data: MediaViewerData;
6
8
  };
7
9
  declare const Cmp: import("svelte").Component<Props, {}, "">;
@@ -9,6 +9,7 @@ import type { MediaViewerData } from './types';
9
9
  * - `index` — zero-based index of the initially visible item
10
10
  * - `backgroundOpacity` — backdrop opacity (default `0.6`)
11
11
  * - `carouselMode` — carousel navigation mode (default `'arrows-with-counts'`)
12
+ * - `host` — mount target for the dialog element (default `document.body`)
12
13
  */
13
- export declare const openMediaViewer: (data: MediaViewerData) => Promise<DialogResult<void>>;
14
+ export declare const openMediaViewer: (data: MediaViewerData, host?: ParentNode) => Promise<DialogResult<void>>;
14
15
  export type { MediaViewerData, MediaViewerItem, MediaViewerItemType } from './types';
@@ -9,10 +9,12 @@ import { default as MediaViewerDialog } from './cmp.media-viewer-dialog.svelte';
9
9
  * - `index` — zero-based index of the initially visible item
10
10
  * - `backgroundOpacity` — backdrop opacity (default `0.6`)
11
11
  * - `carouselMode` — carousel navigation mode (default `'arrows-with-counts'`)
12
+ * - `host` — mount target for the dialog element (default `document.body`)
12
13
  */
13
- export const openMediaViewer = (data) => {
14
+ export const openMediaViewer = (data, host) => {
14
15
  return Dialogs.open({
15
16
  view: MediaViewerDialog,
16
- data
17
+ data,
18
+ host
17
19
  });
18
20
  };
@@ -0,0 +1,282 @@
1
+ @use 'styles/colors';
2
+ @use 'styles/functions';
3
+ @use 'styles/mixins';
4
+
5
+ @mixin multiselect {
6
+ --_multiselect--root--font-size: var(--sc-kit--multiselect--root--font-size, 1rem);
7
+ --_multiselect--height: var(--sc-kit--multiselect--height, #{functions.em(32)});
8
+ --_multiselect--width: var(--sc-kit--multiselect--width, 100%);
9
+ --_multiselect--background: var(--sc-kit--multiselect--background, light-dark(#{colors.$color-white}, #{colors.$color-gray-900}));
10
+ --_multiselect--background--disabled: var(--sc-kit--multiselect--background--disabled, light-dark(#{colors.$color-neutral-50}, #{colors.$color-neutral-800}));
11
+ --_multiselect--border-color: var(--sc-kit--multiselect--border-color, light-dark(#{colors.$color-neutral-300}, #{colors.$color-neutral-600}));
12
+ --_multiselect--border-radius: var(--sc-kit--multiselect--border-radius, #{functions.em(4)});
13
+ --_multiselect--text--font-size: var(--sc-kit--multiselect--text--font-size, #{functions.em(14)});
14
+ --_multiselect--text--color: var(--sc-kit--multiselect--text--color, light-dark(#{colors.$color-gray-800}, #{colors.$color-white}));
15
+ --_multiselect--placeholder--color: var(--sc-kit--multiselect--placeholder--color, var(--_multiselect--border-color));
16
+ --_multiselect--icon--color: var(--sc-kit--multiselect--icon--color, var(--_multiselect--border-color));
17
+ --_multiselect--padding-inline: var(--sc-kit--multiselect--padding-inline, #{functions.em(8)});
18
+ --_multiselect--padding-block: var(--sc-kit--multiselect--padding-block, #{functions.em(4)});
19
+
20
+ --_multiselect--options--max-height: var(--sc-kit--multiselect--options--max-height, #{functions.em(320)});
21
+ --_multiselect--item--hover--background: var(
22
+ --sc-kit--multiselect--item--hover--background,
23
+ light-dark(#{colors.$color-gray-100}, #{colors.$color-gray-800})
24
+ );
25
+ --_multiselect--item--active--background: var(
26
+ --sc-kit--multiselect--item--active--background,
27
+ light-dark(#{colors.$color-neutral-50}, #{colors.$color-neutral-700})
28
+ );
29
+
30
+ --_multiselect--tag--color: var(--sc-kit--multiselect--tag--color, var(--_multiselect--text--color));
31
+ --_multiselect--tag--background: var(--sc-kit--multiselect--tag--background, var(--_multiselect--background));
32
+ --_multiselect--tag--border-color: var(--sc-kit--multiselect--tag--border-color, var(--_multiselect--border-color));
33
+ --_multiselect--tag--border-radius: var(--sc-kit--multiselect--tag--border-radius, var(--_multiselect--border-radius));
34
+ --_multiselect--tag--font-size: var(--sc-kit--multiselect--tag--font-size, calc(var(--_multiselect--text--font-size) * 0.9));
35
+ --_multiselect--tag--padding-inline: var(--sc-kit--multiselect--tag--padding-inline, var(--_multiselect--padding-inline));
36
+ --_multiselect--tag--padding-block: var(--sc-kit--multiselect--tag--padding-block, var(--_multiselect--padding-block));
37
+
38
+ --_multiselect--chevron--pointer-events: var(--sc-kit--multiselect--chevron--pointer-events, none);
39
+
40
+ --_multiselect--group-header--color: var(--sc-kit--multiselect--group-header--color, var(--_multiselect--placeholder--color));
41
+ --_multiselect--group-header--font-weight: var(--sc-kit--multiselect--group-header--font-weight, 500);
42
+ --_multiselect--group-item--padding-left: var(--sc-kit--multiselect--group-item--padding-left, #{functions.em(16)});
43
+
44
+ --_multiselect--inline--tag--background: var(
45
+ --sc-kit--multiselect--inline--tag--background,
46
+ light-dark(#{colors.$color-neutral-100}, #{colors.$color-neutral-700})
47
+ );
48
+
49
+ // svelte-select CSS variable mappings
50
+ --background: var(--_multiselect--background);
51
+ --border: 1px solid var(--_multiselect--border-color);
52
+ --border-focused: var(--border);
53
+ --border-hover: var(--border);
54
+ --border-radius: var(--_multiselect--border-radius);
55
+ --border-radius-focused: var(--border-radius);
56
+ --box-sizing: border-box;
57
+ --chevron-background: transparent;
58
+ --chevron-border: transparent;
59
+ --chevron-color: transparent;
60
+ --chevron-height: auto;
61
+ --chevron-pointer-events: var(--_multiselect--chevron--pointer-events);
62
+ --chevron-width: auto;
63
+ --disabled-background: var(--_multiselect--background--disabled);
64
+ --disabled-border-color: var(--_multiselect--border-color);
65
+ --disabled-color: var(--_multiselect--text--color);
66
+ --disabled-placeholder-color: var(--placeholder-color);
67
+ --disabled-placeholder-opacity: var(--placeholder-opacity);
68
+ --font-size: var(--_multiselect--text--font-size);
69
+ --height: var(--_multiselect--height);
70
+ --icons-color: var(--_multiselect--icon--color);
71
+ --indicators-bottom: auto;
72
+ --indicators-position: static;
73
+ --indicators-right: auto;
74
+ --indicators-top: auto;
75
+ --input--color: var(--_multiselect--text--color);
76
+ --input-left: 0;
77
+ --input-letter-spacing: 1;
78
+ --input-margin: 0;
79
+ --input-padding: 0 var(--_multiselect--padding-inline) 0 0;
80
+ --item-active-background: var(--_multiselect--item--active--background);
81
+ --item-color: var(--_multiselect--text--color);
82
+ --item-first-border-radius: 0;
83
+ --item-height: auto;
84
+ --item-hover-bg: var(--_multiselect--item--hover--background);
85
+ --item-hover-color: var(--_multiselect--text--color);
86
+ --item-is-active-bg: var(--_multiselect--item--active--background);
87
+ --item-is-active-color: var(--_multiselect--text--color);
88
+ --item-is-not-selectable-color: var(--_multiselect--group-header--color);
89
+ --item-line-height: 1;
90
+ --item-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
91
+ --item-transition: auto;
92
+ --list-background: var(--background);
93
+ --list-border: var(--border);
94
+ --list-border-radius: var(--border-radius);
95
+ --list-max-height: var(--_multiselect--options--max-height);
96
+ --list-position: absolute;
97
+ --list-shadow: none;
98
+ --list-z-index: 2;
99
+ --loading--margin: 0;
100
+ --loading-color: var(--icons-color);
101
+ --loading-height: max-content;
102
+ --loading-width: max-content;
103
+ --margin: 0;
104
+ --max-height: var(--height);
105
+ --multi-item-active-outline: none;
106
+ --multi-item-bg: transparent;
107
+ --multi-item-border-radius: 0;
108
+ --multi-item-clear-icon-color: transparent;
109
+ --multi-item-color: transparent;
110
+ --multi-item-gap: 0;
111
+ --multi-item-height: 0;
112
+ --multi-item-margin: 0;
113
+ --multi-item-outline: none;
114
+ --multi-item-padding: 0;
115
+ --multi-max-width: 0;
116
+ --multi-select-input-margin: 0;
117
+ --multi-select-input-padding: 0;
118
+ --multi-select-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline) var(--_multiselect--padding-block) 0;
119
+ --padding: 0;
120
+ --placeholder-color: var(--_multiselect--placeholder--color);
121
+ --placeholder-opacity: 0.8;
122
+ --selected-item-color: auto;
123
+ --selected-item-overflow: auto;
124
+ --selected-item-padding: auto;
125
+ --spinner-color: var(--icons-color);
126
+ --spinner-height: var(--_multiselect--text--font-size);
127
+ --spinner-width: var(--_multiselect--text--font-size);
128
+ --value-container-overflow: hidden;
129
+ --value-container-padding: 0 var(--_multiselect--padding-inline) 0 0;
130
+ --width: var(--_multiselect--width);
131
+ --group-title-color: var(--_multiselect--group-header--color);
132
+ --group-title-font-weight: var(--_multiselect--group-header--font-weight);
133
+ --group-title-font-size: var(--_multiselect--text--font-size);
134
+ --group-title-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
135
+ --group-item-padding-left: var(--_multiselect--group-item--padding-left);
136
+
137
+ font-size: var(--_multiselect--root--font-size);
138
+ width: var(--_multiselect--width);
139
+ position: relative;
140
+
141
+ &__icon {
142
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
143
+ --sc-kit--icon--size: 1.25em;
144
+ display: flex;
145
+ align-items: center;
146
+
147
+ &--prepend {
148
+ padding: 0 var(--_multiselect--padding-inline);
149
+
150
+ :global &:not(:has(*)) {
151
+ padding-right: 0 !important;
152
+ }
153
+ }
154
+ }
155
+
156
+ &__option {
157
+ font-size: var(--_multiselect--text--font-size);
158
+ }
159
+
160
+ &__selection {
161
+ font-size: var(--_multiselect--tag--font-size);
162
+ @include mixins.width(100%);
163
+ @include mixins.height(100%);
164
+ display: flex;
165
+ align-items: center;
166
+ min-width: 0;
167
+ }
168
+
169
+ &__selection-text {
170
+ @include mixins.ellipsis;
171
+ }
172
+
173
+ &__no-options {
174
+ color: var(--_multiselect--placeholder--color);
175
+ padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline);
176
+ }
177
+
178
+ &--disabled {
179
+ cursor: default;
180
+ pointer-events: none;
181
+ }
182
+
183
+ &--loading {
184
+ pointer-events: none;
185
+
186
+ &::after {
187
+ content: '';
188
+ position: absolute;
189
+ top: 0;
190
+ left: 0;
191
+ width: 100%;
192
+ height: 100%;
193
+ background: light-dark(hsl(0, 0%, 97%), hsl(0, 0%, 3%));
194
+ opacity: 0.5;
195
+ }
196
+ }
197
+
198
+ :global(.value-container) {
199
+ gap: 0 !important;
200
+ }
201
+
202
+ &--inline {
203
+ --max-height: auto;
204
+ --multi-item-active-outline: none;
205
+ --multi-item-bg: var(--_multiselect--inline--tag--background);
206
+ --multi-item-border-radius: var(--_multiselect--border-radius);
207
+ --multi-item-clear-icon-color: var(--_multiselect--icon--color);
208
+ --multi-item-color: var(--_multiselect--text--color);
209
+ --multi-item-gap: var(--_multiselect--padding-inline);
210
+ --multi-item-height: calc(var(--_multiselect--height) - 2 * var(--_multiselect--padding-block));
211
+ --multi-item-margin: 0;
212
+ --multi-item-outline: 1px solid var(--_multiselect--border-color);
213
+ --multi-item-padding: var(--_multiselect--tag--padding-block) var(--_multiselect--tag--padding-inline);
214
+ --multi-max-width: #{functions.em(150)};
215
+ --multi-select-input-margin: 0;
216
+ --multi-select-input-padding: 0;
217
+ --multi-select-padding: var(--_multiselect--padding-block) var(--_multiselect--padding-inline) var(--_multiselect--padding-block) 0;
218
+
219
+ :global(.value-container) {
220
+ gap: #{functions.em(4)} !important;
221
+ }
222
+ }
223
+
224
+ &--inline-full-item {
225
+ --multi-max-width: none;
226
+ }
227
+
228
+ &--list-hidden {
229
+ --list-border: none;
230
+ }
231
+ }
232
+
233
+ @mixin multiselect-tags {
234
+ @include mixins.no-select;
235
+ display: flex;
236
+ flex-wrap: wrap;
237
+ gap: #{functions.em(4)};
238
+ margin-bottom: #{functions.em(4)};
239
+ min-width: 0;
240
+ width: 100%;
241
+
242
+ &__item {
243
+ display: flex;
244
+ gap: #{functions.em(6)};
245
+ vertical-align: middle;
246
+ border: 1px solid var(--_multiselect--tag--border-color);
247
+ font-size: var(--_multiselect--tag--font-size);
248
+ padding: var(--_multiselect--tag--padding-block) var(--_multiselect--tag--padding-inline);
249
+ color: var(--_multiselect--tag--color);
250
+ background: var(--_multiselect--tag--background);
251
+ border-radius: var(--_multiselect--tag--border-radius);
252
+ max-width: 100%;
253
+ }
254
+
255
+ &__item-text {
256
+ @include mixins.ellipsis;
257
+ }
258
+
259
+ &__deselect {
260
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
261
+ --sc-kit--icon--size: #{functions.rem(20)};
262
+ cursor: pointer;
263
+ display: flex;
264
+ align-items: center;
265
+ }
266
+
267
+ &__drag-handle {
268
+ --sc-kit--icon--color: var(--_multiselect--icon--color);
269
+ --sc-kit--icon--size: #{functions.rem(16)};
270
+ cursor: grab;
271
+ display: flex;
272
+ align-items: center;
273
+ font-size: 0.7em;
274
+ user-select: none;
275
+ }
276
+ }
277
+
278
+ @mixin multiselect-tags-others {
279
+ color: var(--_multiselect--placeholder--color);
280
+ font-size: var(--_multiselect--tag--font-size);
281
+ padding: var(--_multiselect--tag--padding-block) 0;
282
+ }