tera-system-ui 0.1.64 → 0.1.66

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 (273) hide show
  1. package/dist/COMPONENT_API.md +2 -539
  2. package/dist/components/accordion/Accordion.d.ts +24 -0
  3. package/dist/components/accordion/Accordion.js +4 -0
  4. package/dist/components/accordion/components/Accordion.svelte +2 -8
  5. package/dist/components/accordion/components/AccordionContent.svelte +5 -12
  6. package/dist/components/accordion/components/AccordionItem.svelte +3 -9
  7. package/dist/components/accordion/components/AccordionTrigger.svelte +5 -15
  8. package/dist/components/ai/ChatBubble.svelte +35 -0
  9. package/dist/components/ai/ChatBubble.svelte.d.ts +12 -0
  10. package/dist/components/ai/PromptInput.svelte +58 -0
  11. package/dist/components/ai/PromptInput.svelte.d.ts +13 -0
  12. package/dist/components/ai/StreamText.svelte +41 -0
  13. package/dist/components/ai/StreamText.svelte.d.ts +11 -0
  14. package/dist/components/ai/SuggestionChips.svelte +34 -0
  15. package/dist/components/ai/SuggestionChips.svelte.d.ts +10 -0
  16. package/dist/components/ai/ThinkingLoader.svelte +34 -0
  17. package/dist/components/ai/ThinkingLoader.svelte.d.ts +11 -0
  18. package/dist/components/ai/index.d.ts +5 -0
  19. package/dist/components/ai/index.js +5 -0
  20. package/dist/components/alert/Alert.svelte +47 -0
  21. package/dist/components/alert/Alert.svelte.d.ts +15 -0
  22. package/dist/components/alert/index.d.ts +1 -0
  23. package/dist/components/alert/index.js +1 -0
  24. package/dist/components/avatar/Avatar.svelte +9 -25
  25. package/dist/components/badge/Badge.d.ts +52 -0
  26. package/dist/components/badge/Badge.js +22 -0
  27. package/dist/components/badge/Badge.svelte +22 -0
  28. package/dist/components/badge/Badge.svelte.d.ts +4 -0
  29. package/dist/components/badge/index.d.ts +2 -0
  30. package/dist/components/badge/index.js +1 -0
  31. package/dist/components/brand-logo/BrandLogo.svelte +12 -10
  32. package/dist/components/button/Button.d.ts +2 -2
  33. package/dist/components/button/Button.js +12 -12
  34. package/dist/components/button/Button.svelte +7 -34
  35. package/dist/components/card/Card.d.ts +68 -0
  36. package/dist/components/card/Card.js +28 -0
  37. package/dist/components/card/Card.svelte +33 -0
  38. package/dist/components/card/Card.svelte.d.ts +4 -0
  39. package/dist/components/card/index.d.ts +2 -0
  40. package/dist/components/card/index.js +1 -0
  41. package/dist/components/checkbox/Checkbox.d.ts +25 -4
  42. package/dist/components/checkbox/Checkbox.js +4 -0
  43. package/dist/components/checkbox/Checkbox.svelte +13 -16
  44. package/dist/components/checkbox/Checkbox.svelte.d.ts +2 -2
  45. package/dist/components/combobox/Combobox.d.ts +45 -9
  46. package/dist/components/combobox/Combobox.js +5 -7
  47. package/dist/components/combobox/Combobox.svelte +226 -8
  48. package/dist/components/combobox/Combobox.svelte.d.ts +2 -2
  49. package/dist/components/combobox/index.d.ts +1 -1
  50. package/dist/components/command/components/command-empty.svelte +3 -8
  51. package/dist/components/command/components/command-group.svelte +3 -13
  52. package/dist/components/command/components/command-input.svelte +5 -13
  53. package/dist/components/command/components/command-item.svelte +3 -9
  54. package/dist/components/command/components/command-link-item.svelte +3 -8
  55. package/dist/components/command/components/command-list.svelte +3 -8
  56. package/dist/components/command/components/command-separator.svelte +3 -8
  57. package/dist/components/command/components/command-shortcut.svelte +2 -10
  58. package/dist/components/command/components/command.svelte +29 -42
  59. package/dist/components/date-range-picker/DateRangePicker.svelte +490 -0
  60. package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +4 -0
  61. package/dist/components/date-range-picker/DateRangePicker.types.d.ts +38 -0
  62. package/dist/components/date-range-picker/DateRangePicker.types.js +1 -0
  63. package/dist/components/date-range-picker/index.d.ts +2 -0
  64. package/dist/components/date-range-picker/index.js +1 -0
  65. package/dist/components/dialog/Dialog.d.ts +43 -121
  66. package/dist/components/dialog/Dialog.js +1 -39
  67. package/dist/components/dialog/Dialog.svelte +103 -113
  68. package/dist/components/dialog/Dialog.svelte.d.ts +1 -2
  69. package/dist/components/dialog/dialog.scss +21 -24
  70. package/dist/components/drawer/Drawer.svelte +63 -0
  71. package/dist/components/drawer/Drawer.svelte.d.ts +16 -0
  72. package/dist/components/drawer/index.d.ts +1 -0
  73. package/dist/components/drawer/index.js +1 -0
  74. package/dist/components/dropdown-menu/DropdownMenu.d.ts +51 -24
  75. package/dist/components/dropdown-menu/DropdownMenu.js +1 -15
  76. package/dist/components/dropdown-menu/components/DropdownMenu.svelte +36 -34
  77. package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
  78. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +8 -12
  79. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +2 -4
  80. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -12
  81. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +2 -4
  82. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +27 -30
  83. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
  84. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +9 -11
  85. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +2 -4
  86. package/dist/components/fonts/TeraFontMono.svelte +4 -4
  87. package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -0
  88. package/dist/components/fonts/TeraFontSansSerif.svelte +4 -4
  89. package/dist/components/fonts/TeraFontSansSerif.svelte.d.ts +1 -1
  90. package/dist/components/header/Header.svelte +6 -9
  91. package/dist/components/header/header.scss +1 -1
  92. package/dist/components/icons/IconArrowBigRightFilled.svelte +3 -7
  93. package/dist/components/icons/IconBook.svelte +3 -6
  94. package/dist/components/icons/IconBookmarkPlus.svelte +3 -6
  95. package/dist/components/icons/IconCalculator.svelte +3 -6
  96. package/dist/components/icons/IconCheck.svelte +3 -6
  97. package/dist/components/icons/IconChevronDown.svelte +3 -6
  98. package/dist/components/icons/IconCoin.svelte +3 -6
  99. package/dist/components/icons/IconCoinConvert.svelte +2 -5
  100. package/dist/components/icons/IconCopy.svelte +3 -6
  101. package/dist/components/icons/IconCopyCheckFilled.svelte +3 -6
  102. package/dist/components/icons/IconHamburger.svelte +3 -6
  103. package/dist/components/icons/IconLanguage.svelte +3 -6
  104. package/dist/components/icons/IconLoader2.svelte +3 -6
  105. package/dist/components/icons/IconLogout.svelte +3 -6
  106. package/dist/components/icons/IconMoon.svelte +3 -6
  107. package/dist/components/icons/IconPointFilled.svelte +3 -6
  108. package/dist/components/icons/IconSearch.svelte +3 -6
  109. package/dist/components/icons/IconSettings.svelte +3 -6
  110. package/dist/components/icons/IconSun.svelte +3 -6
  111. package/dist/components/icons/IconSwitchHorizontal.svelte +3 -6
  112. package/dist/components/icons/IconSwitchVertical.svelte +3 -6
  113. package/dist/components/icons/IconTransform.svelte +3 -6
  114. package/dist/components/icons/IconX.svelte +3 -6
  115. package/dist/components/input/Input.d.ts +2 -2
  116. package/dist/components/input/Input.js +10 -10
  117. package/dist/components/input/Input.svelte +10 -26
  118. package/dist/components/label/Label.d.ts +2 -2
  119. package/dist/components/label/Label.js +2 -2
  120. package/dist/components/label/Label.svelte +4 -12
  121. package/dist/components/language-picker-button/LanguagePickerButton.svelte +23 -42
  122. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +21 -26
  123. package/dist/components/marketing/FeatureCard.svelte +37 -0
  124. package/dist/components/marketing/FeatureCard.svelte.d.ts +13 -0
  125. package/dist/components/marketing/PricingCard.svelte +48 -0
  126. package/dist/components/marketing/PricingCard.svelte.d.ts +15 -0
  127. package/dist/components/marketing/StatBlock.svelte +14 -0
  128. package/dist/components/marketing/StatBlock.svelte.d.ts +10 -0
  129. package/dist/components/marketing/TestimonialCard.svelte +24 -0
  130. package/dist/components/marketing/TestimonialCard.svelte.d.ts +12 -0
  131. package/dist/components/marketing/index.d.ts +4 -0
  132. package/dist/components/marketing/index.js +4 -0
  133. package/dist/components/popover/Popover.d.ts +32 -13
  134. package/dist/components/popover/Popover.js +1 -7
  135. package/dist/components/popover/Popover.svelte +40 -158
  136. package/dist/components/popover/Popover.svelte.d.ts +2 -2
  137. package/dist/components/popover-responsive/PopoverResponsive.d.ts +18 -7
  138. package/dist/components/popover-responsive/PopoverResponsive.js +1 -7
  139. package/dist/components/popover-responsive/PopoverResponsive.svelte +25 -87
  140. package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +2 -11
  141. package/dist/components/select/Select.d.ts +60 -23
  142. package/dist/components/select/Select.js +14 -35
  143. package/dist/components/select/Select.svelte +157 -28
  144. package/dist/components/select/Select.svelte.d.ts +2 -3
  145. package/dist/components/select/index.d.ts +1 -1
  146. package/dist/components/side-navigation/SideNavigation.svelte +73 -96
  147. package/dist/components/side-navigation/SideNavigationItem.svelte +2 -2
  148. package/dist/components/side-navigation/SideNavigationLayout.svelte +3 -5
  149. package/dist/components/side-navigation/sidenav.scss +17 -13
  150. package/dist/components/skeleton/Skeleton.svelte +48 -0
  151. package/dist/components/skeleton/Skeleton.svelte.d.ts +12 -0
  152. package/dist/components/skeleton/index.d.ts +1 -0
  153. package/dist/components/skeleton/index.js +1 -0
  154. package/dist/components/slider/Slider.d.ts +25 -15
  155. package/dist/components/slider/Slider.js +1 -7
  156. package/dist/components/slider/Slider.svelte +38 -164
  157. package/dist/components/slider/Slider.svelte.d.ts +1 -1
  158. package/dist/components/spinner/Spinner.svelte +39 -0
  159. package/dist/components/spinner/Spinner.svelte.d.ts +10 -0
  160. package/dist/components/spinner/index.d.ts +1 -0
  161. package/dist/components/spinner/index.js +1 -0
  162. package/dist/components/star-rating/StarRating.svelte +33 -49
  163. package/dist/components/switch/Switch.d.ts +19 -4
  164. package/dist/components/switch/Switch.js +4 -0
  165. package/dist/components/switch/Switch.svelte +13 -17
  166. package/dist/components/switch/Switch.svelte.d.ts +2 -2
  167. package/dist/components/table/Table.svelte +68 -0
  168. package/dist/components/table/Table.svelte.d.ts +40 -0
  169. package/dist/components/table/index.d.ts +1 -0
  170. package/dist/components/table/index.js +1 -0
  171. package/dist/components/tabs/Tabs.svelte.d.ts +45 -16
  172. package/dist/components/tabs/Tabs.svelte.js +8 -18
  173. package/dist/components/tabs/components/Tabs.svelte +27 -33
  174. package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
  175. package/dist/components/tabs/components/TabsContent.svelte +13 -36
  176. package/dist/components/tabs/components/TabsContent.svelte.d.ts +2 -5
  177. package/dist/components/tabs/components/TabsItem.svelte +43 -32
  178. package/dist/components/tabs/components/TabsItem.svelte.d.ts +2 -5
  179. package/dist/components/tabs/components/TabsList.svelte +90 -58
  180. package/dist/components/tabs/components/TabsList.svelte.d.ts +2 -4
  181. package/dist/components/tera-ui-context/TeraUiContext.svelte +13 -26
  182. package/dist/components/text-area/TextArea.d.ts +2 -2
  183. package/dist/components/text-area/TextArea.js +9 -9
  184. package/dist/components/text-area/TextArea.svelte +41 -65
  185. package/dist/components/toast/ToastContainer.svelte +50 -0
  186. package/dist/components/toast/ToastContainer.svelte.d.ts +18 -0
  187. package/dist/components/toast/index.d.ts +3 -0
  188. package/dist/components/toast/index.js +2 -0
  189. package/dist/components/toast/toast.svelte.d.ts +22 -0
  190. package/dist/components/toast/toast.svelte.js +18 -0
  191. package/dist/components/tooltip/Tooltip.d.ts +23 -0
  192. package/dist/components/tooltip/Tooltip.js +1 -0
  193. package/dist/components/tooltip/Tooltip.svelte +30 -0
  194. package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
  195. package/dist/components/tooltip/index.d.ts +2 -0
  196. package/dist/components/tooltip/index.js +1 -0
  197. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +48 -69
  198. package/dist/index.d.ts +19 -2
  199. package/dist/index.js +12 -0
  200. package/dist/llms/accordion.md +90 -0
  201. package/dist/llms/ai.md +110 -0
  202. package/dist/llms/alert.md +29 -0
  203. package/dist/llms/avatar.md +34 -0
  204. package/dist/llms/badge.md +31 -0
  205. package/dist/llms/brand-logo.md +30 -0
  206. package/dist/llms/button.md +37 -0
  207. package/dist/llms/card.md +32 -0
  208. package/dist/llms/checkbox.md +35 -0
  209. package/dist/llms/colors.md +161 -0
  210. package/dist/llms/combobox.md +40 -0
  211. package/dist/llms/command.md +7 -0
  212. package/dist/llms/date-range-picker.md +36 -0
  213. package/dist/llms/dialog.md +45 -0
  214. package/dist/llms/drawer.md +30 -0
  215. package/dist/llms/dropdown-menu.md +112 -0
  216. package/dist/llms/fonts.md +7 -0
  217. package/dist/llms/header.md +26 -0
  218. package/dist/llms/icons.md +43 -0
  219. package/dist/llms/index.md +65 -0
  220. package/dist/llms/input.md +37 -0
  221. package/dist/llms/label.md +30 -0
  222. package/dist/llms/language-picker-button.md +30 -0
  223. package/dist/llms/light-dark-toggle.md +26 -0
  224. package/dist/llms/marketing.md +95 -0
  225. package/dist/llms/popover-responsive.md +32 -0
  226. package/dist/llms/popover.md +40 -0
  227. package/dist/llms/select.md +44 -0
  228. package/dist/llms/side-navigation.md +30 -0
  229. package/dist/llms/skeleton.md +28 -0
  230. package/dist/llms/slider.md +36 -0
  231. package/dist/llms/spinner.md +25 -0
  232. package/dist/llms/star-rating.md +31 -0
  233. package/dist/llms/switch.md +33 -0
  234. package/dist/llms/table.md +30 -0
  235. package/dist/llms/tabs.md +92 -0
  236. package/dist/llms/tera-ui-context.md +30 -0
  237. package/dist/llms/text-area.md +39 -0
  238. package/dist/llms/toast.md +7 -0
  239. package/dist/llms/tooltip.md +32 -0
  240. package/dist/llms/user-avatar-with-menu.md +28 -0
  241. package/dist/paraglide/README.md +72 -3
  242. package/dist/paraglide/messages/text_account_settings.d.ts +14 -2
  243. package/dist/paraglide/messages/text_account_settings.js +53 -58
  244. package/dist/paraglide/messages/text_calces_documentation.d.ts +14 -2
  245. package/dist/paraglide/messages/text_calces_documentation.js +53 -58
  246. package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +14 -2
  247. package/dist/paraglide/messages/text_calces_scientific_calculator.js +53 -58
  248. package/dist/paraglide/messages/text_currency_converter.d.ts +14 -2
  249. package/dist/paraglide/messages/text_currency_converter.js +53 -58
  250. package/dist/paraglide/messages/text_logout.d.ts +14 -2
  251. package/dist/paraglide/messages/text_logout.js +53 -58
  252. package/dist/paraglide/messages/text_select_language.d.ts +14 -2
  253. package/dist/paraglide/messages/text_select_language.js +53 -58
  254. package/dist/paraglide/messages/text_unit_converter.d.ts +14 -2
  255. package/dist/paraglide/messages/text_unit_converter.js +53 -58
  256. package/dist/paraglide/registry.d.ts +13 -0
  257. package/dist/paraglide/registry.js +15 -0
  258. package/dist/paraglide/runtime.d.ts +243 -126
  259. package/dist/paraglide/runtime.js +473 -148
  260. package/dist/paraglide/server.d.ts +13 -20
  261. package/dist/paraglide/server.js +92 -40
  262. package/dist/stories/ComponentOverview.stories.svelte +533 -0
  263. package/dist/stories/ComponentOverview.stories.svelte.d.ts +6 -0
  264. package/dist/themes/tera-ui-base.css +242 -77
  265. package/dist/themes/theme-ai.css +100 -0
  266. package/dist/themes/theme-marketing.css +91 -0
  267. package/dist/themes/theme-professional.css +41 -0
  268. package/package.json +35 -29
  269. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +0 -3
  270. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +0 -103
  271. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/project_id +0 -1
  272. package/dist/themes/tw-preset.cjs +0 -160
  273. package/dist/themes/tw-preset.d.cts +0 -157
@@ -1,8 +1,226 @@
1
- <script lang="ts">
2
- import {type ComboboxProps, styles} from "./Combobox";
3
- import {Popover} from "../popover";
4
-
5
- let {children, ...props}: ComboboxProps = $props();
6
-
7
- </script>
8
-
1
+ <script lang="ts">import { Combobox as ComboboxPrimitive } from 'bits-ui';
2
+ import { cn } from '../../utils/utils.js';
3
+ import { IconCheck, IconChevronDown } from '../icons/index.js';
4
+ import IconX from '@tabler/icons-svelte/icons/x';
5
+ let { type, items = [], value = $bindable(undefined), placeholder = 'Search…', disabled, loop, allowDeselect, onchange, class: className, ref = $bindable(null), name, required, scrollAlignment, freeInput = false, } = $props();
6
+ let searchText = $state('');
7
+ let open = $state(false);
8
+ const filteredItems = $derived(searchText.trim()
9
+ ? items.filter(i => i.label.toLowerCase().includes(searchText.trim().toLowerCase()))
10
+ : items);
11
+ // Label of the currently selected item (single mode), or '' if none / custom text
12
+ const selectedLabel = $derived(type === 'single' && typeof value === 'string' && value
13
+ ? (items.find(i => i.value === value)?.label ?? '')
14
+ : '');
15
+ const selectedChips = $derived(type === 'multiple' && Array.isArray(value)
16
+ ? value.map(v => ({ value: v, label: items.find(i => i.value === v)?.label ?? v }))
17
+ : []);
18
+ /**
19
+ * inputValue passed to Combobox.Root for single mode:
20
+ * - freeInput mode: always controlled — show selected label when an item
21
+ * matches, otherwise show the raw value (custom free text).
22
+ * - normal mode: undefined → let bits-ui manage it automatically.
23
+ *
24
+ * Setting this to '' on clear ensures the input text is wiped even when
25
+ * the dropdown animation is still playing.
26
+ */
27
+ const controlledInputValue = $derived.by(() => {
28
+ if (type !== 'single')
29
+ return undefined;
30
+ if (freeInput) {
31
+ // Show label when value matches an item; otherwise the raw typed value
32
+ return selectedLabel || (typeof value === 'string' ? value : '') || '';
33
+ }
34
+ // Normal mode: after clearing, force the input empty; otherwise let bits-ui handle it
35
+ if (!value)
36
+ return '';
37
+ return undefined;
38
+ });
39
+ // In freeInput mode the X button is visible whenever the input has any text
40
+ const showClearBtn = $derived(type === 'single' && (freeInput ? !!(value) : !!(value)));
41
+ function handleSingleInput(e) {
42
+ searchText = e.currentTarget.value;
43
+ if (freeInput) {
44
+ // Typed text IS the value in free-input mode
45
+ value = searchText;
46
+ onchange?.(searchText);
47
+ // Close immediately (same tick) when no suggestions match —
48
+ // avoids a "no results" flash before a reactive effect would fire.
49
+ if (searchText.trim() && !items.some(i => i.label.toLowerCase().includes(searchText.trim().toLowerCase()))) {
50
+ open = false;
51
+ }
52
+ }
53
+ }
54
+ function clearOne(v) {
55
+ const next = value.filter(x => x !== v);
56
+ value = next;
57
+ onchange?.(next);
58
+ }
59
+ function clearAll() {
60
+ value = type === 'multiple' ? [] : undefined;
61
+ onchange?.(type === 'multiple' ? [] : '');
62
+ searchText = '';
63
+ }
64
+ const wrapperClass = $derived(cn('w-full inline-flex items-center gap-1 rounded-md outline-none font-normal text-left', 'border border-border-default bg-surface-control', 'transition-[border-color,box-shadow] ease-ui duration-150', 'hover:border-interactive', open && 'border-interactive-hover shadow-focus', disabled && 'cursor-not-allowed opacity-50 pointer-events-none', className));
65
+ const dropdownClass = `z-50 overflow-hidden
66
+ bg-surface rounded-container border border-border-default shadow-lg
67
+ animate-in fade-in zoom-in-95 duration-150
68
+ data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95`;
69
+ const itemClass = `relative flex w-full cursor-pointer select-none items-center rounded px-2 py-2 text-sm text-text-primary outline-none
70
+ transition-colors ease-ui duration-100
71
+ data-[highlighted]:bg-surface-hover
72
+ data-[selected]:font-medium data-[selected]:text-interactive
73
+ data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50`;
74
+ </script>
75
+
76
+ {#if type === 'single'}
77
+ <ComboboxPrimitive.Root
78
+ type="single"
79
+ bind:value={value as string | undefined}
80
+ bind:open
81
+ onValueChange={(v) => onchange?.(v)}
82
+ {disabled}
83
+ {loop}
84
+ {allowDeselect}
85
+ {name}
86
+ {required}
87
+ {scrollAlignment}
88
+ {items}
89
+ inputValue={controlledInputValue}
90
+ onOpenChange={(o) => { if (!o) searchText = ''; }}
91
+ >
92
+ <div bind:this={ref} class={cn(wrapperClass, 'h-9 px-3')}>
93
+ <ComboboxPrimitive.Input
94
+ oninput={handleSingleInput}
95
+ placeholder={(!freeInput && selectedLabel) ? selectedLabel : placeholder}
96
+ clearOnDeselect
97
+ class="flex-1 min-w-0 bg-transparent text-sm text-text-primary placeholder:text-text-tertiary outline-none cursor-default"
98
+ />
99
+ {#if showClearBtn}
100
+ <button
101
+ type="button"
102
+ onpointerdown={(e) => e.stopPropagation()}
103
+ onclick={(e) => { e.stopPropagation(); clearAll(); }}
104
+ class="shrink-0 flex items-center justify-center size-4 rounded text-text-tertiary hover:text-text-primary"
105
+ aria-label="Clear selection"
106
+ >
107
+ <IconX class="size-3.5" />
108
+ </button>
109
+ {/if}
110
+ <ComboboxPrimitive.Trigger class="shrink-0 flex items-center justify-center text-text-tertiary hover:text-text-primary">
111
+ <IconChevronDown class={cn('size-4 transition-transform ease-ui duration-150', open && 'rotate-180')} />
112
+ </ComboboxPrimitive.Trigger>
113
+ </div>
114
+
115
+ {#if !freeInput || filteredItems.length > 0}
116
+ <ComboboxPrimitive.Portal>
117
+ <ComboboxPrimitive.Content
118
+ sideOffset={4}
119
+ customAnchor={ref}
120
+ class={cn(dropdownClass, 'min-w-[var(--bits-combobox-anchor-width)]')}
121
+ >
122
+ <ComboboxPrimitive.Viewport class="p-1 max-h-60 overflow-auto">
123
+ {#each filteredItems as item (item.value)}
124
+ <ComboboxPrimitive.Item
125
+ value={item.value}
126
+ label={item.label}
127
+ disabled={item.disabled}
128
+ class={itemClass}
129
+ >
130
+ {#snippet children({selected})}
131
+ <span class="flex-1">{item.label}</span>
132
+ {#if selected}
133
+ <IconCheck class="size-4 text-interactive shrink-0" />
134
+ {/if}
135
+ {/snippet}
136
+ </ComboboxPrimitive.Item>
137
+ {:else}
138
+ <div class="px-3 py-4 text-sm text-center text-text-tertiary">No results found.</div>
139
+ {/each}
140
+ </ComboboxPrimitive.Viewport>
141
+ </ComboboxPrimitive.Content>
142
+ </ComboboxPrimitive.Portal>
143
+ {/if}
144
+ </ComboboxPrimitive.Root>
145
+
146
+ {:else}
147
+ <ComboboxPrimitive.Root
148
+ type="multiple"
149
+ bind:value={value as string[] | undefined}
150
+ bind:open
151
+ onValueChange={(v) => onchange?.(v)}
152
+ {disabled}
153
+ {loop}
154
+ {name}
155
+ {required}
156
+ {scrollAlignment}
157
+ onOpenChange={(o) => { if (!o) searchText = ''; }}
158
+ >
159
+ <div bind:this={ref} class={cn(wrapperClass, 'min-h-9 h-auto flex-wrap gap-1 px-3 py-1.5')}>
160
+ {#each selectedChips as chip (chip.value)}
161
+ <span class="inline-flex items-center gap-1 pl-2 pr-1 py-0.5 rounded-full text-xs bg-interactive-subtle text-interactive-text border border-interactive-border shrink-0">
162
+ {chip.label}
163
+ <button
164
+ type="button"
165
+ onpointerdown={(e) => e.stopPropagation()}
166
+ onclick={(e) => { e.stopPropagation(); clearOne(chip.value); }}
167
+ class="flex items-center rounded-full hover:bg-interactive/20"
168
+ aria-label="Remove {chip.label}"
169
+ >
170
+ <IconX class="size-3" />
171
+ </button>
172
+ </span>
173
+ {/each}
174
+ <ComboboxPrimitive.Input
175
+ oninput={(e) => (searchText = e.currentTarget.value)}
176
+ placeholder={selectedChips.length === 0 ? placeholder : ''}
177
+ clearOnDeselect
178
+ class="flex-1 min-w-[80px] bg-transparent text-sm text-text-primary placeholder:text-text-tertiary outline-none cursor-default"
179
+ />
180
+ <span class="ml-auto flex items-center gap-1 shrink-0 self-center">
181
+ {#if selectedChips.length > 0}
182
+ <button
183
+ type="button"
184
+ onpointerdown={(e) => e.stopPropagation()}
185
+ onclick={(e) => { e.stopPropagation(); clearAll(); }}
186
+ class="flex items-center justify-center size-4 rounded text-text-tertiary hover:text-text-primary"
187
+ aria-label="Clear all"
188
+ >
189
+ <IconX class="size-3.5" />
190
+ </button>
191
+ {/if}
192
+ <ComboboxPrimitive.Trigger class="flex items-center justify-center text-text-tertiary hover:text-text-primary">
193
+ <IconChevronDown class={cn('size-4 transition-transform ease-ui duration-150', open && 'rotate-180')} />
194
+ </ComboboxPrimitive.Trigger>
195
+ </span>
196
+ </div>
197
+
198
+ <ComboboxPrimitive.Portal>
199
+ <ComboboxPrimitive.Content
200
+ sideOffset={4}
201
+ customAnchor={ref}
202
+ class={cn(dropdownClass, 'min-w-[var(--bits-combobox-anchor-width)]')}
203
+ >
204
+ <ComboboxPrimitive.Viewport class="p-1 max-h-60 overflow-auto">
205
+ {#each filteredItems as item (item.value)}
206
+ <ComboboxPrimitive.Item
207
+ value={item.value}
208
+ label={item.label}
209
+ disabled={item.disabled}
210
+ class={itemClass}
211
+ >
212
+ {#snippet children({selected})}
213
+ <span class="flex-1">{item.label}</span>
214
+ {#if selected}
215
+ <IconCheck class="size-4 text-interactive shrink-0" />
216
+ {/if}
217
+ {/snippet}
218
+ </ComboboxPrimitive.Item>
219
+ {:else}
220
+ <div class="px-3 py-4 text-sm text-center text-text-tertiary">No results found.</div>
221
+ {/each}
222
+ </ComboboxPrimitive.Viewport>
223
+ </ComboboxPrimitive.Content>
224
+ </ComboboxPrimitive.Portal>
225
+ </ComboboxPrimitive.Root>
226
+ {/if}
@@ -1,4 +1,4 @@
1
- import { type ComboboxProps } from "./Combobox";
2
- declare const Combobox: import("svelte").Component<ComboboxProps, {}, "">;
1
+ import type { ComboboxProps } from './Combobox.js';
2
+ declare const Combobox: import("svelte").Component<ComboboxProps, {}, "value" | "ref">;
3
3
  type Combobox = ReturnType<typeof Combobox>;
4
4
  export default Combobox;
@@ -1,2 +1,2 @@
1
1
  export { default as Combobox } from './Combobox.svelte';
2
- export type { ComboboxProps } from './Combobox';
2
+ export type { ComboboxProps, ComboboxItem } from './Combobox.js';
@@ -1,11 +1,6 @@
1
- <script lang="ts">
2
- import { Command as CommandPrimitive } from "bits-ui";
3
- import { cn } from "../../../utils";
4
- let {
5
- ref = $bindable(null),
6
- class: className,
7
- ...restProps
8
- }: CommandPrimitive.EmptyProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, ...restProps } = $props();
9
4
  </script>
10
5
  <CommandPrimitive.Empty
11
6
  bind:ref
@@ -1,16 +1,6 @@
1
- <script lang="ts">
2
- import { Command as CommandPrimitive, useId } from "bits-ui";
3
- import { cn } from "../../../utils";
4
- let {
5
- ref = $bindable(null),
6
- class: className,
7
- children,
8
- heading,
9
- value,
10
- ...restProps
11
- }: CommandPrimitive.GroupProps & {
12
- heading?: string;
13
- } = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive, useId } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, children, heading, value, ...restProps } = $props();
14
4
  </script>
15
5
  <CommandPrimitive.Group
16
6
  bind:ref
@@ -1,16 +1,8 @@
1
- <script lang="ts">
2
- import {Command as CommandPrimitive} from "bits-ui";
3
- import {cn} from "../../../utils";
4
- import {IconSearch} from "../../..";
5
- import {styles} from "../../input/Input.js";
6
-
7
- let {
8
- autofocus = undefined,
9
- ref = $bindable(null),
10
- class: className,
11
- value = $bindable(""),
12
- ...restProps
13
- }: CommandPrimitive.InputProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ import { IconSearch } from "../../..";
4
+ import { styles } from "../../input/Input.js";
5
+ let { autofocus = undefined, ref = $bindable(null), class: className, value = $bindable(""), ...restProps } = $props();
14
6
  </script>
15
7
  <div class="flex items-center border-b px-3" data-slot="command-input-wrapper">
16
8
  <IconSearch class="size-4 shrink-0 opacity-50"/>
@@ -1,12 +1,6 @@
1
- <script lang="ts">
2
- import {Command as CommandPrimitive} from "bits-ui";
3
- import {cn} from "../../../utils";
4
-
5
- let {
6
- ref = $bindable(null),
7
- class: className,
8
- ...restProps
9
- }: CommandPrimitive.ItemProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, ...restProps } = $props();
10
4
  </script>
11
5
  <CommandPrimitive.Item
12
6
  bind:ref
@@ -1,11 +1,6 @@
1
- <script lang="ts">
2
- import { Command as CommandPrimitive } from "bits-ui";
3
- import { cn } from "../../../utils";
4
- let {
5
- ref = $bindable(null),
6
- class: className,
7
- ...restProps
8
- }: CommandPrimitive.LinkItemProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, ...restProps } = $props();
9
4
  </script>
10
5
  <CommandPrimitive.LinkItem
11
6
  bind:ref
@@ -1,11 +1,6 @@
1
- <script lang="ts">
2
- import { Command as CommandPrimitive } from "bits-ui";
3
- import { cn } from "../../../utils";
4
- let {
5
- ref = $bindable(null),
6
- class: className,
7
- ...restProps
8
- }: CommandPrimitive.ListProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, ...restProps } = $props();
9
4
  </script>
10
5
  <CommandPrimitive.List
11
6
  bind:ref
@@ -1,11 +1,6 @@
1
- <script lang="ts">
2
- import { Command as CommandPrimitive } from "bits-ui";
3
- import { cn } from "../../../utils";
4
- let {
5
- ref = $bindable(null),
6
- class: className,
7
- ...restProps
8
- }: CommandPrimitive.SeparatorProps = $props();
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ let { ref = $bindable(null), class: className, ...restProps } = $props();
9
4
  </script>
10
5
  <CommandPrimitive.Separator
11
6
  bind:ref
@@ -1,13 +1,5 @@
1
- <script lang="ts">
2
- import {cn, type WithElementRef} from "../../../utils";
3
- import type {HTMLAttributes} from "svelte/elements";
4
-
5
- let {
6
- ref = $bindable(null),
7
- class: className,
8
- children,
9
- ...restProps
10
- }: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();
1
+ <script lang="ts">import { cn } from "../../../utils";
2
+ let { ref = $bindable(null), class: className, children, ...restProps } = $props();
11
3
  </script>
12
4
  <span
13
5
  bind:this={ref}
@@ -1,45 +1,32 @@
1
- <script lang="ts">
2
- import {Command as CommandPrimitive} from "bits-ui";
3
- import {cn} from "../../../utils";
4
- import "../command.scss"
5
-
6
- let {
7
- ref = $bindable(null),
8
- value = $bindable(""),
9
- command = $bindable(),
10
- class: className,
11
- selectedIndex,
12
- ...restProps
13
- }: CommandPrimitive.RootProps = $props();
14
-
15
- $effect(() => {
16
- if (!command || selectedIndex === undefined) return;
17
- const items = command.getValidItems();
18
- if (!items?.length) return;
19
-
20
- setTimeout(() => {
21
- if (selectedIndex < 0) {
22
- const selectedItem = items.find((item: HTMLElement) =>
23
- item.hasAttribute('data-selected')
24
- );
25
-
26
- if (selectedItem) {
27
- selectedItem.removeAttribute("data-selected");
28
-
29
- // Use AbortController for cleanup
30
- const controller = new AbortController();
31
- selectedItem.addEventListener("pointerenter", () => {
32
- selectedItem.setAttribute("data-selected", "");
33
- }, {once: true, signal: controller.signal});
34
-
35
- // Cleanup on component unmount
36
- return () => controller.abort();
37
- }
38
- } else if (selectedIndex < items.length) {
39
- command.updateSelectedToIndex(selectedIndex);
40
- }
41
- }, 6)
42
- });
1
+ <script lang="ts">import { Command as CommandPrimitive } from "bits-ui";
2
+ import { cn } from "../../../utils";
3
+ import "../command.scss";
4
+ let { ref = $bindable(null), value = $bindable(""), command = $bindable(), class: className, selectedIndex, ...restProps } = $props();
5
+ $effect(() => {
6
+ if (!command || selectedIndex === undefined)
7
+ return;
8
+ const items = command.getValidItems();
9
+ if (!items?.length)
10
+ return;
11
+ setTimeout(() => {
12
+ if (selectedIndex < 0) {
13
+ const selectedItem = items.find((item) => item.hasAttribute('data-selected'));
14
+ if (selectedItem) {
15
+ selectedItem.removeAttribute("data-selected");
16
+ // Use AbortController for cleanup
17
+ const controller = new AbortController();
18
+ selectedItem.addEventListener("pointerenter", () => {
19
+ selectedItem.setAttribute("data-selected", "");
20
+ }, { once: true, signal: controller.signal });
21
+ // Cleanup on component unmount
22
+ return () => controller.abort();
23
+ }
24
+ }
25
+ else if (selectedIndex < items.length) {
26
+ command.updateSelectedToIndex(selectedIndex);
27
+ }
28
+ }, 6);
29
+ });
43
30
  </script>
44
31
  <CommandPrimitive.Root
45
32
  bind:value