wssf-kage-ui 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Alert/index.d.ts +37 -0
- package/dist/cjs/Alert/index.js +124 -0
- package/dist/cjs/Alert/style.less +248 -0
- package/dist/cjs/Drawer/index.d.ts +57 -0
- package/dist/cjs/Drawer/index.js +203 -0
- package/dist/cjs/Drawer/style.less +215 -0
- package/dist/cjs/FloatButton/index.d.ts +54 -0
- package/dist/cjs/FloatButton/index.js +119 -0
- package/dist/cjs/FloatButton/style.less +266 -0
- package/dist/cjs/Message/index.d.ts +38 -0
- package/dist/cjs/Message/index.js +292 -0
- package/dist/cjs/Message/style.less +183 -0
- package/dist/cjs/Modal/index.d.ts +63 -0
- package/dist/cjs/Modal/index.js +254 -0
- package/dist/cjs/Modal/style.less +298 -0
- package/dist/cjs/Notification/index.d.ts +48 -0
- package/dist/cjs/Notification/index.js +340 -0
- package/dist/cjs/Notification/style.less +260 -0
- package/dist/cjs/Popconfirm/index.d.ts +58 -0
- package/dist/cjs/Popconfirm/index.js +393 -0
- package/dist/cjs/Popconfirm/style.less +417 -0
- package/dist/cjs/Progress/index.d.ts +43 -0
- package/dist/cjs/Progress/index.js +213 -0
- package/dist/cjs/Progress/style.less +206 -0
- package/dist/cjs/Result/index.d.ts +25 -0
- package/dist/cjs/Result/index.js +63 -0
- package/dist/cjs/Result/style.less +111 -0
- package/dist/cjs/Skeleton/index.d.ts +88 -0
- package/dist/cjs/Skeleton/index.js +207 -0
- package/dist/cjs/Skeleton/style.less +487 -0
- package/dist/cjs/Spin/index.d.ts +25 -0
- package/dist/cjs/Spin/index.js +98 -0
- package/dist/cjs/Spin/style.less +169 -0
- package/dist/cjs/Tree/index.d.ts +82 -0
- package/dist/cjs/Tree/index.js +226 -0
- package/dist/cjs/Tree/style.less +313 -0
- package/dist/cjs/Watermark/index.d.ts +41 -0
- package/dist/cjs/Watermark/index.js +353 -0
- package/dist/cjs/Watermark/style.less +31 -0
- package/dist/cjs/index.d.ts +27 -1
- package/dist/cjs/index.js +91 -0
- package/dist/esm/Alert/index.d.ts +37 -0
- package/dist/esm/Alert/index.js +121 -0
- package/dist/esm/Alert/style.less +248 -0
- package/dist/esm/Drawer/index.d.ts +57 -0
- package/dist/esm/Drawer/index.js +202 -0
- package/dist/esm/Drawer/style.less +215 -0
- package/dist/esm/FloatButton/index.d.ts +54 -0
- package/dist/esm/FloatButton/index.js +123 -0
- package/dist/esm/FloatButton/style.less +266 -0
- package/dist/esm/Message/index.d.ts +38 -0
- package/dist/esm/Message/index.js +294 -0
- package/dist/esm/Message/style.less +183 -0
- package/dist/esm/Modal/index.d.ts +63 -0
- package/dist/esm/Modal/index.js +251 -0
- package/dist/esm/Modal/style.less +298 -0
- package/dist/esm/Notification/index.d.ts +48 -0
- package/dist/esm/Notification/index.js +345 -0
- package/dist/esm/Notification/style.less +260 -0
- package/dist/esm/Popconfirm/index.d.ts +58 -0
- package/dist/esm/Popconfirm/index.js +389 -0
- package/dist/esm/Popconfirm/style.less +417 -0
- package/dist/esm/Progress/index.d.ts +43 -0
- package/dist/esm/Progress/index.js +208 -0
- package/dist/esm/Progress/style.less +206 -0
- package/dist/esm/Result/index.d.ts +25 -0
- package/dist/esm/Result/index.js +57 -0
- package/dist/esm/Result/style.less +111 -0
- package/dist/esm/Skeleton/index.d.ts +88 -0
- package/dist/esm/Skeleton/index.js +213 -0
- package/dist/esm/Skeleton/style.less +487 -0
- package/dist/esm/Spin/index.d.ts +25 -0
- package/dist/esm/Spin/index.js +95 -0
- package/dist/esm/Spin/style.less +169 -0
- package/dist/esm/Tree/index.d.ts +82 -0
- package/dist/esm/Tree/index.js +225 -0
- package/dist/esm/Tree/style.less +313 -0
- package/dist/esm/Watermark/index.d.ts +41 -0
- package/dist/esm/Watermark/index.js +349 -0
- package/dist/esm/Watermark/style.less +31 -0
- package/dist/esm/index.d.ts +27 -1
- package/dist/esm/index.js +14 -1
- package/package.json +1 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// FloatButton 悬浮按钮组件样式
|
|
2
|
+
|
|
3
|
+
@prefix: kage-float-btn;
|
|
4
|
+
|
|
5
|
+
// 颜色变量
|
|
6
|
+
@float-btn-default-bg: #fff;
|
|
7
|
+
@float-btn-default-color: rgba(0, 0, 0, 0.85);
|
|
8
|
+
@float-btn-primary-bg: #1890ff;
|
|
9
|
+
@float-btn-primary-color: #fff;
|
|
10
|
+
@float-btn-danger-bg: #ff4d4f;
|
|
11
|
+
@float-btn-danger-color: #fff;
|
|
12
|
+
@float-btn-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
13
|
+
|
|
14
|
+
// ============ 主容器 ============
|
|
15
|
+
.@{prefix}-wrapper {
|
|
16
|
+
position: relative;
|
|
17
|
+
display: inline-block;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ============ 悬浮按钮 ============
|
|
21
|
+
.@{prefix} {
|
|
22
|
+
position: relative;
|
|
23
|
+
z-index: 10;
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
width: 56px;
|
|
28
|
+
height: 56px;
|
|
29
|
+
padding: 0;
|
|
30
|
+
color: @float-btn-default-color;
|
|
31
|
+
font-size: 20px;
|
|
32
|
+
line-height: 1;
|
|
33
|
+
text-align: center;
|
|
34
|
+
background-color: @float-btn-default-bg;
|
|
35
|
+
border: none;
|
|
36
|
+
border-radius: 50%;
|
|
37
|
+
box-shadow: @float-btn-shadow;
|
|
38
|
+
cursor: pointer;
|
|
39
|
+
transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
40
|
+
user-select: none;
|
|
41
|
+
|
|
42
|
+
&:hover {
|
|
43
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&:active {
|
|
47
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&:disabled {
|
|
51
|
+
color: rgba(0, 0, 0, 0.25);
|
|
52
|
+
background-color: #f5f5f5;
|
|
53
|
+
cursor: not-allowed;
|
|
54
|
+
box-shadow: none;
|
|
55
|
+
|
|
56
|
+
&:hover {
|
|
57
|
+
box-shadow: none;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
* {
|
|
62
|
+
box-sizing: border-box;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ============ 类型 ============
|
|
67
|
+
.@{prefix}-primary {
|
|
68
|
+
color: @float-btn-primary-color;
|
|
69
|
+
background-color: @float-btn-primary-bg;
|
|
70
|
+
|
|
71
|
+
&:hover {
|
|
72
|
+
background-color: #40a9ff;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
&:active {
|
|
76
|
+
background-color: #0958d9;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&:disabled {
|
|
80
|
+
color: rgba(0, 0, 0, 0.25);
|
|
81
|
+
background-color: #f5f5f5;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.@{prefix}-danger {
|
|
86
|
+
color: @float-btn-danger-color;
|
|
87
|
+
background-color: @float-btn-danger-bg;
|
|
88
|
+
|
|
89
|
+
&:hover {
|
|
90
|
+
background-color: #ff7875;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&:active {
|
|
94
|
+
background-color: #cf1322;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&:disabled {
|
|
98
|
+
color: rgba(0, 0, 0, 0.25);
|
|
99
|
+
background-color: #f5f5f5;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ============ 形状 ============
|
|
104
|
+
.@{prefix}-square {
|
|
105
|
+
border-radius: 8px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ============ 描述 ============
|
|
109
|
+
.@{prefix}-description {
|
|
110
|
+
position: absolute;
|
|
111
|
+
right: 100%;
|
|
112
|
+
display: flex;
|
|
113
|
+
align-items: center;
|
|
114
|
+
height: 22px;
|
|
115
|
+
margin-right: 12px;
|
|
116
|
+
padding: 0 8px;
|
|
117
|
+
color: rgba(0, 0, 0, 0.85);
|
|
118
|
+
font-size: 14px;
|
|
119
|
+
line-height: 22px;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
background-color: rgba(0, 0, 0, 0.75);
|
|
122
|
+
border-radius: 4px;
|
|
123
|
+
opacity: 0;
|
|
124
|
+
transform: scale(0.8);
|
|
125
|
+
transform-origin: right center;
|
|
126
|
+
transition: all 0.2s;
|
|
127
|
+
pointer-events: none;
|
|
128
|
+
|
|
129
|
+
&::after {
|
|
130
|
+
position: absolute;
|
|
131
|
+
top: 50%;
|
|
132
|
+
right: -4px;
|
|
133
|
+
width: 0;
|
|
134
|
+
height: 0;
|
|
135
|
+
border: 4px solid transparent;
|
|
136
|
+
border-left-color: rgba(0, 0, 0, 0.75);
|
|
137
|
+
transform: translateY(-50%);
|
|
138
|
+
content: '';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.@{prefix}-wrapper:hover .@{prefix}-description {
|
|
143
|
+
opacity: 1;
|
|
144
|
+
transform: scale(1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ============ 工具提示 ============
|
|
148
|
+
.@{prefix}-tooltip {
|
|
149
|
+
position: absolute;
|
|
150
|
+
right: 100%;
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
height: 22px;
|
|
154
|
+
margin-right: 12px;
|
|
155
|
+
padding: 0 8px;
|
|
156
|
+
color: #fff;
|
|
157
|
+
font-size: 14px;
|
|
158
|
+
line-height: 22px;
|
|
159
|
+
white-space: nowrap;
|
|
160
|
+
background-color: rgba(0, 0, 0, 0.75);
|
|
161
|
+
border-radius: 4px;
|
|
162
|
+
opacity: 0;
|
|
163
|
+
transform: scale(0.8);
|
|
164
|
+
transform-origin: right center;
|
|
165
|
+
transition: all 0.2s;
|
|
166
|
+
pointer-events: none;
|
|
167
|
+
|
|
168
|
+
&::after {
|
|
169
|
+
position: absolute;
|
|
170
|
+
top: 50%;
|
|
171
|
+
right: -4px;
|
|
172
|
+
width: 0;
|
|
173
|
+
height: 0;
|
|
174
|
+
border: 4px solid transparent;
|
|
175
|
+
border-left-color: rgba(0, 0, 0, 0.75);
|
|
176
|
+
transform: translateY(-50%);
|
|
177
|
+
content: '';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.@{prefix}-wrapper:hover .@{prefix}-tooltip {
|
|
182
|
+
opacity: 1;
|
|
183
|
+
transform: scale(1);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// ============ 按钮组 ============
|
|
187
|
+
.@{prefix}-group {
|
|
188
|
+
position: relative;
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-direction: column;
|
|
191
|
+
gap: 16px;
|
|
192
|
+
align-items: center;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.@{prefix}-group-open {
|
|
196
|
+
.@{prefix} {
|
|
197
|
+
opacity: 1;
|
|
198
|
+
transform: scale(1);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.@{prefix}-group:not(.@{prefix}-group-open) {
|
|
203
|
+
> .@{prefix}:not(:first-child) {
|
|
204
|
+
opacity: 0;
|
|
205
|
+
transform: scale(0);
|
|
206
|
+
pointer-events: none;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ============ 暗色模式适配 ============
|
|
211
|
+
[data-theme='dark'],
|
|
212
|
+
[data-prefers-color-scheme='dark'],
|
|
213
|
+
[data-prefers-color='dark'],
|
|
214
|
+
html.dark,
|
|
215
|
+
body.dark,
|
|
216
|
+
.dark {
|
|
217
|
+
.@{prefix} {
|
|
218
|
+
background-color: #1f1f1f;
|
|
219
|
+
color: rgba(255, 255, 255, 0.85);
|
|
220
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
221
|
+
|
|
222
|
+
&:hover {
|
|
223
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
&:disabled {
|
|
227
|
+
color: rgba(255, 255, 255, 0.25);
|
|
228
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.@{prefix}-primary {
|
|
233
|
+
background-color: #1890ff;
|
|
234
|
+
|
|
235
|
+
&:hover {
|
|
236
|
+
background-color: #40a9ff;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
&:disabled {
|
|
240
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.@{prefix}-danger {
|
|
245
|
+
background-color: #ff4d4f;
|
|
246
|
+
|
|
247
|
+
&:hover {
|
|
248
|
+
background-color: #ff7875;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
&:disabled {
|
|
252
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.@{prefix}-description,
|
|
257
|
+
.@{prefix}-tooltip {
|
|
258
|
+
background-color: rgba(255, 255, 255, 0.85);
|
|
259
|
+
color: rgba(0, 0, 0, 0.85);
|
|
260
|
+
|
|
261
|
+
&::after {
|
|
262
|
+
border-left-color: rgba(255, 255, 255, 0.85);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
/** Message 类型 */
|
|
4
|
+
export type MessageType = 'success' | 'info' | 'warning' | 'error' | 'loading';
|
|
5
|
+
/** Message 配置 */
|
|
6
|
+
export interface MessageConfig {
|
|
7
|
+
/** 提示内容 */
|
|
8
|
+
content: ReactNode;
|
|
9
|
+
/** 提示类型 */
|
|
10
|
+
type?: MessageType;
|
|
11
|
+
/** 自动关闭的延时,单位秒。设为 0 时不自动关闭 */
|
|
12
|
+
duration?: number;
|
|
13
|
+
/** 自定义图标 */
|
|
14
|
+
icon?: ReactNode;
|
|
15
|
+
/** 自定义类名 */
|
|
16
|
+
className?: string;
|
|
17
|
+
/** 自定义样式 */
|
|
18
|
+
style?: CSSProperties;
|
|
19
|
+
/** 关闭时的回调 */
|
|
20
|
+
onClose?: () => void;
|
|
21
|
+
/** 消息唯一标识 */
|
|
22
|
+
key?: string | number;
|
|
23
|
+
}
|
|
24
|
+
/** Message API */
|
|
25
|
+
export interface MessageApi {
|
|
26
|
+
success: (content: ReactNode, duration?: number, onClose?: () => void) => void;
|
|
27
|
+
error: (content: ReactNode, duration?: number, onClose?: () => void) => void;
|
|
28
|
+
info: (content: ReactNode, duration?: number, onClose?: () => void) => void;
|
|
29
|
+
warning: (content: ReactNode, duration?: number, onClose?: () => void) => void;
|
|
30
|
+
loading: (content: ReactNode, duration?: number, onClose?: () => void) => void;
|
|
31
|
+
open: (config: MessageConfig) => void;
|
|
32
|
+
destroy: (key?: string | number) => void;
|
|
33
|
+
}
|
|
34
|
+
declare const MessageContainer: React.FC;
|
|
35
|
+
export declare const Message: MessageApi & {
|
|
36
|
+
Container: typeof MessageContainer;
|
|
37
|
+
};
|
|
38
|
+
export default Message;
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
5
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
6
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
7
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
8
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
9
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
11
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
12
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
13
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
import React, { useState, useEffect } from 'react';
|
|
17
|
+
import "./style.less";
|
|
18
|
+
|
|
19
|
+
// ============ 类型定义 ============
|
|
20
|
+
|
|
21
|
+
/** Message 类型 */
|
|
22
|
+
|
|
23
|
+
/** Message 配置 */
|
|
24
|
+
|
|
25
|
+
/** Message 实例 */
|
|
26
|
+
|
|
27
|
+
/** Message API */
|
|
28
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
29
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
30
|
+
// ============ 默认图标 ============
|
|
31
|
+
var defaultIcons = {
|
|
32
|
+
success: '✓',
|
|
33
|
+
info: 'ℹ',
|
|
34
|
+
warning: '⚠',
|
|
35
|
+
error: '✕',
|
|
36
|
+
loading: '⟳'
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// ============ Message 管理器 ============
|
|
40
|
+
var MessageManager = /*#__PURE__*/function () {
|
|
41
|
+
function MessageManager() {
|
|
42
|
+
_classCallCheck(this, MessageManager);
|
|
43
|
+
_defineProperty(this, "instances", []);
|
|
44
|
+
_defineProperty(this, "listeners", new Set());
|
|
45
|
+
_defineProperty(this, "keyCounter", 0);
|
|
46
|
+
}
|
|
47
|
+
_createClass(MessageManager, [{
|
|
48
|
+
key: "subscribe",
|
|
49
|
+
value: function subscribe(listener) {
|
|
50
|
+
var _this = this;
|
|
51
|
+
this.listeners.add(listener);
|
|
52
|
+
return function () {
|
|
53
|
+
_this.listeners.delete(listener);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}, {
|
|
57
|
+
key: "notify",
|
|
58
|
+
value: function notify() {
|
|
59
|
+
this.listeners.forEach(function (listener) {
|
|
60
|
+
return listener();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}, {
|
|
64
|
+
key: "add",
|
|
65
|
+
value: function add(config) {
|
|
66
|
+
var _config$key,
|
|
67
|
+
_this2 = this;
|
|
68
|
+
var key = (_config$key = config.key) !== null && _config$key !== void 0 ? _config$key : "message-".concat(++this.keyCounter);
|
|
69
|
+
var instance = _objectSpread(_objectSpread({}, config), {}, {
|
|
70
|
+
key: key,
|
|
71
|
+
visible: true,
|
|
72
|
+
closing: false
|
|
73
|
+
});
|
|
74
|
+
this.instances.push(instance);
|
|
75
|
+
this.notify();
|
|
76
|
+
|
|
77
|
+
// 自动关闭
|
|
78
|
+
if (config.duration !== 0) {
|
|
79
|
+
var _config$duration;
|
|
80
|
+
var _duration = (_config$duration = config.duration) !== null && _config$duration !== void 0 ? _config$duration : 3;
|
|
81
|
+
setTimeout(function () {
|
|
82
|
+
_this2.remove(key);
|
|
83
|
+
}, _duration * 1000);
|
|
84
|
+
}
|
|
85
|
+
return key;
|
|
86
|
+
}
|
|
87
|
+
}, {
|
|
88
|
+
key: "remove",
|
|
89
|
+
value: function remove(key) {
|
|
90
|
+
var _this3 = this;
|
|
91
|
+
var instance = this.instances.find(function (item) {
|
|
92
|
+
return item.key === key;
|
|
93
|
+
});
|
|
94
|
+
if (!instance) return;
|
|
95
|
+
instance.closing = true;
|
|
96
|
+
this.notify();
|
|
97
|
+
|
|
98
|
+
// 等待动画完成
|
|
99
|
+
setTimeout(function () {
|
|
100
|
+
var index = _this3.instances.findIndex(function (item) {
|
|
101
|
+
return item.key === key;
|
|
102
|
+
});
|
|
103
|
+
if (index > -1) {
|
|
104
|
+
var _instance$onClose;
|
|
105
|
+
_this3.instances.splice(index, 1);
|
|
106
|
+
_this3.notify();
|
|
107
|
+
(_instance$onClose = instance.onClose) === null || _instance$onClose === void 0 || _instance$onClose.call(instance);
|
|
108
|
+
}
|
|
109
|
+
}, 300);
|
|
110
|
+
}
|
|
111
|
+
}, {
|
|
112
|
+
key: "destroy",
|
|
113
|
+
value: function destroy(key) {
|
|
114
|
+
var _this4 = this;
|
|
115
|
+
if (key) {
|
|
116
|
+
this.remove(key);
|
|
117
|
+
} else {
|
|
118
|
+
this.instances.forEach(function (instance) {
|
|
119
|
+
instance.closing = true;
|
|
120
|
+
});
|
|
121
|
+
this.notify();
|
|
122
|
+
setTimeout(function () {
|
|
123
|
+
_this4.instances.forEach(function (instance) {
|
|
124
|
+
var _instance$onClose2;
|
|
125
|
+
(_instance$onClose2 = instance.onClose) === null || _instance$onClose2 === void 0 || _instance$onClose2.call(instance);
|
|
126
|
+
});
|
|
127
|
+
_this4.instances = [];
|
|
128
|
+
_this4.notify();
|
|
129
|
+
}, 300);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}, {
|
|
133
|
+
key: "getInstances",
|
|
134
|
+
value: function getInstances() {
|
|
135
|
+
return this.instances;
|
|
136
|
+
}
|
|
137
|
+
}]);
|
|
138
|
+
return MessageManager;
|
|
139
|
+
}();
|
|
140
|
+
var messageManager = new MessageManager();
|
|
141
|
+
|
|
142
|
+
// ============ Message 容器组件 ============
|
|
143
|
+
var MessageContainer = function MessageContainer() {
|
|
144
|
+
var _useState = useState({}),
|
|
145
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
146
|
+
forceUpdate = _useState2[1];
|
|
147
|
+
useEffect(function () {
|
|
148
|
+
var unsubscribe = messageManager.subscribe(function () {
|
|
149
|
+
forceUpdate({});
|
|
150
|
+
});
|
|
151
|
+
return unsubscribe;
|
|
152
|
+
}, []);
|
|
153
|
+
var instances = messageManager.getInstances();
|
|
154
|
+
if (instances.length === 0) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return /*#__PURE__*/_jsx("div", {
|
|
158
|
+
className: "kage-message-container",
|
|
159
|
+
children: instances.map(function (instance) {
|
|
160
|
+
return /*#__PURE__*/_jsx(MessageItem, {
|
|
161
|
+
instance: instance
|
|
162
|
+
}, instance.key);
|
|
163
|
+
})
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// ============ Message 项组件 ============
|
|
168
|
+
var MessageItem = function MessageItem(_ref) {
|
|
169
|
+
var instance = _ref.instance;
|
|
170
|
+
var content = instance.content,
|
|
171
|
+
_instance$type = instance.type,
|
|
172
|
+
type = _instance$type === void 0 ? 'info' : _instance$type,
|
|
173
|
+
icon = instance.icon,
|
|
174
|
+
_instance$className = instance.className,
|
|
175
|
+
className = _instance$className === void 0 ? '' : _instance$className,
|
|
176
|
+
style = instance.style,
|
|
177
|
+
closing = instance.closing,
|
|
178
|
+
visible = instance.visible;
|
|
179
|
+
if (!visible && !closing) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
var classNames = ['kage-message', "kage-message-".concat(type), closing && 'kage-message-closing', className].filter(Boolean).join(' ');
|
|
183
|
+
var iconNode = icon || defaultIcons[type];
|
|
184
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
185
|
+
className: classNames,
|
|
186
|
+
style: style,
|
|
187
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
188
|
+
className: "kage-message-icon",
|
|
189
|
+
children: iconNode
|
|
190
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
191
|
+
className: "kage-message-content",
|
|
192
|
+
children: content
|
|
193
|
+
})]
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
// ============ Message API ============
|
|
198
|
+
var messageApi = {
|
|
199
|
+
success: function success(content, duration, onClose) {
|
|
200
|
+
messageManager.add({
|
|
201
|
+
content: content,
|
|
202
|
+
type: 'success',
|
|
203
|
+
duration: duration,
|
|
204
|
+
onClose: onClose
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
error: function error(content, duration, onClose) {
|
|
208
|
+
messageManager.add({
|
|
209
|
+
content: content,
|
|
210
|
+
type: 'error',
|
|
211
|
+
duration: duration,
|
|
212
|
+
onClose: onClose
|
|
213
|
+
});
|
|
214
|
+
},
|
|
215
|
+
info: function info(content, duration, onClose) {
|
|
216
|
+
messageManager.add({
|
|
217
|
+
content: content,
|
|
218
|
+
type: 'info',
|
|
219
|
+
duration: duration,
|
|
220
|
+
onClose: onClose
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
warning: function warning(content, duration, onClose) {
|
|
224
|
+
messageManager.add({
|
|
225
|
+
content: content,
|
|
226
|
+
type: 'warning',
|
|
227
|
+
duration: duration,
|
|
228
|
+
onClose: onClose
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
loading: function loading(content, duration, onClose) {
|
|
232
|
+
messageManager.add({
|
|
233
|
+
content: content,
|
|
234
|
+
type: 'loading',
|
|
235
|
+
duration: duration,
|
|
236
|
+
onClose: onClose
|
|
237
|
+
});
|
|
238
|
+
},
|
|
239
|
+
open: function open(config) {
|
|
240
|
+
messageManager.add(config);
|
|
241
|
+
},
|
|
242
|
+
destroy: function destroy(key) {
|
|
243
|
+
messageManager.destroy(key);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
// ============ Message 组件 ============
|
|
248
|
+
export var Message = {};
|
|
249
|
+
|
|
250
|
+
// 将 API 方法挂载到组件上
|
|
251
|
+
Object.assign(Message, messageApi);
|
|
252
|
+
Message.Container = MessageContainer;
|
|
253
|
+
|
|
254
|
+
// 初始化容器(延迟执行,避免 SSR 问题)
|
|
255
|
+
var containerElement = null;
|
|
256
|
+
var containerMounted = false;
|
|
257
|
+
var getContainer = function getContainer() {
|
|
258
|
+
if (!containerElement && typeof document !== 'undefined') {
|
|
259
|
+
containerElement = document.createElement('div');
|
|
260
|
+
containerElement.className = 'kage-message-root';
|
|
261
|
+
document.body.appendChild(containerElement);
|
|
262
|
+
}
|
|
263
|
+
return containerElement;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// 延迟初始化容器组件
|
|
267
|
+
var initContainer = function initContainer() {
|
|
268
|
+
if (containerMounted || typeof document === 'undefined') return;
|
|
269
|
+
containerMounted = true;
|
|
270
|
+
var container = getContainer();
|
|
271
|
+
try {
|
|
272
|
+
var _React = require('react');
|
|
273
|
+
var ReactDOM = require('react-dom');
|
|
274
|
+
if (ReactDOM.createRoot) {
|
|
275
|
+
// React 18
|
|
276
|
+
ReactDOM.createRoot(container).render(_React.createElement(MessageContainer));
|
|
277
|
+
} else if (ReactDOM.render) {
|
|
278
|
+
// React 17
|
|
279
|
+
ReactDOM.render(_React.createElement(MessageContainer), container);
|
|
280
|
+
}
|
|
281
|
+
} catch (e) {
|
|
282
|
+
// 静默失败,避免影响应用启动
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// 在浏览器环境中初始化
|
|
287
|
+
if (typeof window !== 'undefined') {
|
|
288
|
+
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
289
|
+
setTimeout(initContainer, 0);
|
|
290
|
+
} else {
|
|
291
|
+
document.addEventListener('DOMContentLoaded', initContainer);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
export default Message;
|