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.
Files changed (89) hide show
  1. package/dist/accordion/AccordionItem.svelte +15 -1
  2. package/dist/alert/Alert.svelte +15 -2
  3. package/dist/badge/Badge.svelte +19 -2
  4. package/dist/banner/Banner.svelte +16 -1
  5. package/dist/bottom-navigation/BottomNavItem.svelte +7 -1
  6. package/dist/breadcrumb/BreadcrumbItem.svelte +3 -1
  7. package/dist/carousel/Carousel.svelte +35 -4
  8. package/dist/datepicker/Datepicker.svelte +69 -6
  9. package/dist/device-mockups/Android.svelte +5 -1
  10. package/dist/device-mockups/DefaultMockup.svelte +5 -1
  11. package/dist/device-mockups/Ios.svelte +5 -1
  12. package/dist/device-mockups/Laptop.svelte +5 -1
  13. package/dist/device-mockups/Smartwatch.svelte +5 -1
  14. package/dist/device-mockups/Tablet.svelte +5 -1
  15. package/dist/dialog/Dialog.svelte +38 -7
  16. package/dist/drawer/Drawer.svelte +29 -2
  17. package/dist/forms/button-toggle/ButtonToggle.svelte +9 -1
  18. package/dist/forms/button-toggle/ButtonToggleGroup.svelte +14 -1
  19. package/dist/forms/button-toggle/CheckIcon.svelte +13 -1
  20. package/dist/forms/checkbox/Checkbox.svelte +18 -1
  21. package/dist/forms/fileupload/Fileupload.svelte +14 -1
  22. package/dist/forms/floating-label/FloatingLabelInput.svelte +48 -5
  23. package/dist/forms/input-addon/InputAddon.svelte +12 -1
  24. package/dist/forms/input-field/Input.svelte +60 -9
  25. package/dist/forms/phoneinput/PhoneInput.svelte +14 -2
  26. package/dist/forms/phoneinput/PhoneInput.svelte.d.ts +1 -1
  27. package/dist/forms/radio/Radio.svelte +14 -1
  28. package/dist/forms/search/Search.svelte +16 -1
  29. package/dist/forms/select/MultiSelect.svelte +10 -1
  30. package/dist/forms/select/Select.svelte +20 -1
  31. package/dist/forms/tags/Tags.svelte +35 -11
  32. package/dist/forms/textarea/Textarea.svelte +27 -2
  33. package/dist/forms/textarea/theme.js +3 -1
  34. package/dist/forms/timepicker/Timepicker.svelte +143 -13
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +1 -0
  37. package/dist/kanban/KanbanBoard.svelte +98 -0
  38. package/dist/kanban/KanbanBoard.svelte.d.ts +4 -0
  39. package/dist/kanban/KanbanCard.svelte +58 -0
  40. package/dist/kanban/KanbanCard.svelte.d.ts +16 -0
  41. package/dist/kanban/index.d.ts +3 -0
  42. package/dist/kanban/index.js +3 -0
  43. package/dist/kanban/theme.d.ts +108 -0
  44. package/dist/kanban/theme.js +43 -0
  45. package/dist/mega-menu/MegaMenu.svelte +1 -8
  46. package/dist/modal/Modal.svelte +30 -2
  47. package/dist/navbar/NavHamburger.svelte +1 -1
  48. package/dist/navbar/NavLi.svelte +3 -1
  49. package/dist/navbar/NavUl.svelte +14 -1
  50. package/dist/pagination/theme.js +4 -1
  51. package/dist/popover/Popover.svelte +13 -1
  52. package/dist/progress/Progressbar.svelte +14 -1
  53. package/dist/progress/Progressradial.svelte +28 -2
  54. package/dist/rating/AdvancedRating.svelte +5 -1
  55. package/dist/rating/CustomIcon.svelte +13 -1
  56. package/dist/rating/Heart.svelte +19 -2
  57. package/dist/rating/Review.svelte +6 -3
  58. package/dist/rating/Review.svelte.d.ts +0 -1
  59. package/dist/rating/Star.svelte +12 -1
  60. package/dist/rating/Thumbup.svelte +19 -2
  61. package/dist/sidebar/Sidebar.svelte +30 -2
  62. package/dist/sidebar/SidebarButton.svelte +5 -1
  63. package/dist/sidebar/SidebarDropdownWrapper.svelte +18 -1
  64. package/dist/skeleton/CardPlaceholder.svelte +8 -2
  65. package/dist/skeleton/ImagePlaceholder.svelte +3 -1
  66. package/dist/skeleton/TestimonialPlaceholder.svelte +5 -1
  67. package/dist/skeleton/VideoPlaceholder.svelte +3 -1
  68. package/dist/speed-dial/SpeedDial.svelte +13 -1
  69. package/dist/speed-dial/SpeedDialButton.svelte +12 -1
  70. package/dist/spinner/Spinner.svelte +8 -2
  71. package/dist/step-indicator/StepIndicator.svelte +14 -2
  72. package/dist/stepper/DetailedStepper.svelte +1 -1
  73. package/dist/stepper/ProgressStepper.svelte +3 -1
  74. package/dist/stepper/TimelineStepper.svelte +3 -1
  75. package/dist/stepper/VerticalStepper.svelte +1 -1
  76. package/dist/table/TableSearch.svelte +26 -2
  77. package/dist/theme/themeUtils.js +3 -1
  78. package/dist/theme/themes.d.ts +1 -0
  79. package/dist/theme/themes.js +1 -0
  80. package/dist/timeline/GroupItem.svelte +10 -2
  81. package/dist/timeline/TimelineItem.svelte +24 -2
  82. package/dist/toast/Toast.svelte +17 -2
  83. package/dist/tooltip/Tooltip.svelte +12 -4
  84. package/dist/types.d.ts +27 -1
  85. package/dist/typography/paragraph/P.svelte +14 -1
  86. package/dist/utils/CloseButton.svelte +10 -2
  87. package/dist/utils/Popper.svelte +38 -2
  88. package/dist/virtuallist/VirtualList.svelte +8 -1
  89. 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 { children, id = idGenerator(), value = $bindable(), elementRef = $bindable(), variant = "standard", size = "default", color = "default", class: className, classes, inputClass, labelClass, clearable, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, data = [], maxSuggestions = 5, onSelect, comboClass, placeholder, ...restProps }: FloatingLabelInputProps = $props();
11
-
12
- warnThemeDeprecation("FloatingLabelInput", { inputClass, labelClass, clearableSvgClass, clearableClass, comboClass }, { inputClass: "input", labelClass: "label", clearableSvgClass: "svg", clearableClass: "close", comboClass: "combo" });
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 {id} placeholder=" " bind:value bind:this={elementRef} {...restProps} class={input({ class: clsx(theme?.input, styling.input) })} oninput={handleInput} onfocus={handleFocus} onblur={handleBlur} onkeydown={handleKeydown} />
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 type="button" 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" onclick={() => selectItem(item)} onmouseenter={() => (selectedIndex = i)}>
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(textSizes[_size], prefixPadding[_size], "text-gray-500 bg-gray-200", background ? darkBgClasses.tinted : darkBgClasses.base, background ? divider.tinted : divider.base, background ? borderClasses["tinted"] : borderClasses["base"], "inline-flex items-center border", group && "not-first:-ms-px", "first:rounded-s-lg last:rounded-e-lg", className);
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 { children, left, right, value = $bindable(), elementRef = $bindable(), clearable = false, size, color = "default", class: className, classes, wrapperClass, leftClass, rightClass, divClass, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, data = [], maxSuggestions = 5, onSelect, comboClass, comboItemClass, onInput, onFocus, onBlur, onKeydown, oninput, onfocus, onblur, onkeydown, ...restProps }: InputProps<InputValue> = $props();
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("Input", { wrapperClass, leftClass, rightClass, divClass, clearableSvgClass, clearableClass, comboClass }, { wrapperClass: "wrapper", leftClass: "left", rightClass: "right", divClass: "div", clearableSvgClass: "svg", clearableClass: "close", comboClass: "comboItem" });
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(event: Event) {
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(event: FocusEvent) {
152
+ function defaultHandleFocus() {
116
153
  isFocused = true;
117
154
  updateSuggestions();
118
155
  }
119
156
 
120
- function defaultHandleBlur(event: FocusEvent) {
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(event);
214
+ defaultHandleFocus();
178
215
  }
179
216
 
180
217
  function handleBlur(event: FocusEvent) {
181
218
  if (resolvedOnBlur) {
182
219
  resolvedOnBlur(event);
183
220
  }
184
- defaultHandleBlur(event);
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 type="button" 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" onclick={() => selectItem(item)} onmouseenter={() => (selectedIndex = i)}>
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 {...restProps} bind:value bind:this={elementRef} oninput={handleInput} onfocus={handleFocus} onblur={handleBlur} onkeydown={handleKeydown} class={[wrapped || base(), inputCls({ class: clsx(theme?.input, className) })]} />
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 { children, phoneIcon = true, pattern = "[0-9]{3}-[0-9]{3}-[0-9]{4}", phoneType = "default", floatingLabel = "Phone number", labelFor = "floating-phone-number", class: className, classes, ...restProps }: PhoneInputProps = $props();
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 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" />
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<number>, {}, "">;
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 { children, "aria-describedby": ariaDescribedby, inline = false, labelClass, color = "primary", custom = false, group = $bindable<T>(), value = $bindable<T>(), class: className, inputClass, classes, ...restProps }: RadioProps<T> = $props();
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 { children, inputClass, size, placeholder = "Search", value = $bindable(), elementRef = $bindable(), clearable = false, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, class: className, classes, ...restProps }: SearchProps = $props();
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 bind:this={multiSelectContainer} {...restProps} onclick={toggleDropdown} onblur={handleBlur} onkeydown={handleKeyDown} tabindex="0" role="listbox" class={base({ size, class: clsx(theme?.base, className) })}>
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 { children, items, value = $bindable(), elementRef = $bindable(), underline, size = "md", disabled, placeholder = "Choose option ...", clearable, clearableColor = "none", clearableOnClick, onClear, clearableSvgClass, clearableClass, selectClass, class: className, classes, ...restProps }: SelectProps<T> = $props();
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 { value = $bindable([]), placeholder = "Enter tags", class: className, classes, itemClass, spanClass, closeClass, inputClass, closeBtnSize = "xs", unique = false, availableTags = [], showHelper = false, showAvailableTags = false, allowNewTags = true, inputProps = {}, disabled, ...restProps }: TagsProps = $props();
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 on:scroll={checkDropdownPosition} on:resize={checkDropdownPosition} />
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 {...inputProps} {disabled} bind:this={inputElement} onkeydown={handleKeys} oninput={handleInput} bind:value={contents} placeholder={value.length === 0 ? placeholder : ""} type="text" autocomplete="off" class={inputCls({ class: clsx(styling.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 { header, footer, addon, value = $bindable(), elementRef = $bindable(), divClass, innerClass, headerClass, footerClass, addonClass, disabled, class: className, classes, clearable, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, textareaClass, ...restProps }: TextareaProps = $props();
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("Textarea", { divClass, innerClass, headerClass, footerClass, addonClass, textareaClass, clearableClass, clearableSvgClass }, { divClass: "div", innerClass: "inner", headerClass: "header", footerClass: "footer", addonClass: "addon", textareaClass: "class", clearableClass: "close", clearableSvgClass: "svg" });
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: { 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" }
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: {