flowbite-svelte 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/dist/accordion/AccordionItem.svelte +5 -3
  2. package/dist/accordion/AccordionItem.svelte.d.ts +2 -0
  3. package/dist/alert/Alert.svelte +1 -1
  4. package/dist/alert/Alert.svelte.d.ts +1 -1
  5. package/dist/avatar/Avatar.svelte +1 -1
  6. package/dist/avatar/Avatar.svelte.d.ts +1 -1
  7. package/dist/badge/Badge.svelte +1 -1
  8. package/dist/badge/Badge.svelte.d.ts +1 -1
  9. package/dist/banner/Banner.svelte +1 -1
  10. package/dist/banner/Banner.svelte.d.ts +1 -1
  11. package/dist/bottom-navigation/BottomNav.svelte +1 -1
  12. package/dist/bottom-navigation/BottomNav.svelte.d.ts +1 -1
  13. package/dist/bottom-navigation/BottomNavHeader.svelte +1 -1
  14. package/dist/bottom-navigation/BottomNavHeader.svelte.d.ts +1 -1
  15. package/dist/bottom-navigation/BottomNavHeaderItem.svelte +1 -1
  16. package/dist/bottom-navigation/BottomNavHeaderItem.svelte.d.ts +1 -1
  17. package/dist/bottom-navigation/BottomNavItem.svelte +1 -1
  18. package/dist/bottom-navigation/BottomNavItem.svelte.d.ts +1 -1
  19. package/dist/breadcrumb/Breadcrumb.svelte +1 -1
  20. package/dist/breadcrumb/Breadcrumb.svelte.d.ts +1 -1
  21. package/dist/breadcrumb/BreadcrumbItem.svelte +1 -1
  22. package/dist/breadcrumb/BreadcrumbItem.svelte.d.ts +1 -1
  23. package/dist/buttongroup/ButtonGroup.svelte +4 -2
  24. package/dist/buttongroup/ButtonGroup.svelte.d.ts +2 -1
  25. package/dist/buttons/Button.svelte +6 -3
  26. package/dist/buttons/Button.svelte.d.ts +1 -1
  27. package/dist/buttons/GradientButton.svelte +1 -1
  28. package/dist/buttons/GradientButton.svelte.d.ts +1 -1
  29. package/dist/card/Card.svelte +1 -1
  30. package/dist/card/Card.svelte.d.ts +1 -1
  31. package/dist/carousel/Carousel.svelte +1 -1
  32. package/dist/carousel/Carousel.svelte.d.ts +1 -1
  33. package/dist/carousel/ControlButton.svelte +1 -1
  34. package/dist/carousel/ControlButton.svelte.d.ts +1 -1
  35. package/dist/carousel/Controls.svelte +1 -1
  36. package/dist/carousel/Controls.svelte.d.ts +1 -1
  37. package/dist/carousel/Indicators.svelte +1 -1
  38. package/dist/carousel/Indicators.svelte.d.ts +1 -1
  39. package/dist/carousel/Slide.svelte +1 -1
  40. package/dist/carousel/Slide.svelte.d.ts +1 -1
  41. package/dist/carousel/Thumbnail.svelte +1 -1
  42. package/dist/carousel/Thumbnail.svelte.d.ts +1 -1
  43. package/dist/carousel/Thumbnails.svelte +1 -1
  44. package/dist/carousel/Thumbnails.svelte.d.ts +1 -1
  45. package/dist/chart/Chart.svelte +1 -1
  46. package/dist/chart/Chart.svelte.d.ts +1 -1
  47. package/dist/darkmode/DarkMode.svelte +1 -1
  48. package/dist/darkmode/DarkMode.svelte.d.ts +1 -1
  49. package/dist/datepicker/Datepicker.svelte +3 -3
  50. package/dist/datepicker/Datepicker.svelte.d.ts +1 -1
  51. package/dist/device-mockups/Android.svelte +1 -1
  52. package/dist/device-mockups/Android.svelte.d.ts +1 -1
  53. package/dist/device-mockups/DefaultMockup.svelte +1 -1
  54. package/dist/device-mockups/DefaultMockup.svelte.d.ts +1 -1
  55. package/dist/device-mockups/Desktop.svelte +1 -1
  56. package/dist/device-mockups/Desktop.svelte.d.ts +1 -1
  57. package/dist/device-mockups/DeviceMockup.svelte +1 -1
  58. package/dist/device-mockups/DeviceMockup.svelte.d.ts +1 -1
  59. package/dist/device-mockups/Ios.svelte +1 -1
  60. package/dist/device-mockups/Ios.svelte.d.ts +1 -1
  61. package/dist/device-mockups/Laptop.svelte +1 -1
  62. package/dist/device-mockups/Laptop.svelte.d.ts +1 -1
  63. package/dist/device-mockups/Smartwatch.svelte +1 -1
  64. package/dist/device-mockups/Smartwatch.svelte.d.ts +1 -1
  65. package/dist/device-mockups/Tablet.svelte +1 -1
  66. package/dist/device-mockups/Tablet.svelte.d.ts +1 -1
  67. package/dist/drawer/Drawer.svelte +1 -1
  68. package/dist/drawer/Drawer.svelte.d.ts +1 -1
  69. package/dist/drawer/Drawerhead.svelte +1 -1
  70. package/dist/drawer/Drawerhead.svelte.d.ts +1 -1
  71. package/dist/dropdown/Dropdown.svelte +1 -1
  72. package/dist/dropdown/Dropdown.svelte.d.ts +1 -1
  73. package/dist/dropdown/DropdownDivider.svelte +1 -1
  74. package/dist/dropdown/DropdownDivider.svelte.d.ts +1 -1
  75. package/dist/dropdown/DropdownGroup.svelte +1 -1
  76. package/dist/dropdown/DropdownGroup.svelte.d.ts +1 -1
  77. package/dist/dropdown/DropdownHeader.svelte +1 -1
  78. package/dist/dropdown/DropdownHeader.svelte.d.ts +1 -1
  79. package/dist/dropdown/DropdownItem.svelte +1 -1
  80. package/dist/dropdown/DropdownItem.svelte.d.ts +1 -1
  81. package/dist/footer/Footer.svelte +1 -1
  82. package/dist/footer/Footer.svelte.d.ts +1 -1
  83. package/dist/footer/FooterBrand.svelte +1 -1
  84. package/dist/footer/FooterBrand.svelte.d.ts +1 -1
  85. package/dist/footer/FooterCopyright.svelte +1 -1
  86. package/dist/footer/FooterCopyright.svelte.d.ts +1 -1
  87. package/dist/footer/FooterIcon.svelte +1 -1
  88. package/dist/footer/FooterIcon.svelte.d.ts +1 -1
  89. package/dist/footer/FooterLink.svelte +1 -1
  90. package/dist/footer/FooterLink.svelte.d.ts +1 -1
  91. package/dist/footer/FooterLinkGroup.svelte +1 -1
  92. package/dist/footer/FooterLinkGroup.svelte.d.ts +1 -1
  93. package/dist/forms/checkbox-button/CheckboxButton.svelte +1 -1
  94. package/dist/forms/checkbox-button/CheckboxButton.svelte.d.ts +1 -1
  95. package/dist/forms/fileupload/Fileupload.svelte +1 -1
  96. package/dist/forms/fileupload/Fileupload.svelte.d.ts +1 -1
  97. package/dist/forms/floating-label-input/FloatingLabelInput.svelte +125 -5
  98. package/dist/forms/floating-label-input/FloatingLabelInput.svelte.d.ts +4 -1
  99. package/dist/forms/helper/Helper.svelte +1 -1
  100. package/dist/forms/helper/Helper.svelte.d.ts +1 -1
  101. package/dist/forms/input/Input.svelte +184 -21
  102. package/dist/forms/input/Input.svelte.d.ts +0 -5
  103. package/dist/forms/input-addon/InputAddon.svelte +1 -1
  104. package/dist/forms/input-addon/InputAddon.svelte.d.ts +1 -1
  105. package/dist/forms/label/Label.svelte +1 -1
  106. package/dist/forms/label/Label.svelte.d.ts +1 -1
  107. package/dist/forms/range/Range.svelte +1 -1
  108. package/dist/forms/range/Range.svelte.d.ts +1 -1
  109. package/dist/forms/search/Search.svelte +1 -1
  110. package/dist/forms/search/Search.svelte.d.ts +1 -1
  111. package/dist/forms/select/index.d.ts +3 -4
  112. package/dist/forms/select/index.js +3 -4
  113. package/dist/forms/tags/Tags.svelte +79 -0
  114. package/dist/forms/tags/Tags.svelte.d.ts +19 -0
  115. package/dist/forms/tags/index.d.ts +2 -0
  116. package/dist/forms/tags/index.js +2 -0
  117. package/dist/forms/tags/theme.d.ts +49 -0
  118. package/dist/forms/tags/theme.js +10 -0
  119. package/dist/forms/textarea/Textarea.svelte +1 -1
  120. package/dist/forms/textarea/Textarea.svelte.d.ts +1 -1
  121. package/dist/forms/timepicker/Timepicker.svelte +1 -1
  122. package/dist/forms/timepicker/Timepicker.svelte.d.ts +1 -1
  123. package/dist/forms/toggle/Toggle.svelte +1 -1
  124. package/dist/forms/toggle/Toggle.svelte.d.ts +1 -1
  125. package/dist/gallery/Gallery.svelte +1 -1
  126. package/dist/gallery/Gallery.svelte.d.ts +1 -1
  127. package/dist/index.d.ts +1 -0
  128. package/dist/index.js +1 -0
  129. package/dist/indicator/Indicator.svelte +1 -1
  130. package/dist/indicator/Indicator.svelte.d.ts +1 -1
  131. package/dist/kbd/Kbd.svelte +1 -1
  132. package/dist/kbd/Kbd.svelte.d.ts +1 -1
  133. package/dist/list-group/Listgroup.svelte +1 -1
  134. package/dist/list-group/Listgroup.svelte.d.ts +1 -1
  135. package/dist/list-group/ListgroupItem.svelte +1 -1
  136. package/dist/list-group/ListgroupItem.svelte.d.ts +1 -1
  137. package/dist/mega-menu/MegaMenu.svelte +1 -1
  138. package/dist/mega-menu/MegaMenu.svelte.d.ts +1 -1
  139. package/dist/modal/Modal.svelte +18 -10
  140. package/dist/modal/Modal.svelte.d.ts +2 -1
  141. package/dist/navbar/Menu.svelte +1 -1
  142. package/dist/navbar/Menu.svelte.d.ts +1 -1
  143. package/dist/navbar/NavBrand.svelte +1 -1
  144. package/dist/navbar/NavBrand.svelte.d.ts +1 -1
  145. package/dist/navbar/NavContainer.svelte +1 -1
  146. package/dist/navbar/NavContainer.svelte.d.ts +1 -1
  147. package/dist/navbar/NavHamburger.svelte +1 -1
  148. package/dist/navbar/NavHamburger.svelte.d.ts +1 -1
  149. package/dist/navbar/NavLi.svelte +1 -1
  150. package/dist/navbar/NavLi.svelte.d.ts +1 -1
  151. package/dist/navbar/NavUl.svelte +1 -1
  152. package/dist/navbar/NavUl.svelte.d.ts +1 -1
  153. package/dist/navbar/Navbar.svelte +1 -1
  154. package/dist/navbar/Navbar.svelte.d.ts +1 -1
  155. package/dist/pagination/Pagination.svelte +1 -1
  156. package/dist/pagination/Pagination.svelte.d.ts +1 -1
  157. package/dist/pagination/PaginationItem.svelte +1 -1
  158. package/dist/pagination/PaginationItem.svelte.d.ts +1 -1
  159. package/dist/popover/Popover.svelte +1 -1
  160. package/dist/popover/Popover.svelte.d.ts +1 -1
  161. package/dist/progress/Progressbar.svelte +1 -1
  162. package/dist/progress/Progressbar.svelte.d.ts +1 -1
  163. package/dist/progress/Progressradial.svelte +1 -1
  164. package/dist/progress/Progressradial.svelte.d.ts +1 -1
  165. package/dist/rating/AdvancedRating.svelte +1 -1
  166. package/dist/rating/AdvancedRating.svelte.d.ts +1 -1
  167. package/dist/rating/CustomIcon.svelte +1 -1
  168. package/dist/rating/CustomIcon.svelte.d.ts +1 -1
  169. package/dist/rating/Heart.svelte +1 -1
  170. package/dist/rating/Heart.svelte.d.ts +1 -1
  171. package/dist/rating/Rating.svelte +1 -1
  172. package/dist/rating/Rating.svelte.d.ts +1 -1
  173. package/dist/rating/RatingComment.svelte +1 -1
  174. package/dist/rating/RatingComment.svelte.d.ts +1 -1
  175. package/dist/rating/Review.svelte +1 -1
  176. package/dist/rating/Review.svelte.d.ts +1 -1
  177. package/dist/rating/ScoreRating.svelte +1 -1
  178. package/dist/rating/ScoreRating.svelte.d.ts +1 -1
  179. package/dist/rating/Star.svelte +1 -1
  180. package/dist/rating/Star.svelte.d.ts +1 -1
  181. package/dist/rating/Thumbup.svelte +1 -1
  182. package/dist/rating/Thumbup.svelte.d.ts +1 -1
  183. package/dist/sidebar/Sidebar.svelte +1 -1
  184. package/dist/sidebar/Sidebar.svelte.d.ts +1 -1
  185. package/dist/sidebar/SidebarBrand.svelte +1 -1
  186. package/dist/sidebar/SidebarBrand.svelte.d.ts +1 -1
  187. package/dist/sidebar/SidebarButton.svelte +1 -1
  188. package/dist/sidebar/SidebarButton.svelte.d.ts +1 -1
  189. package/dist/sidebar/SidebarCta.svelte +1 -1
  190. package/dist/sidebar/SidebarCta.svelte.d.ts +1 -1
  191. package/dist/sidebar/SidebarDropdownWrapper.svelte +1 -1
  192. package/dist/sidebar/SidebarDropdownWrapper.svelte.d.ts +1 -1
  193. package/dist/sidebar/SidebarGroup.svelte +1 -1
  194. package/dist/sidebar/SidebarGroup.svelte.d.ts +1 -1
  195. package/dist/sidebar/SidebarItem.svelte +1 -1
  196. package/dist/sidebar/SidebarItem.svelte.d.ts +1 -1
  197. package/dist/skeleton/CardPlaceholder.svelte +1 -1
  198. package/dist/skeleton/CardPlaceholder.svelte.d.ts +1 -1
  199. package/dist/skeleton/ImagePlaceholder.svelte +1 -1
  200. package/dist/skeleton/ImagePlaceholder.svelte.d.ts +1 -1
  201. package/dist/skeleton/ListPlaceholder.svelte +1 -1
  202. package/dist/skeleton/ListPlaceholder.svelte.d.ts +1 -1
  203. package/dist/skeleton/Skeleton.svelte +1 -1
  204. package/dist/skeleton/Skeleton.svelte.d.ts +1 -1
  205. package/dist/skeleton/TextPlaceholder.svelte +1 -1
  206. package/dist/skeleton/TextPlaceholder.svelte.d.ts +1 -1
  207. package/dist/skeleton/VideoPlaceholder.svelte +1 -1
  208. package/dist/skeleton/VideoPlaceholder.svelte.d.ts +1 -1
  209. package/dist/speed-dial/SpeedDial.svelte +1 -1
  210. package/dist/speed-dial/SpeedDial.svelte.d.ts +1 -1
  211. package/dist/speed-dial/SpeedDialButton.svelte +1 -1
  212. package/dist/speed-dial/SpeedDialButton.svelte.d.ts +1 -1
  213. package/dist/speed-dial/SpeedDialTrigger.svelte +1 -1
  214. package/dist/speed-dial/SpeedDialTrigger.svelte.d.ts +1 -1
  215. package/dist/spinner/Spinner.svelte +1 -1
  216. package/dist/spinner/Spinner.svelte.d.ts +1 -1
  217. package/dist/steps/StepIndicator.svelte +1 -1
  218. package/dist/steps/StepIndicator.svelte.d.ts +1 -1
  219. package/dist/table/Table.svelte +1 -1
  220. package/dist/table/Table.svelte.d.ts +1 -1
  221. package/dist/table/TableBody.svelte +1 -1
  222. package/dist/table/TableBody.svelte.d.ts +1 -1
  223. package/dist/table/TableBodyCell.svelte +1 -1
  224. package/dist/table/TableBodyCell.svelte.d.ts +1 -1
  225. package/dist/table/TableBodyRow.svelte +1 -1
  226. package/dist/table/TableBodyRow.svelte.d.ts +1 -1
  227. package/dist/table/TableHead.svelte +1 -1
  228. package/dist/table/TableHead.svelte.d.ts +1 -1
  229. package/dist/table/TableHeadCell.svelte +1 -1
  230. package/dist/table/TableHeadCell.svelte.d.ts +1 -1
  231. package/dist/table/TableSearch.svelte +1 -1
  232. package/dist/table/TableSearch.svelte.d.ts +1 -1
  233. package/dist/tabs/TabItem.svelte +1 -1
  234. package/dist/tabs/TabItem.svelte.d.ts +1 -1
  235. package/dist/tabs/Tabs.svelte +1 -1
  236. package/dist/tabs/Tabs.svelte.d.ts +1 -1
  237. package/dist/theme/Theme.svelte +1 -1
  238. package/dist/theme/Theme.svelte.d.ts +1 -1
  239. package/dist/timeline/Activity.svelte +1 -1
  240. package/dist/timeline/Activity.svelte.d.ts +1 -1
  241. package/dist/timeline/ActivityItem.svelte +1 -1
  242. package/dist/timeline/ActivityItem.svelte.d.ts +1 -1
  243. package/dist/timeline/Group.svelte +1 -1
  244. package/dist/timeline/Group.svelte.d.ts +1 -1
  245. package/dist/timeline/GroupItem.svelte +1 -1
  246. package/dist/timeline/GroupItem.svelte.d.ts +1 -1
  247. package/dist/timeline/Timeline.svelte +1 -1
  248. package/dist/timeline/Timeline.svelte.d.ts +1 -1
  249. package/dist/timeline/TimelineItem.svelte +1 -1
  250. package/dist/timeline/TimelineItem.svelte.d.ts +1 -1
  251. package/dist/toast/Toast.svelte +1 -1
  252. package/dist/toast/Toast.svelte.d.ts +1 -1
  253. package/dist/toolbar/Toolbar.svelte +1 -1
  254. package/dist/toolbar/Toolbar.svelte.d.ts +1 -1
  255. package/dist/toolbar/ToolbarButton.svelte +1 -1
  256. package/dist/toolbar/ToolbarButton.svelte.d.ts +1 -1
  257. package/dist/toolbar/ToolbarGroup.svelte +1 -1
  258. package/dist/toolbar/ToolbarGroup.svelte.d.ts +1 -1
  259. package/dist/tooltip/Tooltip.svelte +1 -1
  260. package/dist/tooltip/Tooltip.svelte.d.ts +1 -1
  261. package/dist/types.d.ts +24 -0
  262. package/dist/typography/anchor/A.svelte +1 -1
  263. package/dist/typography/anchor/A.svelte.d.ts +1 -1
  264. package/dist/typography/blockquote/Blockquote.svelte +1 -1
  265. package/dist/typography/blockquote/Blockquote.svelte.d.ts +1 -1
  266. package/dist/typography/descriptionlist/DescriptionList.svelte +1 -1
  267. package/dist/typography/descriptionlist/DescriptionList.svelte.d.ts +1 -1
  268. package/dist/typography/heading/Heading.svelte +1 -1
  269. package/dist/typography/heading/Heading.svelte.d.ts +1 -1
  270. package/dist/typography/hr/Hr.svelte +1 -1
  271. package/dist/typography/hr/Hr.svelte.d.ts +1 -1
  272. package/dist/typography/img/EnhancedImg.svelte +1 -1
  273. package/dist/typography/img/EnhancedImg.svelte.d.ts +1 -1
  274. package/dist/typography/img/Img.svelte +1 -1
  275. package/dist/typography/img/Img.svelte.d.ts +1 -1
  276. package/dist/typography/layout/Layout.svelte +1 -1
  277. package/dist/typography/layout/Layout.svelte.d.ts +1 -1
  278. package/dist/typography/list/Li.svelte +1 -1
  279. package/dist/typography/list/Li.svelte.d.ts +1 -1
  280. package/dist/typography/list/List.svelte +1 -1
  281. package/dist/typography/list/List.svelte.d.ts +1 -1
  282. package/dist/typography/mark/Mark.svelte +1 -1
  283. package/dist/typography/mark/Mark.svelte.d.ts +1 -1
  284. package/dist/typography/paragraph/P.svelte +1 -1
  285. package/dist/typography/paragraph/P.svelte.d.ts +1 -1
  286. package/dist/typography/secondary/Secondary.svelte +1 -1
  287. package/dist/typography/secondary/Secondary.svelte.d.ts +1 -1
  288. package/dist/typography/span/Span.svelte +1 -1
  289. package/dist/typography/span/Span.svelte.d.ts +1 -1
  290. package/dist/utils/Popper.svelte +30 -53
  291. package/dist/utils/Popper.svelte.d.ts +3 -1
  292. package/dist/video/Video.svelte +1 -1
  293. package/dist/video/Video.svelte.d.ts +1 -1
  294. package/package.json +28 -23
@@ -2,7 +2,7 @@ import type { HelperProps } from "../../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [HelperProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L725)
5
+ * [HelperProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L731)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop class: className
@@ -1,14 +1,44 @@
1
1
  <script lang="ts">
2
2
  import { getContext } from "svelte";
3
3
  import { CloseButton, type SizeType, type InputProps, type InputValue } from "../..";
4
+ import { twMerge } from "tailwind-merge";
4
5
  import { input, clampSize } from ".";
5
6
  import clsx from "clsx";
6
7
 
7
- let { children, left, right, value = $bindable(), elementRef = $bindable(), clearable = false, size, color = "default", class: className, classLeft, classRight, divClass, clearableSvgClass, clearableColor = "none", clearableClass, clearableOnClick, ...restProps }: InputProps<InputValue> = $props();
8
+ let {
9
+ children,
10
+ left,
11
+ right,
12
+ value = $bindable(),
13
+ elementRef = $bindable(),
14
+ clearable = false,
15
+ size,
16
+ color = "default",
17
+ class: className,
18
+ wrapperClass,
19
+ classLeft,
20
+ classRight,
21
+ divClass,
22
+ clearableSvgClass,
23
+ clearableColor = "none",
24
+ clearableClass,
25
+ clearableOnClick,
26
+ // Combobox props
27
+ data = [],
28
+ maxSuggestions = 5,
29
+ onSelect,
30
+ ...restProps
31
+ }: InputProps<InputValue> = $props();
32
+
33
+ // Automatically enable combobox when data is provided
34
+ const isCombobox = $derived(Array.isArray(data) && data.length > 0);
8
35
 
9
36
  // tinted if put in component having its own background
10
37
  let background: boolean = getContext("background");
11
38
 
39
+ // svelte-ignore non_reactive_update
40
+ let dummyFocusDiv: HTMLDivElement;
41
+
12
42
  let group: { size: SizeType } = getContext("group");
13
43
  let isGroup = !!group;
14
44
  let _size = $derived(size || clampSize(group?.size) || "md");
@@ -18,13 +48,163 @@
18
48
 
19
49
  const clearAll = () => {
20
50
  if (elementRef) {
21
- elementRef.value = "";
22
- value = undefined;
51
+ // in order to avoid type error in setTimeout()
52
+ const input = elementRef;
53
+ input.value = "";
54
+ value = "";
55
+
56
+ backspaceUsed = false;
57
+ updateSuggestions();
58
+ // hack to focus outside
59
+ dummyFocusDiv?.focus();
60
+ setTimeout(() => {
61
+ input.focus();
62
+ }, 100);
23
63
  }
64
+
24
65
  if (clearableOnClick) clearableOnClick();
25
66
  };
67
+
68
+ // Combobox functionality
69
+ let isFocused = $state(false);
70
+ let filteredSuggestions: string[] = $state([]);
71
+ let selectedIndex = $state(-1);
72
+ let backspaceUsed = $state(false); // Track if backspace was used to clear
73
+
74
+ function updateSuggestions() {
75
+ if (!isCombobox || !isFocused) {
76
+ filteredSuggestions = [];
77
+ return;
78
+ }
79
+
80
+ const searchTerm = ((value as string) || "").toLowerCase();
81
+
82
+ // Show suggestions if:
83
+ // 1. There's actual input text, OR
84
+ // 2. The input is empty but backspace was just used to clear it
85
+ if (searchTerm === "" && !backspaceUsed) {
86
+ filteredSuggestions = [];
87
+ } else {
88
+ // If there's text, filter suggestions
89
+ if (searchTerm) {
90
+ filteredSuggestions = data.filter((item) => item.toLowerCase().includes(searchTerm)).slice(0, maxSuggestions);
91
+ }
92
+ // If empty but backspace was used, show all suggestions
93
+ else if (backspaceUsed) {
94
+ filteredSuggestions = [...data].slice(0, maxSuggestions);
95
+ }
96
+ }
97
+
98
+ selectedIndex = -1;
99
+ }
100
+
101
+ // Watch for value changes
102
+ $effect(() => {
103
+ if (isCombobox) {
104
+ updateSuggestions();
105
+ }
106
+ });
107
+
108
+ function handleInput() {
109
+ // Reset backspace flag if user starts typing again
110
+ if ((value as string).length > 0) {
111
+ backspaceUsed = false;
112
+ }
113
+ updateSuggestions();
114
+ }
115
+
116
+ function handleFocus() {
117
+ isFocused = true;
118
+ updateSuggestions();
119
+ }
120
+
121
+ function handleBlur() {
122
+ // Small delay to allow click on suggestion to fire first
123
+ setTimeout(() => {
124
+ isFocused = false;
125
+ backspaceUsed = false; // Reset flag when focus is lost
126
+ filteredSuggestions = [];
127
+ }, 200);
128
+ }
129
+
130
+ function handleKeydown(event: KeyboardEvent) {
131
+ if (!isCombobox) return;
132
+
133
+ // Special handling for backspace/delete - track when it's used to clear the input
134
+ if (event.key === "Backspace" || event.key === "Delete") {
135
+ const currentValue = value as string;
136
+ // If this keypress will make the input empty
137
+ if (currentValue.length <= 1) {
138
+ backspaceUsed = true;
139
+ }
140
+ }
141
+
142
+ if (!filteredSuggestions.length) return;
143
+
144
+ switch (event.key) {
145
+ case "ArrowDown":
146
+ event.preventDefault();
147
+ selectedIndex = (selectedIndex + 1) % filteredSuggestions.length;
148
+ break;
149
+ case "ArrowUp":
150
+ event.preventDefault();
151
+ selectedIndex = selectedIndex <= 0 ? filteredSuggestions.length - 1 : selectedIndex - 1;
152
+ break;
153
+ case "Enter":
154
+ if (selectedIndex >= 0) {
155
+ event.preventDefault();
156
+ selectItem(filteredSuggestions[selectedIndex]);
157
+ }
158
+ break;
159
+ case "Escape":
160
+ event.preventDefault();
161
+ filteredSuggestions = [];
162
+ break;
163
+ }
164
+ }
165
+
166
+ function selectItem(item: string) {
167
+ value = item;
168
+
169
+ if (onSelect) {
170
+ onSelect(item);
171
+ }
172
+
173
+ filteredSuggestions = [];
174
+ selectedIndex = -1;
175
+
176
+ if (elementRef) {
177
+ elementRef.focus();
178
+ }
179
+ }
26
180
  </script>
27
181
 
182
+ {#if clearable}
183
+ <div tabindex="-1" bind:this={dummyFocusDiv} class="sr-only"></div>
184
+ {/if}
185
+
186
+ <div class={twMerge(isCombobox ? "relative w-full" : "", wrapperClass)}>
187
+ {#if group}
188
+ {@render inputContent()}
189
+ {:else if right || left || clearable}
190
+ <div class={base({ class: divClass })}>
191
+ {@render inputContent()}
192
+ </div>
193
+ {:else}
194
+ {@render inputContent()}
195
+ {/if}
196
+
197
+ {#if isCombobox && isFocused && filteredSuggestions.length > 0}
198
+ <div class="absolute top-full right-0 left-0 z-10 mt-1 max-h-60 overflow-y-auto rounded-md border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800">
199
+ {#each filteredSuggestions as item, i}
200
+ <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)}>
201
+ {item}
202
+ </button>
203
+ {/each}
204
+ </div>
205
+ {/if}
206
+ </div>
207
+
28
208
  {#snippet inputContent()}
29
209
  {#if left}
30
210
  <div class={leftCls({ class: classLeft })}>
@@ -34,7 +214,7 @@
34
214
  {#if children}
35
215
  {@render children({ ...restProps, class: inputCls() })}
36
216
  {:else}
37
- <input {...restProps} bind:value bind:this={elementRef} class={inputCls({ class: clsx(className) })} />
217
+ <input {...restProps} bind:value bind:this={elementRef} oninput={handleInput} onfocus={handleFocus} onblur={handleBlur} onkeydown={handleKeydown} class={inputCls({ class: clsx(className) })} />
38
218
  {#if value !== undefined && value !== "" && clearable}
39
219
  <CloseButton onclick={clearAll} class={clearbtn({ class: clearableClass })} color={clearableColor} aria-label="Clear search value" svgClass={clearableSvgClass} />
40
220
  {/if}
@@ -45,20 +225,3 @@
45
225
  </div>
46
226
  {/if}
47
227
  {/snippet}
48
-
49
- {#if group}
50
- {@render inputContent()}
51
- {:else if right || left || clearable}
52
- <div class={base({ class: divClass })}>
53
- {@render inputContent()}
54
- </div>
55
- {:else}
56
- {@render inputContent()}
57
- {/if}
58
-
59
- <!--
60
- @component
61
- [Go to docs](https://flowbite-svelte.com/)
62
- ## Props
63
- @props:
64
- -->
@@ -1,9 +1,4 @@
1
1
  import { type InputProps, type InputValue } from "../..";
2
- /**
3
- * [Go to docs](https://flowbite-svelte.com/)
4
- * ## Props
5
- * @props:
6
- */
7
2
  declare const Input: import("svelte").Component<InputProps<InputValue>, {}, "value" | "elementRef">;
8
3
  type Input = ReturnType<typeof Input>;
9
4
  export default Input;
@@ -41,7 +41,7 @@
41
41
  @component
42
42
  [Go to docs](https://flowbite-svelte.com/)
43
43
  ## Type
44
- [InputAddonProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L749)
44
+ [InputAddonProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L759)
45
45
  ## Props
46
46
  @prop children
47
47
  @prop class: className
@@ -2,7 +2,7 @@ import type { InputAddonProps } from "../../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [InputAddonProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L749)
5
+ * [InputAddonProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L759)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop class: className
@@ -20,7 +20,7 @@
20
20
  @component
21
21
  [Go to docs](https://flowbite-svelte.com/)
22
22
  ## Type
23
- [LabelProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L756)
23
+ [LabelProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L766)
24
24
  ## Props
25
25
  @prop children
26
26
  @prop color = "gray"
@@ -2,7 +2,7 @@ import type { LabelProps } from "../../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [LabelProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L756)
5
+ * [LabelProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L766)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop color = "gray"
@@ -14,7 +14,7 @@
14
14
  @component
15
15
  [Go to docs](https://flowbite-svelte.com/)
16
16
  ## Type
17
- [RangeProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L785)
17
+ [RangeProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L795)
18
18
  ## Props
19
19
  @prop value = $bindable()
20
20
  @prop appearance = "none"
@@ -2,7 +2,7 @@ import type { RangeProps } from "../../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [RangeProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L785)
5
+ * [RangeProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L795)
6
6
  * ## Props
7
7
  * @prop value = $bindable()
8
8
  * @prop appearance = "none"
@@ -37,7 +37,7 @@
37
37
  @component
38
38
  [Go to docs](https://flowbite-svelte.com/)
39
39
  ## Type
40
- [SearchProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L790)
40
+ [SearchProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L800)
41
41
  ## Props
42
42
  @prop children
43
43
  @prop class: inputClass
@@ -2,7 +2,7 @@ import { type SearchProps } from "../..";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [SearchProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L790)
5
+ * [SearchProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L800)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop class: inputClass
@@ -1,4 +1,3 @@
1
- import Select from "./Select.svelte";
2
- import MultiSelect from "./MultiSelect.svelte";
3
- import { select } from "./theme";
4
- export { Select, MultiSelect, select };
1
+ export { default as Select } from "./Select.svelte";
2
+ export { default as MultiSelect } from "./MultiSelect.svelte";
3
+ export { select } from "./theme";
@@ -1,4 +1,3 @@
1
- import Select from "./Select.svelte";
2
- import MultiSelect from "./MultiSelect.svelte";
3
- import { select } from "./theme";
4
- export { Select, MultiSelect, select };
1
+ export { default as Select } from "./Select.svelte";
2
+ export { default as MultiSelect } from "./MultiSelect.svelte";
3
+ export { select } from "./theme";
@@ -0,0 +1,79 @@
1
+ <script lang="ts">
2
+ import { type TagsProps, CloseButton } from "../..";
3
+ import { tags } from "./theme";
4
+
5
+ let { value = $bindable([]), itemClass, spanClass, placeholder = "Enter tags", class: className, closeClass, inputClass, closeBtnSize = "xs", ...restProps }: TagsProps = $props();
6
+
7
+ const { base, tag: tagCls, span: spanCls, close, input: inputCls } = $derived(tags());
8
+
9
+ let contents: string = $state("");
10
+
11
+ const handleKeys = (event: KeyboardEvent) => {
12
+ if (event.key === "Enter") {
13
+ event.preventDefault();
14
+ if (contents.length > 0 && contents.trim().length > 0) {
15
+ value.push(contents.trim());
16
+ value = value;
17
+ contents = "";
18
+ }
19
+ }
20
+
21
+ if (event.key === "Backspace") {
22
+ if (contents.length === 0) {
23
+ event.preventDefault();
24
+ contents = value.pop() ?? "";
25
+ value = value;
26
+ }
27
+ }
28
+ };
29
+
30
+ const deleteField = (index: number) => {
31
+ value.splice(index, 1);
32
+ value = value;
33
+ };
34
+ </script>
35
+
36
+ <div {...restProps} class={base({ class: className })}>
37
+ {#each value as tag, index}
38
+ <div class={tagCls({ class: itemClass })}>
39
+ <span class={spanCls({ class: spanClass })}>
40
+ {tag}
41
+ </span>
42
+ <CloseButton
43
+ size={closeBtnSize}
44
+ class={close({ class: closeClass })}
45
+ onclick={() => {
46
+ deleteField(index);
47
+ }}
48
+ />
49
+ </div>
50
+ {/each}
51
+
52
+ <input
53
+ onkeydown={(event) => {
54
+ handleKeys(event);
55
+ }}
56
+ bind:value={contents}
57
+ placeholder={value.length === 0 ? placeholder : ""}
58
+ type="text"
59
+ autocomplete="new-password"
60
+ class={inputCls({ class: inputClass })}
61
+ />
62
+ </div>
63
+
64
+ <!--
65
+ @component
66
+ [Go to docs](https://flowbite-svelte.com/)
67
+ ## Type
68
+ [TagsProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L843)
69
+ ## Props
70
+ @prop value = $bindable([])
71
+ @prop itemClass
72
+ @prop spanClass
73
+ @prop placeholder = 'Enter tags'
74
+ @prop class:className
75
+ @prop closeClass
76
+ @prop inputClass
77
+ @prop closeBtnSize = "xs"
78
+ @prop ...restProps
79
+ -->
@@ -0,0 +1,19 @@
1
+ import { type TagsProps } from "../..";
2
+ /**
3
+ * [Go to docs](https://flowbite-svelte.com/)
4
+ * ## Type
5
+ * [TagsProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L843)
6
+ * ## Props
7
+ * @prop value = $bindable([])
8
+ * @prop itemClass
9
+ * @prop spanClass
10
+ * @prop placeholder = 'Enter tags'
11
+ * @prop class:className
12
+ * @prop closeClass
13
+ * @prop inputClass
14
+ * @prop closeBtnSize = "xs"
15
+ * @prop ...restProps
16
+ */
17
+ declare const Tags: import("svelte").Component<TagsProps, {}, "value">;
18
+ type Tags = ReturnType<typeof Tags>;
19
+ export default Tags;
@@ -0,0 +1,2 @@
1
+ export { default as Tags } from "./Tags.svelte";
2
+ export { tags } from "./theme";
@@ -0,0 +1,2 @@
1
+ export { default as Tags } from "./Tags.svelte";
2
+ export { tags } from "./theme";
@@ -0,0 +1,49 @@
1
+ export declare const tags: import("tailwind-variants").TVReturnType<{
2
+ [key: string]: {
3
+ [key: string]: import("tailwind-variants").ClassValue | {
4
+ close?: import("tailwind-variants").ClassValue;
5
+ input?: import("tailwind-variants").ClassValue;
6
+ base?: import("tailwind-variants").ClassValue;
7
+ span?: import("tailwind-variants").ClassValue;
8
+ tag?: import("tailwind-variants").ClassValue;
9
+ };
10
+ };
11
+ } | {
12
+ [x: string]: {
13
+ [x: string]: import("tailwind-variants").ClassValue | {
14
+ close?: import("tailwind-variants").ClassValue;
15
+ input?: import("tailwind-variants").ClassValue;
16
+ base?: import("tailwind-variants").ClassValue;
17
+ span?: import("tailwind-variants").ClassValue;
18
+ tag?: import("tailwind-variants").ClassValue;
19
+ };
20
+ };
21
+ } | {}, {
22
+ base: string;
23
+ tag: string;
24
+ span: string;
25
+ close: string;
26
+ input: string;
27
+ }, undefined, {
28
+ [key: string]: {
29
+ [key: string]: import("tailwind-variants").ClassValue | {
30
+ close?: import("tailwind-variants").ClassValue;
31
+ input?: import("tailwind-variants").ClassValue;
32
+ base?: import("tailwind-variants").ClassValue;
33
+ span?: import("tailwind-variants").ClassValue;
34
+ tag?: import("tailwind-variants").ClassValue;
35
+ };
36
+ };
37
+ } | {}, {
38
+ base: string;
39
+ tag: string;
40
+ span: string;
41
+ close: string;
42
+ input: string;
43
+ }, import("tailwind-variants").TVReturnType<unknown, {
44
+ base: string;
45
+ tag: string;
46
+ span: string;
47
+ close: string;
48
+ input: string;
49
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,10 @@
1
+ import { tv } from "tailwind-variants";
2
+ export const tags = tv({
3
+ slots: {
4
+ base: "border bg-gray-50 border-gray-300 rounded-lg flex focus-within:ring-primary-500 focus-within:ring-1 focus-within:border-primary-500 overflow-x-auto scrollbar-hidden",
5
+ tag: "flex items-center rounded-lg bg-gray-100 text-gray-900 border border-gray-300 my-1 ml-1 px-2 text-sm max-w-full min-w-fit",
6
+ span: "items-center",
7
+ close: "my-auto ml-1",
8
+ input: "block text-sm m-2.5 p-0 bg-transparent border-none outline-none text-gray-900 h-min w-full min-w-fit focus:ring-0 placeholder-gray-400"
9
+ }
10
+ });
@@ -49,7 +49,7 @@
49
49
  @component
50
50
  [Go to docs](https://flowbite-svelte.com/)
51
51
  ## Type
52
- [TextareaProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L868)
52
+ [TextareaProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L891)
53
53
  ## Props
54
54
  @prop header
55
55
  @prop footer
@@ -2,7 +2,7 @@ import { type TextareaProps } from "../..";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [TextareaProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L868)
5
+ * [TextareaProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L891)
6
6
  * ## Props
7
7
  * @prop header
8
8
  * @prop footer
@@ -195,7 +195,7 @@
195
195
  @component
196
196
  [Go to docs](https://flowbite-svelte.com/)
197
197
  ## Type
198
- [TimepickerProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L840)
198
+ [TimepickerProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L863)
199
199
  ## Props
200
200
  @prop id = "time"
201
201
  @prop endId = "end-time"
@@ -2,7 +2,7 @@ import { type TimepickerProps } from "../..";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [TimepickerProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L840)
5
+ * [TimepickerProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L863)
6
6
  * ## Props
7
7
  * @prop id = "time"
8
8
  * @prop endId = "end-time"
@@ -24,7 +24,7 @@
24
24
  @component
25
25
  [Go to docs](https://flowbite-svelte.com/)
26
26
  ## Type
27
- [ToggleProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L887)
27
+ [ToggleProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L910)
28
28
  ## Props
29
29
  @prop children
30
30
  @prop size = "default"
@@ -2,7 +2,7 @@ import type { ToggleProps } from "../../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [ToggleProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L887)
5
+ * [ToggleProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L910)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop size = "default"
@@ -36,7 +36,7 @@
36
36
  @component
37
37
  [Go to docs](https://flowbite-svelte.com/)
38
38
  ## Type
39
- [GalleryProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L904)
39
+ [GalleryProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L927)
40
40
  ## Props
41
41
  @prop children
42
42
  @prop figure
@@ -2,7 +2,7 @@ import type { GalleryProps } from "../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [GalleryProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L904)
5
+ * [GalleryProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L927)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop figure
package/dist/index.d.ts CHANGED
@@ -55,6 +55,7 @@ export * from "./forms/radio";
55
55
  export * from "./forms/radio-button";
56
56
  export * from "./forms/range";
57
57
  export * from "./forms/search";
58
+ export * from "./forms/tags";
58
59
  export * from "./forms/textarea";
59
60
  export * from "./forms/timepicker";
60
61
  export * from "./forms/toggle";
package/dist/index.js CHANGED
@@ -56,6 +56,7 @@ export * from "./forms/radio";
56
56
  export * from "./forms/radio-button";
57
57
  export * from "./forms/range";
58
58
  export * from "./forms/search";
59
+ export * from "./forms/tags";
59
60
  export * from "./forms/textarea";
60
61
  export * from "./forms/timepicker";
61
62
  export * from "./forms/toggle";
@@ -29,7 +29,7 @@
29
29
  @component
30
30
  [Go to docs](https://flowbite-svelte.com/)
31
31
  ## Type
32
- [IndicatorProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L912)
32
+ [IndicatorProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L938)
33
33
  ## Props
34
34
  @prop children
35
35
  @prop color = "primary"
@@ -2,7 +2,7 @@ import type { IndicatorProps } from "../types";
2
2
  /**
3
3
  * [Go to docs](https://flowbite-svelte.com/)
4
4
  * ## Type
5
- * [IndicatorProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L912)
5
+ * [IndicatorProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L938)
6
6
  * ## Props
7
7
  * @prop children
8
8
  * @prop color = "primary"
@@ -15,7 +15,7 @@
15
15
  @component
16
16
  [Go to docs](https://flowbite-svelte.com/)
17
17
  ## Type
18
- [KbdProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L923)
18
+ [KbdProps](https://github.com/themesberg/flowbite-svelte/blob/main/src/lib/types.ts#L949)
19
19
  ## Props
20
20
  @prop children
21
21
  @prop class: className