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,131 +1,53 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @component Dialog - Modal dialog with header/footer snippet slots, size variants, and focus management.
|
|
3
|
+
* Built on BitsUI Dialog primitive.
|
|
4
|
+
*/
|
|
2
5
|
import type { Snippet } from "svelte";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
md: {
|
|
13
|
-
dialog: string;
|
|
14
|
-
};
|
|
15
|
-
lg: {
|
|
16
|
-
dialog: string;
|
|
17
|
-
};
|
|
18
|
-
full: {
|
|
19
|
-
dialog: string;
|
|
20
|
-
};
|
|
21
|
-
auto: {
|
|
22
|
-
dialog: string;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
padding: {
|
|
26
|
-
none: {
|
|
27
|
-
dialogContainer: string;
|
|
28
|
-
body: string;
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
}, {
|
|
32
|
-
base: string;
|
|
33
|
-
dialog: string;
|
|
34
|
-
dialogContainer: string;
|
|
35
|
-
header: string;
|
|
36
|
-
body: string;
|
|
37
|
-
footer: string;
|
|
38
|
-
}, undefined, {
|
|
39
|
-
size: {
|
|
40
|
-
xs: {
|
|
41
|
-
dialog: string;
|
|
42
|
-
};
|
|
43
|
-
sm: {
|
|
44
|
-
dialog: string;
|
|
45
|
-
};
|
|
46
|
-
md: {
|
|
47
|
-
dialog: string;
|
|
48
|
-
};
|
|
49
|
-
lg: {
|
|
50
|
-
dialog: string;
|
|
51
|
-
};
|
|
52
|
-
full: {
|
|
53
|
-
dialog: string;
|
|
54
|
-
};
|
|
55
|
-
auto: {
|
|
56
|
-
dialog: string;
|
|
57
|
-
};
|
|
58
|
-
};
|
|
59
|
-
padding: {
|
|
60
|
-
none: {
|
|
61
|
-
dialogContainer: string;
|
|
62
|
-
body: string;
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
}, {
|
|
66
|
-
base: string;
|
|
67
|
-
dialog: string;
|
|
68
|
-
dialogContainer: string;
|
|
69
|
-
header: string;
|
|
70
|
-
body: string;
|
|
71
|
-
footer: string;
|
|
72
|
-
}, import("tailwind-variants").TVReturnType<{
|
|
73
|
-
size: {
|
|
74
|
-
xs: {
|
|
75
|
-
dialog: string;
|
|
76
|
-
};
|
|
77
|
-
sm: {
|
|
78
|
-
dialog: string;
|
|
79
|
-
};
|
|
80
|
-
md: {
|
|
81
|
-
dialog: string;
|
|
82
|
-
};
|
|
83
|
-
lg: {
|
|
84
|
-
dialog: string;
|
|
85
|
-
};
|
|
86
|
-
full: {
|
|
87
|
-
dialog: string;
|
|
88
|
-
};
|
|
89
|
-
auto: {
|
|
90
|
-
dialog: string;
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
padding: {
|
|
94
|
-
none: {
|
|
95
|
-
dialogContainer: string;
|
|
96
|
-
body: string;
|
|
97
|
-
};
|
|
98
|
-
};
|
|
99
|
-
}, {
|
|
100
|
-
base: string;
|
|
101
|
-
dialog: string;
|
|
102
|
-
dialogContainer: string;
|
|
103
|
-
header: string;
|
|
104
|
-
body: string;
|
|
105
|
-
footer: string;
|
|
106
|
-
}, undefined, unknown, unknown, undefined>>;
|
|
107
|
-
type DialogVariants = VariantProps<typeof styles>;
|
|
108
|
-
type DialogPropsCommon = {
|
|
6
|
+
export type DialogProps = {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
/** Snippet rendered in the dialog header area. */
|
|
9
|
+
header?: Snippet;
|
|
10
|
+
/** Snippet rendered in the dialog footer area. */
|
|
11
|
+
footer?: Snippet;
|
|
12
|
+
/** Whether the dialog is open. Bindable. */
|
|
13
|
+
open?: boolean;
|
|
14
|
+
/** Additional CSS classes for the dialog content panel. */
|
|
109
15
|
class?: string;
|
|
110
|
-
|
|
16
|
+
/** Controls the maximum width of the dialog panel. */
|
|
17
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'full' | 'auto';
|
|
18
|
+
/** Vertical alignment of the dialog on screen. */
|
|
19
|
+
position?: 'top' | 'center';
|
|
20
|
+
/** Set to 'none' to remove internal padding. */
|
|
21
|
+
padding?: 'none' | undefined;
|
|
22
|
+
/** Whether clicking the backdrop closes the dialog. */
|
|
111
23
|
closeOnClickOutside?: boolean;
|
|
24
|
+
/** Whether to render a close (×) button in the header. */
|
|
112
25
|
closeButton?: boolean;
|
|
113
|
-
|
|
26
|
+
/**
|
|
27
|
+
* When true the dialog DOM is kept alive after close — children preserve
|
|
28
|
+
* internal state between open/close cycles.
|
|
29
|
+
*/
|
|
30
|
+
staticRender?: boolean;
|
|
31
|
+
/** Prevent the page from scrolling while the dialog is open. */
|
|
32
|
+
preventScroll?: boolean;
|
|
33
|
+
/** Called after the open or close animation has fully completed.
|
|
34
|
+
* Note: This callback only fires when the internal component mutates the open state, not when the state is changed by outside)
|
|
35
|
+
*/
|
|
36
|
+
onOpenChangeComplete?: (open: boolean) => void;
|
|
37
|
+
/** Element to return focus to when the dialog closes. */
|
|
38
|
+
triggerRef?: HTMLElement | null;
|
|
39
|
+
/** Focus triggerRef after close (default true when triggerRef is provided). */
|
|
114
40
|
focusTriggerAfterClose?: boolean;
|
|
115
|
-
|
|
41
|
+
/** Additional classes applied to the outer container div. */
|
|
116
42
|
containerClass?: string;
|
|
43
|
+
/** Additional classes applied to the header region. */
|
|
117
44
|
headerClass?: string;
|
|
45
|
+
/** Additional classes applied to the body/content region. */
|
|
118
46
|
bodyClass?: string;
|
|
47
|
+
/** Additional classes applied to the footer region. */
|
|
119
48
|
footerClass?: string;
|
|
49
|
+
/** Bindable reference to the dialog content element. */
|
|
50
|
+
ref?: HTMLElement | null;
|
|
51
|
+
[key: string]: unknown;
|
|
120
52
|
};
|
|
121
|
-
export type
|
|
122
|
-
children?: Snippet;
|
|
123
|
-
header?: Snippet;
|
|
124
|
-
footer?: Snippet;
|
|
125
|
-
open?: boolean;
|
|
126
|
-
staticRender?: boolean;
|
|
127
|
-
triggerRef?: HTMLElement | null;
|
|
128
|
-
ref?: HTMLDialogElement | null;
|
|
129
|
-
};
|
|
130
|
-
export type DialogPropsAstro = DialogVariants & DialogPropsCommon & {};
|
|
131
|
-
export {};
|
|
53
|
+
export type DialogPropsAstro = Omit<DialogProps, 'children' | 'open' | 'ref'>;
|
|
@@ -1,39 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export const styles = tv({
|
|
3
|
-
slots: {
|
|
4
|
-
base: '',
|
|
5
|
-
dialog: 'bg-transparent text-inherit',
|
|
6
|
-
dialogContainer: 'py-4 rounded-container',
|
|
7
|
-
header: 'font-bold px-4 mb-2',
|
|
8
|
-
body: 'px-4',
|
|
9
|
-
footer: 'mt-3 px-4 flex items-center justify-end gap-2.5'
|
|
10
|
-
},
|
|
11
|
-
variants: {
|
|
12
|
-
size: {
|
|
13
|
-
xs: {
|
|
14
|
-
dialog: ''
|
|
15
|
-
},
|
|
16
|
-
sm: {
|
|
17
|
-
dialog: ''
|
|
18
|
-
},
|
|
19
|
-
md: {
|
|
20
|
-
dialog: ''
|
|
21
|
-
},
|
|
22
|
-
lg: {
|
|
23
|
-
dialog: ''
|
|
24
|
-
},
|
|
25
|
-
full: {
|
|
26
|
-
dialog: ''
|
|
27
|
-
},
|
|
28
|
-
auto: {
|
|
29
|
-
dialog: ''
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
padding: {
|
|
33
|
-
none: {
|
|
34
|
-
dialogContainer: 'py-0',
|
|
35
|
-
body: 'px-0',
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
});
|
|
1
|
+
export {};
|
|
@@ -1,113 +1,103 @@
|
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
{@render children?.()}
|
|
105
|
-
</main>
|
|
106
|
-
{#if footer}
|
|
107
|
-
<footer class={cn(footerStyle(), footerClass)}>
|
|
108
|
-
{@render footer?.()}
|
|
109
|
-
</footer>
|
|
110
|
-
{/if}
|
|
111
|
-
</div>
|
|
112
|
-
</dialog>
|
|
113
|
-
{/if}
|
|
1
|
+
<script lang="ts">import { Dialog as DialogPrimitive } from 'bits-ui';
|
|
2
|
+
import IconX from '../icons/IconX.svelte';
|
|
3
|
+
import { cn } from '../../utils/index.js';
|
|
4
|
+
let { children, open = $bindable(false), ref = $bindable(null), closeOnClickOutside = true, closeButton = true, size = 'sm', header, footer, class: className, position = 'center', padding, staticRender = false, preventScroll, onOpenChangeComplete, triggerRef, focusTriggerAfterClose = true, containerClass, headerClass, bodyClass, footerClass, ...props } = $props();
|
|
5
|
+
const sizeClass = {
|
|
6
|
+
xs: 'max-w-[24rem]',
|
|
7
|
+
sm: 'max-w-[30rem]',
|
|
8
|
+
md: 'max-w-[40rem]',
|
|
9
|
+
lg: 'max-w-[50rem]',
|
|
10
|
+
full: 'max-w-full w-screen rounded-none',
|
|
11
|
+
auto: 'w-fit',
|
|
12
|
+
};
|
|
13
|
+
const isFull = $derived(size === 'full');
|
|
14
|
+
const paddingClass = $derived(padding === 'none'
|
|
15
|
+
? { container: 'py-0', body: 'px-0' }
|
|
16
|
+
: { container: 'py-4', body: 'px-4' });
|
|
17
|
+
function handleCloseAutoFocus(e) {
|
|
18
|
+
if (triggerRef && focusTriggerAfterClose) {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
triggerRef.focus();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<DialogPrimitive.Root bind:open onOpenChangeComplete={onOpenChangeComplete}>
|
|
26
|
+
<DialogPrimitive.Portal>
|
|
27
|
+
<!-- Backdrop -->
|
|
28
|
+
<DialogPrimitive.Overlay
|
|
29
|
+
class="fixed inset-0 z-50 bg-overlay backdrop-blur-[4px]
|
|
30
|
+
animate-in fade-in duration-200
|
|
31
|
+
data-[state=closed]:animate-out data-[state=closed]:fade-out
|
|
32
|
+
data-[state=closed]:hidden"
|
|
33
|
+
/>
|
|
34
|
+
|
|
35
|
+
<!--
|
|
36
|
+
We use the `child` snippet (bits-ui "asChild" pattern) so that bits-ui gates its
|
|
37
|
+
internal <ScrollLock> on `open.current`. Without this, the `children` branch renders
|
|
38
|
+
<ScrollLock> unconditionally — with forceMount the lock never releases, leaving
|
|
39
|
+
`document.body { pointer-events:none; overflow:hidden }` active even when closed.
|
|
40
|
+
-->
|
|
41
|
+
<DialogPrimitive.Content
|
|
42
|
+
bind:ref
|
|
43
|
+
forceMount={staticRender || undefined}
|
|
44
|
+
interactOutsideBehavior={closeOnClickOutside ? 'close' : 'ignore'}
|
|
45
|
+
preventScroll={preventScroll}
|
|
46
|
+
onCloseAutoFocus={handleCloseAutoFocus}
|
|
47
|
+
{...props}
|
|
48
|
+
>
|
|
49
|
+
{#snippet child({ props: contentProps })}
|
|
50
|
+
<div
|
|
51
|
+
{...contentProps}
|
|
52
|
+
inert={staticRender && !open ? true : undefined}
|
|
53
|
+
class={cn(
|
|
54
|
+
contentProps.class,
|
|
55
|
+
'fixed z-50 w-full bg-surface shadow-lg border-border-default',
|
|
56
|
+
'flex flex-col overflow-hidden',
|
|
57
|
+
isFull
|
|
58
|
+
? 'inset-0 h-screen border-0'
|
|
59
|
+
: [
|
|
60
|
+
'rounded-container',
|
|
61
|
+
'max-h-[min(calc(100svh-2rem),55rem)]',
|
|
62
|
+
position === 'top'
|
|
63
|
+
? 'top-4 left-1/2 -translate-x-1/2'
|
|
64
|
+
: 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',
|
|
65
|
+
].join(' '),
|
|
66
|
+
sizeClass[size ?? 'sm'],
|
|
67
|
+
'animate-in fade-in zoom-in-95 duration-[250ms] ease-spring',
|
|
68
|
+
'data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95 data-[state=closed]:duration-200',
|
|
69
|
+
staticRender && 'data-[state=closed]:hidden',
|
|
70
|
+
className
|
|
71
|
+
)}
|
|
72
|
+
>
|
|
73
|
+
{#if closeButton}
|
|
74
|
+
<DialogPrimitive.Close
|
|
75
|
+
class="absolute right-2 top-2 z-10 size-8 flex items-center justify-center rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors"
|
|
76
|
+
aria-label="Close"
|
|
77
|
+
>
|
|
78
|
+
<IconX class="size-4"/>
|
|
79
|
+
</DialogPrimitive.Close>
|
|
80
|
+
{/if}
|
|
81
|
+
|
|
82
|
+
<div class={cn(paddingClass.container, 'grid grid-rows-[auto_1fr_auto] h-full overflow-hidden', containerClass)}>
|
|
83
|
+
{#if header}
|
|
84
|
+
<header class={cn('font-bold px-4 mb-2', headerClass)}>
|
|
85
|
+
{@render header()}
|
|
86
|
+
</header>
|
|
87
|
+
{/if}
|
|
88
|
+
|
|
89
|
+
<main class={cn('overflow-auto', paddingClass.body, bodyClass)}>
|
|
90
|
+
{@render children?.()}
|
|
91
|
+
</main>
|
|
92
|
+
|
|
93
|
+
{#if footer}
|
|
94
|
+
<footer class={cn('mt-3 px-4 flex items-center justify-end gap-2.5', footerClass)}>
|
|
95
|
+
{@render footer()}
|
|
96
|
+
</footer>
|
|
97
|
+
{/if}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
{/snippet}
|
|
101
|
+
</DialogPrimitive.Content>
|
|
102
|
+
</DialogPrimitive.Portal>
|
|
103
|
+
</DialogPrimitive.Root>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import './dialog.scss';
|
|
1
|
+
import type { DialogProps } from './Dialog.js';
|
|
3
2
|
declare const Dialog: import("svelte").Component<DialogProps, {}, "ref" | "open">;
|
|
4
3
|
type Dialog = ReturnType<typeof Dialog>;
|
|
5
4
|
export default Dialog;
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
display: grid;
|
|
9
9
|
grid-template-rows: auto 1fr auto;
|
|
10
10
|
width: 100%;
|
|
11
|
-
background: var(--color-
|
|
11
|
+
background: var(--color-surface);
|
|
12
|
+
border-radius: var(--border-radius-container);
|
|
12
13
|
position: relative;
|
|
13
14
|
top: 0;
|
|
14
15
|
left: 0;
|
|
@@ -62,10 +63,12 @@ dialog[open] {
|
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
dialog {
|
|
65
|
-
--transition-duration: 0.
|
|
66
|
+
--transition-duration: 0.25s;
|
|
67
|
+
--transition-easing: var(--ease-spring);
|
|
66
68
|
transform: translateY(0px);
|
|
67
69
|
margin: auto;
|
|
68
|
-
box-shadow:
|
|
70
|
+
box-shadow: var(--shadow-lg);
|
|
71
|
+
border-radius: var(--border-radius-container);
|
|
69
72
|
|
|
70
73
|
&[data-position="top"] {
|
|
71
74
|
position: fixed;
|
|
@@ -76,11 +79,11 @@ dialog {
|
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
&, &::backdrop {
|
|
79
|
-
transition: opacity var(--transition-duration)
|
|
80
|
-
transform var(--transition-duration)
|
|
82
|
+
transition: opacity var(--transition-duration) var(--transition-easing),
|
|
83
|
+
transform var(--transition-duration) var(--transition-easing),
|
|
81
84
|
display var(--transition-duration) allow-discrete,
|
|
82
85
|
overlay var(--transition-duration) allow-discrete,
|
|
83
|
-
box-shadow var(--transition-duration)
|
|
86
|
+
box-shadow var(--transition-duration) var(--transition-easing);
|
|
84
87
|
|
|
85
88
|
opacity: 0;
|
|
86
89
|
|
|
@@ -91,58 +94,52 @@ dialog {
|
|
|
91
94
|
|
|
92
95
|
|
|
93
96
|
&[open] {
|
|
94
|
-
animation:
|
|
97
|
+
animation: dialog-enter var(--transition-duration) var(--transition-easing);
|
|
95
98
|
opacity: 1;
|
|
96
|
-
box-shadow:
|
|
99
|
+
box-shadow: var(--shadow-lg);
|
|
97
100
|
&::backdrop {
|
|
98
101
|
opacity: 1;
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
&[data-position="top"] {
|
|
102
|
-
animation: slide-in-top var(--transition-duration)
|
|
105
|
+
animation: slide-in-top var(--transition-duration) var(--transition-easing);
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
108
|
|
|
106
109
|
&:not([open]) {
|
|
107
|
-
animation:
|
|
110
|
+
animation: dialog-exit var(--transition-duration) var(--ease-ui);
|
|
108
111
|
opacity: 0;
|
|
109
|
-
box-shadow:
|
|
112
|
+
box-shadow: var(--shadow-sm);
|
|
110
113
|
&::backdrop {
|
|
111
114
|
opacity: 0;
|
|
112
115
|
}
|
|
113
116
|
|
|
114
117
|
&[data-position="top"] {
|
|
115
|
-
animation: slide-out-top var(--transition-duration) ease-
|
|
118
|
+
animation: slide-out-top var(--transition-duration) var(--ease-ui);
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
@keyframes
|
|
124
|
+
@keyframes dialog-enter {
|
|
122
125
|
from {
|
|
123
|
-
transform:
|
|
126
|
+
transform: scale(0.95);
|
|
124
127
|
opacity: 0;
|
|
125
|
-
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
|
|
126
|
-
|
|
127
128
|
}
|
|
128
129
|
to {
|
|
129
|
-
transform:
|
|
130
|
+
transform: scale(1);
|
|
130
131
|
opacity: 1;
|
|
131
|
-
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.24), 0 8px 16px rgba(0, 0, 0, 0.12);
|
|
132
|
-
|
|
133
132
|
}
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
@keyframes
|
|
135
|
+
@keyframes dialog-exit {
|
|
137
136
|
from {
|
|
138
|
-
transform:
|
|
137
|
+
transform: scale(1);
|
|
139
138
|
opacity: 1;
|
|
140
|
-
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.24), 0 8px 16px rgba(0, 0, 0, 0.12);
|
|
141
139
|
}
|
|
142
140
|
to {
|
|
143
|
-
transform:
|
|
141
|
+
transform: scale(0.95);
|
|
144
142
|
opacity: 0;
|
|
145
|
-
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
|
|
146
143
|
}
|
|
147
144
|
}
|
|
148
145
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script lang="ts">let { open = $bindable(false), side = 'right', size = 'md', closeOnClickOutside = true, header, footer, children, onclose, } = $props();
|
|
2
|
+
const sizeMap = {
|
|
3
|
+
sm: '320px', md: '480px', lg: '640px', full: '100%',
|
|
4
|
+
};
|
|
5
|
+
const slideFrom = {
|
|
6
|
+
left: 'translate-x-[-100%]',
|
|
7
|
+
right: 'translate-x-[100%]',
|
|
8
|
+
bottom: 'translate-y-[100%]',
|
|
9
|
+
};
|
|
10
|
+
const drawerClass = $derived(side === 'bottom'
|
|
11
|
+
? `fixed bottom-0 left-0 right-0 max-h-[85vh] rounded-t-[20px]`
|
|
12
|
+
: side === 'left'
|
|
13
|
+
? `fixed left-0 top-0 bottom-0 w-[${sizeMap[size]}] max-w-full`
|
|
14
|
+
: `fixed right-0 top-0 bottom-0 w-[${sizeMap[size]}] max-w-full`);
|
|
15
|
+
function close() {
|
|
16
|
+
open = false;
|
|
17
|
+
onclose?.();
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
{#if open}
|
|
23
|
+
<!-- Backdrop -->
|
|
24
|
+
<div
|
|
25
|
+
role="presentation"
|
|
26
|
+
class="fixed inset-0 z-40 bg-overlay backdrop-blur-[4px] animate-in fade-in duration-200"
|
|
27
|
+
onclick={() => closeOnClickOutside && close()}
|
|
28
|
+
onkeydown={(e) => e.key === 'Escape' && closeOnClickOutside && close()}
|
|
29
|
+
></div>
|
|
30
|
+
|
|
31
|
+
<!-- Drawer panel -->
|
|
32
|
+
<div
|
|
33
|
+
class="{drawerClass} z-50 flex flex-col bg-surface shadow-lg border border-border-default animate-in duration-300 ease-spring {side === 'bottom' ? 'slide-in-from-bottom' : side === 'left' ? 'slide-in-from-left' : 'slide-in-from-right'}"
|
|
34
|
+
role="dialog"
|
|
35
|
+
aria-modal="true"
|
|
36
|
+
>
|
|
37
|
+
{#if header}
|
|
38
|
+
<header class="flex items-center justify-between px-5 py-4 border-b border-border-default shrink-0">
|
|
39
|
+
{@render header()}
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
onclick={close}
|
|
43
|
+
class="text-text-tertiary hover:text-text-primary transition-colors ml-auto"
|
|
44
|
+
aria-label="Close drawer"
|
|
45
|
+
>
|
|
46
|
+
<svg class="size-4" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
47
|
+
<path d="M4 4l8 8M12 4l-8 8"/>
|
|
48
|
+
</svg>
|
|
49
|
+
</button>
|
|
50
|
+
</header>
|
|
51
|
+
{/if}
|
|
52
|
+
|
|
53
|
+
<main class="flex-1 overflow-y-auto p-5">
|
|
54
|
+
{@render children?.()}
|
|
55
|
+
</main>
|
|
56
|
+
|
|
57
|
+
{#if footer}
|
|
58
|
+
<footer class="px-5 py-4 border-t border-border-default shrink-0">
|
|
59
|
+
{@render footer()}
|
|
60
|
+
</footer>
|
|
61
|
+
{/if}
|
|
62
|
+
</div>
|
|
63
|
+
{/if}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type DrawerSide = 'left' | 'right' | 'bottom';
|
|
3
|
+
type DrawerSize = 'sm' | 'md' | 'lg' | 'full';
|
|
4
|
+
type $$ComponentProps = {
|
|
5
|
+
open?: boolean;
|
|
6
|
+
side?: DrawerSide;
|
|
7
|
+
size?: DrawerSize;
|
|
8
|
+
closeOnClickOutside?: boolean;
|
|
9
|
+
header?: Snippet;
|
|
10
|
+
footer?: Snippet;
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
onclose?: () => void;
|
|
13
|
+
};
|
|
14
|
+
declare const Drawer: import("svelte").Component<$$ComponentProps, {}, "open">;
|
|
15
|
+
type Drawer = ReturnType<typeof Drawer>;
|
|
16
|
+
export default Drawer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Drawer } from './Drawer.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Drawer } from './Drawer.svelte';
|