@marwes-ui/svelte 1.3.0
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/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +518 -0
- package/dist/components/accordion/Accordion.svelte +56 -0
- package/dist/components/accordion/Accordion.svelte.d.ts +4 -0
- package/dist/components/accordion/AccordionField.svelte +90 -0
- package/dist/components/accordion/AccordionField.svelte.d.ts +4 -0
- package/dist/components/accordion/FAQAccordion.svelte +21 -0
- package/dist/components/accordion/FAQAccordion.svelte.d.ts +20 -0
- package/dist/components/accordion/README.md +19 -0
- package/dist/components/accordion/SectionsAccordion.svelte +22 -0
- package/dist/components/accordion/SectionsAccordion.svelte.d.ts +21 -0
- package/dist/components/accordion/SettingsAccordion.svelte +21 -0
- package/dist/components/accordion/SettingsAccordion.svelte.d.ts +20 -0
- package/dist/components/accordion/index.d.ts +2 -0
- package/dist/components/accordion/index.js +1 -0
- package/dist/components/accordion/types.d.ts +28 -0
- package/dist/components/accordion/types.js +1 -0
- package/dist/components/avatar/Avatar.svelte +45 -0
- package/dist/components/avatar/Avatar.svelte.d.ts +4 -0
- package/dist/components/avatar/AvatarBadge.svelte +47 -0
- package/dist/components/avatar/AvatarBadge.svelte.d.ts +7 -0
- package/dist/components/avatar/AvatarGroup.svelte +50 -0
- package/dist/components/avatar/AvatarGroup.svelte.d.ts +15 -0
- package/dist/components/avatar/PresenceAvatar.svelte +12 -0
- package/dist/components/avatar/PresenceAvatar.svelte.d.ts +7 -0
- package/dist/components/avatar/ProfileAvatar.svelte +7 -0
- package/dist/components/avatar/ProfileAvatar.svelte.d.ts +4 -0
- package/dist/components/avatar/README.md +19 -0
- package/dist/components/avatar/TeamAvatarGroup.svelte +21 -0
- package/dist/components/avatar/TeamAvatarGroup.svelte.d.ts +15 -0
- package/dist/components/avatar/index.d.ts +2 -0
- package/dist/components/avatar/index.js +1 -0
- package/dist/components/avatar/types.d.ts +6 -0
- package/dist/components/avatar/types.js +1 -0
- package/dist/components/badge/Badge.svelte +26 -0
- package/dist/components/badge/Badge.svelte.d.ts +4 -0
- package/dist/components/badge/BadgeGroup.svelte +25 -0
- package/dist/components/badge/BadgeGroup.svelte.d.ts +4 -0
- package/dist/components/badge/NotificationBadge.svelte +7 -0
- package/dist/components/badge/NotificationBadge.svelte.d.ts +4 -0
- package/dist/components/badge/PriorityBadge.svelte +7 -0
- package/dist/components/badge/PriorityBadge.svelte.d.ts +4 -0
- package/dist/components/badge/README.md +16 -0
- package/dist/components/badge/StatusBadge.svelte +7 -0
- package/dist/components/badge/StatusBadge.svelte.d.ts +4 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/badge/types.d.ts +15 -0
- package/dist/components/badge/types.js +1 -0
- package/dist/components/button/Button.svelte +92 -0
- package/dist/components/button/Button.svelte.d.ts +4 -0
- package/dist/components/button/CancelButton.svelte +8 -0
- package/dist/components/button/CancelButton.svelte.d.ts +5 -0
- package/dist/components/button/CloseButton.svelte +8 -0
- package/dist/components/button/CloseButton.svelte.d.ts +5 -0
- package/dist/components/button/ConfirmButton.svelte +8 -0
- package/dist/components/button/ConfirmButton.svelte.d.ts +5 -0
- package/dist/components/button/CopyButton.svelte +8 -0
- package/dist/components/button/CopyButton.svelte.d.ts +5 -0
- package/dist/components/button/CreateButton.svelte +7 -0
- package/dist/components/button/CreateButton.svelte.d.ts +5 -0
- package/dist/components/button/DestructiveButton.svelte +8 -0
- package/dist/components/button/DestructiveButton.svelte.d.ts +5 -0
- package/dist/components/button/DownloadButton.svelte +8 -0
- package/dist/components/button/DownloadButton.svelte.d.ts +5 -0
- package/dist/components/button/DropdownButton.svelte +8 -0
- package/dist/components/button/DropdownButton.svelte.d.ts +5 -0
- package/dist/components/button/EditButton.svelte +8 -0
- package/dist/components/button/EditButton.svelte.d.ts +5 -0
- package/dist/components/button/FilterButton.svelte +8 -0
- package/dist/components/button/FilterButton.svelte.d.ts +5 -0
- package/dist/components/button/LinkButton.svelte +8 -0
- package/dist/components/button/LinkButton.svelte.d.ts +5 -0
- package/dist/components/button/PrimaryButton.svelte +7 -0
- package/dist/components/button/PrimaryButton.svelte.d.ts +5 -0
- package/dist/components/button/README.md +21 -0
- package/dist/components/button/RefreshButton.svelte +8 -0
- package/dist/components/button/RefreshButton.svelte.d.ts +5 -0
- package/dist/components/button/SaveButton.svelte +8 -0
- package/dist/components/button/SaveButton.svelte.d.ts +5 -0
- package/dist/components/button/SearchButton.svelte +8 -0
- package/dist/components/button/SearchButton.svelte.d.ts +5 -0
- package/dist/components/button/SecondaryButton.svelte +7 -0
- package/dist/components/button/SecondaryButton.svelte.d.ts +5 -0
- package/dist/components/button/SortButton.svelte +8 -0
- package/dist/components/button/SortButton.svelte.d.ts +5 -0
- package/dist/components/button/SubmitButton.svelte +7 -0
- package/dist/components/button/SubmitButton.svelte.d.ts +5 -0
- package/dist/components/button/SuccessButton.svelte +7 -0
- package/dist/components/button/SuccessButton.svelte.d.ts +5 -0
- package/dist/components/button/TextButton.svelte +7 -0
- package/dist/components/button/TextButton.svelte.d.ts +5 -0
- package/dist/components/button/UploadButton.svelte +8 -0
- package/dist/components/button/UploadButton.svelte.d.ts +5 -0
- package/dist/components/button/VerifyButton.svelte +8 -0
- package/dist/components/button/VerifyButton.svelte.d.ts +5 -0
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/button/index.js +1 -0
- package/dist/components/button/types.d.ts +8 -0
- package/dist/components/button/types.js +1 -0
- package/dist/components/card/Card.svelte +33 -0
- package/dist/components/card/Card.svelte.d.ts +4 -0
- package/dist/components/card/ProductCard.svelte +6 -0
- package/dist/components/card/ProductCard.svelte.d.ts +4 -0
- package/dist/components/card/ProfileCard.svelte +6 -0
- package/dist/components/card/ProfileCard.svelte.d.ts +4 -0
- package/dist/components/card/README.md +15 -0
- package/dist/components/card/StatCard.svelte +6 -0
- package/dist/components/card/StatCard.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/card/types.d.ts +10 -0
- package/dist/components/card/types.js +1 -0
- package/dist/components/checkbox/Checkbox.svelte +54 -0
- package/dist/components/checkbox/Checkbox.svelte.d.ts +4 -0
- package/dist/components/checkbox/CheckboxField.svelte +74 -0
- package/dist/components/checkbox/CheckboxField.svelte.d.ts +4 -0
- package/dist/components/checkbox/CheckboxGroupField.svelte +50 -0
- package/dist/components/checkbox/CheckboxGroupField.svelte.d.ts +4 -0
- package/dist/components/checkbox/README.md +17 -0
- package/dist/components/checkbox/index.d.ts +3 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/checkbox/types.d.ts +30 -0
- package/dist/components/checkbox/types.js +1 -0
- package/dist/components/date-picker/DatePicker.svelte +108 -0
- package/dist/components/date-picker/DatePicker.svelte.d.ts +4 -0
- package/dist/components/date-picker/README.md +17 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +1 -0
- package/dist/components/date-picker/types.d.ts +13 -0
- package/dist/components/date-picker/types.js +1 -0
- package/dist/components/dialog/ConfirmDialog.svelte +28 -0
- package/dist/components/dialog/ConfirmDialog.svelte.d.ts +4 -0
- package/dist/components/dialog/DestructiveDialog.svelte +28 -0
- package/dist/components/dialog/DestructiveDialog.svelte.d.ts +4 -0
- package/dist/components/dialog/Dialog.svelte +114 -0
- package/dist/components/dialog/Dialog.svelte.d.ts +4 -0
- package/dist/components/dialog/DialogModal.svelte +120 -0
- package/dist/components/dialog/DialogModal.svelte.d.ts +4 -0
- package/dist/components/dialog/InfoDialog.svelte +24 -0
- package/dist/components/dialog/InfoDialog.svelte.d.ts +4 -0
- package/dist/components/dialog/README.md +23 -0
- package/dist/components/dialog/index.d.ts +6 -0
- package/dist/components/dialog/index.js +5 -0
- package/dist/components/dialog/types.d.ts +42 -0
- package/dist/components/dialog/types.js +1 -0
- package/dist/components/divider/Divider.svelte +25 -0
- package/dist/components/divider/Divider.svelte.d.ts +4 -0
- package/dist/components/divider/README.md +15 -0
- package/dist/components/divider/index.d.ts +2 -0
- package/dist/components/divider/index.js +1 -0
- package/dist/components/divider/types.d.ts +5 -0
- package/dist/components/divider/types.js +1 -0
- package/dist/components/heading/H1.svelte +23 -0
- package/dist/components/heading/H1.svelte.d.ts +4 -0
- package/dist/components/heading/H2.svelte +23 -0
- package/dist/components/heading/H2.svelte.d.ts +4 -0
- package/dist/components/heading/H3.svelte +23 -0
- package/dist/components/heading/H3.svelte.d.ts +4 -0
- package/dist/components/heading/README.md +13 -0
- package/dist/components/heading/index.d.ts +4 -0
- package/dist/components/heading/index.js +3 -0
- package/dist/components/heading/types.d.ts +26 -0
- package/dist/components/heading/types.js +1 -0
- package/dist/components/icon/Icon.svelte +65 -0
- package/dist/components/icon/Icon.svelte.d.ts +4 -0
- package/dist/components/icon/README.md +18 -0
- package/dist/components/icon/index.d.ts +2 -0
- package/dist/components/icon/index.js +1 -0
- package/dist/components/icon/types.d.ts +12 -0
- package/dist/components/icon/types.js +1 -0
- package/dist/components/input/CurrencyField.svelte +12 -0
- package/dist/components/input/CurrencyField.svelte.d.ts +7 -0
- package/dist/components/input/DateOfBirthField.svelte +21 -0
- package/dist/components/input/DateOfBirthField.svelte.d.ts +14 -0
- package/dist/components/input/DropdownField.svelte +29 -0
- package/dist/components/input/DropdownField.svelte.d.ts +14 -0
- package/dist/components/input/EmailField.svelte +9 -0
- package/dist/components/input/EmailField.svelte.d.ts +7 -0
- package/dist/components/input/Input.svelte +49 -0
- package/dist/components/input/Input.svelte.d.ts +4 -0
- package/dist/components/input/InputField.svelte +139 -0
- package/dist/components/input/InputField.svelte.d.ts +4 -0
- package/dist/components/input/InputOtp.svelte +140 -0
- package/dist/components/input/InputOtp.svelte.d.ts +4 -0
- package/dist/components/input/PasswordField.svelte +9 -0
- package/dist/components/input/PasswordField.svelte.d.ts +7 -0
- package/dist/components/input/PhoneField.svelte +9 -0
- package/dist/components/input/PhoneField.svelte.d.ts +7 -0
- package/dist/components/input/README.md +24 -0
- package/dist/components/input/RichText.svelte +177 -0
- package/dist/components/input/RichText.svelte.d.ts +4 -0
- package/dist/components/input/RichTextField.svelte +84 -0
- package/dist/components/input/RichTextField.svelte.d.ts +4 -0
- package/dist/components/input/SearchField.svelte +9 -0
- package/dist/components/input/SearchField.svelte.d.ts +7 -0
- package/dist/components/input/Select.svelte +88 -0
- package/dist/components/input/Select.svelte.d.ts +4 -0
- package/dist/components/input/SelectField.svelte +395 -0
- package/dist/components/input/SelectField.svelte.d.ts +4 -0
- package/dist/components/input/Textarea.svelte +50 -0
- package/dist/components/input/Textarea.svelte.d.ts +4 -0
- package/dist/components/input/TextareaField.svelte +57 -0
- package/dist/components/input/TextareaField.svelte.d.ts +4 -0
- package/dist/components/input/URLField.svelte +9 -0
- package/dist/components/input/URLField.svelte.d.ts +7 -0
- package/dist/components/input/ZipCodeField.svelte +21 -0
- package/dist/components/input/ZipCodeField.svelte.d.ts +14 -0
- package/dist/components/input/index.d.ts +7 -0
- package/dist/components/input/index.js +6 -0
- package/dist/components/input/types.d.ts +104 -0
- package/dist/components/input/types.js +1 -0
- package/dist/components/paragraph/Paragraph.svelte +23 -0
- package/dist/components/paragraph/Paragraph.svelte.d.ts +4 -0
- package/dist/components/paragraph/README.md +13 -0
- package/dist/components/paragraph/index.d.ts +2 -0
- package/dist/components/paragraph/index.js +1 -0
- package/dist/components/paragraph/types.d.ts +9 -0
- package/dist/components/paragraph/types.js +1 -0
- package/dist/components/radio/OptionRadioGroup.svelte +52 -0
- package/dist/components/radio/OptionRadioGroup.svelte.d.ts +21 -0
- package/dist/components/radio/README.md +16 -0
- package/dist/components/radio/Radio.svelte +38 -0
- package/dist/components/radio/Radio.svelte.d.ts +4 -0
- package/dist/components/radio/RadioGroupField.svelte +75 -0
- package/dist/components/radio/RadioGroupField.svelte.d.ts +4 -0
- package/dist/components/radio/RatingRadioGroup.svelte +51 -0
- package/dist/components/radio/RatingRadioGroup.svelte.d.ts +17 -0
- package/dist/components/radio/YesNoRadioGroup.svelte +48 -0
- package/dist/components/radio/YesNoRadioGroup.svelte.d.ts +16 -0
- package/dist/components/radio/index.d.ts +3 -0
- package/dist/components/radio/index.js +2 -0
- package/dist/components/radio/types.d.ts +22 -0
- package/dist/components/radio/types.js +1 -0
- package/dist/components/skeleton/README.md +16 -0
- package/dist/components/skeleton/Skeleton.svelte +29 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +4 -0
- package/dist/components/skeleton/index.d.ts +2 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/skeleton/types.d.ts +6 -0
- package/dist/components/skeleton/types.js +1 -0
- package/dist/components/slider/BrightnessSlider.svelte +31 -0
- package/dist/components/slider/BrightnessSlider.svelte.d.ts +11 -0
- package/dist/components/slider/README.md +20 -0
- package/dist/components/slider/RadiusSlider.svelte +31 -0
- package/dist/components/slider/RadiusSlider.svelte.d.ts +11 -0
- package/dist/components/slider/Slider.svelte +67 -0
- package/dist/components/slider/Slider.svelte.d.ts +4 -0
- package/dist/components/slider/SliderField.svelte +115 -0
- package/dist/components/slider/SliderField.svelte.d.ts +4 -0
- package/dist/components/slider/VolumeSlider.svelte +31 -0
- package/dist/components/slider/VolumeSlider.svelte.d.ts +11 -0
- package/dist/components/slider/index.d.ts +2 -0
- package/dist/components/slider/index.js +1 -0
- package/dist/components/slider/types.d.ts +28 -0
- package/dist/components/slider/types.js +1 -0
- package/dist/components/spacing/README.md +15 -0
- package/dist/components/spacing/Spacer.svelte +8 -0
- package/dist/components/spacing/Spacer.svelte.d.ts +3 -0
- package/dist/components/spacing/Spacing.svelte +23 -0
- package/dist/components/spacing/Spacing.svelte.d.ts +4 -0
- package/dist/components/spacing/index.d.ts +3 -0
- package/dist/components/spacing/index.js +2 -0
- package/dist/components/spacing/types.d.ts +7 -0
- package/dist/components/spacing/types.js +1 -0
- package/dist/components/spinner/ButtonSpinner.svelte +35 -0
- package/dist/components/spinner/ButtonSpinner.svelte.d.ts +4 -0
- package/dist/components/spinner/EmptyStateSpinner.svelte +20 -0
- package/dist/components/spinner/EmptyStateSpinner.svelte.d.ts +4 -0
- package/dist/components/spinner/README.md +19 -0
- package/dist/components/spinner/Spinner.svelte +60 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +4 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/spinner/index.js +2 -0
- package/dist/components/spinner/types.d.ts +9 -0
- package/dist/components/spinner/types.js +1 -0
- package/dist/components/stat-tile/README.md +15 -0
- package/dist/components/stat-tile/StatTile.svelte +44 -0
- package/dist/components/stat-tile/StatTile.svelte.d.ts +4 -0
- package/dist/components/stat-tile/index.d.ts +2 -0
- package/dist/components/stat-tile/index.js +1 -0
- package/dist/components/stat-tile/types.d.ts +14 -0
- package/dist/components/stat-tile/types.js +1 -0
- package/dist/components/switch/FeatureToggle.svelte +19 -0
- package/dist/components/switch/FeatureToggle.svelte.d.ts +13 -0
- package/dist/components/switch/PermissionSwitch.svelte +19 -0
- package/dist/components/switch/PermissionSwitch.svelte.d.ts +13 -0
- package/dist/components/switch/PreferenceSwitch.svelte +19 -0
- package/dist/components/switch/PreferenceSwitch.svelte.d.ts +13 -0
- package/dist/components/switch/README.md +17 -0
- package/dist/components/switch/Switch.svelte +52 -0
- package/dist/components/switch/Switch.svelte.d.ts +4 -0
- package/dist/components/switch/SwitchField.svelte +71 -0
- package/dist/components/switch/SwitchField.svelte.d.ts +4 -0
- package/dist/components/switch/index.d.ts +3 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/switch/types.d.ts +20 -0
- package/dist/components/switch/types.js +1 -0
- package/dist/components/tab/ContentTabs.svelte +11 -0
- package/dist/components/tab/ContentTabs.svelte.d.ts +3 -0
- package/dist/components/tab/NavigationTabs.svelte +11 -0
- package/dist/components/tab/NavigationTabs.svelte.d.ts +3 -0
- package/dist/components/tab/README.md +26 -0
- package/dist/components/tab/SettingsTabs.svelte +11 -0
- package/dist/components/tab/SettingsTabs.svelte.d.ts +3 -0
- package/dist/components/tab/Tab.svelte +32 -0
- package/dist/components/tab/Tab.svelte.d.ts +4 -0
- package/dist/components/tab/TabGroup.svelte +132 -0
- package/dist/components/tab/TabGroup.svelte.d.ts +4 -0
- package/dist/components/tab/TabPanel.svelte +25 -0
- package/dist/components/tab/TabPanel.svelte.d.ts +4 -0
- package/dist/components/tab/index.d.ts +7 -0
- package/dist/components/tab/index.js +6 -0
- package/dist/components/tab/types.d.ts +36 -0
- package/dist/components/tab/types.js +1 -0
- package/dist/components/toast/ErrorToast.svelte +24 -0
- package/dist/components/toast/ErrorToast.svelte.d.ts +4 -0
- package/dist/components/toast/InfoToast.svelte +24 -0
- package/dist/components/toast/InfoToast.svelte.d.ts +4 -0
- package/dist/components/toast/README.md +35 -0
- package/dist/components/toast/SuccessToast.svelte +25 -0
- package/dist/components/toast/SuccessToast.svelte.d.ts +4 -0
- package/dist/components/toast/Toast.svelte +53 -0
- package/dist/components/toast/Toast.svelte.d.ts +4 -0
- package/dist/components/toast/ToastContainer.svelte +212 -0
- package/dist/components/toast/ToastContainer.svelte.d.ts +4 -0
- package/dist/components/toast/ToastProvider.svelte +71 -0
- package/dist/components/toast/ToastProvider.svelte.d.ts +7 -0
- package/dist/components/toast/WarningToast.svelte +24 -0
- package/dist/components/toast/WarningToast.svelte.d.ts +4 -0
- package/dist/components/toast/index.d.ts +9 -0
- package/dist/components/toast/index.js +8 -0
- package/dist/components/toast/types.d.ts +48 -0
- package/dist/components/toast/types.js +1 -0
- package/dist/components/tooltip/README.md +22 -0
- package/dist/components/tooltip/Tooltip.svelte +29 -0
- package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
- package/dist/components/tooltip/TooltipGroup.svelte +100 -0
- package/dist/components/tooltip/TooltipGroup.svelte.d.ts +4 -0
- package/dist/components/tooltip/index.d.ts +3 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/components/tooltip/types.d.ts +22 -0
- package/dist/components/tooltip/types.js +1 -0
- package/dist/index.d.ts +149 -0
- package/dist/index.js +149 -0
- package/dist/internal/attrs.d.ts +2 -0
- package/dist/internal/attrs.js +5 -0
- package/dist/internal/css-vars.d.ts +5 -0
- package/dist/internal/css-vars.js +20 -0
- package/dist/internal/merge-class.d.ts +1 -0
- package/dist/internal/merge-class.js +4 -0
- package/dist/internal/svg-attrs.d.ts +9 -0
- package/dist/internal/svg-attrs.js +16 -0
- package/dist/provider/MarwesProvider.svelte +186 -0
- package/dist/provider/MarwesProvider.svelte.d.ts +4 -0
- package/dist/provider/context.d.ts +3 -0
- package/dist/provider/context.js +12 -0
- package/dist/provider/runtime-theme.d.ts +5 -0
- package/dist/provider/runtime-theme.js +63 -0
- package/dist/provider/theme-mode-runtime.d.ts +15 -0
- package/dist/provider/theme-mode-runtime.js +84 -0
- package/dist/provider/types.d.ts +32 -0
- package/dist/provider/types.js +1 -0
- package/dist/provider/use-theme-mode.d.ts +24 -0
- package/dist/provider/use-theme-mode.js +38 -0
- package/dist/provider/use-theme.d.ts +15 -0
- package/dist/provider/use-theme.js +19 -0
- package/dist/ssr.d.ts +2 -0
- package/dist/ssr.js +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as Tab } from "./Tab.svelte";
|
|
2
|
+
export { default as TabPanel } from "./TabPanel.svelte";
|
|
3
|
+
export { default as TabGroup } from "./TabGroup.svelte";
|
|
4
|
+
export { default as NavigationTabs } from "./NavigationTabs.svelte";
|
|
5
|
+
export { default as ContentTabs } from "./ContentTabs.svelte";
|
|
6
|
+
export { default as SettingsTabs } from "./SettingsTabs.svelte";
|
|
7
|
+
export type { TabProps, TabPanelProps, TabGroupProps, TabGroupItem, NavigationTabsProps, ContentTabsProps, SettingsTabsProps, } from "./types.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as Tab } from "./Tab.svelte";
|
|
2
|
+
export { default as TabPanel } from "./TabPanel.svelte";
|
|
3
|
+
export { default as TabGroup } from "./TabGroup.svelte";
|
|
4
|
+
export { default as NavigationTabs } from "./NavigationTabs.svelte";
|
|
5
|
+
export { default as ContentTabs } from "./ContentTabs.svelte";
|
|
6
|
+
export { default as SettingsTabs } from "./SettingsTabs.svelte";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TabOptions } from "@marwes-ui/core";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
export interface TabProps extends TabOptions {
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
class?: string;
|
|
6
|
+
id?: string;
|
|
7
|
+
onclick?: (e: MouseEvent) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface TabPanelProps {
|
|
10
|
+
id: string;
|
|
11
|
+
tabId: string;
|
|
12
|
+
hidden?: boolean;
|
|
13
|
+
children?: Snippet;
|
|
14
|
+
class?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TabGroupItem {
|
|
17
|
+
value: string;
|
|
18
|
+
label: string;
|
|
19
|
+
panel: Snippet | string;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
ariaLabel?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TabGroupProps {
|
|
24
|
+
id?: string;
|
|
25
|
+
label?: string;
|
|
26
|
+
ariaLabel?: string;
|
|
27
|
+
tabs: TabGroupItem[];
|
|
28
|
+
activeTab?: string;
|
|
29
|
+
defaultActiveTab?: string;
|
|
30
|
+
onactivetabchange?: (value: string) => void;
|
|
31
|
+
dataAttributes?: Record<string, string>;
|
|
32
|
+
class?: string;
|
|
33
|
+
}
|
|
34
|
+
export type NavigationTabsProps = TabGroupProps;
|
|
35
|
+
export type ContentTabsProps = TabGroupProps;
|
|
36
|
+
export type SettingsTabsProps = TabGroupProps;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconName, createPurposeSemanticAttributes } from "@marwes-ui/core";
|
|
3
|
+
import Icon from "../icon/Icon.svelte";
|
|
4
|
+
import Toast from "./Toast.svelte";
|
|
5
|
+
import type { ToastProps } from "./types.js";
|
|
6
|
+
|
|
7
|
+
let { dataAttributes, variant, ariaLive, icon, ...props }: ToastProps = $props();
|
|
8
|
+
const hasCustomIcon = $derived(icon !== undefined);
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Toast
|
|
12
|
+
{...props}
|
|
13
|
+
variant={variant ?? "outline"}
|
|
14
|
+
ariaLive={ariaLive ?? "assertive"}
|
|
15
|
+
dataAttributes={{ ...dataAttributes, ...createPurposeSemanticAttributes("error-toast") }}
|
|
16
|
+
>
|
|
17
|
+
{#snippet icon()}
|
|
18
|
+
{#if hasCustomIcon}
|
|
19
|
+
{@render icon?.()}
|
|
20
|
+
{:else}
|
|
21
|
+
<Icon name={IconName.XCircle} decorative />
|
|
22
|
+
{/if}
|
|
23
|
+
{/snippet}
|
|
24
|
+
</Toast>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconName, createPurposeSemanticAttributes } from "@marwes-ui/core";
|
|
3
|
+
import Icon from "../icon/Icon.svelte";
|
|
4
|
+
import Toast from "./Toast.svelte";
|
|
5
|
+
import type { ToastProps } from "./types.js";
|
|
6
|
+
|
|
7
|
+
let { dataAttributes, variant, ariaLive, icon, ...props }: ToastProps = $props();
|
|
8
|
+
const hasCustomIcon = $derived(icon !== undefined);
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Toast
|
|
12
|
+
{...props}
|
|
13
|
+
variant={variant ?? "outline"}
|
|
14
|
+
ariaLive={ariaLive ?? "polite"}
|
|
15
|
+
dataAttributes={{ ...dataAttributes, ...createPurposeSemanticAttributes("info-toast") }}
|
|
16
|
+
>
|
|
17
|
+
{#snippet icon()}
|
|
18
|
+
{#if hasCustomIcon}
|
|
19
|
+
{@render icon?.()}
|
|
20
|
+
{:else}
|
|
21
|
+
<Icon name={IconName.Info} decorative />
|
|
22
|
+
{/if}
|
|
23
|
+
{/snippet}
|
|
24
|
+
</Toast>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Toast
|
|
2
|
+
|
|
3
|
+
Svelte toast components are aligned with the React and Vue toast family.
|
|
4
|
+
|
|
5
|
+
## Public Components
|
|
6
|
+
|
|
7
|
+
- `Toast` — atom for a single live-region notification.
|
|
8
|
+
- `ToastContainer` — positioned viewport that renders managed toasts.
|
|
9
|
+
- `ToastProvider` — context provider with the imperative toast controller.
|
|
10
|
+
- `SuccessToast` — purpose toast with success semantics.
|
|
11
|
+
- `ErrorToast` — purpose toast with assertive error semantics.
|
|
12
|
+
- `WarningToast` — purpose toast with warning semantics.
|
|
13
|
+
- `InfoToast` — purpose toast with informational semantics.
|
|
14
|
+
|
|
15
|
+
## Shared Contract
|
|
16
|
+
|
|
17
|
+
- Uses `createToastRecipe` from `@marwes-ui/core`.
|
|
18
|
+
- Wires `role="status"` or `role="alert"` from `ariaLive`.
|
|
19
|
+
- Sets `aria-live` and `aria-atomic="true"`.
|
|
20
|
+
- Supports icon, action, and dismiss slots.
|
|
21
|
+
- Renders a dismiss button only when `ondismiss` is provided.
|
|
22
|
+
- Applies canonical `data-component`, `data-purpose`, and `data-intent` attributes.
|
|
23
|
+
- Keeps `ToastContainer` placement classes and `maxVisible` behavior aligned with React and Vue.
|
|
24
|
+
- Keeps provider-managed toasts on the shared imperative API: `show()`, `dismiss()`, and `clear()`.
|
|
25
|
+
- Defaults provider-managed toast duration to `4000ms`.
|
|
26
|
+
- Keeps `duration={null}` toasts visible until product code dismisses them.
|
|
27
|
+
- Pauses auto-dismiss while pointer hover or focus is inside the toast, then resumes with remaining time.
|
|
28
|
+
|
|
29
|
+
## Svelte Notes
|
|
30
|
+
|
|
31
|
+
- `useToast()` uses Svelte context through `getContext` and `setContext`.
|
|
32
|
+
- Icon, action, and children content use Svelte snippets.
|
|
33
|
+
- `ManagedToast.message` is a string, while React/Vue use framework-native node children.
|
|
34
|
+
- Event naming follows Svelte conventions: `ondismiss`.
|
|
35
|
+
- Class passthrough uses `class`, matching Svelte component conventions.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconName, createPurposeSemanticAttributes } from "@marwes-ui/core";
|
|
3
|
+
import Icon from "../icon/Icon.svelte";
|
|
4
|
+
import Toast from "./Toast.svelte";
|
|
5
|
+
import type { ToastProps } from "./types.js";
|
|
6
|
+
|
|
7
|
+
let { dataAttributes, variant, ariaLive, icon, ...props }: ToastProps = $props();
|
|
8
|
+
|
|
9
|
+
const hasCustomIcon = $derived(icon !== undefined);
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<Toast
|
|
13
|
+
{...props}
|
|
14
|
+
variant={variant ?? "outline"}
|
|
15
|
+
ariaLive={ariaLive ?? "polite"}
|
|
16
|
+
dataAttributes={{ ...dataAttributes, ...createPurposeSemanticAttributes("success-toast") }}
|
|
17
|
+
>
|
|
18
|
+
{#snippet icon()}
|
|
19
|
+
{#if hasCustomIcon}
|
|
20
|
+
{@render icon?.()}
|
|
21
|
+
{:else}
|
|
22
|
+
<Icon name={IconName.Check} decorative />
|
|
23
|
+
{/if}
|
|
24
|
+
{/snippet}
|
|
25
|
+
</Toast>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createToastRecipe } from "@marwes-ui/core";
|
|
3
|
+
import { mergeClass } from "../../internal/merge-class.js";
|
|
4
|
+
import type { ToastProps } from "./types.js";
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
children,
|
|
8
|
+
icon,
|
|
9
|
+
action,
|
|
10
|
+
ondismiss,
|
|
11
|
+
class: className,
|
|
12
|
+
id,
|
|
13
|
+
dataAttributes,
|
|
14
|
+
...coreProps
|
|
15
|
+
}: ToastProps = $props();
|
|
16
|
+
|
|
17
|
+
const kit = $derived(createToastRecipe(coreProps));
|
|
18
|
+
const mergedClass = $derived(mergeClass(kit.className, className));
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div
|
|
22
|
+
{id}
|
|
23
|
+
class={mergedClass}
|
|
24
|
+
role={kit.a11y.role}
|
|
25
|
+
aria-live={kit.a11y.ariaLive}
|
|
26
|
+
aria-atomic="true"
|
|
27
|
+
{...kit.dataAttributes}
|
|
28
|
+
{...dataAttributes}
|
|
29
|
+
>
|
|
30
|
+
{#if icon}
|
|
31
|
+
<span class="mw-toast__icon" aria-hidden="true">
|
|
32
|
+
{@render icon()}
|
|
33
|
+
</span>
|
|
34
|
+
{/if}
|
|
35
|
+
<div class="mw-toast__body">
|
|
36
|
+
<span class="mw-toast__text">
|
|
37
|
+
{@render children?.()}
|
|
38
|
+
</span>
|
|
39
|
+
{#if action}
|
|
40
|
+
<span class="mw-toast__action">
|
|
41
|
+
{@render action()}
|
|
42
|
+
</span>
|
|
43
|
+
{/if}
|
|
44
|
+
</div>
|
|
45
|
+
{#if ondismiss}
|
|
46
|
+
<button
|
|
47
|
+
type="button"
|
|
48
|
+
class="mw-toast__dismiss"
|
|
49
|
+
aria-label="Dismiss"
|
|
50
|
+
onclick={ondismiss}
|
|
51
|
+
></button>
|
|
52
|
+
{/if}
|
|
53
|
+
</div>
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { mergeClass } from "../../internal/merge-class.js";
|
|
3
|
+
import ErrorToast from "./ErrorToast.svelte";
|
|
4
|
+
import InfoToast from "./InfoToast.svelte";
|
|
5
|
+
import SuccessToast from "./SuccessToast.svelte";
|
|
6
|
+
import Toast from "./Toast.svelte";
|
|
7
|
+
import WarningToast from "./WarningToast.svelte";
|
|
8
|
+
import type { ManagedToast, ToastContainerProps } from "./types.js";
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
toasts,
|
|
12
|
+
placement = "top-right",
|
|
13
|
+
maxVisible,
|
|
14
|
+
class: className,
|
|
15
|
+
ondismiss,
|
|
16
|
+
}: ToastContainerProps = $props();
|
|
17
|
+
|
|
18
|
+
const mergedClass = $derived(
|
|
19
|
+
mergeClass("mw-toast-container", `mw-toast-container--${placement}`, className)
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const visibleToasts = $derived(
|
|
23
|
+
maxVisible && maxVisible > 0 ? toasts.slice(-maxVisible) : toasts
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
type TimerState = {
|
|
27
|
+
duration: number | null | undefined;
|
|
28
|
+
focusInside: boolean;
|
|
29
|
+
handle: ReturnType<typeof setTimeout> | null;
|
|
30
|
+
pointerInside: boolean;
|
|
31
|
+
remaining: number | null;
|
|
32
|
+
startedAt: number | null;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const timerStates = new Map<string, TimerState>();
|
|
36
|
+
|
|
37
|
+
function getTimerState(toast: ManagedToast): TimerState {
|
|
38
|
+
let state = timerStates.get(toast.id);
|
|
39
|
+
if (!state) {
|
|
40
|
+
state = {
|
|
41
|
+
duration: undefined,
|
|
42
|
+
focusInside: false,
|
|
43
|
+
handle: null,
|
|
44
|
+
pointerInside: false,
|
|
45
|
+
remaining: null,
|
|
46
|
+
startedAt: null,
|
|
47
|
+
};
|
|
48
|
+
timerStates.set(toast.id, state);
|
|
49
|
+
}
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function clearDismissTimer(state: TimerState): void {
|
|
54
|
+
if (state.handle === null) return;
|
|
55
|
+
clearTimeout(state.handle);
|
|
56
|
+
state.handle = null;
|
|
57
|
+
state.startedAt = null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function scheduleDismissTimer(toast: ManagedToast, delay: number): void {
|
|
61
|
+
const state = getTimerState(toast);
|
|
62
|
+
if (!ondismiss || delay <= 0 || state.pointerInside || state.focusInside || state.handle !== null) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
state.startedAt = Date.now();
|
|
67
|
+
state.handle = setTimeout(() => {
|
|
68
|
+
state.handle = null;
|
|
69
|
+
state.startedAt = null;
|
|
70
|
+
state.remaining = 0;
|
|
71
|
+
ondismiss?.(toast.id);
|
|
72
|
+
}, delay);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function pauseDismissTimer(toast: ManagedToast): void {
|
|
76
|
+
const state = getTimerState(toast);
|
|
77
|
+
if (state.handle === null || state.startedAt === null) return;
|
|
78
|
+
|
|
79
|
+
const elapsed = Date.now() - state.startedAt;
|
|
80
|
+
state.remaining = Math.max((state.remaining ?? 0) - elapsed, 0);
|
|
81
|
+
clearDismissTimer(state);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function resumeDismissTimer(toast: ManagedToast): void {
|
|
85
|
+
const state = getTimerState(toast);
|
|
86
|
+
if (state.pointerInside || state.focusInside || state.remaining === null || state.remaining <= 0) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
scheduleDismissTimer(toast, state.remaining);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
$effect(() => {
|
|
94
|
+
const visibleIds = new Set(visibleToasts.map((toast) => toast.id));
|
|
95
|
+
|
|
96
|
+
for (const [id, state] of timerStates) {
|
|
97
|
+
if (!visibleIds.has(id)) {
|
|
98
|
+
clearDismissTimer(state);
|
|
99
|
+
timerStates.delete(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const toast of visibleToasts) {
|
|
104
|
+
const state = getTimerState(toast);
|
|
105
|
+
if (state.duration === toast.duration) continue;
|
|
106
|
+
|
|
107
|
+
clearDismissTimer(state);
|
|
108
|
+
state.duration = toast.duration;
|
|
109
|
+
state.focusInside = false;
|
|
110
|
+
state.pointerInside = false;
|
|
111
|
+
state.remaining = toast.duration ?? null;
|
|
112
|
+
|
|
113
|
+
if (toast.duration !== null && toast.duration !== undefined && toast.duration > 0) {
|
|
114
|
+
scheduleDismissTimer(toast, toast.duration);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
</script>
|
|
119
|
+
|
|
120
|
+
<div class={mergedClass}>
|
|
121
|
+
{#each visibleToasts as toast (toast.id)}
|
|
122
|
+
<div
|
|
123
|
+
class="mw-toast-container__item"
|
|
124
|
+
role="presentation"
|
|
125
|
+
onmouseenter={() => {
|
|
126
|
+
const state = getTimerState(toast);
|
|
127
|
+
state.pointerInside = true;
|
|
128
|
+
pauseDismissTimer(toast);
|
|
129
|
+
}}
|
|
130
|
+
onmouseleave={() => {
|
|
131
|
+
const state = getTimerState(toast);
|
|
132
|
+
state.pointerInside = false;
|
|
133
|
+
resumeDismissTimer(toast);
|
|
134
|
+
}}
|
|
135
|
+
onfocusin={() => {
|
|
136
|
+
const state = getTimerState(toast);
|
|
137
|
+
state.focusInside = true;
|
|
138
|
+
pauseDismissTimer(toast);
|
|
139
|
+
}}
|
|
140
|
+
onfocusout={(event) => {
|
|
141
|
+
const related = event.relatedTarget;
|
|
142
|
+
if (related instanceof Node && event.currentTarget.contains(related)) return;
|
|
143
|
+
|
|
144
|
+
const state = getTimerState(toast);
|
|
145
|
+
state.focusInside = false;
|
|
146
|
+
resumeDismissTimer(toast);
|
|
147
|
+
}}
|
|
148
|
+
>
|
|
149
|
+
{#if toast.intent === "success"}
|
|
150
|
+
<SuccessToast
|
|
151
|
+
id={toast.id}
|
|
152
|
+
{...(toast.class ? { class: toast.class } : {})}
|
|
153
|
+
{...(toast.variant ? { variant: toast.variant } : {})}
|
|
154
|
+
{...(toast.ariaLive ? { ariaLive: toast.ariaLive } : {})}
|
|
155
|
+
{...(ondismiss ? { ondismiss: () => ondismiss(toast.id) } : {})}
|
|
156
|
+
{...(toast.dataAttributes ? { dataAttributes: toast.dataAttributes } : {})}
|
|
157
|
+
>
|
|
158
|
+
{#snippet children()}{toast.message}{/snippet}
|
|
159
|
+
</SuccessToast>
|
|
160
|
+
{:else if toast.intent === "error"}
|
|
161
|
+
<ErrorToast
|
|
162
|
+
id={toast.id}
|
|
163
|
+
{...(toast.class ? { class: toast.class } : {})}
|
|
164
|
+
{...(toast.variant ? { variant: toast.variant } : {})}
|
|
165
|
+
{...(toast.ariaLive ? { ariaLive: toast.ariaLive } : {})}
|
|
166
|
+
{...(ondismiss ? { ondismiss: () => ondismiss(toast.id) } : {})}
|
|
167
|
+
{...(toast.dataAttributes ? { dataAttributes: toast.dataAttributes } : {})}
|
|
168
|
+
>
|
|
169
|
+
{#snippet children()}{toast.message}{/snippet}
|
|
170
|
+
</ErrorToast>
|
|
171
|
+
{:else if toast.intent === "warning"}
|
|
172
|
+
<WarningToast
|
|
173
|
+
id={toast.id}
|
|
174
|
+
{...(toast.class ? { class: toast.class } : {})}
|
|
175
|
+
{...(toast.variant ? { variant: toast.variant } : {})}
|
|
176
|
+
{...(toast.ariaLive ? { ariaLive: toast.ariaLive } : {})}
|
|
177
|
+
{...(ondismiss ? { ondismiss: () => ondismiss(toast.id) } : {})}
|
|
178
|
+
{...(toast.dataAttributes ? { dataAttributes: toast.dataAttributes } : {})}
|
|
179
|
+
>
|
|
180
|
+
{#snippet children()}{toast.message}{/snippet}
|
|
181
|
+
</WarningToast>
|
|
182
|
+
{:else if toast.intent === "info"}
|
|
183
|
+
<InfoToast
|
|
184
|
+
id={toast.id}
|
|
185
|
+
{...(toast.class ? { class: toast.class } : {})}
|
|
186
|
+
{...(toast.variant ? { variant: toast.variant } : {})}
|
|
187
|
+
{...(toast.ariaLive ? { ariaLive: toast.ariaLive } : {})}
|
|
188
|
+
{...(ondismiss ? { ondismiss: () => ondismiss(toast.id) } : {})}
|
|
189
|
+
{...(toast.dataAttributes ? { dataAttributes: toast.dataAttributes } : {})}
|
|
190
|
+
>
|
|
191
|
+
{#snippet children()}{toast.message}{/snippet}
|
|
192
|
+
</InfoToast>
|
|
193
|
+
{:else}
|
|
194
|
+
<Toast
|
|
195
|
+
id={toast.id}
|
|
196
|
+
{...(toast.class ? { class: toast.class } : {})}
|
|
197
|
+
{...(toast.variant ? { variant: toast.variant } : {})}
|
|
198
|
+
{...(toast.ariaLive ? { ariaLive: toast.ariaLive } : {})}
|
|
199
|
+
{...(ondismiss ? { ondismiss: () => ondismiss(toast.id) } : {})}
|
|
200
|
+
{...(toast.dataAttributes ? {
|
|
201
|
+
dataAttributes: {
|
|
202
|
+
...toast.dataAttributes,
|
|
203
|
+
...(toast.intent ? { "data-intent": toast.intent } : {}),
|
|
204
|
+
},
|
|
205
|
+
} : (toast.intent ? { dataAttributes: { "data-intent": toast.intent } } : {}))}
|
|
206
|
+
>
|
|
207
|
+
{#snippet children()}{toast.message}{/snippet}
|
|
208
|
+
</Toast>
|
|
209
|
+
{/if}
|
|
210
|
+
</div>
|
|
211
|
+
{/each}
|
|
212
|
+
</div>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { getContext, setContext } from "svelte";
|
|
3
|
+
import type { ToastController } from "./types.js";
|
|
4
|
+
|
|
5
|
+
const TOAST_CONTEXT_KEY = Symbol("marwes-toast");
|
|
6
|
+
|
|
7
|
+
export function setToastContext(controller: ToastController): void {
|
|
8
|
+
setContext(TOAST_CONTEXT_KEY, controller);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function useToast(): ToastController {
|
|
12
|
+
const ctx = getContext<ToastController | undefined>(TOAST_CONTEXT_KEY);
|
|
13
|
+
if (!ctx) {
|
|
14
|
+
throw new Error("ToastProvider is missing. Wrap your app in <ToastProvider />.");
|
|
15
|
+
}
|
|
16
|
+
return ctx;
|
|
17
|
+
}
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<script lang="ts">
|
|
21
|
+
import ToastContainer from "./ToastContainer.svelte";
|
|
22
|
+
import type { ManagedToast, ShowToastOptions, ToastProviderProps } from "./types.js";
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
children,
|
|
26
|
+
placement,
|
|
27
|
+
maxVisible,
|
|
28
|
+
defaultDuration,
|
|
29
|
+
class: className,
|
|
30
|
+
}: ToastProviderProps = $props();
|
|
31
|
+
|
|
32
|
+
let toasts = $state<ManagedToast[]>([]);
|
|
33
|
+
let nextId = $state(0);
|
|
34
|
+
|
|
35
|
+
function show(options: ShowToastOptions): string {
|
|
36
|
+
nextId += 1;
|
|
37
|
+
const id = `mw-toast-${nextId}`;
|
|
38
|
+
const duration = options.duration === undefined
|
|
39
|
+
? (defaultDuration === undefined ? 4000 : defaultDuration)
|
|
40
|
+
: options.duration;
|
|
41
|
+
|
|
42
|
+
toasts = [...toasts, { ...options, id, duration }];
|
|
43
|
+
|
|
44
|
+
return id;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function dismiss(id: string): void {
|
|
48
|
+
const toast = toasts.find((t) => t.id === id);
|
|
49
|
+
toast?.ondismiss?.();
|
|
50
|
+
toasts = toasts.filter((t) => t.id !== id);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function clear(): void {
|
|
54
|
+
for (const toast of toasts) {
|
|
55
|
+
toast.ondismiss?.();
|
|
56
|
+
}
|
|
57
|
+
toasts = [];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const controller: ToastController = { show, dismiss, clear };
|
|
61
|
+
setToastContext(controller);
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
{@render children?.()}
|
|
65
|
+
<ToastContainer
|
|
66
|
+
{toasts}
|
|
67
|
+
ondismiss={dismiss}
|
|
68
|
+
{...(placement ? { placement } : {})}
|
|
69
|
+
{...(maxVisible !== undefined ? { maxVisible } : {})}
|
|
70
|
+
{...(className ? { class: className } : {})}
|
|
71
|
+
/>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToastController } from "./types.js";
|
|
2
|
+
export declare function setToastContext(controller: ToastController): void;
|
|
3
|
+
export declare function useToast(): ToastController;
|
|
4
|
+
import type { ToastProviderProps } from "./types.js";
|
|
5
|
+
declare const ToastProvider: import("svelte").Component<ToastProviderProps, {}, "">;
|
|
6
|
+
type ToastProvider = ReturnType<typeof ToastProvider>;
|
|
7
|
+
export default ToastProvider;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconName, createPurposeSemanticAttributes } from "@marwes-ui/core";
|
|
3
|
+
import Icon from "../icon/Icon.svelte";
|
|
4
|
+
import Toast from "./Toast.svelte";
|
|
5
|
+
import type { ToastProps } from "./types.js";
|
|
6
|
+
|
|
7
|
+
let { dataAttributes, variant, ariaLive, icon, ...props }: ToastProps = $props();
|
|
8
|
+
const hasCustomIcon = $derived(icon !== undefined);
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Toast
|
|
12
|
+
{...props}
|
|
13
|
+
variant={variant ?? "outline"}
|
|
14
|
+
ariaLive={ariaLive ?? "polite"}
|
|
15
|
+
dataAttributes={{ ...dataAttributes, ...createPurposeSemanticAttributes("warning-toast") }}
|
|
16
|
+
>
|
|
17
|
+
{#snippet icon()}
|
|
18
|
+
{#if hasCustomIcon}
|
|
19
|
+
{@render icon?.()}
|
|
20
|
+
{:else}
|
|
21
|
+
<Icon name={IconName.AlertTriangle} decorative />
|
|
22
|
+
{/if}
|
|
23
|
+
{/snippet}
|
|
24
|
+
</Toast>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as Toast } from "./Toast.svelte";
|
|
2
|
+
export { default as ToastContainer } from "./ToastContainer.svelte";
|
|
3
|
+
export { default as ToastProvider } from "./ToastProvider.svelte";
|
|
4
|
+
export { useToast } from "./ToastProvider.svelte";
|
|
5
|
+
export { default as SuccessToast } from "./SuccessToast.svelte";
|
|
6
|
+
export { default as ErrorToast } from "./ErrorToast.svelte";
|
|
7
|
+
export { default as WarningToast } from "./WarningToast.svelte";
|
|
8
|
+
export { default as InfoToast } from "./InfoToast.svelte";
|
|
9
|
+
export type { ManagedToast, ShowToastOptions, ToastContainerProps, ToastController, ToastProps, ToastProviderProps, SuccessToastProps, ErrorToastProps, WarningToastProps, InfoToastProps, } from "./types.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as Toast } from "./Toast.svelte";
|
|
2
|
+
export { default as ToastContainer } from "./ToastContainer.svelte";
|
|
3
|
+
export { default as ToastProvider } from "./ToastProvider.svelte";
|
|
4
|
+
export { useToast } from "./ToastProvider.svelte";
|
|
5
|
+
export { default as SuccessToast } from "./SuccessToast.svelte";
|
|
6
|
+
export { default as ErrorToast } from "./ErrorToast.svelte";
|
|
7
|
+
export { default as WarningToast } from "./WarningToast.svelte";
|
|
8
|
+
export { default as InfoToast } from "./InfoToast.svelte";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ToastIntent, ToastOptions, ToastPlacement, ToastVariant } from "@marwes-ui/core";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
export interface ToastProps extends ToastOptions {
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
icon?: Snippet;
|
|
6
|
+
action?: Snippet;
|
|
7
|
+
ondismiss?: () => void;
|
|
8
|
+
class?: string;
|
|
9
|
+
id?: string;
|
|
10
|
+
dataAttributes?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
export interface ManagedToast {
|
|
13
|
+
id: string;
|
|
14
|
+
message: string;
|
|
15
|
+
icon?: Snippet;
|
|
16
|
+
action?: Snippet;
|
|
17
|
+
ondismiss?: () => void;
|
|
18
|
+
class?: string;
|
|
19
|
+
variant?: ToastVariant;
|
|
20
|
+
ariaLive?: "polite" | "assertive";
|
|
21
|
+
intent?: ToastIntent;
|
|
22
|
+
duration?: number | null;
|
|
23
|
+
dataAttributes?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export type ShowToastOptions = Omit<ManagedToast, "id">;
|
|
26
|
+
export interface ToastContainerProps {
|
|
27
|
+
toasts: ManagedToast[];
|
|
28
|
+
placement?: ToastPlacement;
|
|
29
|
+
maxVisible?: number;
|
|
30
|
+
class?: string;
|
|
31
|
+
ondismiss?: (id: string) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface ToastProviderProps {
|
|
34
|
+
children?: Snippet;
|
|
35
|
+
placement?: ToastPlacement;
|
|
36
|
+
maxVisible?: number;
|
|
37
|
+
defaultDuration?: number | null;
|
|
38
|
+
class?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ToastController {
|
|
41
|
+
show: (toast: ShowToastOptions) => string;
|
|
42
|
+
dismiss: (id: string) => void;
|
|
43
|
+
clear: () => void;
|
|
44
|
+
}
|
|
45
|
+
export type SuccessToastProps = ToastProps;
|
|
46
|
+
export type ErrorToastProps = ToastProps;
|
|
47
|
+
export type WarningToastProps = ToastProps;
|
|
48
|
+
export type InfoToastProps = ToastProps;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Tooltip — Parity Findings
|
|
2
|
+
|
|
3
|
+
## Svelte vs React/Vue
|
|
4
|
+
|
|
5
|
+
### Aligned ✅
|
|
6
|
+
- `Tooltip` atom with `createTooltipRecipe`
|
|
7
|
+
- `role="tooltip"`, CSS vars for positioning
|
|
8
|
+
- `TooltipGroup` molecule with icon trigger, hover/focus reveal
|
|
9
|
+
- Controlled (`open`) and uncontrolled (`defaultOpen`) modes
|
|
10
|
+
- `onopenchange` callback
|
|
11
|
+
- Dismiss on pointer leave, focus leave, and Escape
|
|
12
|
+
- Exit animation delay (160ms) before unmounting
|
|
13
|
+
- Default icon: `IconName.HelpCircle`, swappable via `icon` prop
|
|
14
|
+
- `triggerLabel` for accessible trigger button name
|
|
15
|
+
- `aria-describedby` wired from trigger to tooltip when open
|
|
16
|
+
|
|
17
|
+
### Svelte-specific
|
|
18
|
+
- `content` prop accepts `Snippet | string` (React uses `ReactNode`)
|
|
19
|
+
- Uses `$props.id()` for stable unique IDs
|
|
20
|
+
|
|
21
|
+
### Notes
|
|
22
|
+
- Tooltip is for non-interactive contextual help only. For interactive content, use a popover or dialog pattern.
|