tera-system-ui 0.1.64 → 0.1.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/COMPONENT_API.md +2 -539
- package/dist/components/accordion/Accordion.d.ts +24 -0
- package/dist/components/accordion/Accordion.js +4 -0
- package/dist/components/accordion/components/Accordion.svelte +2 -8
- package/dist/components/accordion/components/AccordionContent.svelte +5 -12
- package/dist/components/accordion/components/AccordionItem.svelte +3 -9
- package/dist/components/accordion/components/AccordionTrigger.svelte +5 -15
- package/dist/components/ai/ChatBubble.svelte +35 -0
- package/dist/components/ai/ChatBubble.svelte.d.ts +12 -0
- package/dist/components/ai/PromptInput.svelte +58 -0
- package/dist/components/ai/PromptInput.svelte.d.ts +13 -0
- package/dist/components/ai/StreamText.svelte +41 -0
- package/dist/components/ai/StreamText.svelte.d.ts +11 -0
- package/dist/components/ai/SuggestionChips.svelte +34 -0
- package/dist/components/ai/SuggestionChips.svelte.d.ts +10 -0
- package/dist/components/ai/ThinkingLoader.svelte +34 -0
- package/dist/components/ai/ThinkingLoader.svelte.d.ts +11 -0
- package/dist/components/ai/index.d.ts +5 -0
- package/dist/components/ai/index.js +5 -0
- package/dist/components/alert/Alert.svelte +47 -0
- package/dist/components/alert/Alert.svelte.d.ts +15 -0
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/index.js +1 -0
- package/dist/components/avatar/Avatar.svelte +9 -25
- package/dist/components/badge/Badge.d.ts +52 -0
- package/dist/components/badge/Badge.js +22 -0
- package/dist/components/badge/Badge.svelte +22 -0
- package/dist/components/badge/Badge.svelte.d.ts +4 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +1 -0
- package/dist/components/brand-logo/BrandLogo.svelte +12 -10
- package/dist/components/button/Button.d.ts +2 -2
- package/dist/components/button/Button.js +12 -12
- package/dist/components/button/Button.svelte +7 -34
- package/dist/components/card/Card.d.ts +68 -0
- package/dist/components/card/Card.js +28 -0
- package/dist/components/card/Card.svelte +33 -0
- package/dist/components/card/Card.svelte.d.ts +4 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +1 -0
- package/dist/components/checkbox/Checkbox.d.ts +25 -4
- package/dist/components/checkbox/Checkbox.js +4 -0
- package/dist/components/checkbox/Checkbox.svelte +13 -16
- package/dist/components/checkbox/Checkbox.svelte.d.ts +2 -2
- package/dist/components/combobox/Combobox.d.ts +45 -9
- package/dist/components/combobox/Combobox.js +5 -7
- package/dist/components/combobox/Combobox.svelte +226 -8
- package/dist/components/combobox/Combobox.svelte.d.ts +2 -2
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/command/components/command-empty.svelte +3 -8
- package/dist/components/command/components/command-group.svelte +3 -13
- package/dist/components/command/components/command-input.svelte +5 -13
- package/dist/components/command/components/command-item.svelte +3 -9
- package/dist/components/command/components/command-link-item.svelte +3 -8
- package/dist/components/command/components/command-list.svelte +3 -8
- package/dist/components/command/components/command-separator.svelte +3 -8
- package/dist/components/command/components/command-shortcut.svelte +2 -10
- package/dist/components/command/components/command.svelte +29 -42
- package/dist/components/date-range-picker/DateRangePicker.svelte +490 -0
- package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +4 -0
- package/dist/components/date-range-picker/DateRangePicker.types.d.ts +38 -0
- package/dist/components/date-range-picker/DateRangePicker.types.js +1 -0
- package/dist/components/date-range-picker/index.d.ts +2 -0
- package/dist/components/date-range-picker/index.js +1 -0
- package/dist/components/dialog/Dialog.d.ts +43 -121
- package/dist/components/dialog/Dialog.js +1 -39
- package/dist/components/dialog/Dialog.svelte +103 -113
- package/dist/components/dialog/Dialog.svelte.d.ts +1 -2
- package/dist/components/dialog/dialog.scss +21 -24
- package/dist/components/drawer/Drawer.svelte +63 -0
- package/dist/components/drawer/Drawer.svelte.d.ts +16 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/dropdown-menu/DropdownMenu.d.ts +51 -24
- package/dist/components/dropdown-menu/DropdownMenu.js +1 -15
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte +36 -34
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +8 -12
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -12
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +27 -30
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +9 -11
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +2 -4
- package/dist/components/fonts/TeraFontMono.svelte +4 -4
- package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -0
- package/dist/components/fonts/TeraFontSansSerif.svelte +4 -4
- package/dist/components/fonts/TeraFontSansSerif.svelte.d.ts +1 -1
- package/dist/components/header/Header.svelte +6 -9
- package/dist/components/header/header.scss +1 -1
- package/dist/components/icons/IconArrowBigRightFilled.svelte +3 -7
- package/dist/components/icons/IconBook.svelte +3 -6
- package/dist/components/icons/IconBookmarkPlus.svelte +3 -6
- package/dist/components/icons/IconCalculator.svelte +3 -6
- package/dist/components/icons/IconCheck.svelte +3 -6
- package/dist/components/icons/IconChevronDown.svelte +3 -6
- package/dist/components/icons/IconCoin.svelte +3 -6
- package/dist/components/icons/IconCoinConvert.svelte +2 -5
- package/dist/components/icons/IconCopy.svelte +3 -6
- package/dist/components/icons/IconCopyCheckFilled.svelte +3 -6
- package/dist/components/icons/IconHamburger.svelte +3 -6
- package/dist/components/icons/IconLanguage.svelte +3 -6
- package/dist/components/icons/IconLoader2.svelte +3 -6
- package/dist/components/icons/IconLogout.svelte +3 -6
- package/dist/components/icons/IconMoon.svelte +3 -6
- package/dist/components/icons/IconPointFilled.svelte +3 -6
- package/dist/components/icons/IconSearch.svelte +3 -6
- package/dist/components/icons/IconSettings.svelte +3 -6
- package/dist/components/icons/IconSun.svelte +3 -6
- package/dist/components/icons/IconSwitchHorizontal.svelte +3 -6
- package/dist/components/icons/IconSwitchVertical.svelte +3 -6
- package/dist/components/icons/IconTransform.svelte +3 -6
- package/dist/components/icons/IconX.svelte +3 -6
- package/dist/components/input/Input.d.ts +2 -2
- package/dist/components/input/Input.js +10 -10
- package/dist/components/input/Input.svelte +10 -26
- package/dist/components/label/Label.d.ts +2 -2
- package/dist/components/label/Label.js +2 -2
- package/dist/components/label/Label.svelte +4 -12
- package/dist/components/language-picker-button/LanguagePickerButton.svelte +23 -42
- package/dist/components/light-dark-toggle/LightDarkToggle.svelte +21 -26
- package/dist/components/marketing/FeatureCard.svelte +37 -0
- package/dist/components/marketing/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/marketing/PricingCard.svelte +48 -0
- package/dist/components/marketing/PricingCard.svelte.d.ts +15 -0
- package/dist/components/marketing/StatBlock.svelte +14 -0
- package/dist/components/marketing/StatBlock.svelte.d.ts +10 -0
- package/dist/components/marketing/TestimonialCard.svelte +24 -0
- package/dist/components/marketing/TestimonialCard.svelte.d.ts +12 -0
- package/dist/components/marketing/index.d.ts +4 -0
- package/dist/components/marketing/index.js +4 -0
- package/dist/components/popover/Popover.d.ts +32 -13
- package/dist/components/popover/Popover.js +1 -7
- package/dist/components/popover/Popover.svelte +40 -158
- package/dist/components/popover/Popover.svelte.d.ts +2 -2
- package/dist/components/popover-responsive/PopoverResponsive.d.ts +18 -7
- package/dist/components/popover-responsive/PopoverResponsive.js +1 -7
- package/dist/components/popover-responsive/PopoverResponsive.svelte +25 -87
- package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +2 -11
- package/dist/components/select/Select.d.ts +60 -23
- package/dist/components/select/Select.js +14 -35
- package/dist/components/select/Select.svelte +157 -28
- package/dist/components/select/Select.svelte.d.ts +2 -3
- package/dist/components/select/index.d.ts +1 -1
- package/dist/components/side-navigation/SideNavigation.svelte +73 -96
- package/dist/components/side-navigation/SideNavigationItem.svelte +2 -2
- package/dist/components/side-navigation/SideNavigationLayout.svelte +3 -5
- package/dist/components/side-navigation/sidenav.scss +17 -13
- package/dist/components/skeleton/Skeleton.svelte +48 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +12 -0
- package/dist/components/skeleton/index.d.ts +1 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/slider/Slider.d.ts +25 -15
- package/dist/components/slider/Slider.js +1 -7
- package/dist/components/slider/Slider.svelte +38 -164
- package/dist/components/slider/Slider.svelte.d.ts +1 -1
- package/dist/components/spinner/Spinner.svelte +39 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +10 -0
- package/dist/components/spinner/index.d.ts +1 -0
- package/dist/components/spinner/index.js +1 -0
- package/dist/components/star-rating/StarRating.svelte +33 -49
- package/dist/components/switch/Switch.d.ts +19 -4
- package/dist/components/switch/Switch.js +4 -0
- package/dist/components/switch/Switch.svelte +13 -17
- package/dist/components/switch/Switch.svelte.d.ts +2 -2
- package/dist/components/table/Table.svelte +68 -0
- package/dist/components/table/Table.svelte.d.ts +40 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +45 -16
- package/dist/components/tabs/Tabs.svelte.js +8 -18
- package/dist/components/tabs/components/Tabs.svelte +27 -33
- package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
- package/dist/components/tabs/components/TabsContent.svelte +13 -36
- package/dist/components/tabs/components/TabsContent.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsItem.svelte +43 -32
- package/dist/components/tabs/components/TabsItem.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsList.svelte +90 -58
- package/dist/components/tabs/components/TabsList.svelte.d.ts +2 -4
- package/dist/components/tera-ui-context/TeraUiContext.svelte +13 -26
- package/dist/components/text-area/TextArea.d.ts +2 -2
- package/dist/components/text-area/TextArea.js +9 -9
- package/dist/components/text-area/TextArea.svelte +41 -65
- package/dist/components/toast/ToastContainer.svelte +50 -0
- package/dist/components/toast/ToastContainer.svelte.d.ts +18 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toast/toast.svelte.d.ts +22 -0
- package/dist/components/toast/toast.svelte.js +18 -0
- package/dist/components/tooltip/Tooltip.d.ts +23 -0
- package/dist/components/tooltip/Tooltip.js +1 -0
- package/dist/components/tooltip/Tooltip.svelte +30 -0
- package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +48 -69
- package/dist/index.d.ts +19 -2
- package/dist/index.js +12 -0
- package/dist/llms/accordion.md +90 -0
- package/dist/llms/ai.md +110 -0
- package/dist/llms/alert.md +29 -0
- package/dist/llms/avatar.md +34 -0
- package/dist/llms/badge.md +31 -0
- package/dist/llms/brand-logo.md +30 -0
- package/dist/llms/button.md +37 -0
- package/dist/llms/card.md +32 -0
- package/dist/llms/checkbox.md +35 -0
- package/dist/llms/colors.md +161 -0
- package/dist/llms/combobox.md +40 -0
- package/dist/llms/command.md +7 -0
- package/dist/llms/date-range-picker.md +36 -0
- package/dist/llms/dialog.md +45 -0
- package/dist/llms/drawer.md +30 -0
- package/dist/llms/dropdown-menu.md +112 -0
- package/dist/llms/fonts.md +7 -0
- package/dist/llms/header.md +26 -0
- package/dist/llms/icons.md +43 -0
- package/dist/llms/index.md +65 -0
- package/dist/llms/input.md +37 -0
- package/dist/llms/label.md +30 -0
- package/dist/llms/language-picker-button.md +30 -0
- package/dist/llms/light-dark-toggle.md +26 -0
- package/dist/llms/marketing.md +95 -0
- package/dist/llms/popover-responsive.md +32 -0
- package/dist/llms/popover.md +40 -0
- package/dist/llms/select.md +44 -0
- package/dist/llms/side-navigation.md +30 -0
- package/dist/llms/skeleton.md +28 -0
- package/dist/llms/slider.md +36 -0
- package/dist/llms/spinner.md +25 -0
- package/dist/llms/star-rating.md +31 -0
- package/dist/llms/switch.md +33 -0
- package/dist/llms/table.md +30 -0
- package/dist/llms/tabs.md +92 -0
- package/dist/llms/tera-ui-context.md +30 -0
- package/dist/llms/text-area.md +39 -0
- package/dist/llms/toast.md +7 -0
- package/dist/llms/tooltip.md +32 -0
- package/dist/llms/user-avatar-with-menu.md +28 -0
- package/dist/paraglide/README.md +72 -3
- package/dist/paraglide/messages/_index.d.ts +105 -7
- package/dist/paraglide/messages/_index.js +437 -7
- package/dist/paraglide/messages/ar.d.ts +23 -0
- package/dist/paraglide/messages/ar.js +38 -0
- package/dist/paraglide/messages/bg.d.ts +23 -0
- package/dist/paraglide/messages/bg.js +38 -0
- package/dist/paraglide/messages/bn.d.ts +23 -0
- package/dist/paraglide/messages/bn.js +38 -0
- package/dist/paraglide/messages/ca.d.ts +23 -0
- package/dist/paraglide/messages/ca.js +38 -0
- package/dist/paraglide/messages/cs.d.ts +23 -0
- package/dist/paraglide/messages/cs.js +38 -0
- package/dist/paraglide/messages/da.d.ts +23 -0
- package/dist/paraglide/messages/da.js +38 -0
- package/dist/paraglide/messages/de.d.ts +23 -0
- package/dist/paraglide/messages/de.js +38 -0
- package/dist/paraglide/messages/el.d.ts +23 -0
- package/dist/paraglide/messages/el.js +38 -0
- package/dist/paraglide/messages/en.d.ts +23 -0
- package/dist/paraglide/messages/en.js +38 -0
- package/dist/paraglide/messages/es.d.ts +23 -0
- package/dist/paraglide/messages/es.js +38 -0
- package/dist/paraglide/messages/fi.d.ts +23 -0
- package/dist/paraglide/messages/fi.js +38 -0
- package/dist/paraglide/messages/fr.d.ts +23 -0
- package/dist/paraglide/messages/fr.js +38 -0
- package/dist/paraglide/messages/he.d.ts +23 -0
- package/dist/paraglide/messages/he.js +38 -0
- package/dist/paraglide/messages/hi.d.ts +23 -0
- package/dist/paraglide/messages/hi.js +38 -0
- package/dist/paraglide/messages/hu.d.ts +23 -0
- package/dist/paraglide/messages/hu.js +38 -0
- package/dist/paraglide/messages/id.d.ts +23 -0
- package/dist/paraglide/messages/id.js +38 -0
- package/dist/paraglide/messages/it.d.ts +23 -0
- package/dist/paraglide/messages/it.js +38 -0
- package/dist/paraglide/messages/ja.d.ts +23 -0
- package/dist/paraglide/messages/ja.js +38 -0
- package/dist/paraglide/messages/ko.d.ts +23 -0
- package/dist/paraglide/messages/ko.js +38 -0
- package/dist/paraglide/messages/lt.d.ts +23 -0
- package/dist/paraglide/messages/lt.js +38 -0
- package/dist/paraglide/messages/lv.d.ts +23 -0
- package/dist/paraglide/messages/lv.js +38 -0
- package/dist/paraglide/messages/ms.d.ts +23 -0
- package/dist/paraglide/messages/ms.js +38 -0
- package/dist/paraglide/messages/nl.d.ts +23 -0
- package/dist/paraglide/messages/nl.js +38 -0
- package/dist/paraglide/messages/no.d.ts +23 -0
- package/dist/paraglide/messages/no.js +38 -0
- package/dist/paraglide/messages/pl.d.ts +23 -0
- package/dist/paraglide/messages/pl.js +38 -0
- package/dist/paraglide/messages/pt.d.ts +23 -0
- package/dist/paraglide/messages/pt.js +38 -0
- package/dist/paraglide/messages/ro.d.ts +23 -0
- package/dist/paraglide/messages/ro.js +38 -0
- package/dist/paraglide/messages/ru.d.ts +23 -0
- package/dist/paraglide/messages/ru.js +38 -0
- package/dist/paraglide/messages/sk.d.ts +23 -0
- package/dist/paraglide/messages/sk.js +38 -0
- package/dist/paraglide/messages/sl.d.ts +23 -0
- package/dist/paraglide/messages/sl.js +38 -0
- package/dist/paraglide/messages/sq.d.ts +23 -0
- package/dist/paraglide/messages/sq.js +38 -0
- package/dist/paraglide/messages/sr.d.ts +23 -0
- package/dist/paraglide/messages/sr.js +38 -0
- package/dist/paraglide/messages/sv.d.ts +23 -0
- package/dist/paraglide/messages/sv.js +38 -0
- package/dist/paraglide/messages/sw.d.ts +23 -0
- package/dist/paraglide/messages/sw.js +38 -0
- package/dist/paraglide/messages/ta.d.ts +23 -0
- package/dist/paraglide/messages/ta.js +38 -0
- package/dist/paraglide/messages/te.d.ts +23 -0
- package/dist/paraglide/messages/te.js +38 -0
- package/dist/paraglide/messages/th.d.ts +23 -0
- package/dist/paraglide/messages/th.js +38 -0
- package/dist/paraglide/messages/tl.d.ts +23 -0
- package/dist/paraglide/messages/tl.js +38 -0
- package/dist/paraglide/messages/tr.d.ts +23 -0
- package/dist/paraglide/messages/tr.js +38 -0
- package/dist/paraglide/messages/uk.d.ts +23 -0
- package/dist/paraglide/messages/uk.js +38 -0
- package/dist/paraglide/messages/vi.d.ts +23 -0
- package/dist/paraglide/messages/vi.js +38 -0
- package/dist/paraglide/messages/zh-CN.d.ts +23 -0
- package/dist/paraglide/messages/zh-CN.js +38 -0
- package/dist/paraglide/messages/zh-TW.d.ts +23 -0
- package/dist/paraglide/messages/zh-TW.js +38 -0
- package/dist/paraglide/registry.d.ts +13 -0
- package/dist/paraglide/registry.js +15 -0
- package/dist/paraglide/runtime.d.ts +243 -126
- package/dist/paraglide/runtime.js +473 -148
- package/dist/paraglide/server.d.ts +13 -20
- package/dist/paraglide/server.js +92 -40
- package/dist/stories/ComponentOverview.stories.svelte +533 -0
- package/dist/stories/ComponentOverview.stories.svelte.d.ts +6 -0
- package/dist/themes/tera-ui-base.css +664 -470
- package/dist/themes/theme-ai.css +100 -0
- package/dist/themes/theme-marketing.css +91 -0
- package/dist/themes/theme-professional.css +41 -0
- package/package.json +35 -29
- package/dist/paraglide/messages/text_account_settings.d.ts +0 -4
- package/dist/paraglide/messages/text_account_settings.js +0 -239
- package/dist/paraglide/messages/text_calces_documentation.d.ts +0 -4
- package/dist/paraglide/messages/text_calces_documentation.js +0 -239
- package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +0 -4
- package/dist/paraglide/messages/text_calces_scientific_calculator.js +0 -239
- package/dist/paraglide/messages/text_currency_converter.d.ts +0 -4
- package/dist/paraglide/messages/text_currency_converter.js +0 -239
- package/dist/paraglide/messages/text_logout.d.ts +0 -4
- package/dist/paraglide/messages/text_logout.js +0 -239
- package/dist/paraglide/messages/text_select_language.d.ts +0 -4
- package/dist/paraglide/messages/text_select_language.js +0 -239
- package/dist/paraglide/messages/text_unit_converter.d.ts +0 -4
- package/dist/paraglide/messages/text_unit_converter.js +0 -239
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +0 -3
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +0 -103
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/project_id +0 -1
- package/dist/themes/tw-preset.cjs +0 -160
- package/dist/themes/tw-preset.d.cts +0 -157
|
@@ -1,8 +1,226 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 {
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|