luna-plus 0.0.5
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/README.md +242 -0
- package/dist/Affix/Affix.svelte +97 -0
- package/dist/Affix/Affix.svelte.d.ts +14 -0
- package/dist/Affix/index.d.ts +4 -0
- package/dist/Affix/index.js +3 -0
- package/dist/Affix/types.d.ts +11 -0
- package/dist/Affix/types.js +1 -0
- package/dist/Alert/Alert.svelte +97 -0
- package/dist/Alert/Alert.svelte.d.ts +16 -0
- package/dist/Alert/index.d.ts +4 -0
- package/dist/Alert/index.js +3 -0
- package/dist/Alert/types.d.ts +23 -0
- package/dist/Alert/types.js +1 -0
- package/dist/Autocomplete/Autocomplete.svelte +163 -0
- package/dist/Autocomplete/Autocomplete.svelte.d.ts +20 -0
- package/dist/Autocomplete/index.d.ts +3 -0
- package/dist/Autocomplete/index.js +3 -0
- package/dist/Avatar/Avatar.svelte +97 -0
- package/dist/Avatar/Avatar.svelte.d.ts +14 -0
- package/dist/Avatar/index.d.ts +4 -0
- package/dist/Avatar/index.js +3 -0
- package/dist/Avatar/types.d.ts +26 -0
- package/dist/Avatar/types.js +1 -0
- package/dist/Backtop/Backtop.svelte +60 -0
- package/dist/Backtop/Backtop.svelte.d.ts +13 -0
- package/dist/Backtop/index.d.ts +4 -0
- package/dist/Backtop/index.js +3 -0
- package/dist/Backtop/types.d.ts +18 -0
- package/dist/Backtop/types.js +1 -0
- package/dist/Badge/Badge.svelte +68 -0
- package/dist/Badge/Badge.svelte.d.ts +13 -0
- package/dist/Badge/index.d.ts +4 -0
- package/dist/Badge/index.js +3 -0
- package/dist/Badge/types.d.ts +20 -0
- package/dist/Badge/types.js +1 -0
- package/dist/Breadcrumb/Breadcrumb.svelte +66 -0
- package/dist/Breadcrumb/Breadcrumb.svelte.d.ts +6 -0
- package/dist/Breadcrumb/BreadcrumbContext.d.ts +4 -0
- package/dist/Breadcrumb/BreadcrumbContext.js +1 -0
- package/dist/Breadcrumb/BreadcrumbItem.svelte +56 -0
- package/dist/Breadcrumb/BreadcrumbItem.svelte.d.ts +12 -0
- package/dist/Breadcrumb/index.d.ts +4 -0
- package/dist/Breadcrumb/index.js +3 -0
- package/dist/Breadcrumb/types.d.ts +10 -0
- package/dist/Breadcrumb/types.js +1 -0
- package/dist/Button/Button.svelte +61 -0
- package/dist/Button/Button.svelte.d.ts +4 -0
- package/dist/Button/index.d.ts +4 -0
- package/dist/Button/index.js +3 -0
- package/dist/Button/types.d.ts +42 -0
- package/dist/Button/types.js +1 -0
- package/dist/Calendar/Calendar.svelte +115 -0
- package/dist/Calendar/Calendar.svelte.d.ts +7 -0
- package/dist/Calendar/index.d.ts +3 -0
- package/dist/Calendar/index.js +3 -0
- package/dist/Card/Card.svelte +59 -0
- package/dist/Card/Card.svelte.d.ts +4 -0
- package/dist/Card/index.d.ts +4 -0
- package/dist/Card/index.js +4 -0
- package/dist/Card/types.d.ts +26 -0
- package/dist/Card/types.js +1 -0
- package/dist/Carousel/Carousel.svelte +206 -0
- package/dist/Carousel/Carousel.svelte.d.ts +19 -0
- package/dist/Carousel/CarouselContext.d.ts +6 -0
- package/dist/Carousel/CarouselContext.js +1 -0
- package/dist/Carousel/CarouselItem.svelte +42 -0
- package/dist/Carousel/CarouselItem.svelte.d.ts +11 -0
- package/dist/Carousel/index.d.ts +5 -0
- package/dist/Carousel/index.js +4 -0
- package/dist/Carousel/types.d.ts +43 -0
- package/dist/Carousel/types.js +1 -0
- package/dist/Cascader/Cascader.svelte +219 -0
- package/dist/Cascader/Cascader.svelte.d.ts +4 -0
- package/dist/Cascader/index.d.ts +4 -0
- package/dist/Cascader/index.js +3 -0
- package/dist/Cascader/types.d.ts +19 -0
- package/dist/Cascader/types.js +1 -0
- package/dist/Checkbox/Checkbox.svelte +55 -0
- package/dist/Checkbox/Checkbox.svelte.d.ts +15 -0
- package/dist/Checkbox/CheckboxGroup.svelte +43 -0
- package/dist/Checkbox/CheckboxGroup.svelte.d.ts +12 -0
- package/dist/Checkbox/index.d.ts +4 -0
- package/dist/Checkbox/index.js +3 -0
- package/dist/Checkbox/types.d.ts +24 -0
- package/dist/Checkbox/types.js +1 -0
- package/dist/Collapse/Collapse.svelte +62 -0
- package/dist/Collapse/Collapse.svelte.d.ts +11 -0
- package/dist/Collapse/CollapseContext.d.ts +6 -0
- package/dist/Collapse/CollapseContext.js +1 -0
- package/dist/Collapse/CollapseItem.svelte +175 -0
- package/dist/Collapse/CollapseItem.svelte.d.ts +11 -0
- package/dist/Collapse/index.d.ts +5 -0
- package/dist/Collapse/index.js +4 -0
- package/dist/Collapse/types.d.ts +27 -0
- package/dist/Collapse/types.js +1 -0
- package/dist/ColorPicker/ColorPicker.svelte +157 -0
- package/dist/ColorPicker/ColorPicker.svelte.d.ts +12 -0
- package/dist/ColorPicker/index.d.ts +4 -0
- package/dist/ColorPicker/index.js +3 -0
- package/dist/ColorPicker/types.d.ts +17 -0
- package/dist/ColorPicker/types.js +1 -0
- package/dist/Container/Aside.svelte +20 -0
- package/dist/Container/Aside.svelte.d.ts +9 -0
- package/dist/Container/Container.svelte +19 -0
- package/dist/Container/Container.svelte.d.ts +9 -0
- package/dist/Container/Footer.svelte +20 -0
- package/dist/Container/Footer.svelte.d.ts +9 -0
- package/dist/Container/Header.svelte +20 -0
- package/dist/Container/Header.svelte.d.ts +9 -0
- package/dist/Container/Main.svelte +18 -0
- package/dist/Container/Main.svelte.d.ts +8 -0
- package/dist/Container/index.d.ts +14 -0
- package/dist/Container/index.js +13 -0
- package/dist/Container/types.d.ts +46 -0
- package/dist/Container/types.js +1 -0
- package/dist/DatePicker/DatePicker.svelte +278 -0
- package/dist/DatePicker/DatePicker.svelte.d.ts +17 -0
- package/dist/DatePicker/index.d.ts +4 -0
- package/dist/DatePicker/index.js +3 -0
- package/dist/DatePicker/types.d.ts +29 -0
- package/dist/DatePicker/types.js +1 -0
- package/dist/DateTimePicker/DateTimePicker.svelte +500 -0
- package/dist/DateTimePicker/DateTimePicker.svelte.d.ts +4 -0
- package/dist/DateTimePicker/index.d.ts +4 -0
- package/dist/DateTimePicker/index.js +3 -0
- package/dist/DateTimePicker/types.d.ts +21 -0
- package/dist/DateTimePicker/types.js +1 -0
- package/dist/Descriptions/Descriptions.svelte +69 -0
- package/dist/Descriptions/Descriptions.svelte.d.ts +15 -0
- package/dist/Descriptions/DescriptionsContext.d.ts +8 -0
- package/dist/Descriptions/DescriptionsContext.js +1 -0
- package/dist/Descriptions/DescriptionsItem.svelte +59 -0
- package/dist/Descriptions/DescriptionsItem.svelte.d.ts +13 -0
- package/dist/Descriptions/index.d.ts +5 -0
- package/dist/Descriptions/index.js +4 -0
- package/dist/Descriptions/types.d.ts +41 -0
- package/dist/Descriptions/types.js +1 -0
- package/dist/Dialog/Dialog.svelte +151 -0
- package/dist/Dialog/Dialog.svelte.d.ts +20 -0
- package/dist/Dialog/index.d.ts +4 -0
- package/dist/Dialog/index.js +3 -0
- package/dist/Dialog/types.d.ts +32 -0
- package/dist/Dialog/types.js +1 -0
- package/dist/Divider/Divider.svelte +47 -0
- package/dist/Divider/Divider.svelte.d.ts +11 -0
- package/dist/Divider/index.d.ts +4 -0
- package/dist/Divider/index.js +3 -0
- package/dist/Divider/types.d.ts +20 -0
- package/dist/Divider/types.js +1 -0
- package/dist/Drawer/Drawer.svelte +141 -0
- package/dist/Drawer/Drawer.svelte.d.ts +26 -0
- package/dist/Drawer/index.d.ts +4 -0
- package/dist/Drawer/index.js +3 -0
- package/dist/Drawer/types.d.ts +40 -0
- package/dist/Drawer/types.js +1 -0
- package/dist/Dropdown/Dropdown.svelte +222 -0
- package/dist/Dropdown/Dropdown.svelte.d.ts +4 -0
- package/dist/Dropdown/DropdownContext.d.ts +7 -0
- package/dist/Dropdown/DropdownContext.js +8 -0
- package/dist/Dropdown/DropdownItem.svelte +51 -0
- package/dist/Dropdown/DropdownItem.svelte.d.ts +4 -0
- package/dist/Dropdown/DropdownMenu.svelte +13 -0
- package/dist/Dropdown/DropdownMenu.svelte.d.ts +4 -0
- package/dist/Dropdown/index.d.ts +5 -0
- package/dist/Dropdown/index.js +5 -0
- package/dist/Dropdown/types.d.ts +68 -0
- package/dist/Dropdown/types.js +1 -0
- package/dist/Empty/Empty.svelte +40 -0
- package/dist/Empty/Empty.svelte.d.ts +11 -0
- package/dist/Empty/index.d.ts +4 -0
- package/dist/Empty/index.js +3 -0
- package/dist/Empty/types.d.ts +14 -0
- package/dist/Empty/types.js +1 -0
- package/dist/Form/Form.svelte +88 -0
- package/dist/Form/Form.svelte.d.ts +15 -0
- package/dist/Form/FormContext.d.ts +19 -0
- package/dist/Form/FormContext.js +1 -0
- package/dist/Form/FormInternals.d.ts +40 -0
- package/dist/Form/FormInternals.js +152 -0
- package/dist/Form/FormItem.svelte +191 -0
- package/dist/Form/FormItem.svelte.d.ts +8 -0
- package/dist/Form/index.d.ts +3 -0
- package/dist/Form/index.js +2 -0
- package/dist/Form/types.d.ts +61 -0
- package/dist/Form/types.js +1 -0
- package/dist/Icon/Icon.svelte +59 -0
- package/dist/Icon/Icon.svelte.d.ts +11 -0
- package/dist/Icon/index.d.ts +5 -0
- package/dist/Icon/index.js +15 -0
- package/dist/Icon/types.d.ts +14 -0
- package/dist/Icon/types.js +1 -0
- package/dist/Image/Image.svelte +134 -0
- package/dist/Image/Image.svelte.d.ts +20 -0
- package/dist/Image/index.d.ts +4 -0
- package/dist/Image/index.js +3 -0
- package/dist/Image/types.d.ts +32 -0
- package/dist/Image/types.js +1 -0
- package/dist/Input/Input.svelte +177 -0
- package/dist/Input/Input.svelte.d.ts +4 -0
- package/dist/Input/index.d.ts +4 -0
- package/dist/Input/index.js +3 -0
- package/dist/Input/types.d.ts +72 -0
- package/dist/Input/types.js +1 -0
- package/dist/InputNumber/InputNumber.svelte +110 -0
- package/dist/InputNumber/InputNumber.svelte.d.ts +18 -0
- package/dist/InputNumber/index.d.ts +4 -0
- package/dist/InputNumber/index.js +3 -0
- package/dist/InputNumber/types.d.ts +29 -0
- package/dist/InputNumber/types.js +1 -0
- package/dist/InputTag/InputTag.svelte +160 -0
- package/dist/InputTag/InputTag.svelte.d.ts +4 -0
- package/dist/InputTag/index.d.ts +4 -0
- package/dist/InputTag/index.js +3 -0
- package/dist/InputTag/types.d.ts +21 -0
- package/dist/InputTag/types.js +1 -0
- package/dist/Link/Link.svelte +38 -0
- package/dist/Link/Link.svelte.d.ts +15 -0
- package/dist/Link/index.d.ts +4 -0
- package/dist/Link/index.js +3 -0
- package/dist/Link/types.d.ts +26 -0
- package/dist/Link/types.js +1 -0
- package/dist/Loading/Loading.svelte +56 -0
- package/dist/Loading/Loading.svelte.d.ts +14 -0
- package/dist/Loading/index.d.ts +4 -0
- package/dist/Loading/index.js +3 -0
- package/dist/Loading/types.d.ts +20 -0
- package/dist/Loading/types.js +1 -0
- package/dist/Menu/Menu.svelte +301 -0
- package/dist/Menu/Menu.svelte.d.ts +4 -0
- package/dist/Menu/types.d.ts +35 -0
- package/dist/Menu/types.js +1 -0
- package/dist/Message/Message.svelte +60 -0
- package/dist/Message/Message.svelte.d.ts +13 -0
- package/dist/Message/MessageQueue.svelte +65 -0
- package/dist/Message/MessageQueue.svelte.d.ts +10 -0
- package/dist/Message/index.d.ts +4 -0
- package/dist/Message/index.js +3 -0
- package/dist/Message/message.d.ts +19 -0
- package/dist/Message/message.js +95 -0
- package/dist/Message/types.d.ts +28 -0
- package/dist/Message/types.js +1 -0
- package/dist/MessageBox/MessageBox.svelte +133 -0
- package/dist/MessageBox/MessageBox.svelte.d.ts +7 -0
- package/dist/MessageBox/index.d.ts +4 -0
- package/dist/MessageBox/index.js +3 -0
- package/dist/MessageBox/messageBox.d.ts +13 -0
- package/dist/MessageBox/messageBox.js +32 -0
- package/dist/MessageBox/types.d.ts +23 -0
- package/dist/MessageBox/types.js +1 -0
- package/dist/Notification/Notification.svelte +142 -0
- package/dist/Notification/Notification.svelte.d.ts +7 -0
- package/dist/Notification/index.d.ts +4 -0
- package/dist/Notification/index.js +3 -0
- package/dist/Notification/notification.d.ts +11 -0
- package/dist/Notification/notification.js +19 -0
- package/dist/Notification/types.d.ts +26 -0
- package/dist/Notification/types.js +1 -0
- package/dist/Pagination/Pagination.svelte +413 -0
- package/dist/Pagination/Pagination.svelte.d.ts +21 -0
- package/dist/Pagination/index.d.ts +4 -0
- package/dist/Pagination/index.js +3 -0
- package/dist/Pagination/types.d.ts +32 -0
- package/dist/Pagination/types.js +1 -0
- package/dist/PinInput/PinInput.svelte +175 -0
- package/dist/PinInput/PinInput.svelte.d.ts +4 -0
- package/dist/PinInput/index.d.ts +4 -0
- package/dist/PinInput/index.js +3 -0
- package/dist/PinInput/types.d.ts +31 -0
- package/dist/PinInput/types.js +1 -0
- package/dist/Popconfirm/Popconfirm.svelte +293 -0
- package/dist/Popconfirm/Popconfirm.svelte.d.ts +4 -0
- package/dist/Popconfirm/index.d.ts +2 -0
- package/dist/Popconfirm/index.js +1 -0
- package/dist/Popconfirm/types.d.ts +53 -0
- package/dist/Popconfirm/types.js +1 -0
- package/dist/Popover/Popover.svelte +245 -0
- package/dist/Popover/Popover.svelte.d.ts +7 -0
- package/dist/Popover/index.d.ts +4 -0
- package/dist/Popover/index.js +3 -0
- package/dist/Popover/types.d.ts +24 -0
- package/dist/Popover/types.js +1 -0
- package/dist/Progress/Progress.svelte +33 -0
- package/dist/Progress/Progress.svelte.d.ts +11 -0
- package/dist/Progress/index.d.ts +4 -0
- package/dist/Progress/index.js +3 -0
- package/dist/Progress/types.d.ts +17 -0
- package/dist/Progress/types.js +1 -0
- package/dist/Radio/Radio.svelte +66 -0
- package/dist/Radio/Radio.svelte.d.ts +15 -0
- package/dist/Radio/RadioGroup.svelte +40 -0
- package/dist/Radio/RadioGroup.svelte.d.ts +13 -0
- package/dist/Radio/index.d.ts +4 -0
- package/dist/Radio/index.js +3 -0
- package/dist/Radio/types.d.ts +24 -0
- package/dist/Radio/types.js +1 -0
- package/dist/Rating/Rating.svelte +226 -0
- package/dist/Rating/Rating.svelte.d.ts +27 -0
- package/dist/Rating/index.d.ts +4 -0
- package/dist/Rating/index.js +3 -0
- package/dist/Rating/types.d.ts +43 -0
- package/dist/Rating/types.js +1 -0
- package/dist/Result/Result.svelte +58 -0
- package/dist/Result/Result.svelte.d.ts +14 -0
- package/dist/Result/index.d.ts +4 -0
- package/dist/Result/index.js +3 -0
- package/dist/Result/types.d.ts +20 -0
- package/dist/Result/types.js +1 -0
- package/dist/Segmented/Segmented.svelte +49 -0
- package/dist/Segmented/Segmented.svelte.d.ts +12 -0
- package/dist/Segmented/index.d.ts +4 -0
- package/dist/Segmented/index.js +3 -0
- package/dist/Segmented/types.d.ts +29 -0
- package/dist/Segmented/types.js +1 -0
- package/dist/Select/Option.svelte +30 -0
- package/dist/Select/Option.svelte.d.ts +9 -0
- package/dist/Select/OptionGroup.svelte +33 -0
- package/dist/Select/OptionGroup.svelte.d.ts +10 -0
- package/dist/Select/Select.svelte +245 -0
- package/dist/Select/Select.svelte.d.ts +4 -0
- package/dist/Select/index.d.ts +4 -0
- package/dist/Select/index.js +3 -0
- package/dist/Select/types.d.ts +41 -0
- package/dist/Select/types.js +1 -0
- package/dist/Skeleton/Skeleton.svelte +44 -0
- package/dist/Skeleton/Skeleton.svelte.d.ts +13 -0
- package/dist/Skeleton/SkeletonItem.svelte +14 -0
- package/dist/Skeleton/SkeletonItem.svelte.d.ts +8 -0
- package/dist/Skeleton/index.d.ts +5 -0
- package/dist/Skeleton/index.js +4 -0
- package/dist/Skeleton/types.d.ts +27 -0
- package/dist/Skeleton/types.js +1 -0
- package/dist/Slider/Slider.svelte +342 -0
- package/dist/Slider/Slider.svelte.d.ts +18 -0
- package/dist/Slider/index.d.ts +4 -0
- package/dist/Slider/index.js +3 -0
- package/dist/Slider/types.d.ts +28 -0
- package/dist/Slider/types.js +1 -0
- package/dist/Space/Space.svelte +89 -0
- package/dist/Space/Space.svelte.d.ts +17 -0
- package/dist/Space/index.d.ts +4 -0
- package/dist/Space/index.js +3 -0
- package/dist/Space/types.d.ts +32 -0
- package/dist/Space/types.js +1 -0
- package/dist/Statistic/Countdown.svelte +108 -0
- package/dist/Statistic/Countdown.svelte.d.ts +14 -0
- package/dist/Statistic/Statistic.svelte +63 -0
- package/dist/Statistic/Statistic.svelte.d.ts +15 -0
- package/dist/Statistic/index.d.ts +5 -0
- package/dist/Statistic/index.js +4 -0
- package/dist/Statistic/types.d.ts +41 -0
- package/dist/Statistic/types.js +1 -0
- package/dist/Steps/Step.svelte +58 -0
- package/dist/Steps/Step.svelte.d.ts +14 -0
- package/dist/Steps/Steps.svelte +60 -0
- package/dist/Steps/Steps.svelte.d.ts +15 -0
- package/dist/Steps/StepsContext.d.ts +12 -0
- package/dist/Steps/StepsContext.js +1 -0
- package/dist/Steps/index.d.ts +5 -0
- package/dist/Steps/index.js +4 -0
- package/dist/Steps/types.d.ts +41 -0
- package/dist/Steps/types.js +1 -0
- package/dist/Switch/Switch.svelte +122 -0
- package/dist/Switch/Switch.svelte.d.ts +22 -0
- package/dist/Switch/index.d.ts +4 -0
- package/dist/Switch/index.js +3 -0
- package/dist/Switch/types.d.ts +37 -0
- package/dist/Switch/types.js +1 -0
- package/dist/Table/Table.svelte +700 -0
- package/dist/Table/Table.svelte.d.ts +11 -0
- package/dist/Table/index.d.ts +4 -0
- package/dist/Table/index.js +3 -0
- package/dist/Table/types.d.ts +180 -0
- package/dist/Table/types.js +1 -0
- package/dist/Tabs/TabPane.svelte +37 -0
- package/dist/Tabs/TabPane.svelte.d.ts +13 -0
- package/dist/Tabs/Tabs.svelte +251 -0
- package/dist/Tabs/Tabs.svelte.d.ts +13 -0
- package/dist/Tabs/TabsContext.d.ts +11 -0
- package/dist/Tabs/TabsContext.js +1 -0
- package/dist/Tabs/index.d.ts +3 -0
- package/dist/Tabs/index.js +2 -0
- package/dist/Tabs/types.d.ts +39 -0
- package/dist/Tabs/types.js +1 -0
- package/dist/Tag/Tag.svelte +39 -0
- package/dist/Tag/Tag.svelte.d.ts +13 -0
- package/dist/Tag/index.d.ts +4 -0
- package/dist/Tag/index.js +3 -0
- package/dist/Tag/types.d.ts +22 -0
- package/dist/Tag/types.js +1 -0
- package/dist/Textarea/Textarea.svelte +76 -0
- package/dist/Textarea/Textarea.svelte.d.ts +16 -0
- package/dist/Textarea/index.d.ts +4 -0
- package/dist/Textarea/index.js +3 -0
- package/dist/Textarea/types.d.ts +25 -0
- package/dist/Textarea/types.js +1 -0
- package/dist/TimePicker/TimePicker.svelte +364 -0
- package/dist/TimePicker/TimePicker.svelte.d.ts +14 -0
- package/dist/TimePicker/index.d.ts +3 -0
- package/dist/TimePicker/index.js +3 -0
- package/dist/TimePicker/types.d.ts +21 -0
- package/dist/TimePicker/types.js +1 -0
- package/dist/Timeline/Timeline.svelte +18 -0
- package/dist/Timeline/Timeline.svelte.d.ts +8 -0
- package/dist/Timeline/TimelineItem.svelte +67 -0
- package/dist/Timeline/TimelineItem.svelte.d.ts +18 -0
- package/dist/Timeline/index.d.ts +5 -0
- package/dist/Timeline/index.js +4 -0
- package/dist/Timeline/types.d.ts +39 -0
- package/dist/Timeline/types.js +1 -0
- package/dist/Tooltip/OverflowTooltip.svelte +81 -0
- package/dist/Tooltip/OverflowTooltip.svelte.d.ts +4 -0
- package/dist/Tooltip/Tooltip.svelte +77 -0
- package/dist/Tooltip/Tooltip.svelte.d.ts +16 -0
- package/dist/Tooltip/index.d.ts +6 -0
- package/dist/Tooltip/index.js +5 -0
- package/dist/Tooltip/types.d.ts +51 -0
- package/dist/Tooltip/types.js +1 -0
- package/dist/Transfer/Transfer.svelte +145 -0
- package/dist/Transfer/Transfer.svelte.d.ts +14 -0
- package/dist/Transfer/index.d.ts +4 -0
- package/dist/Transfer/index.js +3 -0
- package/dist/Transfer/types.d.ts +16 -0
- package/dist/Transfer/types.js +1 -0
- package/dist/Tree/Tree.svelte +148 -0
- package/dist/Tree/Tree.svelte.d.ts +17 -0
- package/dist/Tree/TreeNode.svelte +133 -0
- package/dist/Tree/TreeNode.svelte.d.ts +19 -0
- package/dist/Tree/index.d.ts +4 -0
- package/dist/Tree/index.js +3 -0
- package/dist/Tree/types.d.ts +65 -0
- package/dist/Tree/types.js +1 -0
- package/dist/TreeSelect/TreeSelect.svelte +716 -0
- package/dist/TreeSelect/TreeSelect.svelte.d.ts +4 -0
- package/dist/TreeSelect/index.d.ts +4 -0
- package/dist/TreeSelect/index.js +3 -0
- package/dist/TreeSelect/types.d.ts +98 -0
- package/dist/TreeSelect/types.js +1 -0
- package/dist/Upload/Upload.svelte +396 -0
- package/dist/Upload/Upload.svelte.d.ts +28 -0
- package/dist/Upload/index.d.ts +4 -0
- package/dist/Upload/index.js +3 -0
- package/dist/Upload/types.d.ts +67 -0
- package/dist/Upload/types.js +1 -0
- package/dist/Watermark/Watermark.svelte +174 -0
- package/dist/Watermark/Watermark.svelte.d.ts +20 -0
- package/dist/Watermark/index.d.ts +4 -0
- package/dist/Watermark/index.js +3 -0
- package/dist/Watermark/types.d.ts +32 -0
- package/dist/Watermark/types.js +1 -0
- package/dist/index.d.ts +140 -0
- package/dist/index.js +85 -0
- package/dist/utils/floating.d.ts +28 -0
- package/dist/utils/floating.js +140 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +34 -0
- package/dist/utils/portal.d.ts +9 -0
- package/dist/utils/portal.js +33 -0
- package/package.json +115 -0
- package/styles/index.css +1 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Icon from "../Icon/Icon.svelte";
|
|
3
|
+
import { CheckCircle, AlertTriangle, XCircle, Info, X } from "lucide";
|
|
4
|
+
import { fly } from "svelte/transition";
|
|
5
|
+
import type { IconNode } from "lucide";
|
|
6
|
+
import type { MessageItem, MessageType, CloseMessageFn } from "./types";
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
messages: MessageItem[];
|
|
10
|
+
onClose: CloseMessageFn;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { messages = $bindable([]), onClose }: Props = $props();
|
|
14
|
+
|
|
15
|
+
export const setMessages = (next: MessageItem[]): void => {
|
|
16
|
+
messages = next;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const ICON_MAP: Record<MessageType, IconNode> = {
|
|
20
|
+
success: CheckCircle,
|
|
21
|
+
warning: AlertTriangle,
|
|
22
|
+
error: XCircle,
|
|
23
|
+
info: Info,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const getIcon = (type?: MessageType): IconNode => ICON_MAP[type || "info"];
|
|
27
|
+
|
|
28
|
+
const getOffset = (index: number): number => {
|
|
29
|
+
const baseOffset = messages[0]?.offset ?? 20;
|
|
30
|
+
let offset = baseOffset;
|
|
31
|
+
for (let i = 0; i < index; i++) {
|
|
32
|
+
if (messages[i]?.visible) {
|
|
33
|
+
offset += 60;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return offset;
|
|
37
|
+
};
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
{#each messages as message, index (message.id)}
|
|
41
|
+
{#if message.visible}
|
|
42
|
+
<div
|
|
43
|
+
class="lm-message lm-message--{message.type}"
|
|
44
|
+
class:is-center={message.center}
|
|
45
|
+
class:is-closable={message.showClose}
|
|
46
|
+
style="top: {getOffset(index)}px;"
|
|
47
|
+
transition:fly={{ y: -20, duration: 250, opacity: 0 }}
|
|
48
|
+
>
|
|
49
|
+
<Icon icon={getIcon(message.type)} size={16} class="lm-message__icon" />
|
|
50
|
+
<div class="lm-message__content">
|
|
51
|
+
{message.message}
|
|
52
|
+
</div>
|
|
53
|
+
{#if message.showClose}
|
|
54
|
+
<button
|
|
55
|
+
type="button"
|
|
56
|
+
class="lm-message__close"
|
|
57
|
+
onclick={() => onClose(message.id)}
|
|
58
|
+
aria-label="Close"
|
|
59
|
+
>
|
|
60
|
+
<Icon icon={X} size={14} />
|
|
61
|
+
</button>
|
|
62
|
+
{/if}
|
|
63
|
+
</div>
|
|
64
|
+
{/if}
|
|
65
|
+
{/each}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MessageItem, CloseMessageFn } from "./types";
|
|
2
|
+
interface Props {
|
|
3
|
+
messages: MessageItem[];
|
|
4
|
+
onClose: CloseMessageFn;
|
|
5
|
+
}
|
|
6
|
+
declare const MessageQueue: import("svelte").Component<Props, {
|
|
7
|
+
setMessages: (next: MessageItem[]) => void;
|
|
8
|
+
}, "messages">;
|
|
9
|
+
type MessageQueue = ReturnType<typeof MessageQueue>;
|
|
10
|
+
export default MessageQueue;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MessageOptions, MessageItem, MessageType, CloseMessageFn } from './types';
|
|
2
|
+
/** 显示消息(弹出队列) */
|
|
3
|
+
export type ShowMessageFn = (options: MessageOptions | string) => number;
|
|
4
|
+
export declare const showMessage: ShowMessageFn;
|
|
5
|
+
/** 关闭消息(按 id) */
|
|
6
|
+
export declare const closeMessage: CloseMessageFn;
|
|
7
|
+
/** 关闭所有消息 */
|
|
8
|
+
export declare const closeAllMessages: () => void;
|
|
9
|
+
/** 便捷方法 */
|
|
10
|
+
export declare const message: {
|
|
11
|
+
show: ShowMessageFn;
|
|
12
|
+
close: CloseMessageFn;
|
|
13
|
+
closeAll: () => void;
|
|
14
|
+
success: (msg: string, options?: Omit<MessageOptions, "message" | "type">) => number;
|
|
15
|
+
warning: (msg: string, options?: Omit<MessageOptions, "message" | "type">) => number;
|
|
16
|
+
error: (msg: string, options?: Omit<MessageOptions, "message" | "type">) => number;
|
|
17
|
+
info: (msg: string, options?: Omit<MessageOptions, "message" | "type">) => number;
|
|
18
|
+
};
|
|
19
|
+
export type { MessageOptions, MessageItem, MessageType, CloseMessageFn };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { mount, unmount } from 'svelte';
|
|
2
|
+
import MessageQueue from './MessageQueue.svelte';
|
|
3
|
+
/** 消息队列 */
|
|
4
|
+
let messages = [];
|
|
5
|
+
/** 消息容器 DOM 元素 */
|
|
6
|
+
let host = null;
|
|
7
|
+
/** MessageQueue 组件实例 */
|
|
8
|
+
let instance = null;
|
|
9
|
+
/** 消息 ID 计数器 */
|
|
10
|
+
let idCounter = 0;
|
|
11
|
+
const ensureMounted = () => {
|
|
12
|
+
if (typeof document === 'undefined')
|
|
13
|
+
return;
|
|
14
|
+
if (!host) {
|
|
15
|
+
host = document.createElement('div');
|
|
16
|
+
host.className = 'lm-message-container';
|
|
17
|
+
document.body.appendChild(host);
|
|
18
|
+
}
|
|
19
|
+
if (!instance) {
|
|
20
|
+
instance = mount(MessageQueue, {
|
|
21
|
+
target: host,
|
|
22
|
+
props: {
|
|
23
|
+
messages,
|
|
24
|
+
onClose: removeMessage,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const updateMessages = (next) => {
|
|
30
|
+
messages = next;
|
|
31
|
+
instance?.setMessages?.(messages);
|
|
32
|
+
};
|
|
33
|
+
/** 关闭消息(按 id) */
|
|
34
|
+
const removeMessage = (id) => {
|
|
35
|
+
const index = messages.findIndex((m) => m.id === id);
|
|
36
|
+
if (index < 0)
|
|
37
|
+
return;
|
|
38
|
+
const item = messages[index];
|
|
39
|
+
item.visible = false;
|
|
40
|
+
updateMessages([...messages]);
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
updateMessages(messages.filter((m) => m.id !== id));
|
|
43
|
+
item.onClose?.();
|
|
44
|
+
if (messages.length === 0 && instance && host) {
|
|
45
|
+
unmount(instance);
|
|
46
|
+
document.body.removeChild(host);
|
|
47
|
+
host = null;
|
|
48
|
+
instance = null;
|
|
49
|
+
}
|
|
50
|
+
}, 250);
|
|
51
|
+
};
|
|
52
|
+
const addMessage = (options) => {
|
|
53
|
+
ensureMounted();
|
|
54
|
+
const id = ++idCounter;
|
|
55
|
+
const item = {
|
|
56
|
+
id,
|
|
57
|
+
type: 'info',
|
|
58
|
+
duration: 3000,
|
|
59
|
+
showClose: false,
|
|
60
|
+
center: false,
|
|
61
|
+
offset: 20,
|
|
62
|
+
visible: false,
|
|
63
|
+
...options,
|
|
64
|
+
};
|
|
65
|
+
updateMessages([...messages, item]);
|
|
66
|
+
// Ensure intro transition runs (align with Notification behavior)
|
|
67
|
+
queueMicrotask(() => {
|
|
68
|
+
item.visible = true;
|
|
69
|
+
updateMessages([...messages]);
|
|
70
|
+
});
|
|
71
|
+
if (item.duration && item.duration > 0) {
|
|
72
|
+
setTimeout(() => removeMessage(id), item.duration);
|
|
73
|
+
}
|
|
74
|
+
return id;
|
|
75
|
+
};
|
|
76
|
+
export const showMessage = (options) => {
|
|
77
|
+
const opts = typeof options === 'string' ? { message: options } : options;
|
|
78
|
+
return addMessage(opts);
|
|
79
|
+
};
|
|
80
|
+
/** 关闭消息(按 id) */
|
|
81
|
+
export const closeMessage = removeMessage;
|
|
82
|
+
/** 关闭所有消息 */
|
|
83
|
+
export const closeAllMessages = () => {
|
|
84
|
+
messages.slice().forEach((m) => removeMessage(m.id));
|
|
85
|
+
};
|
|
86
|
+
/** 便捷方法 */
|
|
87
|
+
export const message = {
|
|
88
|
+
show: showMessage,
|
|
89
|
+
close: closeMessage,
|
|
90
|
+
closeAll: closeAllMessages,
|
|
91
|
+
success: (msg, options) => addMessage({ ...options, message: msg, type: 'success' }),
|
|
92
|
+
warning: (msg, options) => addMessage({ ...options, message: msg, type: 'warning' }),
|
|
93
|
+
error: (msg, options) => addMessage({ ...options, message: msg, type: 'error' }),
|
|
94
|
+
info: (msg, options) => addMessage({ ...options, message: msg, type: 'info' }),
|
|
95
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** 消息类型 */
|
|
2
|
+
export type MessageType = 'success' | 'warning' | 'error' | 'info';
|
|
3
|
+
/** 消息配置选项 */
|
|
4
|
+
export interface MessageOptions {
|
|
5
|
+
/** 消息内容 */
|
|
6
|
+
message: string;
|
|
7
|
+
/** 消息类型 */
|
|
8
|
+
type?: MessageType;
|
|
9
|
+
/** 显示时间(毫秒),设为 0 则不会自动关闭 */
|
|
10
|
+
duration?: number;
|
|
11
|
+
/** 是否显示关闭按钮 */
|
|
12
|
+
showClose?: boolean;
|
|
13
|
+
/** 文字是否居中 */
|
|
14
|
+
center?: boolean;
|
|
15
|
+
/** 距离顶部的偏移量 */
|
|
16
|
+
offset?: number;
|
|
17
|
+
/** 关闭时的回调函数 */
|
|
18
|
+
onClose?: () => void;
|
|
19
|
+
}
|
|
20
|
+
/** 消息项(内部使用) */
|
|
21
|
+
export interface MessageItem extends MessageOptions {
|
|
22
|
+
/** 消息唯一标识 */
|
|
23
|
+
id: number;
|
|
24
|
+
/** 是否可见 */
|
|
25
|
+
visible: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** 关闭消息的回调函数类型 */
|
|
28
|
+
export type CloseMessageFn = (id: number) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Dialog from "../Dialog";
|
|
3
|
+
import Icon from "../Icon/Icon.svelte";
|
|
4
|
+
import Button from "../Button/Button.svelte";
|
|
5
|
+
import { portal } from "../utils/portal";
|
|
6
|
+
import { CheckCircle, AlertTriangle, XCircle, Info } from "lucide";
|
|
7
|
+
import type { IconNode } from "lucide";
|
|
8
|
+
import type { MessageBoxOptions, MessageBoxType } from "./types";
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
zIndex?: number;
|
|
12
|
+
showClose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { zIndex = 3000, showClose = true }: Props = $props();
|
|
16
|
+
|
|
17
|
+
let visible = $state(false);
|
|
18
|
+
let options = $state<MessageBoxOptions | null>(null);
|
|
19
|
+
|
|
20
|
+
let clearTimer: ReturnType<typeof setTimeout> | null = null;
|
|
21
|
+
let showSeq = 0;
|
|
22
|
+
let opening = false;
|
|
23
|
+
|
|
24
|
+
const ICON_MAP: Record<MessageBoxType, IconNode> = {
|
|
25
|
+
success: CheckCircle,
|
|
26
|
+
warning: AlertTriangle,
|
|
27
|
+
error: XCircle,
|
|
28
|
+
info: Info,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const getIcon = (type?: MessageBoxType): IconNode => ICON_MAP[type || "info"];
|
|
32
|
+
|
|
33
|
+
const show = (opts: MessageBoxOptions): void => {
|
|
34
|
+
if (clearTimer) {
|
|
35
|
+
clearTimeout(clearTimer);
|
|
36
|
+
clearTimer = null;
|
|
37
|
+
}
|
|
38
|
+
const seq = ++showSeq;
|
|
39
|
+
options = opts;
|
|
40
|
+
// Mount Dialog first (visible=false), then toggle to true to trigger intro transition.
|
|
41
|
+
opening = true;
|
|
42
|
+
visible = false;
|
|
43
|
+
queueMicrotask(() => {
|
|
44
|
+
if (seq !== showSeq) return;
|
|
45
|
+
if (clearTimer) {
|
|
46
|
+
clearTimeout(clearTimer);
|
|
47
|
+
clearTimer = null;
|
|
48
|
+
}
|
|
49
|
+
visible = true;
|
|
50
|
+
opening = false;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const hide = (): void => {
|
|
55
|
+
visible = false;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const handleOk = (): void => {
|
|
59
|
+
options?.onOk?.();
|
|
60
|
+
hide();
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const handleCancel = (): void => {
|
|
64
|
+
options?.onCancel?.();
|
|
65
|
+
hide();
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
$effect(() => {
|
|
69
|
+
const handler = (event: CustomEvent<MessageBoxOptions>): void => {
|
|
70
|
+
show(event.detail);
|
|
71
|
+
};
|
|
72
|
+
window.addEventListener("lumen-messagebox", handler as EventListener);
|
|
73
|
+
return () =>
|
|
74
|
+
window.removeEventListener("lumen-messagebox", handler as EventListener);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Keep content mounted until Dialog outro completes
|
|
78
|
+
$effect(() => {
|
|
79
|
+
if (!options) return;
|
|
80
|
+
if (opening) return;
|
|
81
|
+
if (visible) return;
|
|
82
|
+
if (clearTimer) clearTimeout(clearTimer);
|
|
83
|
+
clearTimer = setTimeout(() => {
|
|
84
|
+
options = null;
|
|
85
|
+
clearTimer = null;
|
|
86
|
+
}, 200);
|
|
87
|
+
});
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
{#if options}
|
|
91
|
+
{@const opts = options}
|
|
92
|
+
<div
|
|
93
|
+
class="lm-messagebox__wrapper"
|
|
94
|
+
style="--lm-messagebox-z-index: {zIndex}"
|
|
95
|
+
use:portal
|
|
96
|
+
>
|
|
97
|
+
<Dialog
|
|
98
|
+
bind:visible
|
|
99
|
+
width={opts.width ?? "480px"}
|
|
100
|
+
{showClose}
|
|
101
|
+
closeOnClickModal={false}
|
|
102
|
+
closeOnEsc={true}
|
|
103
|
+
onclose={handleCancel}
|
|
104
|
+
class={`lm-messagebox lm-messagebox--${opts.type ?? "info"}`}
|
|
105
|
+
>
|
|
106
|
+
{#snippet header()}
|
|
107
|
+
<div class="lm-messagebox__header-content">
|
|
108
|
+
<Icon
|
|
109
|
+
icon={getIcon(opts.type)}
|
|
110
|
+
size={20}
|
|
111
|
+
class="lm-messagebox__icon"
|
|
112
|
+
/>
|
|
113
|
+
{#if opts.title}
|
|
114
|
+
<span class="lm-messagebox__title">{opts.title}</span>
|
|
115
|
+
{/if}
|
|
116
|
+
</div>
|
|
117
|
+
{/snippet}
|
|
118
|
+
|
|
119
|
+
{#snippet children()}
|
|
120
|
+
<div class="lm-messagebox__body">{opts.content}</div>
|
|
121
|
+
{/snippet}
|
|
122
|
+
|
|
123
|
+
{#snippet footer()}
|
|
124
|
+
{#if opts.cancelText}
|
|
125
|
+
<Button onclick={handleCancel}>{opts.cancelText}</Button>
|
|
126
|
+
{/if}
|
|
127
|
+
<Button type="primary" onclick={handleOk}
|
|
128
|
+
>{opts.okText ?? "确定"}</Button
|
|
129
|
+
>
|
|
130
|
+
{/snippet}
|
|
131
|
+
</Dialog>
|
|
132
|
+
</div>
|
|
133
|
+
{/if}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MessageBoxOptions } from './types';
|
|
2
|
+
/** 显示消息框 */
|
|
3
|
+
export declare const showMessageBox: (options: MessageBoxOptions) => Promise<boolean>;
|
|
4
|
+
/** 便捷方法 */
|
|
5
|
+
export declare const messageBox: {
|
|
6
|
+
show: (options: MessageBoxOptions) => Promise<boolean>;
|
|
7
|
+
alert: (content: string, title?: string) => Promise<boolean>;
|
|
8
|
+
confirm: (content: string, title?: string) => Promise<boolean>;
|
|
9
|
+
success: (content: string, title?: string) => Promise<boolean>;
|
|
10
|
+
warning: (content: string, title?: string) => Promise<boolean>;
|
|
11
|
+
error: (content: string, title?: string) => Promise<boolean>;
|
|
12
|
+
info: (content: string, title?: string) => Promise<boolean>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** 显示消息框 */
|
|
2
|
+
export const showMessageBox = (options) => {
|
|
3
|
+
return new Promise((resolve) => {
|
|
4
|
+
const onOk = () => {
|
|
5
|
+
options.onOk?.();
|
|
6
|
+
resolve(true);
|
|
7
|
+
};
|
|
8
|
+
const onCancel = () => {
|
|
9
|
+
options.onCancel?.();
|
|
10
|
+
resolve(false);
|
|
11
|
+
};
|
|
12
|
+
// 实际实现需要挂载组件,这里提供基础结构
|
|
13
|
+
console.log('MessageBox:', options);
|
|
14
|
+
// 模拟异步确认
|
|
15
|
+
if (typeof window !== 'undefined' && window.confirm(options.content)) {
|
|
16
|
+
onOk();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
onCancel();
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
/** 便捷方法 */
|
|
24
|
+
export const messageBox = {
|
|
25
|
+
show: showMessageBox,
|
|
26
|
+
alert: (content, title) => showMessageBox({ content, title, type: 'info' }),
|
|
27
|
+
confirm: (content, title) => showMessageBox({ content, title, type: 'warning' }),
|
|
28
|
+
success: (content, title) => showMessageBox({ content, title, type: 'success' }),
|
|
29
|
+
warning: (content, title) => showMessageBox({ content, title, type: 'warning' }),
|
|
30
|
+
error: (content, title) => showMessageBox({ content, title, type: 'error' }),
|
|
31
|
+
info: (content, title) => showMessageBox({ content, title, type: 'info' })
|
|
32
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** 消息框类型 */
|
|
2
|
+
export type MessageBoxType = 'info' | 'success' | 'warning' | 'error';
|
|
3
|
+
/** 消息框配置选项 */
|
|
4
|
+
export interface MessageBoxOptions {
|
|
5
|
+
/** 标题 */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** 内容 */
|
|
8
|
+
content: string;
|
|
9
|
+
/** 类型 */
|
|
10
|
+
type?: MessageBoxType;
|
|
11
|
+
/** 确认按钮文字 */
|
|
12
|
+
okText?: string;
|
|
13
|
+
/** 取消按钮文字 */
|
|
14
|
+
cancelText?: string;
|
|
15
|
+
/** 弹窗宽度(同 Dialog 的 width) */
|
|
16
|
+
width?: string;
|
|
17
|
+
/** 确认回调 */
|
|
18
|
+
onOk?: () => void;
|
|
19
|
+
/** 取消回调 */
|
|
20
|
+
onCancel?: () => void;
|
|
21
|
+
}
|
|
22
|
+
/** 关闭消息框的回调函数类型 */
|
|
23
|
+
export type CloseMessageBoxFn = () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Icon from "../Icon/Icon.svelte";
|
|
3
|
+
import { CheckCircle, AlertTriangle, XCircle, Info, X } from "lucide";
|
|
4
|
+
import type { IconNode } from "lucide";
|
|
5
|
+
import type {
|
|
6
|
+
NotificationItem,
|
|
7
|
+
NotificationOptions,
|
|
8
|
+
NotificationType,
|
|
9
|
+
NotificationPlacement,
|
|
10
|
+
} from "./types";
|
|
11
|
+
import { fly } from "svelte/transition";
|
|
12
|
+
import { tick } from "svelte";
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
defaultPlacement?: NotificationPlacement;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let { defaultPlacement = "top-right" }: Props = $props();
|
|
19
|
+
|
|
20
|
+
let notifications = $state<NotificationItem[]>([]);
|
|
21
|
+
|
|
22
|
+
/** 图标映射(静态,避免重复创建) */
|
|
23
|
+
const ICON_MAP: Record<NotificationType, IconNode> = {
|
|
24
|
+
success: CheckCircle,
|
|
25
|
+
warning: AlertTriangle,
|
|
26
|
+
error: XCircle,
|
|
27
|
+
info: Info,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** 根据类型获取图标 */
|
|
31
|
+
const getIcon = (type?: NotificationType): IconNode =>
|
|
32
|
+
ICON_MAP[type || "info"];
|
|
33
|
+
|
|
34
|
+
/** 移除通知 */
|
|
35
|
+
const removeNotification = (id: number): void => {
|
|
36
|
+
const index = notifications.findIndex((n) => n.id === id);
|
|
37
|
+
if (index > -1) {
|
|
38
|
+
notifications = notifications.map((n) =>
|
|
39
|
+
n.id === id ? { ...n, visible: false } : n,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
notifications = notifications.filter((n) => n.id !== id);
|
|
44
|
+
}, 250);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** 添加通知 */
|
|
49
|
+
const addNotification = (options: NotificationOptions): void => {
|
|
50
|
+
const id = Date.now();
|
|
51
|
+
const item: NotificationItem = {
|
|
52
|
+
id,
|
|
53
|
+
type: "info",
|
|
54
|
+
duration: 4500,
|
|
55
|
+
placement: defaultPlacement,
|
|
56
|
+
visible: false,
|
|
57
|
+
...options,
|
|
58
|
+
};
|
|
59
|
+
notifications = [...notifications, item];
|
|
60
|
+
|
|
61
|
+
tick().then(() => {
|
|
62
|
+
item.visible = true;
|
|
63
|
+
notifications = notifications.map((n) => (n.id === id ? item : n));
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (item.duration && item.duration > 0) {
|
|
67
|
+
setTimeout(() => removeNotification(id), item.duration);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** 按位置分组的通知 */
|
|
72
|
+
const groupedNotifications = $derived.by(() => {
|
|
73
|
+
if (notifications.length === 0) return null;
|
|
74
|
+
const groups: Record<string, NotificationItem[]> = {};
|
|
75
|
+
for (const n of notifications) {
|
|
76
|
+
const placement = n.placement || defaultPlacement;
|
|
77
|
+
(groups[placement] ??= []).push(n);
|
|
78
|
+
}
|
|
79
|
+
return groups;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// 监听事件
|
|
83
|
+
$effect(() => {
|
|
84
|
+
const handler = (event: CustomEvent<NotificationOptions>): void => {
|
|
85
|
+
addNotification(event.detail);
|
|
86
|
+
};
|
|
87
|
+
window.addEventListener("lumen-notification", handler as EventListener);
|
|
88
|
+
return () =>
|
|
89
|
+
window.removeEventListener(
|
|
90
|
+
"lumen-notification",
|
|
91
|
+
handler as EventListener,
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
{#if groupedNotifications}
|
|
97
|
+
{#each Object.entries(groupedNotifications) as [placement, items] (placement)}
|
|
98
|
+
<div
|
|
99
|
+
class="lm-notification-container lm-notification-container--{placement}"
|
|
100
|
+
>
|
|
101
|
+
{#each items as notification (notification.id)}
|
|
102
|
+
{#if notification.visible}
|
|
103
|
+
<div
|
|
104
|
+
class="lm-notification lm-notification--{notification.type}"
|
|
105
|
+
transition:fly={{
|
|
106
|
+
y: placement.startsWith("top") ? -20 : 20,
|
|
107
|
+
duration: 250,
|
|
108
|
+
opacity: 0,
|
|
109
|
+
}}
|
|
110
|
+
>
|
|
111
|
+
<div class="lm-notification__content">
|
|
112
|
+
<div class="lm-notification__header">
|
|
113
|
+
<Icon
|
|
114
|
+
icon={getIcon(notification.type)}
|
|
115
|
+
size={18}
|
|
116
|
+
class="lm-notification__icon"
|
|
117
|
+
/>
|
|
118
|
+
{#if notification.title}
|
|
119
|
+
<div class="lm-notification__title">{notification.title}</div>
|
|
120
|
+
{/if}
|
|
121
|
+
</div>
|
|
122
|
+
<div
|
|
123
|
+
class="lm-notification__message"
|
|
124
|
+
class:is-with-title={!!notification.title}
|
|
125
|
+
>
|
|
126
|
+
{notification.message}
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
<button
|
|
130
|
+
type="button"
|
|
131
|
+
class="lm-notification__close"
|
|
132
|
+
onclick={() => removeNotification(notification.id)}
|
|
133
|
+
aria-label="Close"
|
|
134
|
+
>
|
|
135
|
+
<Icon icon={X} size={14} />
|
|
136
|
+
</button>
|
|
137
|
+
</div>
|
|
138
|
+
{/if}
|
|
139
|
+
{/each}
|
|
140
|
+
</div>
|
|
141
|
+
{/each}
|
|
142
|
+
{/if}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { NotificationPlacement } from "./types";
|
|
2
|
+
interface Props {
|
|
3
|
+
defaultPlacement?: NotificationPlacement;
|
|
4
|
+
}
|
|
5
|
+
declare const Notification: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type Notification = ReturnType<typeof Notification>;
|
|
7
|
+
export default Notification;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NotificationOptions } from './types';
|
|
2
|
+
/** 显示通知 */
|
|
3
|
+
export declare const showNotification: (options: NotificationOptions | string) => void;
|
|
4
|
+
/** 便捷方法 */
|
|
5
|
+
export declare const notification: {
|
|
6
|
+
show: (options: NotificationOptions | string) => void;
|
|
7
|
+
success: (msg: string, options?: Partial<NotificationOptions>) => void;
|
|
8
|
+
warning: (msg: string, options?: Partial<NotificationOptions>) => void;
|
|
9
|
+
error: (msg: string, options?: Partial<NotificationOptions>) => void;
|
|
10
|
+
info: (msg: string, options?: Partial<NotificationOptions>) => void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** 触发通知事件 */
|
|
2
|
+
const dispatchNotification = (options) => {
|
|
3
|
+
if (typeof window !== 'undefined') {
|
|
4
|
+
window.dispatchEvent(new CustomEvent('lumen-notification', { detail: options }));
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
/** 显示通知 */
|
|
8
|
+
export const showNotification = (options) => {
|
|
9
|
+
const opts = typeof options === 'string' ? { message: options } : options;
|
|
10
|
+
dispatchNotification(opts);
|
|
11
|
+
};
|
|
12
|
+
/** 便捷方法 */
|
|
13
|
+
export const notification = {
|
|
14
|
+
show: showNotification,
|
|
15
|
+
success: (msg, options) => dispatchNotification({ message: msg, type: 'success', ...options }),
|
|
16
|
+
warning: (msg, options) => dispatchNotification({ message: msg, type: 'warning', ...options }),
|
|
17
|
+
error: (msg, options) => dispatchNotification({ message: msg, type: 'error', ...options }),
|
|
18
|
+
info: (msg, options) => dispatchNotification({ message: msg, type: 'info', ...options })
|
|
19
|
+
};
|