@lobehub/ui 4.19.1 → 4.20.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/es/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/Accordion.mjs +2 -2
- package/es/Accordion/Accordion.mjs.map +1 -1
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/Accordion/AccordionItem.mjs +2 -2
- package/es/Accordion/AccordionItem.mjs.map +1 -1
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/Checkbox/Checkbox.mjs +2 -2
- package/es/Checkbox/Checkbox.mjs.map +1 -1
- package/es/Checkbox/CheckboxGroup.mjs +2 -2
- package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
- package/es/CodeDiff/CodeDiff.d.mts +2 -2
- package/es/CodeDiff/PatchDiff.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.mjs +2 -2
- package/es/CodeEditor/CodeEditor.mjs.map +1 -1
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ColorSwatches/ColorSwatches.mjs +2 -2
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/ConfigProvider/index.d.mts +2 -2
- package/es/ContextMenu/ContextMenuHost.d.mts +2 -2
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DraggablePanel/DraggablePanel.mjs +2 -2
- package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.mjs +2 -2
- package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Dropdown/Dropdown.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
- package/es/DropdownMenu/atoms.d.mts +15 -15
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EditableText/EditableText.mjs +2 -2
- package/es/EditableText/EditableText.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.mjs +3 -3
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/FontLoader/index.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/GuideCard/GuideCard.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.mjs +2 -2
- package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.mjs +2 -2
- package/es/ImageSelect/ImageSelect.mjs.map +1 -1
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/Modal/ModalProvider.d.mts +2 -2
- package/es/Modal/imperative.d.mts +2 -2
- package/es/MotionProvider/index.d.mts +2 -2
- package/es/Popover/ArrowIcon.d.mts +2 -2
- package/es/Popover/atoms.d.mts +9 -9
- package/es/Popover/context.d.mts +2 -2
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/SearchBar/SearchBar.mjs +2 -2
- package/es/SearchBar/SearchBar.mjs.map +1 -1
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Select/Select.d.mts +2 -2
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/Toast/Toast.mjs +107 -0
- package/es/Toast/Toast.mjs.map +1 -0
- package/es/Toast/context.mjs +14 -0
- package/es/Toast/context.mjs.map +1 -0
- package/es/Toast/imperative.d.mts +45 -0
- package/es/Toast/imperative.mjs +243 -0
- package/es/Toast/imperative.mjs.map +1 -0
- package/es/Toast/index.d.mts +3 -0
- package/es/Toast/index.d.ts +1 -0
- package/es/Toast/index.js +1 -0
- package/es/Toast/index.mjs +3 -0
- package/es/Toast/style.mjs +293 -0
- package/es/Toast/style.mjs.map +1 -0
- package/es/Toast/type.d.mts +118 -0
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Toc/TocMobile.mjs +2 -2
- package/es/Toc/TocMobile.mjs.map +1 -1
- package/es/Video/index.d.mts +2 -2
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/Hero/Hero.d.mts +2 -2
- package/es/awesome/Spline/Spine.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.mjs +3 -3
- package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.mjs +3 -3
- package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/color/CssVar/index.d.mts +2 -2
- package/es/i18n/context.d.mts +2 -2
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +2 -2
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.d.mts +4 -1
- package/es/index.mjs +2 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.mjs +2 -2
- package/es/mobile/TabBar/TabBar.mjs.map +1 -1
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useIsClient } from "../hooks/useIsClient.mjs";
|
|
4
|
+
import { LOBE_THEME_APP_ID } from "../ThemeProvider/constants.mjs";
|
|
5
|
+
import { registerDevSingleton } from "../utils/devSingleton.mjs";
|
|
6
|
+
import { ToastContext } from "./context.mjs";
|
|
7
|
+
import { viewportVariants } from "./style.mjs";
|
|
8
|
+
import Toast_default from "./Toast.mjs";
|
|
9
|
+
import { memo, useEffect, useState } from "react";
|
|
10
|
+
import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
|
|
11
|
+
import { cx } from "antd-style";
|
|
12
|
+
import { createPortal } from "react-dom";
|
|
13
|
+
import { Toast } from "@base-ui/react/toast";
|
|
14
|
+
|
|
15
|
+
//#region src/Toast/imperative.tsx
|
|
16
|
+
const ALL_POSITIONS = [
|
|
17
|
+
"top",
|
|
18
|
+
"top-left",
|
|
19
|
+
"top-right",
|
|
20
|
+
"bottom",
|
|
21
|
+
"bottom-left",
|
|
22
|
+
"bottom-right"
|
|
23
|
+
];
|
|
24
|
+
let globalState = {
|
|
25
|
+
duration: 5e3,
|
|
26
|
+
limit: 5,
|
|
27
|
+
position: "bottom-right",
|
|
28
|
+
swipeDirection: ["down", "right"]
|
|
29
|
+
};
|
|
30
|
+
const toastManagers = {
|
|
31
|
+
"bottom": Toast.createToastManager(),
|
|
32
|
+
"bottom-left": Toast.createToastManager(),
|
|
33
|
+
"bottom-right": Toast.createToastManager(),
|
|
34
|
+
"top": Toast.createToastManager(),
|
|
35
|
+
"top-left": Toast.createToastManager(),
|
|
36
|
+
"top-right": Toast.createToastManager()
|
|
37
|
+
};
|
|
38
|
+
const activeToastIds = {
|
|
39
|
+
"bottom": /* @__PURE__ */ new Set(),
|
|
40
|
+
"bottom-left": /* @__PURE__ */ new Set(),
|
|
41
|
+
"bottom-right": /* @__PURE__ */ new Set(),
|
|
42
|
+
"top": /* @__PURE__ */ new Set(),
|
|
43
|
+
"top-left": /* @__PURE__ */ new Set(),
|
|
44
|
+
"top-right": /* @__PURE__ */ new Set()
|
|
45
|
+
};
|
|
46
|
+
const getManager = (position) => toastManagers[position];
|
|
47
|
+
const normalizeOptions = (optionsOrMessage, type) => {
|
|
48
|
+
if (typeof optionsOrMessage === "string") return {
|
|
49
|
+
description: optionsOrMessage,
|
|
50
|
+
type
|
|
51
|
+
};
|
|
52
|
+
return {
|
|
53
|
+
...optionsOrMessage,
|
|
54
|
+
type
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
const createToastInstance = (id, position) => ({
|
|
58
|
+
close: () => getManager(position).close(id),
|
|
59
|
+
id,
|
|
60
|
+
update: (options) => {
|
|
61
|
+
getManager(position).update(id, {
|
|
62
|
+
data: options,
|
|
63
|
+
description: options.description,
|
|
64
|
+
title: options.title
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
const addToast = (options) => {
|
|
69
|
+
const position = options.placement ?? globalState.position;
|
|
70
|
+
const manager = getManager(position);
|
|
71
|
+
const onRemove = options.onRemove;
|
|
72
|
+
const id = manager.add({
|
|
73
|
+
data: options,
|
|
74
|
+
description: options.description,
|
|
75
|
+
onClose: options.onClose,
|
|
76
|
+
onRemove: () => {
|
|
77
|
+
activeToastIds[position].delete(id);
|
|
78
|
+
onRemove?.();
|
|
79
|
+
},
|
|
80
|
+
timeout: options.duration ?? globalState.duration,
|
|
81
|
+
title: options.title
|
|
82
|
+
});
|
|
83
|
+
activeToastIds[position].add(id);
|
|
84
|
+
return createToastInstance(id, position);
|
|
85
|
+
};
|
|
86
|
+
const dismissToast = (id) => {
|
|
87
|
+
if (id) for (const [position, manager] of Object.entries(toastManagers)) {
|
|
88
|
+
activeToastIds[position].delete(id);
|
|
89
|
+
manager.close(id);
|
|
90
|
+
}
|
|
91
|
+
else for (const [position, manager] of Object.entries(toastManagers)) {
|
|
92
|
+
const ids = Array.from(activeToastIds[position]);
|
|
93
|
+
for (const toastId of ids) manager.close(toastId);
|
|
94
|
+
activeToastIds[position].clear();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const createSuccessToast = (optionsOrMessage) => {
|
|
98
|
+
return addToast(normalizeOptions(optionsOrMessage, "success"));
|
|
99
|
+
};
|
|
100
|
+
const createErrorToast = (optionsOrMessage) => {
|
|
101
|
+
return addToast(normalizeOptions(optionsOrMessage, "error"));
|
|
102
|
+
};
|
|
103
|
+
const createInfoToast = (optionsOrMessage) => {
|
|
104
|
+
return addToast(normalizeOptions(optionsOrMessage, "info"));
|
|
105
|
+
};
|
|
106
|
+
const createWarningToast = (optionsOrMessage) => {
|
|
107
|
+
return addToast(normalizeOptions(optionsOrMessage, "warning"));
|
|
108
|
+
};
|
|
109
|
+
const createLoadingToast = (optionsOrMessage) => {
|
|
110
|
+
return addToast({
|
|
111
|
+
duration: 0,
|
|
112
|
+
...normalizeOptions(optionsOrMessage, "loading")
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
async function promiseToast(promise, options) {
|
|
116
|
+
const loadingToast = addToast({
|
|
117
|
+
closable: false,
|
|
118
|
+
duration: 0,
|
|
119
|
+
type: "loading",
|
|
120
|
+
...typeof options.loading === "string" ? { description: options.loading } : options.loading
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
const result = await promise;
|
|
124
|
+
loadingToast.close();
|
|
125
|
+
addToast({
|
|
126
|
+
type: "success",
|
|
127
|
+
...(() => {
|
|
128
|
+
if (typeof options.success === "string") return { description: options.success };
|
|
129
|
+
if (typeof options.success === "function") return { description: options.success(result) };
|
|
130
|
+
return options.success;
|
|
131
|
+
})()
|
|
132
|
+
});
|
|
133
|
+
return result;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
loadingToast.close();
|
|
136
|
+
addToast({
|
|
137
|
+
type: "error",
|
|
138
|
+
...(() => {
|
|
139
|
+
if (typeof options.error === "string") return { description: options.error };
|
|
140
|
+
if (typeof options.error === "function") return { description: options.error(error) };
|
|
141
|
+
return options.error;
|
|
142
|
+
})()
|
|
143
|
+
});
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const baseToast = (options) => {
|
|
148
|
+
return addToast({
|
|
149
|
+
type: "default",
|
|
150
|
+
...options
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
const toast = Object.assign(baseToast, {
|
|
154
|
+
dismiss: dismissToast,
|
|
155
|
+
error: createErrorToast,
|
|
156
|
+
info: createInfoToast,
|
|
157
|
+
loading: createLoadingToast,
|
|
158
|
+
promise: promiseToast,
|
|
159
|
+
success: createSuccessToast,
|
|
160
|
+
warning: createWarningToast
|
|
161
|
+
});
|
|
162
|
+
const ToastList = memo(() => {
|
|
163
|
+
const { toasts } = Toast.useToastManager();
|
|
164
|
+
return toasts.map((t) => /* @__PURE__ */ jsx(Toast_default, { toast: t }, t.id));
|
|
165
|
+
});
|
|
166
|
+
ToastList.displayName = "ToastList";
|
|
167
|
+
const TOAST_PORTAL_ATTR = "data-lobe-ui-toast-portal";
|
|
168
|
+
const TOAST_CONTAINER_ATTR = "data-lobe-ui-toast-container";
|
|
169
|
+
const containerMap = /* @__PURE__ */ new WeakMap();
|
|
170
|
+
const getOrCreateContainer = (root) => {
|
|
171
|
+
const resolvedRoot = (() => {
|
|
172
|
+
if (typeof document === "undefined") return root;
|
|
173
|
+
if (typeof ShadowRoot !== "undefined" && root instanceof ShadowRoot) return root;
|
|
174
|
+
if (!(root === document.body)) return root;
|
|
175
|
+
const themeApp = document.querySelector(`#${LOBE_THEME_APP_ID}`);
|
|
176
|
+
if (themeApp) return themeApp;
|
|
177
|
+
const toastContainer = document.querySelector(`[${TOAST_CONTAINER_ATTR}="true"]`);
|
|
178
|
+
if (toastContainer) return toastContainer;
|
|
179
|
+
return root;
|
|
180
|
+
})();
|
|
181
|
+
const cached = containerMap.get(resolvedRoot);
|
|
182
|
+
if (cached && cached.isConnected) return cached;
|
|
183
|
+
const el = document.createElement("div");
|
|
184
|
+
el.setAttribute(TOAST_PORTAL_ATTR, "true");
|
|
185
|
+
resolvedRoot.append(el);
|
|
186
|
+
containerMap.set(resolvedRoot, el);
|
|
187
|
+
return el;
|
|
188
|
+
};
|
|
189
|
+
const resolveRoot = (root) => {
|
|
190
|
+
if (root) return root;
|
|
191
|
+
return document.body;
|
|
192
|
+
};
|
|
193
|
+
const ToastHost = memo(({ root, className, duration = 5e3, limit = 5, position = "bottom-right", swipeDirection = ["down", "right"] }) => {
|
|
194
|
+
const isClient = useIsClient();
|
|
195
|
+
const [container, setContainer] = useState(null);
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
globalState = {
|
|
198
|
+
duration,
|
|
199
|
+
limit,
|
|
200
|
+
position,
|
|
201
|
+
swipeDirection
|
|
202
|
+
};
|
|
203
|
+
}, [
|
|
204
|
+
duration,
|
|
205
|
+
limit,
|
|
206
|
+
position,
|
|
207
|
+
swipeDirection
|
|
208
|
+
]);
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
if (!isClient) return;
|
|
211
|
+
const resolved = resolveRoot(root);
|
|
212
|
+
if (resolved) {
|
|
213
|
+
setContainer(getOrCreateContainer(resolved));
|
|
214
|
+
console.log("resolved", resolved, container);
|
|
215
|
+
}
|
|
216
|
+
return registerDevSingleton("ToastHost", root ?? document.body);
|
|
217
|
+
}, [isClient, root]);
|
|
218
|
+
if (!isClient || !container) return null;
|
|
219
|
+
return createPortal(/* @__PURE__ */ jsx(Fragment$1, { children: ALL_POSITIONS.map((pos) => /* @__PURE__ */ jsx(ToastContext.Provider, {
|
|
220
|
+
value: {
|
|
221
|
+
position: pos,
|
|
222
|
+
swipeDirection
|
|
223
|
+
},
|
|
224
|
+
children: /* @__PURE__ */ jsx(Toast.Provider, {
|
|
225
|
+
limit,
|
|
226
|
+
timeout: duration,
|
|
227
|
+
toastManager: getManager(pos),
|
|
228
|
+
children: /* @__PURE__ */ jsx(Toast.Portal, {
|
|
229
|
+
container,
|
|
230
|
+
children: /* @__PURE__ */ jsx(Toast.Viewport, {
|
|
231
|
+
className: cx(viewportVariants({ position: pos }), className),
|
|
232
|
+
children: /* @__PURE__ */ jsx(ToastList, {})
|
|
233
|
+
})
|
|
234
|
+
})
|
|
235
|
+
})
|
|
236
|
+
}, pos)) }), container);
|
|
237
|
+
});
|
|
238
|
+
ToastHost.displayName = "ToastHost";
|
|
239
|
+
const useToast = () => toast;
|
|
240
|
+
|
|
241
|
+
//#endregion
|
|
242
|
+
export { TOAST_CONTAINER_ATTR, ToastHost, toast, useToast };
|
|
243
|
+
//# sourceMappingURL=imperative.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imperative.mjs","names":["ALL_POSITIONS: ToastPosition[]","globalState: ToastState","toastManagers: Record<ToastPosition, ReturnType<typeof BaseToast.createToastManager>>","BaseToast","activeToastIds: Record<ToastPosition, Set<string>>","toast: ToastAPI","ToastItem"],"sources":["../../src/Toast/imperative.tsx"],"sourcesContent":["'use client';\n\nimport { Toast as BaseToast } from '@base-ui/react/toast';\nimport { cx } from 'antd-style';\nimport { memo, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { LOBE_THEME_APP_ID } from '@/ThemeProvider';\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { registerDevSingleton } from '@/utils/devSingleton';\n\nimport ToastItem from './Toast';\nimport { ToastContext } from './context';\nimport { viewportVariants } from './style';\nimport type {\n ToastAPI,\n ToastInstance,\n ToastOptions,\n ToastPosition,\n ToastPromiseOptions,\n ToastType,\n} from './type';\n\n// All possible positions\nconst ALL_POSITIONS: ToastPosition[] = [\n 'top',\n 'top-left',\n 'top-right',\n 'bottom',\n 'bottom-left',\n 'bottom-right',\n];\n\n// Global state management\ninterface ToastState {\n duration: number;\n limit: number;\n position: ToastPosition;\n swipeDirection: ('left' | 'right' | 'up' | 'down') | ('left' | 'right' | 'up' | 'down')[];\n}\n\nlet globalState: ToastState = {\n duration: 5000,\n limit: 5,\n position: 'bottom-right',\n swipeDirection: ['down', 'right'],\n};\n\n// Toast managers for each position\nconst toastManagers: Record<ToastPosition, ReturnType<typeof BaseToast.createToastManager>> = {\n 'bottom': BaseToast.createToastManager(),\n 'bottom-left': BaseToast.createToastManager(),\n 'bottom-right': BaseToast.createToastManager(),\n 'top': BaseToast.createToastManager(),\n 'top-left': BaseToast.createToastManager(),\n 'top-right': BaseToast.createToastManager(),\n};\n\nconst activeToastIds: Record<ToastPosition, Set<string>> = {\n 'bottom': new Set(),\n 'bottom-left': new Set(),\n 'bottom-right': new Set(),\n 'top': new Set(),\n 'top-left': new Set(),\n 'top-right': new Set(),\n};\n\nconst getManager = (position: ToastPosition) => toastManagers[position];\n\nconst normalizeOptions = (\n optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n type: ToastType,\n): ToastOptions => {\n if (typeof optionsOrMessage === 'string') {\n return {\n description: optionsOrMessage,\n type,\n };\n }\n return {\n ...optionsOrMessage,\n type,\n };\n};\n\nconst createToastInstance = (id: string, position: ToastPosition): ToastInstance => ({\n close: () => getManager(position).close(id),\n id,\n update: (options) => {\n getManager(position).update(id, {\n data: options,\n description: options.description,\n title: options.title,\n });\n },\n});\n\nconst addToast = (options: ToastOptions): ToastInstance => {\n const position = options.placement ?? globalState.position;\n const manager = getManager(position);\n const onRemove = options.onRemove;\n const id = manager.add({\n data: options,\n description: options.description,\n onClose: options.onClose,\n onRemove: () => {\n activeToastIds[position].delete(id);\n onRemove?.();\n },\n timeout: options.duration ?? globalState.duration,\n title: options.title,\n });\n activeToastIds[position].add(id);\n return createToastInstance(id, position);\n};\n\nconst dismissToast = (id?: string) => {\n if (id) {\n // Try to close from all managers since we don't know which position the toast is in\n for (const [position, manager] of Object.entries(toastManagers)) {\n activeToastIds[position as ToastPosition].delete(id);\n manager.close(id);\n }\n } else {\n // Clear all toasts\n for (const [position, manager] of Object.entries(toastManagers)) {\n const ids = Array.from(activeToastIds[position as ToastPosition]);\n for (const toastId of ids) {\n manager.close(toastId);\n }\n activeToastIds[position as ToastPosition].clear();\n }\n }\n};\n\nconst createSuccessToast = (\n optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n return addToast(normalizeOptions(optionsOrMessage, 'success'));\n};\n\nconst createErrorToast = (optionsOrMessage: Omit<ToastOptions, 'type'> | string): ToastInstance => {\n return addToast(normalizeOptions(optionsOrMessage, 'error'));\n};\n\nconst createInfoToast = (optionsOrMessage: Omit<ToastOptions, 'type'> | string): ToastInstance => {\n return addToast(normalizeOptions(optionsOrMessage, 'info'));\n};\n\nconst createWarningToast = (\n optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n return addToast(normalizeOptions(optionsOrMessage, 'warning'));\n};\n\nconst createLoadingToast = (\n optionsOrMessage: Omit<ToastOptions, 'type'> | string,\n): ToastInstance => {\n const options = normalizeOptions(optionsOrMessage, 'loading');\n // Loading toasts don't auto-dismiss by default\n return addToast({ duration: 0, ...options });\n};\n\nasync function promiseToast<T>(promise: Promise<T>, options: ToastPromiseOptions<T>): Promise<T> {\n const loadingOptions =\n typeof options.loading === 'string'\n ? { description: options.loading }\n : (options.loading as ToastOptions);\n\n const loadingToast = addToast({\n closable: false,\n duration: 0,\n type: 'loading',\n ...loadingOptions,\n });\n\n try {\n const result = await promise;\n\n loadingToast.close();\n\n const successOptions = (() => {\n if (typeof options.success === 'string') {\n return { description: options.success };\n }\n if (typeof options.success === 'function') {\n return { description: options.success(result) };\n }\n return options.success as ToastOptions;\n })();\n\n addToast({ type: 'success', ...successOptions });\n\n return result;\n } catch (error) {\n loadingToast.close();\n\n const errorOptions = (() => {\n if (typeof options.error === 'string') {\n return { description: options.error };\n }\n if (typeof options.error === 'function') {\n return { description: options.error(error as Error) };\n }\n return options.error as ToastOptions;\n })();\n\n addToast({ type: 'error', ...errorOptions });\n\n throw error;\n }\n}\n\n// Base toast function\nconst baseToast = (options: ToastOptions): ToastInstance => {\n return addToast({ type: 'default', ...options });\n};\n\n// Toast API\nexport const toast: ToastAPI = Object.assign(baseToast, {\n dismiss: dismissToast,\n error: createErrorToast,\n info: createInfoToast,\n loading: createLoadingToast,\n promise: promiseToast,\n success: createSuccessToast,\n warning: createWarningToast,\n});\n\n// Toast List Component\nconst ToastList = memo(() => {\n const { toasts } = BaseToast.useToastManager();\n return toasts.map((t) => <ToastItem key={t.id} toast={t} />);\n});\n\nToastList.displayName = 'ToastList';\n\n// Toast Host Component\nconst TOAST_PORTAL_ATTR = 'data-lobe-ui-toast-portal';\nexport const TOAST_CONTAINER_ATTR = 'data-lobe-ui-toast-container';\n\nconst containerMap = new WeakMap<object, HTMLElement>();\n\nconst getOrCreateContainer = (root: HTMLElement | ShadowRoot): HTMLElement => {\n const resolvedRoot = (() => {\n if (typeof document === 'undefined') return root;\n if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) return root;\n\n const isBody = root === document.body;\n if (!isBody) return root;\n\n const themeApp = document.querySelector<HTMLElement>(`#${LOBE_THEME_APP_ID}`);\n if (themeApp) return themeApp;\n\n const toastContainer = document.querySelector<HTMLElement>(`[${TOAST_CONTAINER_ATTR}=\"true\"]`);\n if (toastContainer) return toastContainer;\n\n return root;\n })();\n\n const cached = containerMap.get(resolvedRoot);\n if (cached && cached.isConnected) return cached;\n\n const el = document.createElement('div');\n el.setAttribute(TOAST_PORTAL_ATTR, 'true');\n resolvedRoot.append(el);\n containerMap.set(resolvedRoot, el);\n return el;\n};\n\nconst resolveRoot = (root?: HTMLElement | ShadowRoot | null): HTMLElement | ShadowRoot | null => {\n if (root) return root;\n return document.body;\n};\n\nexport interface ToastHostProps {\n className?: string;\n /**\n * Default duration for toasts\n * @default 5000\n */\n duration?: number;\n /**\n * Maximum number of toasts\n * @default 5\n */\n limit?: number;\n /**\n * Toast position\n * @default 'bottom-right'\n */\n position?: ToastPosition;\n /**\n * Root element for portal\n */\n root?: HTMLElement | ShadowRoot | null;\n /**\n * Swipe direction to dismiss\n * @default ['down', 'right']\n */\n swipeDirection?: ('left' | 'right' | 'up' | 'down') | ('left' | 'right' | 'up' | 'down')[];\n}\n\nexport const ToastHost = memo(\n ({\n root,\n className,\n duration = 5000,\n limit = 5,\n position = 'bottom-right',\n swipeDirection = ['down', 'right'],\n }: ToastHostProps) => {\n const isClient = useIsClient();\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n globalState = {\n duration,\n limit,\n position,\n swipeDirection,\n };\n }, [duration, limit, position, swipeDirection]);\n\n useEffect(() => {\n if (!isClient) return;\n\n const resolved = resolveRoot(root);\n if (resolved) {\n setContainer(getOrCreateContainer(resolved));\n console.log('resolved', resolved, container);\n }\n\n const scope = root ?? document.body;\n return registerDevSingleton('ToastHost', scope);\n }, [isClient, root]);\n\n if (!isClient || !container) return null;\n\n return createPortal(\n <>\n {ALL_POSITIONS.map((pos) => (\n <ToastContext.Provider key={pos} value={{ position: pos, swipeDirection }}>\n <BaseToast.Provider limit={limit} timeout={duration} toastManager={getManager(pos)}>\n <BaseToast.Portal container={container}>\n <BaseToast.Viewport className={cx(viewportVariants({ position: pos }), className)}>\n <ToastList />\n </BaseToast.Viewport>\n </BaseToast.Portal>\n </BaseToast.Provider>\n </ToastContext.Provider>\n ))}\n </>,\n container,\n );\n },\n);\n\nToastHost.displayName = 'ToastHost';\n\n// Hook to use toast manager\nexport const useToast = () => toast;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ToastAPI, ToastInstance, ToastOptions, ToastPosition, ToastPromiseOptions, ToastProps, ToastType } from "./type.mjs";
|
|
2
|
+
import { TOAST_CONTAINER_ATTR, ToastHost, ToastHostProps, toast, useToast } from "./imperative.mjs";
|
|
3
|
+
export { TOAST_CONTAINER_ATTR, ToastAPI, ToastHost, type ToastHostProps, ToastInstance, ToastOptions, ToastPosition, ToastPromiseOptions, ToastProps, ToastType, toast, useToast };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.d.mts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.mjs';
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { createStaticStyles } from "antd-style";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
|
|
4
|
+
//#region src/Toast/style.ts
|
|
5
|
+
const styles = createStaticStyles(({ css: css$1, cssVar: cssVar$1 }) => ({
|
|
6
|
+
action: css$1`
|
|
7
|
+
cursor: pointer;
|
|
8
|
+
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
justify-content: center;
|
|
12
|
+
|
|
13
|
+
height: 28px;
|
|
14
|
+
margin-block-start: 8px;
|
|
15
|
+
padding-inline: 12px;
|
|
16
|
+
border: none;
|
|
17
|
+
border-radius: ${cssVar$1.borderRadiusSM};
|
|
18
|
+
|
|
19
|
+
font-size: 12px;
|
|
20
|
+
font-weight: 500;
|
|
21
|
+
line-height: 1;
|
|
22
|
+
color: ${cssVar$1.colorTextLightSolid};
|
|
23
|
+
|
|
24
|
+
background: ${cssVar$1.colorPrimary};
|
|
25
|
+
|
|
26
|
+
transition: background 0.2s;
|
|
27
|
+
|
|
28
|
+
&:hover {
|
|
29
|
+
background: ${cssVar$1.colorPrimaryHover};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&:active {
|
|
33
|
+
background: ${cssVar$1.colorPrimaryActive};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&:focus-visible {
|
|
37
|
+
outline: 2px solid ${cssVar$1.colorPrimaryBorder};
|
|
38
|
+
outline-offset: 1px;
|
|
39
|
+
}
|
|
40
|
+
`,
|
|
41
|
+
close: css$1`
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
|
|
44
|
+
position: absolute;
|
|
45
|
+
inset-block-start: 8px;
|
|
46
|
+
inset-inline-end: 8px;
|
|
47
|
+
|
|
48
|
+
display: flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
|
|
52
|
+
width: 20px;
|
|
53
|
+
height: 20px;
|
|
54
|
+
padding: 0;
|
|
55
|
+
border: none;
|
|
56
|
+
border-radius: ${cssVar$1.borderRadiusSM};
|
|
57
|
+
|
|
58
|
+
color: ${cssVar$1.colorTextTertiary};
|
|
59
|
+
|
|
60
|
+
background: transparent;
|
|
61
|
+
|
|
62
|
+
transition: all 0.2s;
|
|
63
|
+
|
|
64
|
+
&:hover {
|
|
65
|
+
color: ${cssVar$1.colorText};
|
|
66
|
+
background: ${cssVar$1.colorFillSecondary};
|
|
67
|
+
}
|
|
68
|
+
`,
|
|
69
|
+
content: css$1`
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
transition: opacity 0.2s;
|
|
72
|
+
|
|
73
|
+
&[data-behind] {
|
|
74
|
+
pointer-events: none;
|
|
75
|
+
opacity: 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&[data-expanded] {
|
|
79
|
+
pointer-events: auto;
|
|
80
|
+
opacity: 1;
|
|
81
|
+
}
|
|
82
|
+
`,
|
|
83
|
+
description: css$1`
|
|
84
|
+
margin: 0;
|
|
85
|
+
font-size: 13px;
|
|
86
|
+
line-height: 1.5;
|
|
87
|
+
color: ${cssVar$1.colorTextSecondary};
|
|
88
|
+
`,
|
|
89
|
+
icon: css$1`
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-shrink: 0;
|
|
92
|
+
align-items: center;
|
|
93
|
+
justify-content: center;
|
|
94
|
+
`,
|
|
95
|
+
root: css$1`
|
|
96
|
+
--toast-gap: 12px;
|
|
97
|
+
--toast-peek: 12px;
|
|
98
|
+
--toast-scale: calc(1 - var(--toast-index) * 0.05);
|
|
99
|
+
--toast-shrink: calc(1 - var(--toast-scale));
|
|
100
|
+
--toast-collapsed-height: var(--toast-frontmost-height, var(--toast-height));
|
|
101
|
+
|
|
102
|
+
cursor: default;
|
|
103
|
+
user-select: none;
|
|
104
|
+
|
|
105
|
+
position: absolute;
|
|
106
|
+
z-index: calc(1000 - var(--toast-index));
|
|
107
|
+
inset-inline: 0;
|
|
108
|
+
|
|
109
|
+
box-sizing: border-box;
|
|
110
|
+
width: 100%;
|
|
111
|
+
height: var(--toast-collapsed-height);
|
|
112
|
+
padding-block: 12px;
|
|
113
|
+
padding-inline: 16px;
|
|
114
|
+
padding-inline-end: 32px;
|
|
115
|
+
border-radius: ${cssVar$1.borderRadiusLG};
|
|
116
|
+
|
|
117
|
+
color: ${cssVar$1.colorText};
|
|
118
|
+
|
|
119
|
+
background: ${cssVar$1.colorBgElevated};
|
|
120
|
+
background-clip: padding-box;
|
|
121
|
+
box-shadow:
|
|
122
|
+
0 0 15px 0 #00000008,
|
|
123
|
+
0 2px 30px 0 #00000014,
|
|
124
|
+
0 0 0 1px ${cssVar$1.colorBorder} inset;
|
|
125
|
+
|
|
126
|
+
transition:
|
|
127
|
+
transform 0.4s cubic-bezier(0.22, 1, 0.36, 1),
|
|
128
|
+
opacity 0.4s,
|
|
129
|
+
height 0.15s;
|
|
130
|
+
|
|
131
|
+
/* Fill gap between stacked toasts to prevent hover flicker */
|
|
132
|
+
&::after {
|
|
133
|
+
content: '';
|
|
134
|
+
position: absolute;
|
|
135
|
+
inset-inline: 0;
|
|
136
|
+
height: calc(var(--toast-gap) + var(--toast-peek) + 8px);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
&[data-limited] {
|
|
140
|
+
opacity: 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
&[data-swiping] {
|
|
144
|
+
transition: none;
|
|
145
|
+
}
|
|
146
|
+
`,
|
|
147
|
+
rootBottom: css$1`
|
|
148
|
+
inset-block: auto 0;
|
|
149
|
+
transform-origin: bottom center;
|
|
150
|
+
transform: translateX(var(--toast-swipe-movement-x))
|
|
151
|
+
translateY(
|
|
152
|
+
calc(
|
|
153
|
+
var(--toast-swipe-movement-y) - (var(--toast-index) * var(--toast-peek)) -
|
|
154
|
+
(var(--toast-shrink) * var(--toast-collapsed-height))
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
scale(var(--toast-scale));
|
|
158
|
+
|
|
159
|
+
&::after {
|
|
160
|
+
inset-block-start: 100%;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
&[data-expanded] {
|
|
164
|
+
transform: translateX(var(--toast-swipe-movement-x))
|
|
165
|
+
translateY(
|
|
166
|
+
calc(
|
|
167
|
+
var(--toast-swipe-movement-y) + var(--toast-offset-y) * -1 + var(--toast-index) *
|
|
168
|
+
var(--toast-gap) * -1
|
|
169
|
+
)
|
|
170
|
+
)
|
|
171
|
+
scale(1);
|
|
172
|
+
height: var(--toast-height);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
&[data-starting-style],
|
|
176
|
+
&[data-ending-style] {
|
|
177
|
+
transform: translateY(150%);
|
|
178
|
+
opacity: 0;
|
|
179
|
+
}
|
|
180
|
+
`,
|
|
181
|
+
rootTop: css$1`
|
|
182
|
+
inset-block: 0 auto;
|
|
183
|
+
transform-origin: top center;
|
|
184
|
+
transform: translateX(var(--toast-swipe-movement-x))
|
|
185
|
+
translateY(
|
|
186
|
+
calc(
|
|
187
|
+
var(--toast-swipe-movement-y) + (var(--toast-index) * var(--toast-peek)) +
|
|
188
|
+
(var(--toast-shrink) * var(--toast-collapsed-height))
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
scale(var(--toast-scale));
|
|
192
|
+
|
|
193
|
+
&::after {
|
|
194
|
+
inset-block-end: 100%;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
&[data-expanded] {
|
|
198
|
+
transform: translateX(var(--toast-swipe-movement-x))
|
|
199
|
+
translateY(
|
|
200
|
+
calc(
|
|
201
|
+
var(--toast-swipe-movement-y) + var(--toast-offset-y) + var(--toast-index) *
|
|
202
|
+
var(--toast-gap)
|
|
203
|
+
)
|
|
204
|
+
)
|
|
205
|
+
scale(1);
|
|
206
|
+
height: var(--toast-height);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
&[data-starting-style],
|
|
210
|
+
&[data-ending-style] {
|
|
211
|
+
transform: translateY(-150%);
|
|
212
|
+
opacity: 0;
|
|
213
|
+
}
|
|
214
|
+
`,
|
|
215
|
+
title: css$1`
|
|
216
|
+
margin: 0;
|
|
217
|
+
|
|
218
|
+
font-size: 14px;
|
|
219
|
+
font-weight: 500;
|
|
220
|
+
line-height: 1.5;
|
|
221
|
+
color: ${cssVar$1.colorText};
|
|
222
|
+
`,
|
|
223
|
+
toastBody: css$1`
|
|
224
|
+
display: flex;
|
|
225
|
+
gap: 12px;
|
|
226
|
+
align-items: flex-start;
|
|
227
|
+
`,
|
|
228
|
+
viewport: css$1`
|
|
229
|
+
position: fixed;
|
|
230
|
+
z-index: 1100;
|
|
231
|
+
|
|
232
|
+
width: 360px;
|
|
233
|
+
max-width: calc(100vw - 32px);
|
|
234
|
+
|
|
235
|
+
outline: 0;
|
|
236
|
+
|
|
237
|
+
@media (width <= 480px) {
|
|
238
|
+
width: calc(100vw - 32px);
|
|
239
|
+
}
|
|
240
|
+
`,
|
|
241
|
+
viewportBottom: css$1`
|
|
242
|
+
inset-block-end: 16px;
|
|
243
|
+
inset-inline-start: 50%;
|
|
244
|
+
transform: translateX(-50%);
|
|
245
|
+
`,
|
|
246
|
+
viewportBottomLeft: css$1`
|
|
247
|
+
inset-block-end: 16px;
|
|
248
|
+
inset-inline-start: 16px;
|
|
249
|
+
`,
|
|
250
|
+
viewportBottomRight: css$1`
|
|
251
|
+
inset-block-end: 16px;
|
|
252
|
+
inset-inline-end: 16px;
|
|
253
|
+
`,
|
|
254
|
+
viewportTop: css$1`
|
|
255
|
+
inset-block-start: 16px;
|
|
256
|
+
inset-inline-start: 50%;
|
|
257
|
+
transform: translateX(-50%);
|
|
258
|
+
`,
|
|
259
|
+
viewportTopLeft: css$1`
|
|
260
|
+
inset-block-start: 16px;
|
|
261
|
+
inset-inline-start: 16px;
|
|
262
|
+
`,
|
|
263
|
+
viewportTopRight: css$1`
|
|
264
|
+
inset-block-start: 16px;
|
|
265
|
+
inset-inline-end: 16px;
|
|
266
|
+
`
|
|
267
|
+
}));
|
|
268
|
+
const viewportVariants = cva(styles.viewport, {
|
|
269
|
+
defaultVariants: { position: "bottom-right" },
|
|
270
|
+
variants: { position: {
|
|
271
|
+
"bottom": styles.viewportBottom,
|
|
272
|
+
"bottom-left": styles.viewportBottomLeft,
|
|
273
|
+
"bottom-right": styles.viewportBottomRight,
|
|
274
|
+
"top": styles.viewportTop,
|
|
275
|
+
"top-left": styles.viewportTopLeft,
|
|
276
|
+
"top-right": styles.viewportTopRight
|
|
277
|
+
} }
|
|
278
|
+
});
|
|
279
|
+
const rootVariants = cva(styles.root, {
|
|
280
|
+
defaultVariants: { position: "bottom-right" },
|
|
281
|
+
variants: { position: {
|
|
282
|
+
"bottom": styles.rootBottom,
|
|
283
|
+
"bottom-left": styles.rootBottom,
|
|
284
|
+
"bottom-right": styles.rootBottom,
|
|
285
|
+
"top": styles.rootTop,
|
|
286
|
+
"top-left": styles.rootTop,
|
|
287
|
+
"top-right": styles.rootTop
|
|
288
|
+
} }
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
//#endregion
|
|
292
|
+
export { rootVariants, styles, viewportVariants };
|
|
293
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":["cssVar"],"sources":["../../src/Toast/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n action: css`\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n height: 28px;\n margin-block-start: 8px;\n padding-inline: 12px;\n border: none;\n border-radius: ${cssVar.borderRadiusSM};\n\n font-size: 12px;\n font-weight: 500;\n line-height: 1;\n color: ${cssVar.colorTextLightSolid};\n\n background: ${cssVar.colorPrimary};\n\n transition: background 0.2s;\n\n &:hover {\n background: ${cssVar.colorPrimaryHover};\n }\n\n &:active {\n background: ${cssVar.colorPrimaryActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${cssVar.colorPrimaryBorder};\n outline-offset: 1px;\n }\n `,\n\n close: css`\n cursor: pointer;\n\n position: absolute;\n inset-block-start: 8px;\n inset-inline-end: 8px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 20px;\n height: 20px;\n padding: 0;\n border: none;\n border-radius: ${cssVar.borderRadiusSM};\n\n color: ${cssVar.colorTextTertiary};\n\n background: transparent;\n\n transition: all 0.2s;\n\n &:hover {\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillSecondary};\n }\n `,\n\n content: css`\n overflow: hidden;\n transition: opacity 0.2s;\n\n &[data-behind] {\n pointer-events: none;\n opacity: 0;\n }\n\n &[data-expanded] {\n pointer-events: auto;\n opacity: 1;\n }\n `,\n\n description: css`\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: ${cssVar.colorTextSecondary};\n `,\n\n icon: css`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n `,\n\n root: css`\n --toast-gap: 12px;\n --toast-peek: 12px;\n --toast-scale: calc(1 - var(--toast-index) * 0.05);\n --toast-shrink: calc(1 - var(--toast-scale));\n --toast-collapsed-height: var(--toast-frontmost-height, var(--toast-height));\n\n cursor: default;\n user-select: none;\n\n position: absolute;\n z-index: calc(1000 - var(--toast-index));\n inset-inline: 0;\n\n box-sizing: border-box;\n width: 100%;\n height: var(--toast-collapsed-height);\n padding-block: 12px;\n padding-inline: 16px;\n padding-inline-end: 32px;\n border-radius: ${cssVar.borderRadiusLG};\n\n color: ${cssVar.colorText};\n\n background: ${cssVar.colorBgElevated};\n background-clip: padding-box;\n box-shadow:\n 0 0 15px 0 #00000008,\n 0 2px 30px 0 #00000014,\n 0 0 0 1px ${cssVar.colorBorder} inset;\n\n transition:\n transform 0.4s cubic-bezier(0.22, 1, 0.36, 1),\n opacity 0.4s,\n height 0.15s;\n\n /* Fill gap between stacked toasts to prevent hover flicker */\n &::after {\n content: '';\n position: absolute;\n inset-inline: 0;\n height: calc(var(--toast-gap) + var(--toast-peek) + 8px);\n }\n\n &[data-limited] {\n opacity: 0;\n }\n\n &[data-swiping] {\n transition: none;\n }\n `,\n\n // Bottom positions - stack upward\n rootBottom: css`\n inset-block: auto 0;\n transform-origin: bottom center;\n transform: translateX(var(--toast-swipe-movement-x))\n translateY(\n calc(\n var(--toast-swipe-movement-y) - (var(--toast-index) * var(--toast-peek)) -\n (var(--toast-shrink) * var(--toast-collapsed-height))\n )\n )\n scale(var(--toast-scale));\n\n &::after {\n inset-block-start: 100%;\n }\n\n &[data-expanded] {\n transform: translateX(var(--toast-swipe-movement-x))\n translateY(\n calc(\n var(--toast-swipe-movement-y) + var(--toast-offset-y) * -1 + var(--toast-index) *\n var(--toast-gap) * -1\n )\n )\n scale(1);\n height: var(--toast-height);\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n transform: translateY(150%);\n opacity: 0;\n }\n `,\n\n // Top positions - stack downward\n rootTop: css`\n inset-block: 0 auto;\n transform-origin: top center;\n transform: translateX(var(--toast-swipe-movement-x))\n translateY(\n calc(\n var(--toast-swipe-movement-y) + (var(--toast-index) * var(--toast-peek)) +\n (var(--toast-shrink) * var(--toast-collapsed-height))\n )\n )\n scale(var(--toast-scale));\n\n &::after {\n inset-block-end: 100%;\n }\n\n &[data-expanded] {\n transform: translateX(var(--toast-swipe-movement-x))\n translateY(\n calc(\n var(--toast-swipe-movement-y) + var(--toast-offset-y) + var(--toast-index) *\n var(--toast-gap)\n )\n )\n scale(1);\n height: var(--toast-height);\n }\n\n &[data-starting-style],\n &[data-ending-style] {\n transform: translateY(-150%);\n opacity: 0;\n }\n `,\n\n title: css`\n margin: 0;\n\n font-size: 14px;\n font-weight: 500;\n line-height: 1.5;\n color: ${cssVar.colorText};\n `,\n\n toastBody: css`\n display: flex;\n gap: 12px;\n align-items: flex-start;\n `,\n\n viewport: css`\n position: fixed;\n z-index: 1100;\n\n width: 360px;\n max-width: calc(100vw - 32px);\n\n outline: 0;\n\n @media (width <= 480px) {\n width: calc(100vw - 32px);\n }\n `,\n\n viewportBottom: css`\n inset-block-end: 16px;\n inset-inline-start: 50%;\n transform: translateX(-50%);\n `,\n\n viewportBottomLeft: css`\n inset-block-end: 16px;\n inset-inline-start: 16px;\n `,\n\n viewportBottomRight: css`\n inset-block-end: 16px;\n inset-inline-end: 16px;\n `,\n\n viewportTop: css`\n inset-block-start: 16px;\n inset-inline-start: 50%;\n transform: translateX(-50%);\n `,\n\n viewportTopLeft: css`\n inset-block-start: 16px;\n inset-inline-start: 16px;\n `,\n\n viewportTopRight: css`\n inset-block-start: 16px;\n inset-inline-end: 16px;\n `,\n}));\n\nexport const viewportVariants = cva(styles.viewport, {\n defaultVariants: {\n position: 'bottom-right',\n },\n variants: {\n position: {\n 'bottom': styles.viewportBottom,\n 'bottom-left': styles.viewportBottomLeft,\n 'bottom-right': styles.viewportBottomRight,\n 'top': styles.viewportTop,\n 'top-left': styles.viewportTopLeft,\n 'top-right': styles.viewportTopRight,\n },\n },\n});\n\nexport const rootVariants = cva(styles.root, {\n defaultVariants: {\n position: 'bottom-right',\n },\n variants: {\n position: {\n 'bottom': styles.rootBottom,\n 'bottom-left': styles.rootBottom,\n 'bottom-right': styles.rootBottom,\n 'top': styles.rootTop,\n 'top-left': styles.rootTop,\n 'top-right': styles.rootTop,\n },\n },\n});\n"],"mappings":";;;;AAGA,MAAa,SAAS,oBAAoB,EAAE,YAAK,wBAAc;CAC7D,QAAQ,KAAG;;;;;;;;;;;qBAWQA,SAAO,eAAe;;;;;aAK9BA,SAAO,oBAAoB;;kBAEtBA,SAAO,aAAa;;;;;oBAKlBA,SAAO,kBAAkB;;;;oBAIzBA,SAAO,mBAAmB;;;;2BAInBA,SAAO,mBAAmB;;;;CAKnD,OAAO,KAAG;;;;;;;;;;;;;;;qBAeSA,SAAO,eAAe;;aAE9BA,SAAO,kBAAkB;;;;;;;eAOvBA,SAAO,UAAU;oBACZA,SAAO,mBAAmB;;;CAI5C,SAAS,KAAG;;;;;;;;;;;;;;CAeZ,aAAa,KAAG;;;;aAILA,SAAO,mBAAmB;;CAGrC,MAAM,KAAG;;;;;;CAOT,MAAM,KAAG;;;;;;;;;;;;;;;;;;;;qBAoBUA,SAAO,eAAe;;aAE9BA,SAAO,UAAU;;kBAEZA,SAAO,gBAAgB;;;;;kBAKvBA,SAAO,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAyBnC,YAAY,KAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCf,SAAS,KAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCZ,OAAO,KAAG;;;;;;aAMCA,SAAO,UAAU;;CAG5B,WAAW,KAAG;;;;;CAMd,UAAU,KAAG;;;;;;;;;;;;;CAcb,gBAAgB,KAAG;;;;;CAMnB,oBAAoB,KAAG;;;;CAKvB,qBAAqB,KAAG;;;;CAKxB,aAAa,KAAG;;;;;CAMhB,iBAAiB,KAAG;;;;CAKpB,kBAAkB,KAAG;;;;CAItB,EAAE;AAEH,MAAa,mBAAmB,IAAI,OAAO,UAAU;CACnD,iBAAiB,EACf,UAAU,gBACX;CACD,UAAU,EACR,UAAU;EACR,UAAU,OAAO;EACjB,eAAe,OAAO;EACtB,gBAAgB,OAAO;EACvB,OAAO,OAAO;EACd,YAAY,OAAO;EACnB,aAAa,OAAO;EACrB,EACF;CACF,CAAC;AAEF,MAAa,eAAe,IAAI,OAAO,MAAM;CAC3C,iBAAiB,EACf,UAAU,gBACX;CACD,UAAU,EACR,UAAU;EACR,UAAU,OAAO;EACjB,eAAe,OAAO;EACtB,gBAAgB,OAAO;EACvB,OAAO,OAAO;EACd,YAAY,OAAO;EACnB,aAAa,OAAO;EACrB,EACF;CACF,CAAC"}
|