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,18 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @component Popover - Floating panel anchored to a trigger element.
|
|
3
|
+
* Built on BitsUI Popover primitive with portal rendering.
|
|
4
|
+
*/
|
|
2
5
|
import type { Snippet } from "svelte";
|
|
3
|
-
|
|
4
|
-
export declare const styles: import("tailwind-variants").TVReturnType<{}, undefined, "", {}, undefined, import("tailwind-variants").TVReturnType<{}, undefined, "", unknown, unknown, undefined>>;
|
|
5
|
-
type PopoverVariants = VariantProps<typeof styles>;
|
|
6
|
-
export interface PopoverProps extends HTMLAttributes<HTMLDivElement>, PopoverVariants {
|
|
6
|
+
export interface PopoverProps {
|
|
7
7
|
children?: Snippet;
|
|
8
|
+
/** Snippet used as the clickable trigger that opens the popover. */
|
|
9
|
+
trigger?: Snippet;
|
|
10
|
+
/** Additional CSS classes for the popover content panel. */
|
|
8
11
|
class?: string;
|
|
9
|
-
|
|
10
|
-
offset?: number;
|
|
11
|
-
padding?: number;
|
|
12
|
+
/** Whether the popover is open. Bindable. */
|
|
12
13
|
open?: boolean;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
/** Which side of the trigger the popover appears on. */
|
|
15
|
+
side?: 'top' | 'bottom' | 'left' | 'right';
|
|
16
|
+
/** Distance in pixels between the trigger and popover panel. */
|
|
17
|
+
sideOffset?: number;
|
|
18
|
+
/** Alignment of the popover relative to the trigger. */
|
|
19
|
+
align?: 'start' | 'center' | 'end';
|
|
20
|
+
/** Additional offset in pixels along the alignment axis. */
|
|
21
|
+
alignOffset?: number;
|
|
22
|
+
/** Whether clicking outside the popover closes it. */
|
|
23
|
+
closeOnClickOutside?: boolean;
|
|
24
|
+
/** Whether pressing Escape closes the popover. Defaults to true. */
|
|
25
|
+
closeOnEscape?: boolean;
|
|
26
|
+
/** Whether focus is trapped inside the popover content while open. */
|
|
27
|
+
trapFocus?: boolean;
|
|
28
|
+
/** Prevent the page from scrolling while the popover is open. */
|
|
29
|
+
preventScroll?: boolean;
|
|
30
|
+
/** Called when the user interacts outside the popover boundaries. */
|
|
31
|
+
onInteractOutside?: () => void;
|
|
32
|
+
/** ARIA role for the popover content element. */
|
|
33
|
+
role?: string;
|
|
34
|
+
/** Bindable reference to the popover content element. */
|
|
35
|
+
ref?: HTMLElement | null;
|
|
36
|
+
[key: string]: unknown;
|
|
17
37
|
}
|
|
18
|
-
export {};
|
|
@@ -1,158 +1,40 @@
|
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
middleware: [
|
|
42
|
-
offset(offsetAmount),
|
|
43
|
-
size({
|
|
44
|
-
apply({rects, elements}) {
|
|
45
|
-
Object.assign(elements.floating.style, {
|
|
46
|
-
minWidth: `${rects.reference.width}px`,
|
|
47
|
-
maxWidth: `${window.innerWidth - 16}px`,
|
|
48
|
-
});
|
|
49
|
-
},
|
|
50
|
-
}),
|
|
51
|
-
enableFlip ? flip() : undefined,
|
|
52
|
-
shift({padding: paddingAmount}),
|
|
53
|
-
arrow({element: arrowElement}),
|
|
54
|
-
],
|
|
55
|
-
}).then(({x, y, placement, middlewareData}) => {
|
|
56
|
-
Object.assign(popover.style, {
|
|
57
|
-
left: `${x}px`,
|
|
58
|
-
top: `${y}px`,
|
|
59
|
-
});
|
|
60
|
-
//
|
|
61
|
-
// // Accessing the data
|
|
62
|
-
// const {x: arrowX, y: arrowY} = middlewareData.arrow;
|
|
63
|
-
//
|
|
64
|
-
// const staticSide = {
|
|
65
|
-
// top: 'bottom',
|
|
66
|
-
// right: 'left',
|
|
67
|
-
// bottom: 'top',
|
|
68
|
-
// left: 'right',
|
|
69
|
-
// }[placement.split('-')[0]];
|
|
70
|
-
//
|
|
71
|
-
// Object.assign(arrowElement.style, {
|
|
72
|
-
// left: arrowX != null ? `${arrowX}px` : '',
|
|
73
|
-
// top: arrowY != null ? `${arrowY}px` : '',
|
|
74
|
-
// right: '',
|
|
75
|
-
// bottom: '',
|
|
76
|
-
// [staticSide]: '-4px',
|
|
77
|
-
// });
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
onMount(() => {
|
|
82
|
-
if (autoTrigger)
|
|
83
|
-
triggerRef?.addEventListener("click", togglePopover);
|
|
84
|
-
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
onDestroy(() => {
|
|
88
|
-
if (autoTrigger)
|
|
89
|
-
triggerRef?.removeEventListener("click", togglePopover);
|
|
90
|
-
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
$effect(() => {
|
|
94
|
-
let cleanup: any
|
|
95
|
-
|
|
96
|
-
if (open) {
|
|
97
|
-
hasOpenedYet = true
|
|
98
|
-
updatePosition()
|
|
99
|
-
|
|
100
|
-
// Start auto updates.
|
|
101
|
-
cleanup = autoUpdate(
|
|
102
|
-
triggerRef,
|
|
103
|
-
popover,
|
|
104
|
-
updatePosition,
|
|
105
|
-
);
|
|
106
|
-
} else {
|
|
107
|
-
cleanup?.()
|
|
108
|
-
if (focusTriggerAfterClose && hasOpenedYet) {
|
|
109
|
-
try {
|
|
110
|
-
triggerRef.focus()
|
|
111
|
-
} catch (e) {
|
|
112
|
-
console.warn('Trigger element focus after close Popover error', e)
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return () => {
|
|
118
|
-
cleanup?.()
|
|
119
|
-
}
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
function spin(node, {duration}) {
|
|
124
|
-
return {
|
|
125
|
-
duration,
|
|
126
|
-
css: (t) => {
|
|
127
|
-
const eased = circInOut(t);
|
|
128
|
-
return `
|
|
129
|
-
transform-origin: 0% 0%;
|
|
130
|
-
transform: translateY(${eased * 10 - 10}px) scaleY(${eased * 0.05 + 0.95});
|
|
131
|
-
opacity: ${eased};
|
|
132
|
-
`
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
</script>
|
|
140
|
-
|
|
141
|
-
<!-- Popover Content -->
|
|
142
|
-
{#if open}
|
|
143
|
-
<div bind:this={popover}
|
|
144
|
-
data-open={open}
|
|
145
|
-
class={cn("overflow-hidden absolute z-10 bg-neutral-token-1 shadow-2xl rounded-container border border-neutral-token-5", className)}
|
|
146
|
-
use:clickOutside={{exceptElement: triggerRef}}
|
|
147
|
-
onclick_outside={handleClickOutside}
|
|
148
|
-
|
|
149
|
-
in:spin={{ duration: 200 }}
|
|
150
|
-
out:spin={{ duration: 200 }}
|
|
151
|
-
{...props}
|
|
152
|
-
>
|
|
153
|
-
<!-- <div bind:this={arrowElement} class="size-2 absolute rotate-45 bg-inherit"></div>-->
|
|
154
|
-
{@render children?.()}
|
|
155
|
-
</div>
|
|
156
|
-
{/if}
|
|
157
|
-
|
|
158
|
-
|
|
1
|
+
<script lang="ts">import { Popover as PopoverPrimitive } from 'bits-ui';
|
|
2
|
+
import { cn } from '../../utils/utils.js';
|
|
3
|
+
let { children, trigger, class: className, open = $bindable(false), side = 'bottom', sideOffset = 4, align = 'start', alignOffset, closeOnClickOutside = true, closeOnEscape = true, trapFocus, preventScroll, onInteractOutside, ref = $bindable(null), ...props } = $props();
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<PopoverPrimitive.Root bind:open>
|
|
7
|
+
{#if trigger}
|
|
8
|
+
<PopoverPrimitive.Trigger>
|
|
9
|
+
{#snippet child({ props: triggerProps })}
|
|
10
|
+
<span {...triggerProps} class="inline-flex">
|
|
11
|
+
{@render trigger()}
|
|
12
|
+
</span>
|
|
13
|
+
{/snippet}
|
|
14
|
+
</PopoverPrimitive.Trigger>
|
|
15
|
+
{/if}
|
|
16
|
+
|
|
17
|
+
<PopoverPrimitive.Portal>
|
|
18
|
+
<PopoverPrimitive.Content
|
|
19
|
+
bind:ref
|
|
20
|
+
{side}
|
|
21
|
+
{sideOffset}
|
|
22
|
+
{align}
|
|
23
|
+
{alignOffset}
|
|
24
|
+
{trapFocus}
|
|
25
|
+
{preventScroll}
|
|
26
|
+
interactOutsideBehavior={closeOnClickOutside ? 'close' : 'ignore'}
|
|
27
|
+
escapeKeydownBehavior={closeOnEscape ? 'close' : 'ignore'}
|
|
28
|
+
onInteractOutside={() => onInteractOutside?.()}
|
|
29
|
+
class={cn(
|
|
30
|
+
'z-50 overflow-hidden bg-surface rounded-container border border-border-default shadow-lg',
|
|
31
|
+
'animate-in fade-in zoom-in-95 duration-150',
|
|
32
|
+
'data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95',
|
|
33
|
+
className
|
|
34
|
+
)}
|
|
35
|
+
{...props}
|
|
36
|
+
>
|
|
37
|
+
{@render children?.()}
|
|
38
|
+
</PopoverPrimitive.Content>
|
|
39
|
+
</PopoverPrimitive.Portal>
|
|
40
|
+
</PopoverPrimitive.Root>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare const Popover: import("svelte").Component<PopoverProps, {}, "open">;
|
|
1
|
+
import type { PopoverProps } from './Popover.js';
|
|
2
|
+
declare const Popover: import("svelte").Component<PopoverProps, {}, "ref" | "open">;
|
|
3
3
|
type Popover = ReturnType<typeof Popover>;
|
|
4
4
|
export default Popover;
|
|
@@ -1,11 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @component PopoverResponsive - Shows a Popover on desktop and a Dialog on mobile.
|
|
3
|
+
* Automatically switches at the 640 px breakpoint.
|
|
4
|
+
*/
|
|
2
5
|
import type { Snippet } from "svelte";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
type PopoverResponsiveVariants = VariantProps<typeof styles>;
|
|
6
|
-
export interface PopoverResponsiveProps extends HTMLAttributes<HTMLDivElement>, PopoverResponsiveVariants {
|
|
6
|
+
export interface PopoverResponsiveProps {
|
|
7
|
+
/** Content rendered inside the popover/dialog panel. */
|
|
7
8
|
children?: Snippet;
|
|
9
|
+
/** Snippet used as the clickable trigger. */
|
|
10
|
+
trigger?: Snippet;
|
|
11
|
+
/** Additional CSS classes for the content panel. */
|
|
8
12
|
class?: string;
|
|
9
|
-
|
|
13
|
+
/** Whether the panel is open. Bindable. */
|
|
14
|
+
open?: boolean;
|
|
15
|
+
/** Which side of the trigger the desktop popover appears on. */
|
|
16
|
+
side?: 'top' | 'bottom' | 'left' | 'right';
|
|
17
|
+
/** Distance in pixels between the trigger and popover (desktop only). */
|
|
18
|
+
sideOffset?: number;
|
|
19
|
+
/** Alignment of the popover relative to the trigger (desktop only). */
|
|
20
|
+
align?: 'start' | 'center' | 'end';
|
|
21
|
+
[key: string]: unknown;
|
|
10
22
|
}
|
|
11
|
-
export {};
|
|
@@ -1,87 +1,25 @@
|
|
|
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
|
-
} = $props();
|
|
27
|
-
|
|
28
|
-
let openPopover = $state(false)
|
|
29
|
-
let openDialog = $state(false)
|
|
30
|
-
|
|
31
|
-
$effect(() => {
|
|
32
|
-
open = openPopover || openDialog
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
$effect(() => {
|
|
36
|
-
toggleOpen(open)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
function toggleOpen(open?: boolean) {
|
|
40
|
-
if (getScreenWidth() >= SCREEN_BREAK_POINTS.sm) {
|
|
41
|
-
if (open === undefined) {
|
|
42
|
-
openPopover = !(openDialog || openPopover)
|
|
43
|
-
} else {
|
|
44
|
-
openPopover = open
|
|
45
|
-
}
|
|
46
|
-
openDialog = false
|
|
47
|
-
} else {
|
|
48
|
-
if (open === undefined) {
|
|
49
|
-
openDialog = !(openDialog || openPopover)
|
|
50
|
-
} else {
|
|
51
|
-
openDialog = open
|
|
52
|
-
}
|
|
53
|
-
openPopover = false
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
onMount(() => {
|
|
58
|
-
triggerRef?.addEventListener('click', (e) => {
|
|
59
|
-
e.stopPropagation()
|
|
60
|
-
toggleOpen()
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
<Popover bind:open={openPopover}
|
|
67
|
-
triggerRef={triggerRef}
|
|
68
|
-
autoTrigger={false}
|
|
69
|
-
padding={popoverPadding}
|
|
70
|
-
focusTriggerAfterClose={focusTriggerAfterClose}
|
|
71
|
-
offset={offset}
|
|
72
|
-
flip={flip}
|
|
73
|
-
class={className}
|
|
74
|
-
{...props}
|
|
75
|
-
>
|
|
76
|
-
{@render children?.()}
|
|
77
|
-
</Popover>
|
|
78
|
-
|
|
79
|
-
<Dialog bind:open={openDialog}
|
|
80
|
-
position="top"
|
|
81
|
-
padding="none"
|
|
82
|
-
class={className}
|
|
83
|
-
triggerRef={triggerRef}
|
|
84
|
-
focusTriggerAfterClose={focusTriggerAfterClose}
|
|
85
|
-
>
|
|
86
|
-
{@render children?.()}
|
|
87
|
-
</Dialog>
|
|
1
|
+
<script lang="ts">import { innerWidth } from 'svelte/reactivity/window';
|
|
2
|
+
import { Dialog } from '../dialog/index.js';
|
|
3
|
+
import { Popover } from '../popover/index.js';
|
|
4
|
+
let { children, trigger, class: className, open = $bindable(false), side = 'bottom', sideOffset = 4, align = 'start', ...props } = $props();
|
|
5
|
+
const isDesktop = $derived((innerWidth.current ?? 640) >= 640);
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
{#if isDesktop}
|
|
9
|
+
<!-- Desktop: bind open directly so both internal and external close work -->
|
|
10
|
+
<Popover bind:open {side} {sideOffset} {align} {trigger} class={className} {...props}>
|
|
11
|
+
{@render children?.()}
|
|
12
|
+
</Popover>
|
|
13
|
+
{:else}
|
|
14
|
+
<!-- Mobile: bind open directly to Dialog, toggle via wrapper button -->
|
|
15
|
+
<button
|
|
16
|
+
type="button"
|
|
17
|
+
class="inline-flex appearance-none bg-transparent p-0 border-0 cursor-pointer"
|
|
18
|
+
onclick={() => open = !open}
|
|
19
|
+
>
|
|
20
|
+
{@render trigger?.()}
|
|
21
|
+
</button>
|
|
22
|
+
<Dialog bind:open position="top" padding="none" class={className}>
|
|
23
|
+
{@render children?.()}
|
|
24
|
+
</Dialog>
|
|
25
|
+
{/if}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
dialogPadding?: string;
|
|
4
|
-
popoverPadding?: number;
|
|
5
|
-
offset?: number;
|
|
6
|
-
open?: boolean;
|
|
7
|
-
focusTriggerAfterClose?: boolean;
|
|
8
|
-
flip?: boolean;
|
|
9
|
-
triggerRef?: HTMLElement;
|
|
10
|
-
};
|
|
11
|
-
declare const PopoverResponsive: import("svelte").Component<$$ComponentProps, {}, "open">;
|
|
1
|
+
import type { PopoverResponsiveProps } from './PopoverResponsive.js';
|
|
2
|
+
declare const PopoverResponsive: import("svelte").Component<PopoverResponsiveProps, {}, "open">;
|
|
12
3
|
type PopoverResponsive = ReturnType<typeof PopoverResponsive>;
|
|
13
4
|
export default PopoverResponsive;
|
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @component Select - Dropdown select with flat or grouped options, keyboard navigation, and style variants.
|
|
3
|
+
* Built on BitsUI Select primitive.
|
|
4
|
+
*/
|
|
5
|
+
import type { VariantProps } from "tailwind-variants";
|
|
6
|
+
export interface SelectOption {
|
|
7
|
+
/** Unique value submitted or passed to onchange. */
|
|
8
|
+
value: string;
|
|
9
|
+
/** Human-readable label shown in the list and trigger. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Prevents selecting this option. */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface SelectGroup {
|
|
15
|
+
/** Heading label displayed above the group's options. */
|
|
16
|
+
label: string;
|
|
17
|
+
/** Options belonging to this group. */
|
|
18
|
+
options: SelectOption[];
|
|
19
|
+
}
|
|
20
|
+
export declare const triggerStyles: import("tailwind-variants").TVReturnType<{
|
|
5
21
|
variant: {
|
|
6
22
|
outlined: string;
|
|
7
23
|
filled: string;
|
|
8
24
|
borderless: string;
|
|
9
25
|
};
|
|
10
|
-
disabled: {
|
|
11
|
-
true: string;
|
|
12
|
-
false: string;
|
|
13
|
-
};
|
|
14
26
|
size: {
|
|
15
27
|
sm: string;
|
|
16
28
|
md: string;
|
|
17
29
|
lg: string;
|
|
18
30
|
};
|
|
31
|
+
disabled: {
|
|
32
|
+
true: string;
|
|
33
|
+
};
|
|
19
34
|
status: {
|
|
20
35
|
error: string;
|
|
21
36
|
warning: string;
|
|
22
37
|
};
|
|
23
|
-
}, undefined, "w-full inline-flex items-center justify-
|
|
38
|
+
}, undefined, "w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150", {
|
|
24
39
|
variant: {
|
|
25
40
|
outlined: string;
|
|
26
41
|
filled: string;
|
|
27
42
|
borderless: string;
|
|
28
43
|
};
|
|
29
|
-
disabled: {
|
|
30
|
-
true: string;
|
|
31
|
-
false: string;
|
|
32
|
-
};
|
|
33
44
|
size: {
|
|
34
45
|
sm: string;
|
|
35
46
|
md: string;
|
|
36
47
|
lg: string;
|
|
37
48
|
};
|
|
49
|
+
disabled: {
|
|
50
|
+
true: string;
|
|
51
|
+
};
|
|
38
52
|
status: {
|
|
39
53
|
error: string;
|
|
40
54
|
warning: string;
|
|
@@ -45,25 +59,48 @@ export declare const styles: import("tailwind-variants").TVReturnType<{
|
|
|
45
59
|
filled: string;
|
|
46
60
|
borderless: string;
|
|
47
61
|
};
|
|
48
|
-
disabled: {
|
|
49
|
-
true: string;
|
|
50
|
-
false: string;
|
|
51
|
-
};
|
|
52
62
|
size: {
|
|
53
63
|
sm: string;
|
|
54
64
|
md: string;
|
|
55
65
|
lg: string;
|
|
56
66
|
};
|
|
67
|
+
disabled: {
|
|
68
|
+
true: string;
|
|
69
|
+
};
|
|
57
70
|
status: {
|
|
58
71
|
error: string;
|
|
59
72
|
warning: string;
|
|
60
73
|
};
|
|
61
|
-
}, undefined, "w-full inline-flex items-center justify-
|
|
62
|
-
type
|
|
63
|
-
export interface SelectProps extends
|
|
64
|
-
|
|
74
|
+
}, undefined, "w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150", unknown, unknown, undefined>>;
|
|
75
|
+
type TriggerVariants = VariantProps<typeof triggerStyles>;
|
|
76
|
+
export interface SelectProps extends TriggerVariants {
|
|
77
|
+
/** Selection mode. Use 'multiple' to allow picking several options. */
|
|
78
|
+
type?: 'single' | 'multiple';
|
|
79
|
+
/** Flat list of options. Use `groups` instead for grouped options. */
|
|
80
|
+
options?: SelectOption[];
|
|
81
|
+
/** Grouped options — renders labeled sections. Takes precedence over `options`. */
|
|
82
|
+
groups?: SelectGroup[];
|
|
83
|
+
/**
|
|
84
|
+
* Currently selected value(s). Bindable.
|
|
85
|
+
* A string for type='single', a string[] for type='multiple'.
|
|
86
|
+
*/
|
|
87
|
+
value?: string | string[];
|
|
88
|
+
/** Text shown in the trigger when nothing is selected. */
|
|
89
|
+
placeholder?: string;
|
|
90
|
+
/** Prevents all interaction. */
|
|
91
|
+
disabled?: boolean;
|
|
92
|
+
/** Whether keyboard navigation wraps from the last item to the first. */
|
|
93
|
+
loop?: boolean;
|
|
94
|
+
/** Allow deselecting the current value by clicking it again (single mode only). */
|
|
95
|
+
allowDeselect?: boolean;
|
|
96
|
+
/** Whether the select is required for form submission. */
|
|
97
|
+
required?: boolean;
|
|
98
|
+
/** Name attribute used when submitting within a form. */
|
|
99
|
+
name?: string;
|
|
100
|
+
/** Additional CSS classes for the trigger button. */
|
|
65
101
|
class?: string;
|
|
66
|
-
value
|
|
67
|
-
|
|
102
|
+
/** Called when the selected value changes. */
|
|
103
|
+
onchange?: (value: string | string[]) => void;
|
|
104
|
+
[key: string]: unknown;
|
|
68
105
|
}
|
|
69
106
|
export {};
|
|
@@ -1,45 +1,24 @@
|
|
|
1
1
|
import { tv } from "tailwind-variants";
|
|
2
|
-
export const
|
|
3
|
-
base: 'w-full inline-flex items-center justify-
|
|
2
|
+
export const triggerStyles = tv({
|
|
3
|
+
base: 'w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150',
|
|
4
4
|
variants: {
|
|
5
5
|
variant: {
|
|
6
|
-
outlined: 'border border-
|
|
7
|
-
filled: 'bg-
|
|
8
|
-
borderless: 'bg-transparent border-0 hover:bg-
|
|
9
|
-
},
|
|
10
|
-
disabled: {
|
|
11
|
-
true: 'cursor-not-allowed bg-neutral-token-3 text-neutral-token-7 border-neutral-token-5',
|
|
12
|
-
false: 'cursor-pointer',
|
|
6
|
+
outlined: 'border border-border-default bg-surface-control hover:border-interactive data-[state=open]:border-interactive-hover data-[state=open]:shadow-focus',
|
|
7
|
+
filled: 'bg-surface-sunken border border-transparent hover:bg-surface-hover data-[state=open]:bg-surface data-[state=open]:border-interactive-hover data-[state=open]:shadow-focus',
|
|
8
|
+
borderless: 'bg-transparent border-0 hover:bg-surface-raised',
|
|
13
9
|
},
|
|
14
10
|
size: {
|
|
15
|
-
sm: 'h-6
|
|
16
|
-
md: 'h-
|
|
17
|
-
lg: 'h-10 px-3
|
|
18
|
-
},
|
|
19
|
-
status: {
|
|
20
|
-
error: 'border-error-500 hover:border-error-400 focus:border-error-500 focus:shadow-[0_0_0_2px_rgba(239,68,68,0.1)]',
|
|
21
|
-
warning: 'border-warning-500 hover:border-warning-400 focus:border-warning-500 focus:shadow-[0_0_0_2px_rgba(249,115,22,0.1)]',
|
|
11
|
+
sm: 'h-6 px-3 text-sm',
|
|
12
|
+
md: 'h-9 px-3 text-sm',
|
|
13
|
+
lg: 'h-10 px-3 text-base',
|
|
22
14
|
},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
variant: 'outlined',
|
|
27
|
-
disabled: true,
|
|
28
|
-
class: 'hover:border-neutral-token-5'
|
|
15
|
+
disabled: {
|
|
16
|
+
true: 'cursor-not-allowed bg-surface-sunken text-text-disabled border-border-default pointer-events-none',
|
|
29
17
|
},
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class: 'hover:bg-neutral-token-3'
|
|
18
|
+
status: {
|
|
19
|
+
error: 'border-error-default hover:border-error-hover data-[state=open]:border-error-default data-[state=open]:shadow-focus-error',
|
|
20
|
+
warning: 'border-warning-default hover:border-warning-hover data-[state=open]:border-warning-default data-[state=open]:shadow-focus-warning',
|
|
34
21
|
},
|
|
35
|
-
{
|
|
36
|
-
variant: 'borderless',
|
|
37
|
-
disabled: true,
|
|
38
|
-
class: 'hover:bg-transparent'
|
|
39
|
-
}
|
|
40
|
-
],
|
|
41
|
-
defaultVariants: {
|
|
42
|
-
variant: 'outlined',
|
|
43
|
-
size: 'md'
|
|
44
22
|
},
|
|
23
|
+
defaultVariants: { variant: 'outlined', size: 'md' },
|
|
45
24
|
});
|