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.
Files changed (83) hide show
  1. package/dist/cjs/Alert/index.d.ts +37 -0
  2. package/dist/cjs/Alert/index.js +124 -0
  3. package/dist/cjs/Alert/style.less +248 -0
  4. package/dist/cjs/Drawer/index.d.ts +57 -0
  5. package/dist/cjs/Drawer/index.js +203 -0
  6. package/dist/cjs/Drawer/style.less +215 -0
  7. package/dist/cjs/FloatButton/index.d.ts +54 -0
  8. package/dist/cjs/FloatButton/index.js +119 -0
  9. package/dist/cjs/FloatButton/style.less +266 -0
  10. package/dist/cjs/Message/index.d.ts +38 -0
  11. package/dist/cjs/Message/index.js +292 -0
  12. package/dist/cjs/Message/style.less +183 -0
  13. package/dist/cjs/Modal/index.d.ts +63 -0
  14. package/dist/cjs/Modal/index.js +254 -0
  15. package/dist/cjs/Modal/style.less +298 -0
  16. package/dist/cjs/Notification/index.d.ts +48 -0
  17. package/dist/cjs/Notification/index.js +340 -0
  18. package/dist/cjs/Notification/style.less +260 -0
  19. package/dist/cjs/Popconfirm/index.d.ts +58 -0
  20. package/dist/cjs/Popconfirm/index.js +393 -0
  21. package/dist/cjs/Popconfirm/style.less +417 -0
  22. package/dist/cjs/Progress/index.d.ts +43 -0
  23. package/dist/cjs/Progress/index.js +213 -0
  24. package/dist/cjs/Progress/style.less +206 -0
  25. package/dist/cjs/Result/index.d.ts +25 -0
  26. package/dist/cjs/Result/index.js +63 -0
  27. package/dist/cjs/Result/style.less +111 -0
  28. package/dist/cjs/Skeleton/index.d.ts +88 -0
  29. package/dist/cjs/Skeleton/index.js +207 -0
  30. package/dist/cjs/Skeleton/style.less +487 -0
  31. package/dist/cjs/Spin/index.d.ts +25 -0
  32. package/dist/cjs/Spin/index.js +98 -0
  33. package/dist/cjs/Spin/style.less +169 -0
  34. package/dist/cjs/Tree/index.d.ts +82 -0
  35. package/dist/cjs/Tree/index.js +226 -0
  36. package/dist/cjs/Tree/style.less +313 -0
  37. package/dist/cjs/Watermark/index.d.ts +41 -0
  38. package/dist/cjs/Watermark/index.js +353 -0
  39. package/dist/cjs/Watermark/style.less +31 -0
  40. package/dist/cjs/index.d.ts +27 -1
  41. package/dist/cjs/index.js +91 -0
  42. package/dist/esm/Alert/index.d.ts +37 -0
  43. package/dist/esm/Alert/index.js +121 -0
  44. package/dist/esm/Alert/style.less +248 -0
  45. package/dist/esm/Drawer/index.d.ts +57 -0
  46. package/dist/esm/Drawer/index.js +202 -0
  47. package/dist/esm/Drawer/style.less +215 -0
  48. package/dist/esm/FloatButton/index.d.ts +54 -0
  49. package/dist/esm/FloatButton/index.js +123 -0
  50. package/dist/esm/FloatButton/style.less +266 -0
  51. package/dist/esm/Message/index.d.ts +38 -0
  52. package/dist/esm/Message/index.js +294 -0
  53. package/dist/esm/Message/style.less +183 -0
  54. package/dist/esm/Modal/index.d.ts +63 -0
  55. package/dist/esm/Modal/index.js +251 -0
  56. package/dist/esm/Modal/style.less +298 -0
  57. package/dist/esm/Notification/index.d.ts +48 -0
  58. package/dist/esm/Notification/index.js +345 -0
  59. package/dist/esm/Notification/style.less +260 -0
  60. package/dist/esm/Popconfirm/index.d.ts +58 -0
  61. package/dist/esm/Popconfirm/index.js +389 -0
  62. package/dist/esm/Popconfirm/style.less +417 -0
  63. package/dist/esm/Progress/index.d.ts +43 -0
  64. package/dist/esm/Progress/index.js +208 -0
  65. package/dist/esm/Progress/style.less +206 -0
  66. package/dist/esm/Result/index.d.ts +25 -0
  67. package/dist/esm/Result/index.js +57 -0
  68. package/dist/esm/Result/style.less +111 -0
  69. package/dist/esm/Skeleton/index.d.ts +88 -0
  70. package/dist/esm/Skeleton/index.js +213 -0
  71. package/dist/esm/Skeleton/style.less +487 -0
  72. package/dist/esm/Spin/index.d.ts +25 -0
  73. package/dist/esm/Spin/index.js +95 -0
  74. package/dist/esm/Spin/style.less +169 -0
  75. package/dist/esm/Tree/index.d.ts +82 -0
  76. package/dist/esm/Tree/index.js +225 -0
  77. package/dist/esm/Tree/style.less +313 -0
  78. package/dist/esm/Watermark/index.d.ts +41 -0
  79. package/dist/esm/Watermark/index.js +349 -0
  80. package/dist/esm/Watermark/style.less +31 -0
  81. package/dist/esm/index.d.ts +27 -1
  82. package/dist/esm/index.js +14 -1
  83. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+
3
+ 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); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = exports.Modal = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactDom = require("react-dom");
10
+ require("./style.less");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ 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; }
15
+ 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; }
16
+ 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; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
18
+ 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); }
19
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
20
+ 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."); }
21
+ 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); }
22
+ 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; }
23
+ 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; } }
24
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // ============ 类型定义 ============
25
+ /** Modal 属性 */
26
+ // ============ Modal 组件 ============
27
+ var Modal = exports.Modal = function Modal(_ref) {
28
+ var controlledOpen = _ref.open,
29
+ _ref$defaultOpen = _ref.defaultOpen,
30
+ defaultOpen = _ref$defaultOpen === void 0 ? false : _ref$defaultOpen,
31
+ onClose = _ref.onClose,
32
+ afterOpenChange = _ref.afterOpenChange,
33
+ title = _ref.title,
34
+ children = _ref.children,
35
+ _ref$mask = _ref.mask,
36
+ mask = _ref$mask === void 0 ? true : _ref$mask,
37
+ _ref$maskClosable = _ref.maskClosable,
38
+ maskClosable = _ref$maskClosable === void 0 ? true : _ref$maskClosable,
39
+ _ref$closable = _ref.closable,
40
+ closable = _ref$closable === void 0 ? true : _ref$closable,
41
+ closeIcon = _ref.closeIcon,
42
+ maskStyle = _ref.maskStyle,
43
+ bodyStyle = _ref.bodyStyle,
44
+ headerStyle = _ref.headerStyle,
45
+ footerStyle = _ref.footerStyle,
46
+ footer = _ref.footer,
47
+ _ref$width = _ref.width,
48
+ width = _ref$width === void 0 ? 520 : _ref$width,
49
+ _ref$centered = _ref.centered,
50
+ centered = _ref$centered === void 0 ? false : _ref$centered,
51
+ _ref$className = _ref.className,
52
+ className = _ref$className === void 0 ? '' : _ref$className,
53
+ style = _ref.style,
54
+ _ref$zIndex = _ref.zIndex,
55
+ zIndex = _ref$zIndex === void 0 ? 1000 : _ref$zIndex,
56
+ _ref$keyboard = _ref.keyboard,
57
+ keyboard = _ref$keyboard === void 0 ? true : _ref$keyboard,
58
+ _ref$destroyOnClose = _ref.destroyOnClose,
59
+ destroyOnClose = _ref$destroyOnClose === void 0 ? false : _ref$destroyOnClose,
60
+ _ref$maskClassName = _ref.maskClassName,
61
+ maskClassName = _ref$maskClassName === void 0 ? '' : _ref$maskClassName,
62
+ _ref$okText = _ref.okText,
63
+ okText = _ref$okText === void 0 ? '确定' : _ref$okText,
64
+ _ref$cancelText = _ref.cancelText,
65
+ cancelText = _ref$cancelText === void 0 ? '取消' : _ref$cancelText,
66
+ _ref$confirmLoading = _ref.confirmLoading,
67
+ confirmLoading = _ref$confirmLoading === void 0 ? false : _ref$confirmLoading,
68
+ onOk = _ref.onOk,
69
+ onCancel = _ref.onCancel;
70
+ var _useState = (0, _react.useState)(defaultOpen),
71
+ _useState2 = _slicedToArray(_useState, 2),
72
+ internalOpen = _useState2[0],
73
+ setInternalOpen = _useState2[1];
74
+ var _useState3 = (0, _react.useState)(defaultOpen),
75
+ _useState4 = _slicedToArray(_useState3, 2),
76
+ visible = _useState4[0],
77
+ setVisible = _useState4[1];
78
+ var _useState5 = (0, _react.useState)(defaultOpen),
79
+ _useState6 = _slicedToArray(_useState5, 2),
80
+ mounted = _useState6[0],
81
+ setMounted = _useState6[1];
82
+ var isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
83
+
84
+ // 更新打开状态
85
+ var updateOpen = (0, _react.useCallback)(function (newOpen) {
86
+ if (controlledOpen === undefined) {
87
+ setInternalOpen(newOpen);
88
+ }
89
+ setVisible(newOpen);
90
+ if (newOpen) {
91
+ setMounted(true);
92
+ }
93
+ afterOpenChange === null || afterOpenChange === void 0 || afterOpenChange(newOpen);
94
+ }, [controlledOpen, afterOpenChange]);
95
+
96
+ // 处理关闭
97
+ var handleClose = (0, _react.useCallback)(function (e) {
98
+ onClose === null || onClose === void 0 || onClose(e);
99
+ if (!e.defaultPrevented) {
100
+ updateOpen(false);
101
+ }
102
+ }, [onClose, updateOpen]);
103
+
104
+ // 处理取消
105
+ var handleCancel = (0, _react.useCallback)(function (e) {
106
+ onCancel === null || onCancel === void 0 || onCancel(e);
107
+ if (!e.defaultPrevented) {
108
+ handleClose(e);
109
+ }
110
+ }, [onCancel, handleClose]);
111
+
112
+ // 处理确定
113
+ var handleOk = (0, _react.useCallback)(function (e) {
114
+ onOk === null || onOk === void 0 || onOk(e);
115
+ // 如果 onOk 阻止了默认行为,则不关闭
116
+ if (e.defaultPrevented) {
117
+ return;
118
+ }
119
+ // 默认情况下,点击确定后自动关闭
120
+ handleClose(e);
121
+ }, [onOk, handleClose]);
122
+
123
+ // 处理遮罩点击
124
+ var handleMaskClick = (0, _react.useCallback)(function (e) {
125
+ if (maskClosable && e.target === e.currentTarget) {
126
+ handleClose(e);
127
+ }
128
+ }, [maskClosable, handleClose]);
129
+
130
+ // 键盘 ESC 关闭
131
+ (0, _react.useEffect)(function () {
132
+ if (keyboard && isOpen) {
133
+ var handleKeyDown = function handleKeyDown(e) {
134
+ if (e.key === 'Escape') {
135
+ handleClose(e);
136
+ }
137
+ };
138
+ document.addEventListener('keydown', handleKeyDown);
139
+ return function () {
140
+ document.removeEventListener('keydown', handleKeyDown);
141
+ };
142
+ }
143
+ }, [keyboard, isOpen, handleClose]);
144
+
145
+ // 监听 open 变化
146
+ (0, _react.useEffect)(function () {
147
+ if (isOpen) {
148
+ setMounted(true);
149
+ // 使用 requestAnimationFrame 确保 DOM 更新后再显示
150
+ requestAnimationFrame(function () {
151
+ setVisible(true);
152
+ });
153
+ } else {
154
+ setVisible(false);
155
+ // 等待动画完成后再卸载(如果 destroyOnClose)
156
+ if (destroyOnClose) {
157
+ var timer = setTimeout(function () {
158
+ setMounted(false);
159
+ }, 300);
160
+ return function () {
161
+ return clearTimeout(timer);
162
+ };
163
+ }
164
+ }
165
+ }, [isOpen, destroyOnClose]);
166
+
167
+ // 阻止 body 滚动
168
+ (0, _react.useEffect)(function () {
169
+ if (isOpen) {
170
+ var originalOverflow = document.body.style.overflow;
171
+ document.body.style.overflow = 'hidden';
172
+ return function () {
173
+ document.body.style.overflow = originalOverflow;
174
+ };
175
+ }
176
+ }, [isOpen]);
177
+ if (!mounted) {
178
+ return null;
179
+ }
180
+ var modalClassNames = ['kage-modal', visible && 'kage-modal-open', centered && 'kage-modal-centered', className].filter(Boolean).join(' ');
181
+ var maskClassNames = ['kage-modal-mask', visible && 'kage-modal-mask-open', maskClassName].filter(Boolean).join(' ');
182
+ var widthStyle = {
183
+ width: typeof width === 'number' ? "".concat(width, "px") : width
184
+ };
185
+
186
+ // 渲染默认底部
187
+ var renderDefaultFooter = function renderDefaultFooter() {
188
+ if (footer !== undefined) {
189
+ return footer;
190
+ }
191
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
192
+ className: "kage-modal-footer",
193
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
194
+ type: "button",
195
+ className: "kage-modal-cancel-btn",
196
+ onClick: handleCancel,
197
+ children: cancelText
198
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
199
+ type: "button",
200
+ className: "kage-modal-ok-btn",
201
+ onClick: handleOk,
202
+ disabled: confirmLoading,
203
+ children: confirmLoading ? '加载中...' : okText
204
+ })]
205
+ });
206
+ };
207
+ var modalContent = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
208
+ children: [mask && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
209
+ className: maskClassNames,
210
+ style: _objectSpread({
211
+ zIndex: zIndex
212
+ }, maskStyle),
213
+ onClick: handleMaskClick
214
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
215
+ className: modalClassNames,
216
+ style: _objectSpread({
217
+ zIndex: zIndex
218
+ }, style),
219
+ role: "dialog",
220
+ "aria-modal": "true",
221
+ onClick: function onClick(e) {
222
+ return e.stopPropagation();
223
+ },
224
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
225
+ className: "kage-modal-wrap",
226
+ style: widthStyle,
227
+ children: [title !== undefined || closable ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
228
+ className: "kage-modal-header",
229
+ style: headerStyle,
230
+ children: [title && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
231
+ className: "kage-modal-title",
232
+ children: title
233
+ }), closable && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
234
+ type: "button",
235
+ className: "kage-modal-close",
236
+ onClick: handleClose,
237
+ "aria-label": "\u5173\u95ED",
238
+ children: closeIcon || '×'
239
+ })]
240
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
241
+ className: "kage-modal-body",
242
+ style: bodyStyle,
243
+ children: children
244
+ }), footer !== null && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
245
+ className: "kage-modal-footer-wrapper",
246
+ style: footerStyle,
247
+ children: renderDefaultFooter()
248
+ })]
249
+ })
250
+ })]
251
+ });
252
+ return /*#__PURE__*/(0, _reactDom.createPortal)(modalContent, document.body);
253
+ };
254
+ var _default = exports.default = Modal;
@@ -0,0 +1,298 @@
1
+ // Modal 对话框组件样式
2
+
3
+ @prefix: kage-modal;
4
+
5
+ // 颜色变量
6
+ @modal-bg: #fff;
7
+ @modal-mask-bg: rgba(0, 0, 0, 0.45);
8
+ @modal-border-color: rgba(0, 0, 0, 0.06);
9
+ @modal-title-color: rgba(0, 0, 0, 0.85);
10
+ @modal-text-color: rgba(0, 0, 0, 0.65);
11
+ @modal-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),
12
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05);
13
+
14
+ // ============ 遮罩层 ============
15
+ .@{prefix}-mask {
16
+ position: fixed;
17
+ top: 0;
18
+ left: 0;
19
+ right: 0;
20
+ bottom: 0;
21
+ background-color: @modal-mask-bg;
22
+ opacity: 0;
23
+ visibility: hidden;
24
+ transition: opacity 0.3s, visibility 0.3s;
25
+
26
+ &-open {
27
+ opacity: 1;
28
+ visibility: visible;
29
+ }
30
+ }
31
+
32
+ // ============ Modal 主体 ============
33
+ .@{prefix} {
34
+ position: fixed;
35
+ top: 0;
36
+ left: 0;
37
+ right: 0;
38
+ bottom: 0;
39
+ z-index: 1000;
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ pointer-events: none;
44
+ opacity: 0;
45
+ transition: opacity 0.3s;
46
+
47
+ &-open {
48
+ opacity: 1;
49
+ pointer-events: auto;
50
+ }
51
+
52
+ &-centered {
53
+ align-items: center;
54
+ }
55
+
56
+ * {
57
+ box-sizing: border-box;
58
+ }
59
+ }
60
+
61
+ // ============ Modal 包装器 ============
62
+ .@{prefix}-wrap {
63
+ position: relative;
64
+ max-width: calc(100vw - 32px);
65
+ max-height: calc(100vh - 32px);
66
+ margin: 0 auto;
67
+ background-color: @modal-bg;
68
+ border-radius: 8px;
69
+ box-shadow: @modal-shadow;
70
+ transform: scale(0.9);
71
+ transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
72
+ pointer-events: auto;
73
+ display: flex;
74
+ flex-direction: column;
75
+ overflow: hidden;
76
+ }
77
+
78
+ .@{prefix}-open .@{prefix}-wrap {
79
+ transform: scale(1);
80
+ }
81
+
82
+ // ============ 头部 ============
83
+ .@{prefix}-header {
84
+ position: relative;
85
+ display: flex;
86
+ align-items: center;
87
+ padding: 16px 24px;
88
+ border-bottom: 1px solid @modal-border-color;
89
+ flex-shrink: 0;
90
+ }
91
+
92
+ .@{prefix}-title {
93
+ flex: 1;
94
+ margin: 0;
95
+ color: @modal-title-color;
96
+ font-size: 16px;
97
+ font-weight: 500;
98
+ line-height: 1.5;
99
+ overflow: hidden;
100
+ text-overflow: ellipsis;
101
+ white-space: nowrap;
102
+ }
103
+
104
+ // ============ 关闭按钮 ============
105
+ .@{prefix}-close {
106
+ position: absolute;
107
+ top: 0;
108
+ right: 0;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ width: 56px;
113
+ height: 56px;
114
+ padding: 0;
115
+ margin: 0;
116
+ color: rgba(0, 0, 0, 0.45);
117
+ font-size: 16px;
118
+ line-height: 1;
119
+ text-align: center;
120
+ background: transparent;
121
+ border: none;
122
+ border-radius: 0;
123
+ cursor: pointer;
124
+ transition: all 0.2s;
125
+
126
+ &:hover {
127
+ color: rgba(0, 0, 0, 0.85);
128
+ background-color: rgba(0, 0, 0, 0.06);
129
+ }
130
+
131
+ &:active {
132
+ background-color: rgba(0, 0, 0, 0.1);
133
+ }
134
+ }
135
+
136
+ // ============ 内容区域 ============
137
+ .@{prefix}-body {
138
+ flex: 1;
139
+ padding: 24px;
140
+ overflow: auto;
141
+ color: @modal-text-color;
142
+ font-size: 14px;
143
+ line-height: 1.5715;
144
+ }
145
+
146
+ // ============ 底部 ============
147
+ .@{prefix}-footer-wrapper {
148
+ padding: 10px 16px;
149
+ border-top: 1px solid @modal-border-color;
150
+ flex-shrink: 0;
151
+ }
152
+
153
+ .@{prefix}-footer {
154
+ display: flex;
155
+ justify-content: flex-end;
156
+ gap: 8px;
157
+ }
158
+
159
+ .@{prefix}-ok-btn,
160
+ .@{prefix}-cancel-btn {
161
+ padding: 4px 15px;
162
+ font-size: 14px;
163
+ line-height: 1.5715;
164
+ border-radius: 6px;
165
+ cursor: pointer;
166
+ transition: all 0.2s;
167
+ border: 1px solid #d9d9d9;
168
+ background: #fff;
169
+ color: rgba(0, 0, 0, 0.85);
170
+
171
+ &:hover {
172
+ color: #1890ff;
173
+ border-color: #1890ff;
174
+ }
175
+
176
+ &:active {
177
+ color: #0958d9;
178
+ border-color: #0958d9;
179
+ }
180
+
181
+ &:disabled {
182
+ color: rgba(0, 0, 0, 0.25);
183
+ background: #f5f5f5;
184
+ border-color: #d9d9d9;
185
+ cursor: not-allowed;
186
+
187
+ &:hover {
188
+ color: rgba(0, 0, 0, 0.25);
189
+ border-color: #d9d9d9;
190
+ }
191
+ }
192
+ }
193
+
194
+ .@{prefix}-ok-btn {
195
+ background: #1890ff;
196
+ border-color: #1890ff;
197
+ color: #fff;
198
+
199
+ &:hover {
200
+ background: #40a9ff;
201
+ border-color: #40a9ff;
202
+ color: #fff;
203
+ }
204
+
205
+ &:active {
206
+ background: #0958d9;
207
+ border-color: #0958d9;
208
+ color: #fff;
209
+ }
210
+
211
+ &:disabled {
212
+ background: #f5f5f5;
213
+ border-color: #d9d9d9;
214
+ color: rgba(0, 0, 0, 0.25);
215
+ }
216
+ }
217
+
218
+ // ============ 暗色模式适配 ============
219
+ [data-theme='dark'],
220
+ [data-prefers-color-scheme='dark'],
221
+ [data-prefers-color='dark'],
222
+ html.dark,
223
+ body.dark,
224
+ .dark {
225
+ .@{prefix}-mask {
226
+ background-color: rgba(0, 0, 0, 0.65);
227
+ }
228
+
229
+ .@{prefix}-wrap {
230
+ background-color: #1f1f1f;
231
+ box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.48), 0 3px 6px -4px rgba(0, 0, 0, 0.32),
232
+ 0 9px 28px 8px rgba(0, 0, 0, 0.2);
233
+ }
234
+
235
+ .@{prefix}-header {
236
+ border-bottom-color: rgba(255, 255, 255, 0.1);
237
+ }
238
+
239
+ .@{prefix}-title {
240
+ color: rgba(255, 255, 255, 0.85);
241
+ }
242
+
243
+ .@{prefix}-close {
244
+ color: rgba(255, 255, 255, 0.45);
245
+
246
+ &:hover {
247
+ color: rgba(255, 255, 255, 0.85);
248
+ background-color: rgba(255, 255, 255, 0.08);
249
+ }
250
+
251
+ &:active {
252
+ background-color: rgba(255, 255, 255, 0.12);
253
+ }
254
+ }
255
+
256
+ .@{prefix}-body {
257
+ color: rgba(255, 255, 255, 0.65);
258
+ }
259
+
260
+ .@{prefix}-footer-wrapper {
261
+ border-top-color: rgba(255, 255, 255, 0.1);
262
+ }
263
+
264
+ .@{prefix}-cancel-btn {
265
+ background: #1f1f1f;
266
+ border-color: rgba(255, 255, 255, 0.3);
267
+ color: rgba(255, 255, 255, 0.85);
268
+
269
+ &:hover {
270
+ color: #1890ff;
271
+ border-color: #1890ff;
272
+ }
273
+
274
+ &:disabled {
275
+ background: rgba(255, 255, 255, 0.08);
276
+ border-color: rgba(255, 255, 255, 0.15);
277
+ color: rgba(255, 255, 255, 0.25);
278
+ }
279
+ }
280
+
281
+ .@{prefix}-ok-btn {
282
+ background: #1890ff;
283
+ border-color: #1890ff;
284
+ color: #fff;
285
+
286
+ &:hover {
287
+ background: #40a9ff;
288
+ border-color: #40a9ff;
289
+ }
290
+
291
+ &:disabled {
292
+ background: rgba(255, 255, 255, 0.08);
293
+ border-color: rgba(255, 255, 255, 0.15);
294
+ color: rgba(255, 255, 255, 0.25);
295
+ }
296
+ }
297
+ }
298
+
@@ -0,0 +1,48 @@
1
+ import React, { ReactNode, CSSProperties } from 'react';
2
+ import './style.less';
3
+ /** Notification 类型 */
4
+ export type NotificationType = 'success' | 'info' | 'warning' | 'error';
5
+ /** Notification 位置 */
6
+ export type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
7
+ /** Notification 配置 */
8
+ export interface NotificationConfig {
9
+ /** 通知标题 */
10
+ message?: ReactNode;
11
+ /** 通知内容 */
12
+ description?: ReactNode;
13
+ /** 通知类型 */
14
+ type?: NotificationType;
15
+ /** 自动关闭的延时,单位秒。设为 0 时不自动关闭 */
16
+ duration?: number;
17
+ /** 自定义图标 */
18
+ icon?: ReactNode;
19
+ /** 自定义关闭图标 */
20
+ closeIcon?: ReactNode;
21
+ /** 是否显示关闭按钮 */
22
+ closable?: boolean;
23
+ /** 自定义类名 */
24
+ className?: string;
25
+ /** 自定义样式 */
26
+ style?: CSSProperties;
27
+ /** 关闭时的回调 */
28
+ onClose?: () => void;
29
+ /** 通知唯一标识 */
30
+ key?: string | number;
31
+ /** 通知位置 */
32
+ placement?: NotificationPlacement;
33
+ }
34
+ /** Notification API */
35
+ export interface NotificationApi {
36
+ success: (config: NotificationConfig | ReactNode, description?: ReactNode) => void;
37
+ error: (config: NotificationConfig | ReactNode, description?: ReactNode) => void;
38
+ info: (config: NotificationConfig | ReactNode, description?: ReactNode) => void;
39
+ warning: (config: NotificationConfig | ReactNode, description?: ReactNode) => void;
40
+ open: (config: NotificationConfig) => void;
41
+ destroy: (key?: string | number) => void;
42
+ close: (key: string | number) => void;
43
+ }
44
+ declare const NotificationContainer: React.FC;
45
+ export declare const Notification: NotificationApi & {
46
+ Container: typeof NotificationContainer;
47
+ };
48
+ export default Notification;