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.
- 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/text_account_settings.d.ts +14 -2
- package/dist/paraglide/messages/text_account_settings.js +53 -58
- package/dist/paraglide/messages/text_calces_documentation.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_documentation.js +53 -58
- package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_scientific_calculator.js +53 -58
- package/dist/paraglide/messages/text_currency_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_currency_converter.js +53 -58
- package/dist/paraglide/messages/text_logout.d.ts +14 -2
- package/dist/paraglide/messages/text_logout.js +53 -58
- package/dist/paraglide/messages/text_select_language.d.ts +14 -2
- package/dist/paraglide/messages/text_select_language.js +53 -58
- package/dist/paraglide/messages/text_unit_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_unit_converter.js +53 -58
- 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 +242 -77
- 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/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
|