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