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,37 @@
|
|
|
1
|
+
import React, { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
/** Alert 类型 */
|
|
4
|
+
export type AlertType = 'success' | 'info' | 'warning' | 'error';
|
|
5
|
+
/** Alert 属性 */
|
|
6
|
+
export interface AlertProps {
|
|
7
|
+
/** 警告提示内容 */
|
|
8
|
+
message?: ReactNode;
|
|
9
|
+
/** 警告提示的辅助性文字介绍 */
|
|
10
|
+
description?: ReactNode;
|
|
11
|
+
/** 指定警告的样式类型 */
|
|
12
|
+
type?: AlertType;
|
|
13
|
+
/** 是否显示辅助图标 */
|
|
14
|
+
showIcon?: boolean;
|
|
15
|
+
/** 自定义图标 */
|
|
16
|
+
icon?: ReactNode;
|
|
17
|
+
/** 自定义关闭按钮 */
|
|
18
|
+
closeIcon?: ReactNode;
|
|
19
|
+
/** 是否显示关闭按钮 */
|
|
20
|
+
closable?: boolean;
|
|
21
|
+
/** 关闭时触发的回调函数 */
|
|
22
|
+
onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
23
|
+
/** 关闭动画结束后触发的回调函数 */
|
|
24
|
+
afterClose?: () => void;
|
|
25
|
+
/** 自定义操作项 */
|
|
26
|
+
action?: ReactNode;
|
|
27
|
+
/** 自定义类名 */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** 自定义样式 */
|
|
30
|
+
style?: CSSProperties;
|
|
31
|
+
/** 是否用图标和标题换行 */
|
|
32
|
+
banner?: boolean;
|
|
33
|
+
/** 子元素 */
|
|
34
|
+
children?: ReactNode;
|
|
35
|
+
}
|
|
36
|
+
export declare const Alert: React.FC<AlertProps>;
|
|
37
|
+
export default Alert;
|
|
@@ -0,0 +1,124 @@
|
|
|
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.Alert = void 0;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
require("./style.less");
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
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); }
|
|
12
|
+
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; }
|
|
13
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
14
|
+
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."); }
|
|
15
|
+
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); }
|
|
16
|
+
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; }
|
|
17
|
+
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; } }
|
|
18
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // ============ 类型定义 ============
|
|
19
|
+
/** Alert 类型 */ /** Alert 属性 */
|
|
20
|
+
// ============ 默认图标 ============
|
|
21
|
+
var defaultIcons = {
|
|
22
|
+
success: '✓',
|
|
23
|
+
info: 'ℹ',
|
|
24
|
+
warning: '⚠',
|
|
25
|
+
error: '✕'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// ============ Alert 组件 ============
|
|
29
|
+
var Alert = exports.Alert = function Alert(_ref) {
|
|
30
|
+
var message = _ref.message,
|
|
31
|
+
description = _ref.description,
|
|
32
|
+
_ref$type = _ref.type,
|
|
33
|
+
type = _ref$type === void 0 ? 'info' : _ref$type,
|
|
34
|
+
_ref$showIcon = _ref.showIcon,
|
|
35
|
+
showIcon = _ref$showIcon === void 0 ? false : _ref$showIcon,
|
|
36
|
+
icon = _ref.icon,
|
|
37
|
+
closeIcon = _ref.closeIcon,
|
|
38
|
+
_ref$closable = _ref.closable,
|
|
39
|
+
closable = _ref$closable === void 0 ? false : _ref$closable,
|
|
40
|
+
onClose = _ref.onClose,
|
|
41
|
+
afterClose = _ref.afterClose,
|
|
42
|
+
action = _ref.action,
|
|
43
|
+
_ref$className = _ref.className,
|
|
44
|
+
className = _ref$className === void 0 ? '' : _ref$className,
|
|
45
|
+
style = _ref.style,
|
|
46
|
+
_ref$banner = _ref.banner,
|
|
47
|
+
banner = _ref$banner === void 0 ? false : _ref$banner,
|
|
48
|
+
children = _ref.children;
|
|
49
|
+
var _useState = (0, _react.useState)(true),
|
|
50
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
51
|
+
visible = _useState2[0],
|
|
52
|
+
setVisible = _useState2[1];
|
|
53
|
+
var _useState3 = (0, _react.useState)(false),
|
|
54
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
55
|
+
closing = _useState4[0],
|
|
56
|
+
setClosing = _useState4[1];
|
|
57
|
+
|
|
58
|
+
// 处理关闭
|
|
59
|
+
var handleClose = function handleClose(e) {
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
onClose === null || onClose === void 0 || onClose(e);
|
|
62
|
+
if (!e.defaultPrevented) {
|
|
63
|
+
setClosing(true);
|
|
64
|
+
setTimeout(function () {
|
|
65
|
+
setVisible(false);
|
|
66
|
+
afterClose === null || afterClose === void 0 || afterClose();
|
|
67
|
+
}, 300); // 等待动画完成
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
if (!visible) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
var classNames = ['kage-alert', "kage-alert-".concat(type), showIcon && 'kage-alert-with-icon', closable && 'kage-alert-closable', banner && 'kage-alert-banner', closing && 'kage-alert-closing', className].filter(Boolean).join(' ');
|
|
74
|
+
|
|
75
|
+
// 渲染图标
|
|
76
|
+
var renderIcon = function renderIcon() {
|
|
77
|
+
if (!showIcon && !icon) return null;
|
|
78
|
+
var iconNode = icon || defaultIcons[type];
|
|
79
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
80
|
+
className: "kage-alert-icon",
|
|
81
|
+
children: iconNode
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// 渲染关闭按钮
|
|
86
|
+
var renderCloseIcon = function renderCloseIcon() {
|
|
87
|
+
if (!closable) return null;
|
|
88
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
89
|
+
type: "button",
|
|
90
|
+
className: "kage-alert-close-icon",
|
|
91
|
+
onClick: handleClose,
|
|
92
|
+
"aria-label": "\u5173\u95ED",
|
|
93
|
+
children: closeIcon || '×'
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// 渲染操作按钮
|
|
98
|
+
var renderAction = function renderAction() {
|
|
99
|
+
if (!action) return null;
|
|
100
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
101
|
+
className: "kage-alert-action",
|
|
102
|
+
children: action
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// 使用 children 或 message
|
|
107
|
+
var content = children || message;
|
|
108
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
109
|
+
className: classNames,
|
|
110
|
+
style: style,
|
|
111
|
+
role: "alert",
|
|
112
|
+
children: [renderIcon(), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
113
|
+
className: "kage-alert-content",
|
|
114
|
+
children: [content && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
115
|
+
className: "kage-alert-message",
|
|
116
|
+
children: content
|
|
117
|
+
}), description && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
118
|
+
className: "kage-alert-description",
|
|
119
|
+
children: description
|
|
120
|
+
})]
|
|
121
|
+
}), renderAction(), renderCloseIcon()]
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
var _default = exports.default = Alert;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// Alert 警告提示样式
|
|
2
|
+
|
|
3
|
+
@prefix: kage-alert;
|
|
4
|
+
|
|
5
|
+
// 颜色变量
|
|
6
|
+
@alert-success-bg: #f6ffed;
|
|
7
|
+
@alert-success-border: #b7eb8f;
|
|
8
|
+
@alert-success-icon: #52c41a;
|
|
9
|
+
@alert-info-bg: #e6f7ff;
|
|
10
|
+
@alert-info-border: #91d5ff;
|
|
11
|
+
@alert-info-icon: #1890ff;
|
|
12
|
+
@alert-warning-bg: #fffbe6;
|
|
13
|
+
@alert-warning-border: #ffe58f;
|
|
14
|
+
@alert-warning-icon: #faad14;
|
|
15
|
+
@alert-error-bg: #fff2f0;
|
|
16
|
+
@alert-error-border: #ffccc7;
|
|
17
|
+
@alert-error-icon: #ff4d4f;
|
|
18
|
+
|
|
19
|
+
// ============ 主容器 ============
|
|
20
|
+
.@{prefix} {
|
|
21
|
+
position: relative;
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: flex-start;
|
|
24
|
+
padding: 8px 15px;
|
|
25
|
+
margin-bottom: 16px;
|
|
26
|
+
font-size: 14px;
|
|
27
|
+
line-height: 1.5715;
|
|
28
|
+
border: 1px solid;
|
|
29
|
+
border-radius: 6px;
|
|
30
|
+
transition: all 0.3s;
|
|
31
|
+
|
|
32
|
+
* {
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ============ 不同类型 ============
|
|
38
|
+
.@{prefix}-success {
|
|
39
|
+
background-color: @alert-success-bg;
|
|
40
|
+
border-color: @alert-success-border;
|
|
41
|
+
color: rgba(0, 0, 0, 0.85);
|
|
42
|
+
|
|
43
|
+
.@{prefix}-icon {
|
|
44
|
+
color: @alert-success-icon;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.@{prefix}-info {
|
|
49
|
+
background-color: @alert-info-bg;
|
|
50
|
+
border-color: @alert-info-border;
|
|
51
|
+
color: rgba(0, 0, 0, 0.85);
|
|
52
|
+
|
|
53
|
+
.@{prefix}-icon {
|
|
54
|
+
color: @alert-info-icon;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.@{prefix}-warning {
|
|
59
|
+
background-color: @alert-warning-bg;
|
|
60
|
+
border-color: @alert-warning-border;
|
|
61
|
+
color: rgba(0, 0, 0, 0.85);
|
|
62
|
+
|
|
63
|
+
.@{prefix}-icon {
|
|
64
|
+
color: @alert-warning-icon;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.@{prefix}-error {
|
|
69
|
+
background-color: @alert-error-bg;
|
|
70
|
+
border-color: @alert-error-border;
|
|
71
|
+
color: rgba(0, 0, 0, 0.85);
|
|
72
|
+
|
|
73
|
+
.@{prefix}-icon {
|
|
74
|
+
color: @alert-error-icon;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ============ 图标 ============
|
|
79
|
+
.@{prefix}-icon {
|
|
80
|
+
display: flex;
|
|
81
|
+
align-items: center;
|
|
82
|
+
margin-right: 8px;
|
|
83
|
+
font-size: 16px;
|
|
84
|
+
line-height: 1;
|
|
85
|
+
flex-shrink: 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.@{prefix}-with-icon {
|
|
89
|
+
padding-left: 37px;
|
|
90
|
+
|
|
91
|
+
.@{prefix}-icon {
|
|
92
|
+
position: absolute;
|
|
93
|
+
top: 8px;
|
|
94
|
+
left: 15px;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ============ 内容区域 ============
|
|
99
|
+
.@{prefix}-content {
|
|
100
|
+
flex: 1;
|
|
101
|
+
min-width: 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.@{prefix}-message {
|
|
105
|
+
margin-bottom: 4px;
|
|
106
|
+
font-size: 14px;
|
|
107
|
+
font-weight: 500;
|
|
108
|
+
line-height: 1.5715;
|
|
109
|
+
color: rgba(0, 0, 0, 0.85);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.@{prefix}-description {
|
|
113
|
+
font-size: 14px;
|
|
114
|
+
line-height: 1.5715;
|
|
115
|
+
color: rgba(0, 0, 0, 0.65);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ============ 操作按钮 ============
|
|
119
|
+
.@{prefix}-action {
|
|
120
|
+
margin-left: 8px;
|
|
121
|
+
flex-shrink: 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ============ 关闭按钮 ============
|
|
125
|
+
.@{prefix}-close-icon {
|
|
126
|
+
position: absolute;
|
|
127
|
+
top: 8px;
|
|
128
|
+
right: 15px;
|
|
129
|
+
padding: 0;
|
|
130
|
+
margin: 0;
|
|
131
|
+
color: rgba(0, 0, 0, 0.45);
|
|
132
|
+
font-size: 12px;
|
|
133
|
+
line-height: 1;
|
|
134
|
+
text-align: center;
|
|
135
|
+
background: transparent;
|
|
136
|
+
border: none;
|
|
137
|
+
border-radius: 2px;
|
|
138
|
+
cursor: pointer;
|
|
139
|
+
transition: all 0.2s;
|
|
140
|
+
flex-shrink: 0;
|
|
141
|
+
|
|
142
|
+
&:hover {
|
|
143
|
+
color: rgba(0, 0, 0, 0.85);
|
|
144
|
+
background-color: rgba(0, 0, 0, 0.06);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
&:active {
|
|
148
|
+
background-color: rgba(0, 0, 0, 0.1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.@{prefix}-closable {
|
|
153
|
+
padding-right: 30px;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ============ Banner 模式 ============
|
|
157
|
+
.@{prefix}-banner {
|
|
158
|
+
border-radius: 0;
|
|
159
|
+
border-left: none;
|
|
160
|
+
border-right: none;
|
|
161
|
+
margin-bottom: 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ============ 关闭动画 ============
|
|
165
|
+
.@{prefix}-closing {
|
|
166
|
+
opacity: 0;
|
|
167
|
+
transform: scale(0.95);
|
|
168
|
+
margin-bottom: 0;
|
|
169
|
+
padding-top: 0;
|
|
170
|
+
padding-bottom: 0;
|
|
171
|
+
height: 0;
|
|
172
|
+
overflow: hidden;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ============ 暗色模式适配 ============
|
|
176
|
+
[data-theme='dark'],
|
|
177
|
+
[data-prefers-color-scheme='dark'],
|
|
178
|
+
[data-prefers-color='dark'],
|
|
179
|
+
html.dark,
|
|
180
|
+
body.dark,
|
|
181
|
+
.dark {
|
|
182
|
+
.@{prefix} {
|
|
183
|
+
background-color: #1f1f1f;
|
|
184
|
+
color: rgba(255, 255, 255, 0.85);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.@{prefix}-success {
|
|
188
|
+
background-color: rgba(82, 196, 26, 0.1);
|
|
189
|
+
border-color: rgba(82, 196, 26, 0.3);
|
|
190
|
+
color: rgba(255, 255, 255, 0.85);
|
|
191
|
+
|
|
192
|
+
.@{prefix}-icon {
|
|
193
|
+
color: #52c41a;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.@{prefix}-info {
|
|
198
|
+
background-color: rgba(24, 144, 255, 0.1);
|
|
199
|
+
border-color: rgba(24, 144, 255, 0.3);
|
|
200
|
+
color: rgba(255, 255, 255, 0.85);
|
|
201
|
+
|
|
202
|
+
.@{prefix}-icon {
|
|
203
|
+
color: #1890ff;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.@{prefix}-warning {
|
|
208
|
+
background-color: rgba(250, 173, 20, 0.1);
|
|
209
|
+
border-color: rgba(250, 173, 20, 0.3);
|
|
210
|
+
color: rgba(255, 255, 255, 0.85);
|
|
211
|
+
|
|
212
|
+
.@{prefix}-icon {
|
|
213
|
+
color: #faad14;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.@{prefix}-error {
|
|
218
|
+
background-color: rgba(255, 77, 79, 0.1);
|
|
219
|
+
border-color: rgba(255, 77, 79, 0.3);
|
|
220
|
+
color: rgba(255, 255, 255, 0.85);
|
|
221
|
+
|
|
222
|
+
.@{prefix}-icon {
|
|
223
|
+
color: #ff4d4f;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.@{prefix}-message {
|
|
228
|
+
color: rgba(255, 255, 255, 0.85);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.@{prefix}-description {
|
|
232
|
+
color: rgba(255, 255, 255, 0.65);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.@{prefix}-close-icon {
|
|
236
|
+
color: rgba(255, 255, 255, 0.45);
|
|
237
|
+
|
|
238
|
+
&:hover {
|
|
239
|
+
color: rgba(255, 255, 255, 0.85);
|
|
240
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
&:active {
|
|
244
|
+
background-color: rgba(255, 255, 255, 0.12);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React, { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
/** Drawer 位置 */
|
|
4
|
+
export type DrawerPlacement = 'top' | 'right' | 'bottom' | 'left';
|
|
5
|
+
/** Drawer 属性 */
|
|
6
|
+
export interface DrawerProps {
|
|
7
|
+
/** 是否显示 */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** 默认是否显示 */
|
|
10
|
+
defaultOpen?: boolean;
|
|
11
|
+
/** 显示隐藏的回调 */
|
|
12
|
+
onClose?: (e: React.MouseEvent | React.KeyboardEvent) => void;
|
|
13
|
+
/** 关闭后的回调 */
|
|
14
|
+
afterOpenChange?: (open: boolean) => void;
|
|
15
|
+
/** 标题 */
|
|
16
|
+
title?: ReactNode;
|
|
17
|
+
/** 内容 */
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
/** 抽屉的位置 */
|
|
20
|
+
placement?: DrawerPlacement;
|
|
21
|
+
/** 是否显示遮罩 */
|
|
22
|
+
mask?: boolean;
|
|
23
|
+
/** 点击遮罩是否关闭 */
|
|
24
|
+
maskClosable?: boolean;
|
|
25
|
+
/** 是否显示关闭按钮 */
|
|
26
|
+
closable?: boolean;
|
|
27
|
+
/** 自定义关闭图标 */
|
|
28
|
+
closeIcon?: ReactNode;
|
|
29
|
+
/** 自定义遮罩样式 */
|
|
30
|
+
maskStyle?: CSSProperties;
|
|
31
|
+
/** 自定义主体内容样式 */
|
|
32
|
+
bodyStyle?: CSSProperties;
|
|
33
|
+
/** 自定义头部样式 */
|
|
34
|
+
headerStyle?: CSSProperties;
|
|
35
|
+
/** 自定义底部样式 */
|
|
36
|
+
footerStyle?: CSSProperties;
|
|
37
|
+
/** 底部内容 */
|
|
38
|
+
footer?: ReactNode;
|
|
39
|
+
/** 宽度(placement 为 left 或 right 时) */
|
|
40
|
+
width?: number | string;
|
|
41
|
+
/** 高度(placement 为 top 或 bottom 时) */
|
|
42
|
+
height?: number | string;
|
|
43
|
+
/** 自定义类名 */
|
|
44
|
+
className?: string;
|
|
45
|
+
/** 自定义样式 */
|
|
46
|
+
style?: CSSProperties;
|
|
47
|
+
/** z-index */
|
|
48
|
+
zIndex?: number;
|
|
49
|
+
/** 是否支持键盘 ESC 关闭 */
|
|
50
|
+
keyboard?: boolean;
|
|
51
|
+
/** 是否在关闭时销毁 Drawer 里的子元素 */
|
|
52
|
+
destroyOnClose?: boolean;
|
|
53
|
+
/** 是否显示遮罩背景 */
|
|
54
|
+
maskClassName?: string;
|
|
55
|
+
}
|
|
56
|
+
export declare const Drawer: React.FC<DrawerProps>;
|
|
57
|
+
export default Drawer;
|
|
@@ -0,0 +1,203 @@
|
|
|
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.Drawer = 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
|
+
/** Drawer 位置 */ /** Drawer 属性 */
|
|
26
|
+
// ============ Drawer 组件 ============
|
|
27
|
+
var Drawer = exports.Drawer = function Drawer(_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$placement = _ref.placement,
|
|
36
|
+
placement = _ref$placement === void 0 ? 'right' : _ref$placement,
|
|
37
|
+
_ref$mask = _ref.mask,
|
|
38
|
+
mask = _ref$mask === void 0 ? true : _ref$mask,
|
|
39
|
+
_ref$maskClosable = _ref.maskClosable,
|
|
40
|
+
maskClosable = _ref$maskClosable === void 0 ? true : _ref$maskClosable,
|
|
41
|
+
_ref$closable = _ref.closable,
|
|
42
|
+
closable = _ref$closable === void 0 ? true : _ref$closable,
|
|
43
|
+
closeIcon = _ref.closeIcon,
|
|
44
|
+
maskStyle = _ref.maskStyle,
|
|
45
|
+
bodyStyle = _ref.bodyStyle,
|
|
46
|
+
headerStyle = _ref.headerStyle,
|
|
47
|
+
footerStyle = _ref.footerStyle,
|
|
48
|
+
footer = _ref.footer,
|
|
49
|
+
_ref$width = _ref.width,
|
|
50
|
+
width = _ref$width === void 0 ? 378 : _ref$width,
|
|
51
|
+
_ref$height = _ref.height,
|
|
52
|
+
height = _ref$height === void 0 ? 378 : _ref$height,
|
|
53
|
+
_ref$className = _ref.className,
|
|
54
|
+
className = _ref$className === void 0 ? '' : _ref$className,
|
|
55
|
+
style = _ref.style,
|
|
56
|
+
_ref$zIndex = _ref.zIndex,
|
|
57
|
+
zIndex = _ref$zIndex === void 0 ? 1000 : _ref$zIndex,
|
|
58
|
+
_ref$keyboard = _ref.keyboard,
|
|
59
|
+
keyboard = _ref$keyboard === void 0 ? true : _ref$keyboard,
|
|
60
|
+
_ref$destroyOnClose = _ref.destroyOnClose,
|
|
61
|
+
destroyOnClose = _ref$destroyOnClose === void 0 ? false : _ref$destroyOnClose,
|
|
62
|
+
_ref$maskClassName = _ref.maskClassName,
|
|
63
|
+
maskClassName = _ref$maskClassName === void 0 ? '' : _ref$maskClassName;
|
|
64
|
+
var _useState = (0, _react.useState)(defaultOpen),
|
|
65
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
66
|
+
internalOpen = _useState2[0],
|
|
67
|
+
setInternalOpen = _useState2[1];
|
|
68
|
+
var _useState3 = (0, _react.useState)(defaultOpen),
|
|
69
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
70
|
+
visible = _useState4[0],
|
|
71
|
+
setVisible = _useState4[1];
|
|
72
|
+
var _useState5 = (0, _react.useState)(defaultOpen),
|
|
73
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
74
|
+
mounted = _useState6[0],
|
|
75
|
+
setMounted = _useState6[1];
|
|
76
|
+
var isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
|
|
77
|
+
|
|
78
|
+
// 更新打开状态
|
|
79
|
+
var updateOpen = (0, _react.useCallback)(function (newOpen) {
|
|
80
|
+
if (controlledOpen === undefined) {
|
|
81
|
+
setInternalOpen(newOpen);
|
|
82
|
+
}
|
|
83
|
+
setVisible(newOpen);
|
|
84
|
+
if (newOpen) {
|
|
85
|
+
setMounted(true);
|
|
86
|
+
}
|
|
87
|
+
afterOpenChange === null || afterOpenChange === void 0 || afterOpenChange(newOpen);
|
|
88
|
+
}, [controlledOpen, afterOpenChange]);
|
|
89
|
+
|
|
90
|
+
// 处理关闭
|
|
91
|
+
var handleClose = (0, _react.useCallback)(function (e) {
|
|
92
|
+
onClose === null || onClose === void 0 || onClose(e);
|
|
93
|
+
if (!e.defaultPrevented) {
|
|
94
|
+
updateOpen(false);
|
|
95
|
+
}
|
|
96
|
+
}, [onClose, updateOpen]);
|
|
97
|
+
|
|
98
|
+
// 处理遮罩点击
|
|
99
|
+
var handleMaskClick = (0, _react.useCallback)(function (e) {
|
|
100
|
+
if (maskClosable && e.target === e.currentTarget) {
|
|
101
|
+
handleClose(e);
|
|
102
|
+
}
|
|
103
|
+
}, [maskClosable, handleClose]);
|
|
104
|
+
|
|
105
|
+
// 键盘 ESC 关闭
|
|
106
|
+
(0, _react.useEffect)(function () {
|
|
107
|
+
if (keyboard && isOpen) {
|
|
108
|
+
var handleKeyDown = function handleKeyDown(e) {
|
|
109
|
+
if (e.key === 'Escape') {
|
|
110
|
+
handleClose(e);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
114
|
+
return function () {
|
|
115
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}, [keyboard, isOpen, handleClose]);
|
|
119
|
+
|
|
120
|
+
// 监听 open 变化
|
|
121
|
+
(0, _react.useEffect)(function () {
|
|
122
|
+
if (isOpen) {
|
|
123
|
+
setMounted(true);
|
|
124
|
+
// 使用 requestAnimationFrame 确保 DOM 更新后再显示
|
|
125
|
+
requestAnimationFrame(function () {
|
|
126
|
+
setVisible(true);
|
|
127
|
+
});
|
|
128
|
+
} else {
|
|
129
|
+
setVisible(false);
|
|
130
|
+
// 等待动画完成后再卸载(如果 destroyOnClose)
|
|
131
|
+
if (destroyOnClose) {
|
|
132
|
+
var timer = setTimeout(function () {
|
|
133
|
+
setMounted(false);
|
|
134
|
+
}, 300);
|
|
135
|
+
return function () {
|
|
136
|
+
return clearTimeout(timer);
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}, [isOpen, destroyOnClose]);
|
|
141
|
+
|
|
142
|
+
// 阻止 body 滚动
|
|
143
|
+
(0, _react.useEffect)(function () {
|
|
144
|
+
if (isOpen) {
|
|
145
|
+
var originalOverflow = document.body.style.overflow;
|
|
146
|
+
document.body.style.overflow = 'hidden';
|
|
147
|
+
return function () {
|
|
148
|
+
document.body.style.overflow = originalOverflow;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}, [isOpen]);
|
|
152
|
+
if (!mounted) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
var drawerClassNames = ['kage-drawer', "kage-drawer-".concat(placement), visible && 'kage-drawer-open', className].filter(Boolean).join(' ');
|
|
156
|
+
var maskClassNames = ['kage-drawer-mask', visible && 'kage-drawer-mask-open', maskClassName].filter(Boolean).join(' ');
|
|
157
|
+
var sizeStyle = {};
|
|
158
|
+
if (placement === 'left' || placement === 'right') {
|
|
159
|
+
sizeStyle.width = typeof width === 'number' ? "".concat(width, "px") : width;
|
|
160
|
+
} else {
|
|
161
|
+
sizeStyle.height = typeof height === 'number' ? "".concat(height, "px") : height;
|
|
162
|
+
}
|
|
163
|
+
var drawerContent = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
164
|
+
children: [mask && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
165
|
+
className: maskClassNames,
|
|
166
|
+
style: _objectSpread({
|
|
167
|
+
zIndex: zIndex
|
|
168
|
+
}, maskStyle),
|
|
169
|
+
onClick: handleMaskClick
|
|
170
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
171
|
+
className: drawerClassNames,
|
|
172
|
+
style: _objectSpread(_objectSpread({
|
|
173
|
+
zIndex: zIndex
|
|
174
|
+
}, sizeStyle), style),
|
|
175
|
+
role: "dialog",
|
|
176
|
+
"aria-modal": "true",
|
|
177
|
+
children: [title !== undefined || closable ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
178
|
+
className: "kage-drawer-header",
|
|
179
|
+
style: headerStyle,
|
|
180
|
+
children: [title && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
181
|
+
className: "kage-drawer-title",
|
|
182
|
+
children: title
|
|
183
|
+
}), closable && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
184
|
+
type: "button",
|
|
185
|
+
className: "kage-drawer-close",
|
|
186
|
+
onClick: handleClose,
|
|
187
|
+
"aria-label": "\u5173\u95ED",
|
|
188
|
+
children: closeIcon || '×'
|
|
189
|
+
})]
|
|
190
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
191
|
+
className: "kage-drawer-body",
|
|
192
|
+
style: bodyStyle,
|
|
193
|
+
children: children
|
|
194
|
+
}), footer && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
195
|
+
className: "kage-drawer-footer",
|
|
196
|
+
style: footerStyle,
|
|
197
|
+
children: footer
|
|
198
|
+
})]
|
|
199
|
+
})]
|
|
200
|
+
});
|
|
201
|
+
return /*#__PURE__*/(0, _reactDom.createPortal)(drawerContent, document.body);
|
|
202
|
+
};
|
|
203
|
+
var _default = exports.default = Drawer;
|