flowbite-svelte 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion/AccordionItem.svelte +15 -1
- package/dist/alert/Alert.svelte +15 -2
- package/dist/badge/Badge.svelte +19 -2
- package/dist/banner/Banner.svelte +16 -1
- package/dist/bottom-navigation/BottomNavItem.svelte +7 -1
- package/dist/breadcrumb/BreadcrumbItem.svelte +3 -1
- package/dist/carousel/Carousel.svelte +35 -4
- package/dist/datepicker/Datepicker.svelte +69 -6
- package/dist/device-mockups/Android.svelte +5 -1
- package/dist/device-mockups/DefaultMockup.svelte +5 -1
- package/dist/device-mockups/Ios.svelte +5 -1
- package/dist/device-mockups/Laptop.svelte +5 -1
- package/dist/device-mockups/Smartwatch.svelte +5 -1
- package/dist/device-mockups/Tablet.svelte +5 -1
- package/dist/dialog/Dialog.svelte +38 -7
- package/dist/drawer/Drawer.svelte +29 -2
- package/dist/forms/button-toggle/ButtonToggle.svelte +9 -1
- package/dist/forms/button-toggle/ButtonToggleGroup.svelte +14 -1
- package/dist/forms/button-toggle/CheckIcon.svelte +13 -1
- package/dist/forms/checkbox/Checkbox.svelte +18 -1
- package/dist/forms/fileupload/Fileupload.svelte +14 -1
- package/dist/forms/floating-label/FloatingLabelInput.svelte +48 -5
- package/dist/forms/input-addon/InputAddon.svelte +12 -1
- package/dist/forms/input-field/Input.svelte +60 -9
- package/dist/forms/phoneinput/PhoneInput.svelte +14 -2
- package/dist/forms/phoneinput/PhoneInput.svelte.d.ts +1 -1
- package/dist/forms/radio/Radio.svelte +14 -1
- package/dist/forms/search/Search.svelte +16 -1
- package/dist/forms/select/MultiSelect.svelte +10 -1
- package/dist/forms/select/Select.svelte +20 -1
- package/dist/forms/tags/Tags.svelte +35 -11
- package/dist/forms/textarea/Textarea.svelte +27 -2
- package/dist/forms/textarea/theme.js +3 -1
- package/dist/forms/timepicker/Timepicker.svelte +143 -13
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/kanban/KanbanBoard.svelte +98 -0
- package/dist/kanban/KanbanBoard.svelte.d.ts +4 -0
- package/dist/kanban/KanbanCard.svelte +58 -0
- package/dist/kanban/KanbanCard.svelte.d.ts +16 -0
- package/dist/kanban/index.d.ts +3 -0
- package/dist/kanban/index.js +3 -0
- package/dist/kanban/theme.d.ts +108 -0
- package/dist/kanban/theme.js +43 -0
- package/dist/mega-menu/MegaMenu.svelte +1 -8
- package/dist/modal/Modal.svelte +30 -2
- package/dist/navbar/NavHamburger.svelte +1 -1
- package/dist/navbar/NavLi.svelte +3 -1
- package/dist/navbar/NavUl.svelte +14 -1
- package/dist/pagination/theme.js +4 -1
- package/dist/popover/Popover.svelte +13 -1
- package/dist/progress/Progressbar.svelte +14 -1
- package/dist/progress/Progressradial.svelte +28 -2
- package/dist/rating/AdvancedRating.svelte +5 -1
- package/dist/rating/CustomIcon.svelte +13 -1
- package/dist/rating/Heart.svelte +19 -2
- package/dist/rating/Review.svelte +6 -3
- package/dist/rating/Review.svelte.d.ts +0 -1
- package/dist/rating/Star.svelte +12 -1
- package/dist/rating/Thumbup.svelte +19 -2
- package/dist/sidebar/Sidebar.svelte +30 -2
- package/dist/sidebar/SidebarButton.svelte +5 -1
- package/dist/sidebar/SidebarDropdownWrapper.svelte +18 -1
- package/dist/skeleton/CardPlaceholder.svelte +8 -2
- package/dist/skeleton/ImagePlaceholder.svelte +3 -1
- package/dist/skeleton/TestimonialPlaceholder.svelte +5 -1
- package/dist/skeleton/VideoPlaceholder.svelte +3 -1
- package/dist/speed-dial/SpeedDial.svelte +13 -1
- package/dist/speed-dial/SpeedDialButton.svelte +12 -1
- package/dist/spinner/Spinner.svelte +8 -2
- package/dist/step-indicator/StepIndicator.svelte +14 -2
- package/dist/stepper/DetailedStepper.svelte +1 -1
- package/dist/stepper/ProgressStepper.svelte +3 -1
- package/dist/stepper/TimelineStepper.svelte +3 -1
- package/dist/stepper/VerticalStepper.svelte +1 -1
- package/dist/table/TableSearch.svelte +26 -2
- package/dist/theme/themeUtils.js +3 -1
- package/dist/theme/themes.d.ts +1 -0
- package/dist/theme/themes.js +1 -0
- package/dist/timeline/GroupItem.svelte +10 -2
- package/dist/timeline/TimelineItem.svelte +24 -2
- package/dist/toast/Toast.svelte +17 -2
- package/dist/tooltip/Tooltip.svelte +12 -4
- package/dist/types.d.ts +27 -1
- package/dist/typography/paragraph/P.svelte +14 -1
- package/dist/utils/CloseButton.svelte +10 -2
- package/dist/utils/Popper.svelte +38 -2
- package/dist/virtuallist/VirtualList.svelte +8 -1
- package/package.json +12 -4
|
@@ -7,9 +7,36 @@
|
|
|
7
7
|
import { getTheme, warnThemeDeprecation } from "../../theme/themeUtils";
|
|
8
8
|
import { createDismissableContext } from "../../utils/dismissable";
|
|
9
9
|
|
|
10
|
-
let {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
let {
|
|
11
|
+
children,
|
|
12
|
+
id = idGenerator(),
|
|
13
|
+
value = $bindable(),
|
|
14
|
+
elementRef = $bindable(),
|
|
15
|
+
variant = "standard",
|
|
16
|
+
size = "default",
|
|
17
|
+
color = "default",
|
|
18
|
+
class: className,
|
|
19
|
+
classes,
|
|
20
|
+
inputClass,
|
|
21
|
+
labelClass,
|
|
22
|
+
clearable,
|
|
23
|
+
clearableSvgClass,
|
|
24
|
+
clearableColor = "none",
|
|
25
|
+
clearableClass,
|
|
26
|
+
clearableOnClick,
|
|
27
|
+
data = [],
|
|
28
|
+
maxSuggestions = 5,
|
|
29
|
+
onSelect,
|
|
30
|
+
comboClass,
|
|
31
|
+
placeholder,
|
|
32
|
+
...restProps
|
|
33
|
+
}: FloatingLabelInputProps = $props();
|
|
34
|
+
|
|
35
|
+
warnThemeDeprecation(
|
|
36
|
+
"FloatingLabelInput",
|
|
37
|
+
{ inputClass, labelClass, clearableSvgClass, clearableClass, comboClass },
|
|
38
|
+
{ inputClass: "input", labelClass: "label", clearableSvgClass: "svg", clearableClass: "close", comboClass: "combo" }
|
|
39
|
+
);
|
|
13
40
|
const styling = $derived(classes ?? { input: inputClass, label: labelClass, svg: clearableSvgClass, close: clearableClass, combo: comboClass });
|
|
14
41
|
|
|
15
42
|
const theme = getTheme("floatingLabelInput");
|
|
@@ -145,7 +172,18 @@
|
|
|
145
172
|
{/if}
|
|
146
173
|
|
|
147
174
|
<div class={base({ class: clsx(isCombobox ? "relative" : "", theme?.base, className) })}>
|
|
148
|
-
<input
|
|
175
|
+
<input
|
|
176
|
+
{id}
|
|
177
|
+
placeholder=" "
|
|
178
|
+
bind:value
|
|
179
|
+
bind:this={elementRef}
|
|
180
|
+
{...restProps}
|
|
181
|
+
class={input({ class: clsx(theme?.input, styling.input) })}
|
|
182
|
+
oninput={handleInput}
|
|
183
|
+
onfocus={handleFocus}
|
|
184
|
+
onblur={handleBlur}
|
|
185
|
+
onkeydown={handleKeydown}
|
|
186
|
+
/>
|
|
149
187
|
{#if value !== undefined && value !== "" && clearable}
|
|
150
188
|
<CloseButton class={close({ class: clsx(theme?.close, styling.close) })} color={clearableColor} aria-label="Clear search value" svgClass={clsx(styling.svg)} />
|
|
151
189
|
{/if}
|
|
@@ -156,7 +194,12 @@
|
|
|
156
194
|
{#if isCombobox && isFocused && filteredSuggestions.length > 0}
|
|
157
195
|
<div class={combo({ class: clsx(theme?.combo, styling.combo) })}>
|
|
158
196
|
{#each filteredSuggestions as item, i}
|
|
159
|
-
<button
|
|
197
|
+
<button
|
|
198
|
+
type="button"
|
|
199
|
+
class="w-full px-3 py-2 text-left {i === selectedIndex ? 'bg-gray-100 dark:bg-gray-700' : 'hover:bg-gray-50 dark:hover:bg-gray-700'} focus:outline-none"
|
|
200
|
+
onclick={() => selectItem(item)}
|
|
201
|
+
onmouseenter={() => (selectedIndex = i)}
|
|
202
|
+
>
|
|
160
203
|
{item}
|
|
161
204
|
</button>
|
|
162
205
|
{/each}
|
|
@@ -31,7 +31,18 @@
|
|
|
31
31
|
// size: explicit, inherited, default
|
|
32
32
|
let _size = size || clampSize(group?.size) || "md";
|
|
33
33
|
|
|
34
|
-
let divClass: string = clsx(
|
|
34
|
+
let divClass: string = clsx(
|
|
35
|
+
textSizes[_size],
|
|
36
|
+
prefixPadding[_size],
|
|
37
|
+
"text-gray-500 bg-gray-200",
|
|
38
|
+
background ? darkBgClasses.tinted : darkBgClasses.base,
|
|
39
|
+
background ? divider.tinted : divider.base,
|
|
40
|
+
background ? borderClasses["tinted"] : borderClasses["base"],
|
|
41
|
+
"inline-flex items-center border",
|
|
42
|
+
group && "not-first:-ms-px",
|
|
43
|
+
"first:rounded-s-lg last:rounded-e-lg",
|
|
44
|
+
className
|
|
45
|
+
);
|
|
35
46
|
</script>
|
|
36
47
|
|
|
37
48
|
<div {...restProps} class={divClass}>
|
|
@@ -8,10 +8,47 @@
|
|
|
8
8
|
import { getTheme, warnThemeDeprecation } from "../../theme/themeUtils";
|
|
9
9
|
import { createDismissableContext } from "../../utils/dismissable";
|
|
10
10
|
|
|
11
|
-
let {
|
|
11
|
+
let {
|
|
12
|
+
children,
|
|
13
|
+
left,
|
|
14
|
+
right,
|
|
15
|
+
value = $bindable(),
|
|
16
|
+
elementRef = $bindable(),
|
|
17
|
+
clearable = false,
|
|
18
|
+
size,
|
|
19
|
+
color = "default",
|
|
20
|
+
class: className,
|
|
21
|
+
classes,
|
|
22
|
+
wrapperClass,
|
|
23
|
+
leftClass,
|
|
24
|
+
rightClass,
|
|
25
|
+
divClass,
|
|
26
|
+
clearableSvgClass,
|
|
27
|
+
clearableColor = "none",
|
|
28
|
+
clearableClass,
|
|
29
|
+
clearableOnClick,
|
|
30
|
+
data = [],
|
|
31
|
+
maxSuggestions = 5,
|
|
32
|
+
onSelect,
|
|
33
|
+
comboClass,
|
|
34
|
+
comboItemClass,
|
|
35
|
+
onInput,
|
|
36
|
+
onFocus,
|
|
37
|
+
onBlur,
|
|
38
|
+
onKeydown,
|
|
39
|
+
oninput,
|
|
40
|
+
onfocus,
|
|
41
|
+
onblur,
|
|
42
|
+
onkeydown,
|
|
43
|
+
...restProps
|
|
44
|
+
}: InputProps<InputValue> = $props();
|
|
12
45
|
|
|
13
46
|
// input, left, right, close, combo, comboItem, div, svg
|
|
14
|
-
warnThemeDeprecation(
|
|
47
|
+
warnThemeDeprecation(
|
|
48
|
+
"Input",
|
|
49
|
+
{ wrapperClass, leftClass, rightClass, divClass, clearableSvgClass, clearableClass, comboClass },
|
|
50
|
+
{ wrapperClass: "wrapper", leftClass: "left", rightClass: "right", divClass: "div", clearableSvgClass: "svg", clearableClass: "close", comboClass: "comboItem" }
|
|
51
|
+
);
|
|
15
52
|
|
|
16
53
|
const styling = $derived(classes ?? { left: leftClass, right: rightClass, div: divClass, svg: clearableSvgClass, close: clearableClass, combo: comboClass, comboItem: comboItemClass });
|
|
17
54
|
|
|
@@ -103,7 +140,7 @@
|
|
|
103
140
|
}
|
|
104
141
|
});
|
|
105
142
|
|
|
106
|
-
function defaultHandleInput(
|
|
143
|
+
function defaultHandleInput(_event: Event) {
|
|
107
144
|
// Ensure value is treated as a string to safely check its length
|
|
108
145
|
const currentValueAsString = String(value || "");
|
|
109
146
|
if (currentValueAsString.length > 0) {
|
|
@@ -112,12 +149,12 @@
|
|
|
112
149
|
updateSuggestions();
|
|
113
150
|
}
|
|
114
151
|
|
|
115
|
-
function defaultHandleFocus(
|
|
152
|
+
function defaultHandleFocus() {
|
|
116
153
|
isFocused = true;
|
|
117
154
|
updateSuggestions();
|
|
118
155
|
}
|
|
119
156
|
|
|
120
|
-
function defaultHandleBlur(
|
|
157
|
+
function defaultHandleBlur() {
|
|
121
158
|
// Small delay to allow click on suggestion to fire first
|
|
122
159
|
setTimeout(() => {
|
|
123
160
|
isFocused = false;
|
|
@@ -174,14 +211,14 @@
|
|
|
174
211
|
if (resolvedOnFocus) {
|
|
175
212
|
resolvedOnFocus(event);
|
|
176
213
|
}
|
|
177
|
-
defaultHandleFocus(
|
|
214
|
+
defaultHandleFocus();
|
|
178
215
|
}
|
|
179
216
|
|
|
180
217
|
function handleBlur(event: FocusEvent) {
|
|
181
218
|
if (resolvedOnBlur) {
|
|
182
219
|
resolvedOnBlur(event);
|
|
183
220
|
}
|
|
184
|
-
defaultHandleBlur(
|
|
221
|
+
defaultHandleBlur();
|
|
185
222
|
}
|
|
186
223
|
|
|
187
224
|
function handleKeydown(event: KeyboardEvent) {
|
|
@@ -235,7 +272,12 @@
|
|
|
235
272
|
{#if isCombobox && isFocused && filteredSuggestions.length > 0}
|
|
236
273
|
<div class={combo({ class: clsx(theme?.combo, styling.combo) })}>
|
|
237
274
|
{#each filteredSuggestions as item, i (item)}
|
|
238
|
-
<button
|
|
275
|
+
<button
|
|
276
|
+
type="button"
|
|
277
|
+
class="w-full px-3 py-2 text-left {i === selectedIndex ? 'bg-gray-100 dark:bg-gray-700' : 'hover:bg-gray-50 dark:hover:bg-gray-700'} focus:outline-none"
|
|
278
|
+
onclick={() => selectItem(item)}
|
|
279
|
+
onmouseenter={() => (selectedIndex = i)}
|
|
280
|
+
>
|
|
239
281
|
<p class={comboItem({ class: clsx(theme?.comboItem, styling.comboItem) })}>{item}</p>
|
|
240
282
|
</button>
|
|
241
283
|
{/each}
|
|
@@ -250,7 +292,16 @@
|
|
|
250
292
|
{#if children}
|
|
251
293
|
{@render children({ ...restProps, class: inputCls() })}
|
|
252
294
|
{:else}
|
|
253
|
-
<input
|
|
295
|
+
<input
|
|
296
|
+
{...restProps}
|
|
297
|
+
bind:value
|
|
298
|
+
bind:this={elementRef}
|
|
299
|
+
oninput={handleInput}
|
|
300
|
+
onfocus={handleFocus}
|
|
301
|
+
onblur={handleBlur}
|
|
302
|
+
onkeydown={handleKeydown}
|
|
303
|
+
class={[wrapped || base(), inputCls({ class: clsx(theme?.input, className) })]}
|
|
304
|
+
/>
|
|
254
305
|
{#if value !== undefined && value !== "" && clearable}
|
|
255
306
|
<CloseButton class={close({ class: clsx(theme?.close, styling.close) })} color={clearableColor} aria-label="Clear search value" svgClass={clsx(styling.svg)} />
|
|
256
307
|
{/if}
|
|
@@ -4,7 +4,17 @@
|
|
|
4
4
|
import clsx from "clsx";
|
|
5
5
|
import { getTheme } from "../../theme/themeUtils";
|
|
6
6
|
|
|
7
|
-
let {
|
|
7
|
+
let {
|
|
8
|
+
children,
|
|
9
|
+
phoneIcon = true,
|
|
10
|
+
pattern = "[0-9]{3}-[0-9]{3}-[0-9]{4}",
|
|
11
|
+
phoneType = "default",
|
|
12
|
+
floatingLabel = "Phone number",
|
|
13
|
+
labelFor = "floating-phone-number",
|
|
14
|
+
class: className,
|
|
15
|
+
classes,
|
|
16
|
+
...restProps
|
|
17
|
+
}: PhoneInputProps = $props();
|
|
8
18
|
|
|
9
19
|
const theme = getTheme("phoneInput");
|
|
10
20
|
|
|
@@ -13,7 +23,9 @@
|
|
|
13
23
|
|
|
14
24
|
{#snippet phoneIconSnippet()}
|
|
15
25
|
<svg class={svg({ class: clsx(theme?.svg) })} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 19 18">
|
|
16
|
-
<path
|
|
26
|
+
<path
|
|
27
|
+
d="M18 13.446a3.02 3.02 0 0 0-.946-1.985l-1.4-1.4a3.054 3.054 0 0 0-4.218 0l-.7.7a.983.983 0 0 1-1.39 0l-2.1-2.1a.983.983 0 0 1 0-1.389l.7-.7a2.98 2.98 0 0 0 0-4.217l-1.4-1.4a2.824 2.824 0 0 0-4.218 0c-3.619 3.619-3 8.229 1.752 12.979C6.785 16.639 9.45 18 11.912 18a7.175 7.175 0 0 0 5.139-2.325A2.9 2.9 0 0 0 18 13.446Z"
|
|
28
|
+
/>
|
|
17
29
|
</svg>
|
|
18
30
|
{/snippet}
|
|
19
31
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { PhoneInputProps } from "../..";
|
|
2
|
-
declare const PhoneInput: import("svelte").Component<PhoneInputProps
|
|
2
|
+
declare const PhoneInput: import("svelte").Component<PhoneInputProps, {}, "">;
|
|
3
3
|
type PhoneInput = ReturnType<typeof PhoneInput>;
|
|
4
4
|
export default PhoneInput;
|
|
@@ -7,7 +7,20 @@
|
|
|
7
7
|
import { getTheme, warnThemeDeprecation } from "../../theme/themeUtils";
|
|
8
8
|
|
|
9
9
|
// remove inputClass in next major version
|
|
10
|
-
let {
|
|
10
|
+
let {
|
|
11
|
+
children,
|
|
12
|
+
"aria-describedby": ariaDescribedby,
|
|
13
|
+
inline = false,
|
|
14
|
+
labelClass,
|
|
15
|
+
color = "primary",
|
|
16
|
+
custom = false,
|
|
17
|
+
group = $bindable<T>(),
|
|
18
|
+
value = $bindable<T>(),
|
|
19
|
+
class: className,
|
|
20
|
+
inputClass,
|
|
21
|
+
classes,
|
|
22
|
+
...restProps
|
|
23
|
+
}: RadioProps<T> = $props();
|
|
11
24
|
|
|
12
25
|
warnThemeDeprecation("Radio", { inputClass, labelClass }, { inputClass: "class", labelClass: "label" });
|
|
13
26
|
const styling = $derived(classes ?? { label: labelClass });
|
|
@@ -6,7 +6,22 @@
|
|
|
6
6
|
import { getTheme, warnThemeDeprecation } from "../../theme/themeUtils";
|
|
7
7
|
import { createDismissableContext } from "../../utils/dismissable";
|
|
8
8
|
|
|
9
|
-
let {
|
|
9
|
+
let {
|
|
10
|
+
children,
|
|
11
|
+
inputClass,
|
|
12
|
+
size,
|
|
13
|
+
placeholder = "Search",
|
|
14
|
+
value = $bindable(),
|
|
15
|
+
elementRef = $bindable(),
|
|
16
|
+
clearable = false,
|
|
17
|
+
clearableSvgClass,
|
|
18
|
+
clearableColor = "none",
|
|
19
|
+
clearableClass,
|
|
20
|
+
clearableOnClick,
|
|
21
|
+
class: className,
|
|
22
|
+
classes,
|
|
23
|
+
...restProps
|
|
24
|
+
}: SearchProps = $props();
|
|
10
25
|
|
|
11
26
|
warnThemeDeprecation("Search", { inputClass, clearableSvgClass, clearableClass }, { inputClass: "input", clearableSvgClass: "svg", clearableClass: "close" });
|
|
12
27
|
const styling = $derived(classes ?? { input: inputClass, svg: clearableSvgClass, close: clearableClass });
|
|
@@ -203,7 +203,16 @@
|
|
|
203
203
|
{/each}
|
|
204
204
|
</select>
|
|
205
205
|
|
|
206
|
-
<div
|
|
206
|
+
<div
|
|
207
|
+
bind:this={multiSelectContainer}
|
|
208
|
+
{...restProps}
|
|
209
|
+
onclick={toggleDropdown}
|
|
210
|
+
onblur={handleBlur}
|
|
211
|
+
onkeydown={handleKeyDown}
|
|
212
|
+
tabindex="0"
|
|
213
|
+
role="listbox"
|
|
214
|
+
class={base({ size, class: clsx(theme?.base, className) })}
|
|
215
|
+
>
|
|
207
216
|
{#if !selectItems.length}
|
|
208
217
|
<span class={placeholderSpan({ class: clsx(classes?.placeholder) })}>{placeholder}</span>
|
|
209
218
|
{/if}
|
|
@@ -7,7 +7,26 @@
|
|
|
7
7
|
import { createDismissableContext } from "../../utils/dismissable";
|
|
8
8
|
import { getContext } from "svelte";
|
|
9
9
|
|
|
10
|
-
let {
|
|
10
|
+
let {
|
|
11
|
+
children,
|
|
12
|
+
items,
|
|
13
|
+
value = $bindable(),
|
|
14
|
+
elementRef = $bindable(),
|
|
15
|
+
underline,
|
|
16
|
+
size = "md",
|
|
17
|
+
disabled,
|
|
18
|
+
placeholder = "Choose option ...",
|
|
19
|
+
clearable,
|
|
20
|
+
clearableColor = "none",
|
|
21
|
+
clearableOnClick,
|
|
22
|
+
onClear,
|
|
23
|
+
clearableSvgClass,
|
|
24
|
+
clearableClass,
|
|
25
|
+
selectClass,
|
|
26
|
+
class: className,
|
|
27
|
+
classes,
|
|
28
|
+
...restProps
|
|
29
|
+
}: SelectProps<T> = $props();
|
|
11
30
|
|
|
12
31
|
// clearableSvgClass, clearableClass, selectClass
|
|
13
32
|
warnThemeDeprecation("Select", { selectClass, clearableSvgClass, clearableClass }, { selectClass: "select", clearableSvgClass: "svg", clearableClass: "close" });
|
|
@@ -8,7 +8,25 @@
|
|
|
8
8
|
import { computePosition, offset, flip, shift, autoUpdate } from "@floating-ui/dom";
|
|
9
9
|
import { onDestroy } from "svelte";
|
|
10
10
|
|
|
11
|
-
let {
|
|
11
|
+
let {
|
|
12
|
+
value = $bindable([]),
|
|
13
|
+
placeholder = "Enter tags",
|
|
14
|
+
class: className,
|
|
15
|
+
classes,
|
|
16
|
+
itemClass,
|
|
17
|
+
spanClass,
|
|
18
|
+
closeClass,
|
|
19
|
+
inputClass,
|
|
20
|
+
closeBtnSize = "xs",
|
|
21
|
+
unique = false,
|
|
22
|
+
availableTags = [],
|
|
23
|
+
showHelper = false,
|
|
24
|
+
showAvailableTags = false,
|
|
25
|
+
allowNewTags = true,
|
|
26
|
+
inputProps = {},
|
|
27
|
+
disabled,
|
|
28
|
+
...restProps
|
|
29
|
+
}: TagsProps = $props();
|
|
12
30
|
|
|
13
31
|
warnThemeDeprecation("Tags", { itemClass, spanClass, closeClass, inputClass }, { itemClass: "tag", spanClass: "span", closeClass: "close", inputClass: "input" });
|
|
14
32
|
const styling = $derived(
|
|
@@ -51,10 +69,6 @@
|
|
|
51
69
|
});
|
|
52
70
|
}
|
|
53
71
|
|
|
54
|
-
const checkDropdownPosition = () => {
|
|
55
|
-
if (!inputContainer) return;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
72
|
const handleKeys = (event: KeyboardEvent) => {
|
|
59
73
|
if (event.key === "Enter") {
|
|
60
74
|
event.preventDefault();
|
|
@@ -102,10 +116,6 @@
|
|
|
102
116
|
}
|
|
103
117
|
};
|
|
104
118
|
|
|
105
|
-
const handleInput = () => {
|
|
106
|
-
checkDropdownPosition();
|
|
107
|
-
};
|
|
108
|
-
|
|
109
119
|
const deleteField = (index: number) => {
|
|
110
120
|
value = value.filter((_, i) => i !== index);
|
|
111
121
|
errorMessage = "";
|
|
@@ -135,7 +145,7 @@
|
|
|
135
145
|
});
|
|
136
146
|
</script>
|
|
137
147
|
|
|
138
|
-
<svelte:window
|
|
148
|
+
<svelte:window />
|
|
139
149
|
|
|
140
150
|
{#if showAvailableTags && availableTags.length > 0}
|
|
141
151
|
<P class={clsx(info(), classes?.info)}>Available tags: {availableTags.join(", ")}</P>
|
|
@@ -149,6 +159,10 @@
|
|
|
149
159
|
{/if}
|
|
150
160
|
{/if}
|
|
151
161
|
|
|
162
|
+
{#if errorMessage}
|
|
163
|
+
<P class={clsx(error(), classes?.error)}>{errorMessage}</P>
|
|
164
|
+
{/if}
|
|
165
|
+
|
|
152
166
|
<div
|
|
153
167
|
{...restProps}
|
|
154
168
|
class={base({
|
|
@@ -164,7 +178,17 @@
|
|
|
164
178
|
</div>
|
|
165
179
|
{/each}
|
|
166
180
|
<div class="relative w-full" bind:this={inputContainer}>
|
|
167
|
-
<input
|
|
181
|
+
<input
|
|
182
|
+
{...inputProps}
|
|
183
|
+
{disabled}
|
|
184
|
+
bind:this={inputElement}
|
|
185
|
+
onkeydown={handleKeys}
|
|
186
|
+
bind:value={contents}
|
|
187
|
+
placeholder={value.length === 0 ? placeholder : ""}
|
|
188
|
+
type="text"
|
|
189
|
+
autocomplete="off"
|
|
190
|
+
class={inputCls({ class: clsx(styling.input) })}
|
|
191
|
+
/>
|
|
168
192
|
{#if availableTags.length > 0 && contents.trim() !== ""}
|
|
169
193
|
{@const filteredSuggestions = availableTags.filter((tag) => tag.toLowerCase().includes(contents.trim().toLowerCase()) && (!unique || !value.some((t) => t.toLowerCase() === tag.toLowerCase())))}
|
|
170
194
|
{#if filteredSuggestions.length > 0}
|
|
@@ -6,9 +6,34 @@
|
|
|
6
6
|
import { getTheme, warnThemeDeprecation } from "../../theme/themeUtils";
|
|
7
7
|
import { createDismissableContext } from "../../utils/dismissable";
|
|
8
8
|
|
|
9
|
-
let {
|
|
9
|
+
let {
|
|
10
|
+
header,
|
|
11
|
+
footer,
|
|
12
|
+
addon,
|
|
13
|
+
value = $bindable(),
|
|
14
|
+
elementRef = $bindable(),
|
|
15
|
+
divClass,
|
|
16
|
+
innerClass,
|
|
17
|
+
headerClass,
|
|
18
|
+
footerClass,
|
|
19
|
+
addonClass,
|
|
20
|
+
disabled,
|
|
21
|
+
class: className,
|
|
22
|
+
classes,
|
|
23
|
+
clearable,
|
|
24
|
+
clearableSvgClass,
|
|
25
|
+
clearableColor = "none",
|
|
26
|
+
clearableClass,
|
|
27
|
+
clearableOnClick,
|
|
28
|
+
textareaClass,
|
|
29
|
+
...restProps
|
|
30
|
+
}: TextareaProps = $props();
|
|
10
31
|
|
|
11
|
-
warnThemeDeprecation(
|
|
32
|
+
warnThemeDeprecation(
|
|
33
|
+
"Textarea",
|
|
34
|
+
{ divClass, innerClass, headerClass, footerClass, addonClass, textareaClass, clearableClass, clearableSvgClass },
|
|
35
|
+
{ divClass: "div", innerClass: "inner", headerClass: "header", footerClass: "footer", addonClass: "addon", textareaClass: "class", clearableClass: "close", clearableSvgClass: "svg" }
|
|
36
|
+
);
|
|
12
37
|
const styling = $derived(
|
|
13
38
|
classes ?? {
|
|
14
39
|
div: divClass,
|
|
@@ -13,7 +13,9 @@ export const textarea = tv({
|
|
|
13
13
|
},
|
|
14
14
|
variants: {
|
|
15
15
|
wrapped: {
|
|
16
|
-
false: {
|
|
16
|
+
false: {
|
|
17
|
+
wrapper: "p-2.5 text-sm focus:outline-hidden focus:ring-primary-500 border-gray-300 focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:border-primary-500 disabled:cursor-not-allowed disabled:opacity-50"
|
|
18
|
+
}
|
|
17
19
|
},
|
|
18
20
|
hasHeader: {
|
|
19
21
|
true: {
|