flowbite-svelte 1.10.4 → 1.10.6

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 (219) hide show
  1. package/dist/accordion/Accordion.svelte +4 -4
  2. package/dist/accordion/AccordionItem.svelte +7 -6
  3. package/dist/accordion/theme.d.ts +3 -2
  4. package/dist/alert/Alert.svelte +10 -12
  5. package/dist/alert/theme.d.ts +2 -1
  6. package/dist/avatar/Avatar.svelte +9 -11
  7. package/dist/avatar/theme.d.ts +2 -1
  8. package/dist/badge/Badge.svelte +4 -3
  9. package/dist/badge/theme.d.ts +2 -1
  10. package/dist/banner/Banner.svelte +5 -4
  11. package/dist/banner/theme.d.ts +2 -1
  12. package/dist/bottom-navigation/BottomNav.svelte +3 -2
  13. package/dist/bottom-navigation/BottomNavHeader.svelte +4 -3
  14. package/dist/bottom-navigation/BottomNavHeaderItem.svelte +4 -3
  15. package/dist/bottom-navigation/BottomNavItem.svelte +4 -3
  16. package/dist/bottom-navigation/theme.d.ts +5 -4
  17. package/dist/breadcrumb/Breadcrumb.svelte +4 -3
  18. package/dist/breadcrumb/BreadcrumbItem.svelte +7 -6
  19. package/dist/breadcrumb/theme.d.ts +3 -2
  20. package/dist/button-group/ButtonGroup.svelte +3 -2
  21. package/dist/button-group/theme.d.ts +2 -1
  22. package/dist/buttons/Button.svelte +3 -2
  23. package/dist/buttons/GradientButton.svelte +5 -4
  24. package/dist/buttons/theme.d.ts +3 -2
  25. package/dist/card/Card.svelte +4 -4
  26. package/dist/card/theme.d.ts +2 -1
  27. package/dist/carousel/Carousel.svelte +5 -4
  28. package/dist/carousel/CarouselIndicators.svelte +4 -3
  29. package/dist/carousel/ControlButton.svelte +7 -4
  30. package/dist/carousel/Controls.svelte +4 -3
  31. package/dist/carousel/Slide.svelte +3 -2
  32. package/dist/carousel/Thumbnail.svelte +2 -2
  33. package/dist/carousel/Thumbnails.svelte +3 -3
  34. package/dist/carousel/theme.d.ts +20 -9
  35. package/dist/carousel/theme.js +4 -1
  36. package/dist/clipboard/Clipboard.svelte +2 -2
  37. package/dist/clipboard/theme.d.ts +2 -1
  38. package/dist/darkmode/DarkMode.svelte +3 -2
  39. package/dist/darkmode/theme.d.ts +2 -1
  40. package/dist/datepicker/Datepicker.svelte +27 -23
  41. package/dist/datepicker/theme.d.ts +1 -1
  42. package/dist/drawer/Drawer.svelte +4 -3
  43. package/dist/drawer/Drawerhead.svelte +5 -4
  44. package/dist/drawer/theme.d.ts +3 -2
  45. package/dist/dropdown/Dropdown.svelte +3 -2
  46. package/dist/dropdown/DropdownDivider.svelte +3 -2
  47. package/dist/dropdown/DropdownGroup.svelte +3 -2
  48. package/dist/dropdown/DropdownHeader.svelte +3 -2
  49. package/dist/dropdown/DropdownItem.svelte +4 -3
  50. package/dist/dropdown/theme.d.ts +6 -5
  51. package/dist/footer/Footer.svelte +4 -3
  52. package/dist/footer/FooterBrand.svelte +6 -5
  53. package/dist/footer/FooterCopyright.svelte +5 -4
  54. package/dist/footer/FooterIcon.svelte +3 -2
  55. package/dist/footer/FooterLink.svelte +4 -3
  56. package/dist/footer/FooterLinkGroup.svelte +3 -2
  57. package/dist/footer/theme.d.ts +7 -6
  58. package/dist/forms/button-toggle/ButtonToggle.svelte +7 -6
  59. package/dist/forms/button-toggle/ButtonToggleGroup.svelte +6 -5
  60. package/dist/forms/button-toggle/CheckIcon.svelte +3 -2
  61. package/dist/forms/button-toggle/theme.d.ts +5 -4
  62. package/dist/forms/checkbox/Checkbox.svelte +6 -5
  63. package/dist/forms/checkbox/CheckboxButton.svelte +3 -2
  64. package/dist/forms/checkbox/theme.d.ts +3 -2
  65. package/dist/forms/dropzone/Dropzone.svelte +3 -2
  66. package/dist/forms/dropzone/theme.d.ts +2 -1
  67. package/dist/forms/fileupload/Fileupload.svelte +5 -4
  68. package/dist/forms/fileupload/theme.d.ts +2 -1
  69. package/dist/forms/floating-label/FloatingLabelInput.svelte +7 -6
  70. package/dist/forms/floating-label/theme.d.ts +2 -1
  71. package/dist/forms/helper/Helper.svelte +3 -2
  72. package/dist/forms/helper/theme.d.ts +2 -1
  73. package/dist/forms/input-addon/InputAddon.svelte +3 -2
  74. package/dist/forms/input-field/Input.svelte +11 -10
  75. package/dist/forms/input-field/theme.d.ts +2 -1
  76. package/dist/forms/label/Label.svelte +3 -2
  77. package/dist/forms/label/theme.d.ts +2 -1
  78. package/dist/forms/phoneinput/PhoneInput.svelte +7 -7
  79. package/dist/forms/phoneinput/theme.d.ts +1 -1
  80. package/dist/forms/radio/Radio.svelte +4 -3
  81. package/dist/forms/radio/RadioButton.svelte +3 -2
  82. package/dist/forms/radio/theme.d.ts +3 -2
  83. package/dist/forms/range/Range.svelte +3 -2
  84. package/dist/forms/range/theme.d.ts +2 -1
  85. package/dist/forms/search/Search.svelte +8 -7
  86. package/dist/forms/search/theme.d.ts +2 -1
  87. package/dist/forms/select/MultiSelect.svelte +7 -6
  88. package/dist/forms/select/Select.svelte +5 -4
  89. package/dist/forms/select/theme.d.ts +3 -2
  90. package/dist/forms/tags/Tags.svelte +7 -6
  91. package/dist/forms/tags/theme.d.ts +2 -1
  92. package/dist/forms/textarea/Textarea.svelte +11 -10
  93. package/dist/forms/textarea/theme.d.ts +2 -1
  94. package/dist/forms/timepicker/Timepicker.svelte +38 -37
  95. package/dist/forms/timepicker/theme.d.ts +2 -1
  96. package/dist/forms/toggle/Toggle.svelte +5 -4
  97. package/dist/forms/toggle/theme.d.ts +2 -1
  98. package/dist/gallery/Gallery.svelte +4 -3
  99. package/dist/gallery/theme.d.ts +2 -1
  100. package/dist/indicator/Indicator.svelte +5 -3
  101. package/dist/indicator/theme.d.ts +2 -1
  102. package/dist/kbd/Kbd.svelte +3 -2
  103. package/dist/kbd/theme.d.ts +2 -1
  104. package/dist/list-group/Listgroup.svelte +6 -5
  105. package/dist/list-group/ListgroupItem.svelte +7 -6
  106. package/dist/list-group/theme.d.ts +3 -2
  107. package/dist/mega-menu/MegaMenu.svelte +6 -5
  108. package/dist/mega-menu/theme.d.ts +2 -1
  109. package/dist/modal/Modal.svelte +7 -7
  110. package/dist/modal/theme.d.ts +2 -1
  111. package/dist/navbar/Menu.svelte +1 -2
  112. package/dist/navbar/NavBrand.svelte +1 -2
  113. package/dist/navbar/NavContainer.svelte +1 -2
  114. package/dist/navbar/NavHamburger.svelte +2 -3
  115. package/dist/navbar/NavHamburger.svelte.d.ts +1 -2
  116. package/dist/navbar/NavLi.svelte +1 -2
  117. package/dist/navbar/NavUl.svelte +4 -5
  118. package/dist/navbar/Navbar.svelte +2 -2
  119. package/dist/navbar/theme.d.ts +6 -5
  120. package/dist/pagination/Pagination.svelte +2 -2
  121. package/dist/pagination/PaginationButton.svelte +10 -13
  122. package/dist/pagination/PaginationItem.svelte +1 -2
  123. package/dist/pagination/PaginationNav.svelte +7 -7
  124. package/dist/pagination/theme.d.ts +5 -4
  125. package/dist/popover/Popover.svelte +4 -5
  126. package/dist/popover/theme.d.ts +2 -1
  127. package/dist/progress/Progressbar.svelte +6 -7
  128. package/dist/progress/Progressradial.svelte +7 -8
  129. package/dist/progress/theme.d.ts +2 -2
  130. package/dist/rating/AdvancedRating.svelte +5 -6
  131. package/dist/rating/Rating.svelte +2 -3
  132. package/dist/rating/Review.svelte +7 -8
  133. package/dist/rating/ScoreRating.svelte +8 -8
  134. package/dist/rating/theme.d.ts +5 -4
  135. package/dist/sidebar/Sidebar.svelte +27 -62
  136. package/dist/sidebar/SidebarBrand.svelte +3 -4
  137. package/dist/sidebar/SidebarButton.svelte +1 -2
  138. package/dist/sidebar/SidebarCta.svelte +3 -4
  139. package/dist/sidebar/SidebarDropdownWrapper.svelte +6 -7
  140. package/dist/sidebar/SidebarItem.svelte +5 -4
  141. package/dist/sidebar/theme.d.ts +12 -23
  142. package/dist/sidebar/theme.js +6 -45
  143. package/dist/skeleton/CardPlaceholder.svelte +11 -12
  144. package/dist/skeleton/ImagePlaceholder.svelte +39 -12
  145. package/dist/skeleton/ListPlaceholder.svelte +26 -8
  146. package/dist/skeleton/Skeleton.svelte +24 -9
  147. package/dist/skeleton/TestimonialPlaceholder.svelte +27 -8
  148. package/dist/skeleton/TextPlaceholder.svelte +49 -26
  149. package/dist/skeleton/VideoPlaceholder.svelte +2 -3
  150. package/dist/skeleton/WidgetPlaceholder.svelte +1 -2
  151. package/dist/skeleton/theme.d.ts +9 -8
  152. package/dist/speed-dial/SpeedDial.svelte +3 -3
  153. package/dist/speed-dial/SpeedDialButton.svelte +3 -3
  154. package/dist/speed-dial/theme.d.ts +3 -2
  155. package/dist/spinner/Spinner.svelte +2 -3
  156. package/dist/spinner/theme.d.ts +2 -1
  157. package/dist/stepindicator/StepIndicator.svelte +10 -9
  158. package/dist/stepindicator/theme.d.ts +2 -1
  159. package/dist/stepper/BreadcrumbStepper.svelte +9 -10
  160. package/dist/stepper/DetailedStepper.svelte +4 -4
  161. package/dist/stepper/ProgressStepper.svelte +8 -11
  162. package/dist/stepper/Stepper.svelte +12 -18
  163. package/dist/stepper/TimelineStepper.svelte +4 -4
  164. package/dist/stepper/VerticalStepper.svelte +4 -4
  165. package/dist/table/Table.svelte +3 -3
  166. package/dist/table/TableBody.svelte +1 -2
  167. package/dist/table/TableBodyCell.svelte +1 -2
  168. package/dist/table/TableBodyRow.svelte +2 -3
  169. package/dist/table/TableHead.svelte +2 -3
  170. package/dist/table/TableHeadCell.svelte +1 -2
  171. package/dist/table/TableSearch.svelte +9 -9
  172. package/dist/table/theme.d.ts +6 -6
  173. package/dist/tabs/TabItem.svelte +5 -4
  174. package/dist/tabs/Tabs.svelte +3 -4
  175. package/dist/tabs/theme.d.ts +3 -2
  176. package/dist/timeline/Activity.svelte +1 -2
  177. package/dist/timeline/ActivityItem.svelte +9 -9
  178. package/dist/timeline/Group.svelte +4 -4
  179. package/dist/timeline/GroupItem.svelte +6 -6
  180. package/dist/timeline/Timeline.svelte +2 -3
  181. package/dist/timeline/TimelineItem.svelte +7 -7
  182. package/dist/timeline/theme.d.ts +7 -6
  183. package/dist/toast/Toast.svelte +5 -5
  184. package/dist/toast/theme.d.ts +2 -1
  185. package/dist/toolbar/Toolbar.svelte +2 -3
  186. package/dist/toolbar/ToolbarButton.svelte +4 -5
  187. package/dist/toolbar/ToolbarGroup.svelte +2 -3
  188. package/dist/toolbar/theme.d.ts +4 -3
  189. package/dist/tooltip/Tooltip.svelte +1 -2
  190. package/dist/tooltip/theme.d.ts +2 -1
  191. package/dist/types.d.ts +2 -3
  192. package/dist/typography/anchor/A.svelte +3 -4
  193. package/dist/typography/anchor/theme.d.ts +2 -1
  194. package/dist/typography/blockquote/Blockquote.svelte +3 -4
  195. package/dist/typography/blockquote/theme.d.ts +2 -1
  196. package/dist/typography/descriptionlist/DescriptionList.svelte +2 -3
  197. package/dist/typography/descriptionlist/theme.d.ts +2 -1
  198. package/dist/typography/heading/Heading.svelte +2 -3
  199. package/dist/typography/heading/theme.d.ts +2 -1
  200. package/dist/typography/hr/Hr.svelte +4 -5
  201. package/dist/typography/hr/theme.d.ts +2 -1
  202. package/dist/typography/img/EnhancedImg.svelte +4 -5
  203. package/dist/typography/img/Img.svelte +4 -5
  204. package/dist/typography/img/theme.d.ts +2 -1
  205. package/dist/typography/layout/Layout.svelte +2 -3
  206. package/dist/typography/layout/theme.d.ts +2 -1
  207. package/dist/typography/list/Li.svelte +1 -2
  208. package/dist/typography/list/List.svelte +2 -3
  209. package/dist/typography/list/theme.d.ts +2 -1
  210. package/dist/typography/mark/Mark.svelte +1 -1
  211. package/dist/typography/mark/theme.d.ts +2 -1
  212. package/dist/typography/paragraph/P.svelte +2 -3
  213. package/dist/typography/paragraph/theme.d.ts +2 -1
  214. package/dist/typography/secondary/Secondary.svelte +1 -2
  215. package/dist/typography/secondary/theme.d.ts +2 -1
  216. package/dist/typography/span/Span.svelte +2 -3
  217. package/dist/typography/span/theme.d.ts +2 -1
  218. package/dist/video/Video.svelte +2 -2
  219. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type LabelVariants = VariantProps<typeof label>;
3
4
  export declare const label: import("tailwind-variants").TVReturnType<{
4
5
  color: {
@@ -73,4 +74,4 @@ export declare const label: import("tailwind-variants").TVReturnType<{
73
74
  rose: string;
74
75
  };
75
76
  }, undefined, "text-sm rtl:text-right font-medium block", unknown, unknown, undefined>>;
76
- export type LabelTheme = string;
77
+ export type LabelTheme = ClassValue;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { type PhoneInputProps, cn } from "../..";
2
+ import { type PhoneInputProps } from "../..";
3
3
  import { phoneinput, type PhoneInputTheme } from ".";
4
4
  import clsx from "clsx";
5
5
  import { getTheme } from "../../theme/themeUtils";
@@ -12,7 +12,7 @@
12
12
  </script>
13
13
 
14
14
  {#snippet phoneIconSnippet()}
15
- <svg class={cn(phonesvg(), (theme as PhoneInputTheme)?.phonesvg)} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 19 18">
15
+ <svg class={phonesvg({ class: clsx((theme as PhoneInputTheme)?.phonesvg) })} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 19 18">
16
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" />
17
17
  </svg>
18
18
  {/snippet}
@@ -20,20 +20,20 @@
20
20
  {#if phoneType === "default" || phoneType === "countryCode"}
21
21
  <div class="relative">
22
22
  {#if phoneIcon}
23
- <div class={cn(defaultDiv({ class: clsx(classes?.defaultDiv) }), (theme as PhoneInputTheme)?.defaultDiv)}>
23
+ <div class={defaultDiv({ class: clsx((theme as PhoneInputTheme)?.defaultDiv, classes?.defaultDiv) })}>
24
24
  {@render phoneIconSnippet()}
25
25
  </div>
26
26
  {/if}
27
- <input type="tel" {pattern} {...restProps} class={cn(defaultInput({ class: clsx(classes?.defaultInput) }), (theme as PhoneInputTheme)?.defaultInput)} />
27
+ <input type="tel" {pattern} {...restProps} class={defaultInput({ class: clsx((theme as PhoneInputTheme)?.defaultInput, classes?.defaultInput) })} />
28
28
  </div>
29
29
  {:else if phoneType === "floating"}
30
30
  <div class="relative">
31
31
  {#if phoneIcon}
32
- <span class={cn(floatingSpan({ class: clsx(classes?.floatingSpan) }), (theme as PhoneInputTheme)?.floatingSpan)}>
32
+ <span class={floatingSpan({ class: clsx((theme as PhoneInputTheme)?.floatingSpan, classes?.floatingSpan) })}>
33
33
  {@render phoneIconSnippet()}
34
34
  </span>
35
35
  {/if}
36
- <input type="tel" class={cn(floatingInput({ class: clsx(classes?.floatingInput) }), (theme as PhoneInputTheme)?.floatingInput)} {pattern} {...restProps} />
37
- <label for={labelFor} class={cn(labelFloating({ class: clsx(classes?.labelFloating) }), (theme as PhoneInputTheme)?.labelFloating)}>{floatingLabel}</label>
36
+ <input type="tel" class={floatingInput({ class: clsx((theme as PhoneInputTheme)?.floatingInput, classes?.floatingInput) })} {pattern} {...restProps} />
37
+ <label for={labelFor} class={labelFloating({ class: clsx((theme as PhoneInputTheme)?.labelFloating, classes?.labelFloating) })}>{floatingLabel}</label>
38
38
  </div>
39
39
  {/if}
@@ -83,4 +83,4 @@ export declare const phoneinput: import("tailwind-variants").TVReturnType<{
83
83
  labelFloating: string;
84
84
  }, undefined, unknown, unknown, undefined>>;
85
85
  export type PhoneInputSlots = keyof typeof phoneinput.slots;
86
- export type PhoneInputTheme = Partial<Record<PhoneInputSlots, string>>;
86
+ export type PhoneInputTheme = Partial<Record<PhoneInputSlots, ClassValue>>;
@@ -1,7 +1,8 @@
1
1
  <script lang="ts" generics="T">
2
2
  import { getContext } from "svelte";
3
3
  import { radio, type RadioTheme } from ".";
4
- import { type RadioProps, Label, cn } from "../..";
4
+ import clsx from "clsx";
5
+ import { type RadioProps, Label } from "../..";
5
6
  import { getTheme } from "../../theme/themeUtils";
6
7
 
7
8
  let { children, "aria-describedby": ariaDescribedby, inline = false, labelClass, color = "primary", custom = false, group = $bindable<T>(), value = $bindable<T>(), inputClass, ...restProps }: RadioProps<T> = $props();
@@ -11,8 +12,8 @@
11
12
  const { input, label } = $derived(radio({ color, tinted: !!getContext("background"), custom, inline }));
12
13
  </script>
13
14
 
14
- <Label class={cn(label(), labelClass, (theme as RadioTheme)?.label)}>
15
- <input type="radio" bind:group {value} aria-describedby={ariaDescribedby} {...restProps} class={cn(input(), inputClass, (theme as RadioTheme)?.input)} />
15
+ <Label class={label({ class: clsx((theme as RadioTheme)?.label, labelClass) })}>
16
+ <input type="radio" bind:group {value} aria-describedby={ariaDescribedby} {...restProps} class={input({ class: clsx((theme as RadioTheme)?.input, inputClass) })} />
16
17
  {@render children?.()}
17
18
  </Label>
18
19
 
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" generics="T">
2
- import { Button, type RadioButtonProps, cn } from "../..";
2
+ import clsx from "clsx";
3
+ import { Button, type RadioButtonProps } from "../..";
3
4
  import { radiobutton } from ".";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
@@ -9,7 +10,7 @@
9
10
 
10
11
  let inputEl: HTMLInputElement;
11
12
  let isChecked = $derived(value == group);
12
- let base = $derived(cn(radiobutton({ inline }), className, isChecked && checkedClass, theme));
13
+ let base = $derived(radiobutton({ inline, class: clsx(isChecked && checkedClass, theme, className) }));
13
14
 
14
15
  function clickHandler() {
15
16
  inputEl?.click(); // manually trigger the click on the hidden input
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type RadioVariants = VariantProps<typeof radio>;
3
4
  export declare const radio: import("tailwind-variants").TVReturnType<{
4
5
  color: {
@@ -272,7 +273,7 @@ export declare const radio: import("tailwind-variants").TVReturnType<{
272
273
  label: string;
273
274
  }, undefined, unknown, unknown, undefined>>;
274
275
  export type RadioSlots = keyof typeof radio.slots;
275
- export type RadioTheme = Partial<Record<RadioSlots, string>>;
276
+ export type RadioTheme = Partial<Record<RadioSlots, ClassValue>>;
276
277
  export declare const radiobutton: import("tailwind-variants").TVReturnType<{
277
278
  inline: {
278
279
  true: string;
@@ -289,4 +290,4 @@ export declare const radiobutton: import("tailwind-variants").TVReturnType<{
289
290
  false: string;
290
291
  };
291
292
  }, undefined, "", unknown, unknown, undefined>>;
292
- export type RadioButtonTheme = string;
293
+ export type RadioButtonTheme = ClassValue;
@@ -1,13 +1,14 @@
1
1
  <script lang="ts">
2
2
  import { range } from "./";
3
- import { type RangeProps, cn } from "../..";
3
+ import clsx from "clsx";
4
+ import { type RangeProps } from "../..";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
6
7
  let { value = $bindable(), appearance = "none", color = "blue", size = "md", inputClass, ...restProps }: RangeProps = $props();
7
8
 
8
9
  const theme = getTheme("range");
9
10
 
10
- const inputCls = $derived(cn(range({ appearance, color, size }), inputClass, theme));
11
+ const inputCls = $derived(range({ appearance, color, size, class: clsx(theme, inputClass) }));
11
12
  </script>
12
13
 
13
14
  <input type="range" bind:value {...restProps} class={inputCls} />
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type RangeVariants = VariantProps<typeof range>;
3
4
  export declare const range: import("tailwind-variants").TVReturnType<{
4
5
  size: {
@@ -64,4 +65,4 @@ export declare const range: import("tailwind-variants").TVReturnType<{
64
65
  none: string;
65
66
  };
66
67
  }, undefined, "w-full bg-gray-200 rounded-lg cursor-pointer dark:bg-gray-700", unknown, unknown, undefined>>;
67
- export type RangeTheme = string;
68
+ export type RangeTheme = ClassValue;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { search, type SearchTheme } from ".";
3
- import { CloseButton, type SearchProps, cn } from "../..";
3
+ import clsx from "clsx";
4
+ import { CloseButton, type SearchProps } from "../..";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
6
7
  let { children, inputClass, size, placeholder = "Search", value = $bindable(), elementRef = $bindable(), clearable = false, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, ...restProps }: SearchProps = $props();
@@ -18,20 +19,20 @@
18
19
  };
19
20
  </script>
20
21
 
21
- <div class={cn(base(), (theme as SearchTheme)?.base)}>
22
- <div class={cn(leftDiv(), (theme as SearchTheme)?.leftDiv)}>
23
- <svg class={cn(icon(), (theme as SearchTheme)?.icon)} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
22
+ <div class={base({ class: clsx((theme as SearchTheme)?.base) })}>
23
+ <div class={leftDiv({ class: clsx((theme as SearchTheme)?.leftDiv) })}>
24
+ <svg class={icon({ class: clsx((theme as SearchTheme)?.icon) })} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
24
25
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" />
25
26
  </svg>
26
27
  </div>
27
- <input type="search" bind:value bind:this={elementRef} class={cn(inputCls(), inputClass, (theme as SearchTheme)?.input)} {placeholder} required {...restProps} />
28
+ <input type="search" bind:value bind:this={elementRef} class={inputCls({ class: clsx((theme as SearchTheme)?.input, inputClass) })} {placeholder} required {...restProps} />
28
29
  {#if children}
29
- <div class={cn(content(), (theme as SearchTheme)?.content)}>
30
+ <div class={content({ class: clsx((theme as SearchTheme)?.content) })}>
30
31
  {@render children()}
31
32
  </div>
32
33
  {/if}
33
34
  {#if value !== undefined && value !== "" && clearable}
34
- <CloseButton onclick={clearAll} class={cn(closebutton(), clearableClass, (theme as SearchTheme)?.closebutton)} color={clearableColor} aria-label="Clear search value" svgClass={cn(clearableSvgClass)} />
35
+ <CloseButton onclick={clearAll} class={closebutton({ class: clsx((theme as SearchTheme)?.closebutton, clearableClass) })} color={clearableColor} aria-label="Clear search value" svgClass={clsx(clearableSvgClass)} />
35
36
  {/if}
36
37
  </div>
37
38
 
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type SearchVariants = VariantProps<typeof search>;
3
4
  export declare const search: import("tailwind-variants").TVReturnType<{
4
5
  size: {
@@ -68,4 +69,4 @@ export declare const search: import("tailwind-variants").TVReturnType<{
68
69
  closebutton: string;
69
70
  }, undefined, unknown, unknown, undefined>>;
70
71
  export type SearchSlots = keyof typeof search.slots;
71
- export type SearchTheme = Partial<Record<SearchSlots, string>>;
72
+ export type SearchTheme = Partial<Record<SearchSlots, ClassValue>>;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" generics="T">
2
- import { Badge, CloseButton, type MultiSelectProps, type SelectOptionType, cn } from "../..";
2
+ import clsx from "clsx";
3
+ import { Badge, CloseButton, type MultiSelectProps, type SelectOptionType } from "../..";
3
4
  import { multiSelect, type MultiSelectTheme } from ".";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
  import { onMount, onDestroy } from "svelte"; // Import onMount and onDestroy
@@ -193,11 +194,11 @@
193
194
  {/each}
194
195
  </select>
195
196
 
196
- <div bind:this={multiSelectContainer} {...restProps} onclick={toggleDropdown} onblur={handleBlur} onkeydown={handleKeyDown} tabindex="0" role="listbox" class={cn(base({ size }), className, (theme as MultiSelectTheme)?.base)}>
197
+ <div bind:this={multiSelectContainer} {...restProps} onclick={toggleDropdown} onblur={handleBlur} onkeydown={handleKeyDown} tabindex="0" role="listbox" class={base({ size, class: clsx((theme as MultiSelectTheme)?.base, className) })}>
197
198
  {#if !selectItems.length}
198
199
  <span class="text-gray-400">{placeholder}</span>
199
200
  {/if}
200
- <span class={cn(select(), (theme as MultiSelectTheme)?.select)}>
201
+ <span class={select({ class: clsx((theme as MultiSelectTheme)?.select) })}>
201
202
  {#if selectItems.length}
202
203
  {#each selectItems as item (item.name)}
203
204
  {#if children}
@@ -212,16 +213,16 @@
212
213
  </span>
213
214
  <div class="ms-auto flex items-center gap-2">
214
215
  {#if selectItems.length}
215
- <CloseButton {size} onclick={clearAll} color="none" class={cn(closebutton(), (theme as MultiSelectTheme)?.closebutton)} {disabled} />
216
+ <CloseButton {size} onclick={clearAll} color="none" class={closebutton({ class: clsx((theme as MultiSelectTheme)?.closebutton) })} {disabled} />
216
217
  {/if}
217
218
 
218
- <svg class={cn("ms-1 h-3 w-3 cursor-pointer text-gray-800 dark:text-white", disabled && "cursor-not-allowed")} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 10 6">
219
+ <svg class={clsx("ms-1 h-3 w-3 cursor-pointer text-gray-800 dark:text-white", disabled && "cursor-not-allowed")} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 10 6">
219
220
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d={show ? "m1 5 4-4 4 4" : "m9 1-4 4-4-4"} />
220
221
  </svg>
221
222
  </div>
222
223
 
223
224
  {#if show}
224
- <div role="presentation" class={cn(dropdown(), dropdownClass)}>
225
+ <div role="presentation" class={dropdown({ class: clsx(dropdownClass) })}>
225
226
  {#each items as item (item.name)}
226
227
  <div
227
228
  onclick={(e) => selectOption(item, e)}
@@ -1,6 +1,7 @@
1
1
  <script lang="ts" generics="T">
2
2
  import { select as selectCls, type SelectTheme } from ".";
3
- import { type SelectProps, CloseButton, cn } from "../..";
3
+ import clsx from "clsx";
4
+ import { type SelectProps, CloseButton } from "../..";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
6
7
  let { children, items, value = $bindable(), elementRef = $bindable(), underline, size = "md", disabled, selectClass, class: className, placeholder = "Choose option ...", clearable, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, ...restProps }: SelectProps<T> = $props();
@@ -18,8 +19,8 @@
18
19
  };
19
20
  </script>
20
21
 
21
- <div class={cn(base(), className, (theme as SelectTheme)?.base)}>
22
- <select {disabled} {...restProps} bind:value bind:this={elementRef} class={cn(select(), selectClass, (theme as SelectTheme)?.select)}>
22
+ <div class={base({ class: clsx((theme as SelectTheme)?.base, className) })}>
23
+ <select {disabled} {...restProps} bind:value bind:this={elementRef} class={select({ class: clsx((theme as SelectTheme)?.select, selectClass) })}>
23
24
  {#if placeholder}
24
25
  <option disabled selected value="">{placeholder}</option>
25
26
  {/if}
@@ -35,7 +36,7 @@
35
36
  {/if}
36
37
  </select>
37
38
  {#if value !== undefined && value !== "" && clearable}
38
- <CloseButton onclick={clearAll} class={cn(closebutton(), clearableClass, (theme as SelectTheme)?.closebutton)} color={clearableColor} aria-label="Clear search value" svgClass={cn(clearableSvgClass)} {disabled} />
39
+ <CloseButton onclick={clearAll} class={closebutton({ class: clsx((theme as SelectTheme)?.closebutton, clearableClass) })} color={clearableColor} aria-label="Clear search value" svgClass={clsx(clearableSvgClass)} {disabled} />
39
40
  {/if}
40
41
  </div>
41
42
  <!--
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type SelectVariants = VariantProps<typeof select>;
3
4
  export declare const select: import("tailwind-variants").TVReturnType<{
4
5
  underline: {
@@ -92,7 +93,7 @@ export declare const select: import("tailwind-variants").TVReturnType<{
92
93
  closebutton: string;
93
94
  }, undefined, unknown, unknown, undefined>>;
94
95
  export type SelectSlots = keyof typeof select.slots;
95
- export type SelectTheme = Partial<Record<SelectSlots, string>>;
96
+ export type SelectTheme = Partial<Record<SelectSlots, ClassValue>>;
96
97
  export type MultiSelectVariants = VariantProps<typeof multiSelect>;
97
98
  export declare const multiSelect: import("tailwind-variants").TVReturnType<{
98
99
  size: {
@@ -192,4 +193,4 @@ export declare const multiSelect: import("tailwind-variants").TVReturnType<{
192
193
  closebutton: string;
193
194
  }, undefined, unknown, unknown, undefined>>;
194
195
  export type MultiSelectSlots = keyof typeof multiSelect.slots;
195
- export type MultiSelectTheme = Partial<Record<MultiSelectSlots, string>>;
196
+ export type MultiSelectTheme = Partial<Record<MultiSelectSlots, ClassValue>>;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
- import { type TagsProps, CloseButton, cn } from "../..";
2
+ import clsx from "clsx";
3
+ import { type TagsProps, CloseButton } from "../..";
3
4
  import { tags, type TagsTheme } from "./theme";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
@@ -36,15 +37,15 @@
36
37
  };
37
38
  </script>
38
39
 
39
- <div {...restProps} class={cn(base(), className, (theme as TagsTheme)?.base)}>
40
+ <div {...restProps} class={base({ class: clsx((theme as TagsTheme)?.base, className) })}>
40
41
  {#each value as tag, index}
41
- <div class={cn(tagCls(), itemClass, (theme as TagsTheme)?.tag)}>
42
- <span class={cn(spanCls(), spanClass, (theme as TagsTheme)?.span)}>
42
+ <div class={tagCls({ class: clsx((theme as TagsTheme)?.tag, itemClass) })}>
43
+ <span class={spanCls({ class: clsx((theme as TagsTheme)?.span, spanClass) })}>
43
44
  {tag}
44
45
  </span>
45
46
  <CloseButton
46
47
  size={closeBtnSize}
47
- class={cn(closebutton(), closeClass, (theme as TagsTheme)?.closebutton)}
48
+ class={closebutton({ class: clsx((theme as TagsTheme)?.closebutton, closeClass) })}
48
49
  onclick={() => {
49
50
  deleteField(index);
50
51
  }}
@@ -60,7 +61,7 @@
60
61
  placeholder={value.length === 0 ? placeholder : ""}
61
62
  type="text"
62
63
  autocomplete="new-password"
63
- class={cn(inputCls(), inputClass)}
64
+ class={inputCls({ class: clsx(inputClass) })}
64
65
  />
65
66
  </div>
66
67
 
@@ -1,3 +1,4 @@
1
+ import type { ClassValue } from "svelte/elements";
1
2
  export declare const tags: import("tailwind-variants").TVReturnType<{
2
3
  [key: string]: {
3
4
  [key: string]: import("tailwind-variants").ClassValue | {
@@ -48,4 +49,4 @@ export declare const tags: import("tailwind-variants").TVReturnType<{
48
49
  input: string;
49
50
  }, undefined, unknown, unknown, undefined>>;
50
51
  export type TagsSlots = keyof typeof tags.slots;
51
- export type TagsTheme = Partial<Record<TagsSlots, string>>;
52
+ export type TagsTheme = Partial<Record<TagsSlots, ClassValue>>;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { textarea, type TextareaTheme } from ".";
3
- import { type TextareaProps, CloseButton, cn } from "../..";
3
+ import clsx from "clsx";
4
+ import { type TextareaProps, CloseButton } from "../..";
4
5
  import { getTheme } from "../../theme/themeUtils";
5
6
 
6
7
  let { header, footer, addon, value = $bindable(), elementRef = $bindable(), divClass, innerClass, headerClass, footerClass, addonClass, disabled, class: className, cols, clearable, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, textareaClass, ...restProps }: TextareaProps = $props();
@@ -23,33 +24,33 @@
23
24
  };
24
25
  </script>
25
26
 
26
- <div class={cn(divWrapper(), divClass, (theme as TextareaTheme)?.divWrapper)}>
27
+ <div class={divWrapper({ class: clsx((theme as TextareaTheme)?.divWrapper, divClass) })}>
27
28
  {#if !wrapped}
28
- <textarea bind:value bind:this={elementRef} {disabled} {...restProps} class={cn(wrapper(), className)}></textarea>
29
+ <textarea bind:value bind:this={elementRef} {disabled} {...restProps} class={wrapper({ class: clsx(className) })}></textarea>
29
30
  {:else}
30
- <div class={cn(wrapper(), className, (theme as TextareaTheme)?.wrapper)}>
31
+ <div class={wrapper({ class: clsx((theme as TextareaTheme)?.wrapper, className) })}>
31
32
  {#if header}
32
- <div class={cn(headerCls(), headerClass, (theme as TextareaTheme)?.headerCls)}>
33
+ <div class={headerCls({ class: clsx((theme as TextareaTheme)?.headerCls, headerClass) })}>
33
34
  {@render header()}
34
35
  </div>
35
36
  {/if}
36
- <div class={cn(innerWrapper(), innerClass, (theme as TextareaTheme)?.innerWrapper)}>
37
+ <div class={innerWrapper({ class: clsx((theme as TextareaTheme)?.innerWrapper, innerClass) })}>
37
38
  {#if addon}
38
- <div class={cn(addonCls(), addonClass, (theme as TextareaTheme)?.addonCls)}>
39
+ <div class={addonCls({ class: clsx((theme as TextareaTheme)?.addonCls, addonClass) })}>
39
40
  {@render addon()}
40
41
  </div>
41
42
  {/if}
42
- <textarea bind:value bind:this={elementRef} {disabled} {...restProps} class={cn(base(), textareaClass, (theme as TextareaTheme)?.base)}></textarea>
43
+ <textarea bind:value bind:this={elementRef} {disabled} {...restProps} class={base({ class: clsx((theme as TextareaTheme)?.base, textareaClass) })}></textarea>
43
44
  </div>
44
45
  {#if footer}
45
- <div class={cn(footerCls(), footerClass, (theme as TextareaTheme)?.footerCls)}>
46
+ <div class={footerCls({ class: clsx((theme as TextareaTheme)?.footerCls, footerClass) })}>
46
47
  {@render footer()}
47
48
  </div>
48
49
  {/if}
49
50
  </div>
50
51
  {/if}
51
52
  {#if value !== undefined && value !== "" && clearable}
52
- <CloseButton onclick={clearAll} class={cn(closebutton(), clearableClass, (theme as TextareaTheme)?.closebutton)} color={clearableColor} aria-label="Clear search value" svgClass={cn(clearableSvgClass)} />
53
+ <CloseButton onclick={clearAll} class={closebutton({ class: clsx((theme as TextareaTheme)?.closebutton, clearableClass) })} color={clearableColor} aria-label="Clear search value" svgClass={clsx(clearableSvgClass)} />
53
54
  {/if}
54
55
  </div>
55
56
 
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type TextareaVariants = VariantProps<typeof textarea>;
3
4
  export declare const textarea: import("tailwind-variants").TVReturnType<{
4
5
  cols: {
@@ -113,4 +114,4 @@ export declare const textarea: import("tailwind-variants").TVReturnType<{
113
114
  closebutton: string;
114
115
  }, undefined, unknown, unknown, undefined>>;
115
116
  export type TextareaSlots = keyof typeof textarea.slots;
116
- export type TextareaTheme = Partial<Record<TextareaSlots, string>>;
117
+ export type TextareaTheme = Partial<Record<TextareaSlots, ClassValue>>;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
- import { Dropdown, DropdownItem, Button, Input, ButtonGroup, Select, Label, Toggle, type TimepickerProps, type TimePickerOption, cn } from "../..";
2
+ import clsx from "clsx";
3
+ import { Dropdown, DropdownItem, Button, Input, ButtonGroup, Select, Label, Toggle, type TimepickerProps, type TimePickerOption } from "../..";
3
4
  import { timepicker, type TimepickerTheme } from ".";
4
5
  import { parse, isValid, isBefore, isAfter } from "date-fns";
5
6
  import { getTheme } from "../../theme/themeUtils";
@@ -154,10 +155,10 @@
154
155
  </script>
155
156
 
156
157
  {#if type !== "inline-buttons"}
157
- <ButtonGroup {size} class={cn(styles.buttonGroup(), divClass, (theme as TimepickerTheme)?.buttonGroup)}>
158
+ <ButtonGroup {size} class={styles.buttonGroup({ class: clsx((theme as TimepickerTheme)?.buttonGroup, divClass) })}>
158
159
  {#if type === "default"}
159
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.input(), styles.inputWithIcon(), inputClass, (theme as TimepickerTheme)?.input)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
160
- <div class={cn(styles.iconWrapper(), (theme as TimepickerTheme)?.iconWrapper)}>
160
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.input({ class: clsx(styles.inputWithIcon(), (theme as TimepickerTheme)?.input, inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
161
+ <div class={styles.iconWrapper({ class: clsx((theme as TimepickerTheme)?.iconWrapper) })}>
161
162
  {#if Icon}
162
163
  <Icon class={iconClass} />
163
164
  {:else}
@@ -167,13 +168,13 @@
167
168
  {/if}
168
169
  </div>
169
170
  {:else if type === "select"}
170
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.input(), inputClass, (theme as TimepickerTheme)?.input)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
171
- <Select selectClass={cn(styles.select(), selectClass, (theme as TimepickerTheme)?.select)} onchange={handleOptionSelect} items={options} value={selectedOption} />
171
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.input({ class: clsx((theme as TimepickerTheme)?.input, inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
172
+ <Select selectClass={styles.select({ class: clsx((theme as TimepickerTheme)?.select, selectClass) })} onchange={handleOptionSelect} items={options} value={selectedOption} />
172
173
  {:else if type === "dropdown"}
173
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.input(), inputClass, (theme as TimepickerTheme)?.input)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
174
- <Button color={buttonColor} class={cn(styles.button(), (theme as TimepickerTheme)?.button)}>
174
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.input({ class: clsx((theme as TimepickerTheme)?.input, inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
175
+ <Button color={buttonColor} class={styles.button({ class: clsx((theme as TimepickerTheme)?.button) })}>
175
176
  {optionLabel}
176
- <svg class={cn(styles.buttonIcon(), (theme as TimepickerTheme)?.buttonIcon)} aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
177
+ <svg class={styles.buttonIcon({ class: clsx((theme as TimepickerTheme)?.buttonIcon) })} aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
177
178
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
178
179
  </svg>
179
180
  </Button>
@@ -185,69 +186,69 @@
185
186
  {/each}
186
187
  </Dropdown>
187
188
  {:else if type === "range"}
188
- <div class={cn(styles.rangeInputWrapper(), (theme as TimepickerTheme)?.rangeInputWrapper)}>
189
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.input(), styles.rangeInput(), inputClass, (theme as TimepickerTheme)?.rangeInput)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
190
- <button type="button" class={cn(styles.rangeButton(), (theme as TimepickerTheme)?.rangeButton)} onclick={() => document.getElementById(id)?.click()} aria-label="Open time picker">
189
+ <div class={styles.rangeInputWrapper({ class: clsx((theme as TimepickerTheme)?.rangeInputWrapper) })}>
190
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.input({ class: clsx((theme as TimepickerTheme)?.rangeInput, styles.rangeInput(), inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
191
+ <button type="button" class={styles.rangeButton({ class: clsx((theme as TimepickerTheme)?.rangeButton) })} onclick={() => document.getElementById(id)?.click()} aria-label="Open time picker">
191
192
  {#if Icon}
192
193
  <Icon class={iconClass} />
193
194
  {:else}
194
- <svg class={cn(styles.icon(), (theme as TimepickerTheme)?.icon)} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
195
+ <svg class={styles.icon({ class: clsx((theme as TimepickerTheme)?.icon) })} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
195
196
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6v4l3.276 3.276M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
196
197
  </svg>
197
198
  {/if}
198
199
  </button>
199
200
  </div>
200
- <span class={cn(styles.rangeSeparator(), (theme as TimepickerTheme)?.rangeSeparator)}>-</span>
201
- <div class={cn(styles.rangeInputWrapper(), (theme as TimepickerTheme)?.rangeInputWrapper)}>
202
- <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.input(), styles.rangeInput(), inputClass, (theme as TimepickerTheme)?.rangeInput)} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
203
- <button type="button" class={cn(styles.rangeButton(), (theme as TimepickerTheme)?.rangeButton)} onclick={() => document.getElementById(endId)?.click()} aria-label="Open end time picker">
201
+ <span class={styles.rangeSeparator({ class: clsx((theme as TimepickerTheme)?.rangeSeparator) })}>-</span>
202
+ <div class={styles.rangeInputWrapper({ class: clsx((theme as TimepickerTheme)?.rangeInputWrapper) })}>
203
+ <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.input({ class: clsx(styles.rangeInput(), (theme as TimepickerTheme)?.rangeInput, inputClass) })} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
204
+ <button type="button" class={styles.rangeButton({ class: clsx((theme as TimepickerTheme)?.rangeButton) })} onclick={() => document.getElementById(endId)?.click()} aria-label="Open end time picker">
204
205
  {#if Icon}
205
206
  <Icon class={iconClass} />
206
207
  {:else}
207
- <svg class={cn(styles.icon(), (theme as TimepickerTheme)?.icon)} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
208
+ <svg class={styles.icon({ class: clsx((theme as TimepickerTheme)?.icon) })} aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
208
209
  <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6v4l3.276 3.276M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
209
210
  </svg>
210
211
  {/if}
211
212
  </button>
212
213
  </div>
213
214
  {:else if type === "timerange-dropdown"}
214
- <Button color={buttonColor} {size} class={cn(styles.button(), (theme as TimepickerTheme)?.button)}>
215
+ <Button color={buttonColor} {size} class={styles.button({ class: clsx((theme as TimepickerTheme)?.button) })}>
215
216
  {timerangeLabel}
216
- <svg class={cn(styles.buttonIcon(), (theme as TimepickerTheme)?.buttonIcon)} aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
217
+ <svg class={styles.buttonIcon({ class: clsx((theme as TimepickerTheme)?.buttonIcon) })} aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
217
218
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
218
219
  </svg>
219
220
  </Button>
220
- <Dropdown simple class={cn(styles.dropdownContent(), (theme as TimepickerTheme)?.dropdownContent)}>
221
- <div class={cn(styles.dropdownInner(), (theme as TimepickerTheme)?.dropdownInner)}>
222
- <div class={cn(styles.dropdownTimeRow(), (theme as TimepickerTheme)?.dropdownTimeRow)}>
223
- <div class={cn(styles.dropdownTimeCol(), (theme as TimepickerTheme)?.dropdownTimeCol)}>
221
+ <Dropdown simple class={styles.dropdownContent({ class: clsx((theme as TimepickerTheme)?.dropdownContent) })}>
222
+ <div class={styles.dropdownInner({ class: clsx((theme as TimepickerTheme)?.dropdownInner) })}>
223
+ <div class={styles.dropdownTimeRow({ class: clsx((theme as TimepickerTheme)?.dropdownTimeRow) })}>
224
+ <div class={styles.dropdownTimeCol({ class: clsx((theme as TimepickerTheme)?.dropdownTimeCol) })}>
224
225
  <Label for={id}>Start time:</Label>
225
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.dropdownTimeInput(), inputClass, (theme as TimepickerTheme)?.dropdownTimeInput)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
226
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.dropdownTimeInput({ class: clsx((theme as TimepickerTheme)?.dropdownTimeInput, inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
226
227
  </div>
227
- <div class={cn(styles.dropdownTimeCol(), (theme as TimepickerTheme)?.dropdownTimeCol)}>
228
+ <div class={styles.dropdownTimeCol({ class: clsx((theme as TimepickerTheme)?.dropdownTimeCol) })}>
228
229
  <Label for={endId}>End time:</Label>
229
- <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.dropdownTimeInput(), inputClass, (theme as TimepickerTheme)?.dropdownTimeInput)} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
230
+ <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.dropdownTimeInput({ class: clsx((theme as TimepickerTheme)?.dropdownTimeInput, inputClass) })} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
230
231
  </div>
231
232
  </div>
232
- <Button color={buttonColor} class={cn(styles.dropdownButton(), (theme as TimepickerTheme)?.dropdownButton)} onclick={applyTimerange}>
233
+ <Button color={buttonColor} class={styles.dropdownButton({ class: clsx((theme as TimepickerTheme)?.dropdownButton) })} onclick={applyTimerange}>
233
234
  {timerangeButtonLabel}
234
235
  </Button>
235
236
  </div>
236
237
  </Dropdown>
237
238
  {:else if type === "timerange-toggle"}
238
- <div class={cn(styles.toggleWrapper(), (theme as TimepickerTheme)?.toggleWrapper)}>
239
- <div class={cn(styles.toggleRow(), (theme as TimepickerTheme)?.toggleRow)}>
239
+ <div class={styles.toggleWrapper({ class: clsx((theme as TimepickerTheme)?.toggleWrapper) })}>
240
+ <div class={styles.toggleRow({ class: clsx((theme as TimepickerTheme)?.toggleRow) })}>
240
241
  <Toggle id={`${id}-timerange-toggle`} checked={showTimerange} onchange={toggleTimerange} spanClass="me-0 rounded-lg" />
241
242
  </div>
242
243
  {#if showTimerange}
243
- <div class={cn(styles.toggleTimeRow(), (theme as TimepickerTheme)?.toggleTimeRow)}>
244
- <div class={cn(styles.toggleTimeCol(), (theme as TimepickerTheme)?.toggleTimeCol)}>
244
+ <div class={styles.toggleTimeRow({ class: clsx((theme as TimepickerTheme)?.toggleTimeRow) })}>
245
+ <div class={styles.toggleTimeCol({ class: clsx((theme as TimepickerTheme)?.toggleTimeCol) })}>
245
246
  <Label for={id}>Start time:</Label>
246
- <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.toggleTimeInput(), inputClass, (theme as TimepickerTheme)?.toggleTimeInput)} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
247
+ <Input {id} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.toggleTimeInput({ class: clsx((theme as TimepickerTheme)?.toggleTimeInput, inputClass) })} bind:value oninput={(e) => handleTimeChange(e)} onchange={(e) => handleTimeChange(e)} />
247
248
  </div>
248
- <div class={cn(styles.toggleTimeCol(), (theme as TimepickerTheme)?.toggleTimeCol)}>
249
+ <div class={styles.toggleTimeCol({ class: clsx((theme as TimepickerTheme)?.toggleTimeCol) })}>
249
250
  <Label for={endId}>End time:</Label>
250
- <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={cn(styles.toggleTimeInput(), inputClass, (theme as TimepickerTheme)?.toggleTimeInput)} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
251
+ <Input id={endId} color={inputColor} type="time" {min} {max} {required} {disabled} class={styles.toggleTimeInput({ class: clsx((theme as TimepickerTheme)?.toggleTimeInput, inputClass) })} bind:value={endValue} oninput={(e) => handleTimeChange(e, true)} onchange={(e) => handleTimeChange(e, true)} />
251
252
  </div>
252
253
  </div>
253
254
  {/if}
@@ -255,9 +256,9 @@
255
256
  {/if}
256
257
  </ButtonGroup>
257
258
  {:else}
258
- <div class={cn(styles.inlineGrid(), (theme as TimepickerTheme)?.inlineGrid)}>
259
+ <div class={styles.inlineGrid({ class: clsx((theme as TimepickerTheme)?.inlineGrid) })}>
259
260
  {#each timeIntervals as time}
260
- <Button {size} color={value === time ? buttonColor : "light"} class={cn(styles.inlineButton(), (theme as TimepickerTheme)?.inlineButton)} onclick={() => handleInlineButtonSelect(time)}>
261
+ <Button {size} color={value === time ? buttonColor : "light"} class={styles.inlineButton({ class: clsx((theme as TimepickerTheme)?.inlineButton) })} onclick={() => handleInlineButtonSelect(time)}>
261
262
  {time}
262
263
  </Button>
263
264
  {/each}
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from "tailwind-variants";
2
+ import type { ClassValue } from "svelte/elements";
2
3
  export type TimepickerVariants = VariantProps<typeof timepicker>;
3
4
  export declare const timepicker: import("tailwind-variants").TVReturnType<{
4
5
  type: {
@@ -188,4 +189,4 @@ export declare const timepicker: import("tailwind-variants").TVReturnType<{
188
189
  inlineButton: string;
189
190
  }, undefined, unknown, unknown, undefined>>;
190
191
  export type TimepickerSlots = keyof typeof timepicker.slots;
191
- export type TimepickerTheme = Partial<Record<TimepickerSlots, string>>;
192
+ export type TimepickerTheme = Partial<Record<TimepickerSlots, ClassValue>>;