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,202 @@
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 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; }
3
+ 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; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ 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); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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; }
11
+ 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; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ import React, { useState, useEffect, useCallback } from 'react';
14
+ import { createPortal } from 'react-dom';
15
+ import "./style.less";
16
+
17
+ // ============ 类型定义 ============
18
+
19
+ /** Drawer 位置 */
20
+
21
+ /** Drawer 属性 */
22
+ import { jsx as _jsx } from "react/jsx-runtime";
23
+ import { jsxs as _jsxs } from "react/jsx-runtime";
24
+ import { Fragment as _Fragment } from "react/jsx-runtime";
25
+ // ============ Drawer 组件 ============
26
+ export var Drawer = function Drawer(_ref) {
27
+ var controlledOpen = _ref.open,
28
+ _ref$defaultOpen = _ref.defaultOpen,
29
+ defaultOpen = _ref$defaultOpen === void 0 ? false : _ref$defaultOpen,
30
+ onClose = _ref.onClose,
31
+ afterOpenChange = _ref.afterOpenChange,
32
+ title = _ref.title,
33
+ children = _ref.children,
34
+ _ref$placement = _ref.placement,
35
+ placement = _ref$placement === void 0 ? 'right' : _ref$placement,
36
+ _ref$mask = _ref.mask,
37
+ mask = _ref$mask === void 0 ? true : _ref$mask,
38
+ _ref$maskClosable = _ref.maskClosable,
39
+ maskClosable = _ref$maskClosable === void 0 ? true : _ref$maskClosable,
40
+ _ref$closable = _ref.closable,
41
+ closable = _ref$closable === void 0 ? true : _ref$closable,
42
+ closeIcon = _ref.closeIcon,
43
+ maskStyle = _ref.maskStyle,
44
+ bodyStyle = _ref.bodyStyle,
45
+ headerStyle = _ref.headerStyle,
46
+ footerStyle = _ref.footerStyle,
47
+ footer = _ref.footer,
48
+ _ref$width = _ref.width,
49
+ width = _ref$width === void 0 ? 378 : _ref$width,
50
+ _ref$height = _ref.height,
51
+ height = _ref$height === void 0 ? 378 : _ref$height,
52
+ _ref$className = _ref.className,
53
+ className = _ref$className === void 0 ? '' : _ref$className,
54
+ style = _ref.style,
55
+ _ref$zIndex = _ref.zIndex,
56
+ zIndex = _ref$zIndex === void 0 ? 1000 : _ref$zIndex,
57
+ _ref$keyboard = _ref.keyboard,
58
+ keyboard = _ref$keyboard === void 0 ? true : _ref$keyboard,
59
+ _ref$destroyOnClose = _ref.destroyOnClose,
60
+ destroyOnClose = _ref$destroyOnClose === void 0 ? false : _ref$destroyOnClose,
61
+ _ref$maskClassName = _ref.maskClassName,
62
+ maskClassName = _ref$maskClassName === void 0 ? '' : _ref$maskClassName;
63
+ var _useState = useState(defaultOpen),
64
+ _useState2 = _slicedToArray(_useState, 2),
65
+ internalOpen = _useState2[0],
66
+ setInternalOpen = _useState2[1];
67
+ var _useState3 = useState(defaultOpen),
68
+ _useState4 = _slicedToArray(_useState3, 2),
69
+ visible = _useState4[0],
70
+ setVisible = _useState4[1];
71
+ var _useState5 = useState(defaultOpen),
72
+ _useState6 = _slicedToArray(_useState5, 2),
73
+ mounted = _useState6[0],
74
+ setMounted = _useState6[1];
75
+ var isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
76
+
77
+ // 更新打开状态
78
+ var updateOpen = useCallback(function (newOpen) {
79
+ if (controlledOpen === undefined) {
80
+ setInternalOpen(newOpen);
81
+ }
82
+ setVisible(newOpen);
83
+ if (newOpen) {
84
+ setMounted(true);
85
+ }
86
+ afterOpenChange === null || afterOpenChange === void 0 || afterOpenChange(newOpen);
87
+ }, [controlledOpen, afterOpenChange]);
88
+
89
+ // 处理关闭
90
+ var handleClose = useCallback(function (e) {
91
+ onClose === null || onClose === void 0 || onClose(e);
92
+ if (!e.defaultPrevented) {
93
+ updateOpen(false);
94
+ }
95
+ }, [onClose, updateOpen]);
96
+
97
+ // 处理遮罩点击
98
+ var handleMaskClick = useCallback(function (e) {
99
+ if (maskClosable && e.target === e.currentTarget) {
100
+ handleClose(e);
101
+ }
102
+ }, [maskClosable, handleClose]);
103
+
104
+ // 键盘 ESC 关闭
105
+ useEffect(function () {
106
+ if (keyboard && isOpen) {
107
+ var handleKeyDown = function handleKeyDown(e) {
108
+ if (e.key === 'Escape') {
109
+ handleClose(e);
110
+ }
111
+ };
112
+ document.addEventListener('keydown', handleKeyDown);
113
+ return function () {
114
+ document.removeEventListener('keydown', handleKeyDown);
115
+ };
116
+ }
117
+ }, [keyboard, isOpen, handleClose]);
118
+
119
+ // 监听 open 变化
120
+ useEffect(function () {
121
+ if (isOpen) {
122
+ setMounted(true);
123
+ // 使用 requestAnimationFrame 确保 DOM 更新后再显示
124
+ requestAnimationFrame(function () {
125
+ setVisible(true);
126
+ });
127
+ } else {
128
+ setVisible(false);
129
+ // 等待动画完成后再卸载(如果 destroyOnClose)
130
+ if (destroyOnClose) {
131
+ var timer = setTimeout(function () {
132
+ setMounted(false);
133
+ }, 300);
134
+ return function () {
135
+ return clearTimeout(timer);
136
+ };
137
+ }
138
+ }
139
+ }, [isOpen, destroyOnClose]);
140
+
141
+ // 阻止 body 滚动
142
+ useEffect(function () {
143
+ if (isOpen) {
144
+ var originalOverflow = document.body.style.overflow;
145
+ document.body.style.overflow = 'hidden';
146
+ return function () {
147
+ document.body.style.overflow = originalOverflow;
148
+ };
149
+ }
150
+ }, [isOpen]);
151
+ if (!mounted) {
152
+ return null;
153
+ }
154
+ var drawerClassNames = ['kage-drawer', "kage-drawer-".concat(placement), visible && 'kage-drawer-open', className].filter(Boolean).join(' ');
155
+ var maskClassNames = ['kage-drawer-mask', visible && 'kage-drawer-mask-open', maskClassName].filter(Boolean).join(' ');
156
+ var sizeStyle = {};
157
+ if (placement === 'left' || placement === 'right') {
158
+ sizeStyle.width = typeof width === 'number' ? "".concat(width, "px") : width;
159
+ } else {
160
+ sizeStyle.height = typeof height === 'number' ? "".concat(height, "px") : height;
161
+ }
162
+ var drawerContent = /*#__PURE__*/_jsxs(_Fragment, {
163
+ children: [mask && /*#__PURE__*/_jsx("div", {
164
+ className: maskClassNames,
165
+ style: _objectSpread({
166
+ zIndex: zIndex
167
+ }, maskStyle),
168
+ onClick: handleMaskClick
169
+ }), /*#__PURE__*/_jsxs("div", {
170
+ className: drawerClassNames,
171
+ style: _objectSpread(_objectSpread({
172
+ zIndex: zIndex
173
+ }, sizeStyle), style),
174
+ role: "dialog",
175
+ "aria-modal": "true",
176
+ children: [title !== undefined || closable ? /*#__PURE__*/_jsxs("div", {
177
+ className: "kage-drawer-header",
178
+ style: headerStyle,
179
+ children: [title && /*#__PURE__*/_jsx("div", {
180
+ className: "kage-drawer-title",
181
+ children: title
182
+ }), closable && /*#__PURE__*/_jsx("button", {
183
+ type: "button",
184
+ className: "kage-drawer-close",
185
+ onClick: handleClose,
186
+ "aria-label": "\u5173\u95ED",
187
+ children: closeIcon || '×'
188
+ })]
189
+ }) : null, /*#__PURE__*/_jsx("div", {
190
+ className: "kage-drawer-body",
191
+ style: bodyStyle,
192
+ children: children
193
+ }), footer && /*#__PURE__*/_jsx("div", {
194
+ className: "kage-drawer-footer",
195
+ style: footerStyle,
196
+ children: footer
197
+ })]
198
+ })]
199
+ });
200
+ return /*#__PURE__*/createPortal(drawerContent, document.body);
201
+ };
202
+ export default Drawer;
@@ -0,0 +1,215 @@
1
+ // Drawer 抽屉组件样式
2
+
3
+ @prefix: kage-drawer;
4
+
5
+ // 颜色变量
6
+ @drawer-bg: #fff;
7
+ @drawer-mask-bg: rgba(0, 0, 0, 0.45);
8
+ @drawer-border-color: rgba(0, 0, 0, 0.06);
9
+ @drawer-title-color: rgba(0, 0, 0, 0.85);
10
+ @drawer-text-color: rgba(0, 0, 0, 0.65);
11
+
12
+ // ============ 遮罩层 ============
13
+ .@{prefix}-mask {
14
+ position: fixed;
15
+ top: 0;
16
+ left: 0;
17
+ right: 0;
18
+ bottom: 0;
19
+ background-color: @drawer-mask-bg;
20
+ opacity: 0;
21
+ visibility: hidden;
22
+ transition: opacity 0.3s, visibility 0.3s;
23
+
24
+ &-open {
25
+ opacity: 1;
26
+ visibility: visible;
27
+ }
28
+ }
29
+
30
+ // ============ 抽屉主体 ============
31
+ .@{prefix} {
32
+ position: fixed;
33
+ z-index: 1000;
34
+ display: flex;
35
+ flex-direction: column;
36
+ background-color: @drawer-bg;
37
+ box-shadow: -6px 0 16px 0 rgba(0, 0, 0, 0.08), -3px 0 6px -4px rgba(0, 0, 0, 0.12),
38
+ -9px 0 28px 8px rgba(0, 0, 0, 0.05);
39
+ transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), box-shadow 0.3s;
40
+
41
+ * {
42
+ box-sizing: border-box;
43
+ }
44
+ }
45
+
46
+ // ============ 位置 - 右侧 ============
47
+ .@{prefix}-right {
48
+ top: 0;
49
+ right: 0;
50
+ bottom: 0;
51
+ width: 378px;
52
+ transform: translateX(100%);
53
+
54
+ &.@{prefix}-open {
55
+ transform: translateX(0);
56
+ }
57
+ }
58
+
59
+ // ============ 位置 - 左侧 ============
60
+ .@{prefix}-left {
61
+ top: 0;
62
+ left: 0;
63
+ bottom: 0;
64
+ width: 378px;
65
+ transform: translateX(-100%);
66
+
67
+ &.@{prefix}-open {
68
+ transform: translateX(0);
69
+ }
70
+ }
71
+
72
+ // ============ 位置 - 顶部 ============
73
+ .@{prefix}-top {
74
+ top: 0;
75
+ left: 0;
76
+ right: 0;
77
+ height: 378px;
78
+ transform: translateY(-100%);
79
+
80
+ &.@{prefix}-open {
81
+ transform: translateY(0);
82
+ }
83
+ }
84
+
85
+ // ============ 位置 - 底部 ============
86
+ .@{prefix}-bottom {
87
+ bottom: 0;
88
+ left: 0;
89
+ right: 0;
90
+ height: 378px;
91
+ transform: translateY(100%);
92
+
93
+ &.@{prefix}-open {
94
+ transform: translateY(0);
95
+ }
96
+ }
97
+
98
+ // ============ 头部 ============
99
+ .@{prefix}-header {
100
+ position: relative;
101
+ display: flex;
102
+ align-items: center;
103
+ padding: 16px 24px;
104
+ border-bottom: 1px solid @drawer-border-color;
105
+ flex-shrink: 0;
106
+ }
107
+
108
+ .@{prefix}-title {
109
+ flex: 1;
110
+ margin: 0;
111
+ color: @drawer-title-color;
112
+ font-size: 16px;
113
+ font-weight: 500;
114
+ line-height: 1.5;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ // ============ 关闭按钮 ============
121
+ .@{prefix}-close {
122
+ position: absolute;
123
+ top: 0;
124
+ right: 0;
125
+ display: flex;
126
+ align-items: center;
127
+ justify-content: center;
128
+ width: 56px;
129
+ height: 56px;
130
+ padding: 0;
131
+ margin: 0;
132
+ color: rgba(0, 0, 0, 0.45);
133
+ font-size: 16px;
134
+ line-height: 1;
135
+ text-align: center;
136
+ background: transparent;
137
+ border: none;
138
+ border-radius: 0;
139
+ cursor: pointer;
140
+ transition: all 0.2s;
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
+ // ============ 内容区域 ============
153
+ .@{prefix}-body {
154
+ flex: 1;
155
+ padding: 24px;
156
+ overflow: auto;
157
+ color: @drawer-text-color;
158
+ font-size: 14px;
159
+ line-height: 1.5715;
160
+ }
161
+
162
+ // ============ 底部 ============
163
+ .@{prefix}-footer {
164
+ padding: 10px 16px;
165
+ border-top: 1px solid @drawer-border-color;
166
+ flex-shrink: 0;
167
+ }
168
+
169
+ // ============ 暗色模式适配 ============
170
+ [data-theme='dark'],
171
+ [data-prefers-color-scheme='dark'],
172
+ [data-prefers-color='dark'],
173
+ html.dark,
174
+ body.dark,
175
+ .dark {
176
+ .@{prefix} {
177
+ background-color: #1f1f1f;
178
+ box-shadow: -6px 0 16px 0 rgba(0, 0, 0, 0.48), -3px 0 6px -4px rgba(0, 0, 0, 0.32),
179
+ -9px 0 28px 8px rgba(0, 0, 0, 0.2);
180
+ }
181
+
182
+ .@{prefix}-mask {
183
+ background-color: rgba(0, 0, 0, 0.65);
184
+ }
185
+
186
+ .@{prefix}-header {
187
+ border-bottom-color: rgba(255, 255, 255, 0.1);
188
+ }
189
+
190
+ .@{prefix}-title {
191
+ color: rgba(255, 255, 255, 0.85);
192
+ }
193
+
194
+ .@{prefix}-close {
195
+ color: rgba(255, 255, 255, 0.45);
196
+
197
+ &:hover {
198
+ color: rgba(255, 255, 255, 0.85);
199
+ background-color: rgba(255, 255, 255, 0.08);
200
+ }
201
+
202
+ &:active {
203
+ background-color: rgba(255, 255, 255, 0.12);
204
+ }
205
+ }
206
+
207
+ .@{prefix}-body {
208
+ color: rgba(255, 255, 255, 0.65);
209
+ }
210
+
211
+ .@{prefix}-footer {
212
+ border-top-color: rgba(255, 255, 255, 0.1);
213
+ }
214
+ }
215
+
@@ -0,0 +1,54 @@
1
+ import React, { ReactNode, CSSProperties } from 'react';
2
+ import './style.less';
3
+ /** FloatButton 类型 */
4
+ export type FloatButtonType = 'default' | 'primary';
5
+ /** FloatButton 形状 */
6
+ export type FloatButtonShape = 'circle' | 'square';
7
+ /** FloatButton 触发方式 */
8
+ export type FloatButtonTrigger = 'click' | 'hover';
9
+ /** FloatButton 属性 */
10
+ export interface FloatButtonProps {
11
+ /** 图标 */
12
+ icon?: ReactNode;
13
+ /** 描述文字 */
14
+ description?: ReactNode;
15
+ /** 按钮类型 */
16
+ type?: FloatButtonType;
17
+ /** 按钮形状 */
18
+ shape?: FloatButtonShape;
19
+ /** 自定义类名 */
20
+ className?: string;
21
+ /** 自定义样式 */
22
+ style?: CSSProperties;
23
+ /** 点击回调 */
24
+ onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
25
+ /** 工具提示 */
26
+ tooltip?: ReactNode;
27
+ /** 是否禁用 */
28
+ disabled?: boolean;
29
+ /** 是否危险按钮 */
30
+ danger?: boolean;
31
+ /** 子元素 */
32
+ children?: ReactNode;
33
+ }
34
+ /** FloatButtonGroup 属性 */
35
+ export interface FloatButtonGroupProps {
36
+ /** 触发方式 */
37
+ trigger?: FloatButtonTrigger;
38
+ /** 是否打开 */
39
+ open?: boolean;
40
+ /** 默认是否打开 */
41
+ defaultOpen?: boolean;
42
+ /** 打开状态改变回调 */
43
+ onOpenChange?: (open: boolean) => void;
44
+ /** 自定义类名 */
45
+ className?: string;
46
+ /** 自定义样式 */
47
+ style?: CSSProperties;
48
+ /** 子元素 */
49
+ children?: ReactNode;
50
+ }
51
+ export declare const FloatButton: React.FC<FloatButtonProps> & {
52
+ Group: React.FC<FloatButtonGroupProps>;
53
+ };
54
+ export default FloatButton;
@@ -0,0 +1,123 @@
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 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; }
3
+ 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; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ 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); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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; }
11
+ 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; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ import React, { useState } from 'react';
14
+ import "./style.less";
15
+
16
+ // ============ 类型定义 ============
17
+
18
+ /** FloatButton 类型 */
19
+
20
+ /** FloatButton 形状 */
21
+
22
+ /** FloatButton 触发方式 */
23
+
24
+ /** FloatButton 属性 */
25
+
26
+ /** FloatButtonGroup 属性 */
27
+ import { jsx as _jsx } from "react/jsx-runtime";
28
+ import { jsxs as _jsxs } from "react/jsx-runtime";
29
+ // ============ FloatButton 组件 ============
30
+ export var FloatButton = function FloatButton(_ref) {
31
+ var icon = _ref.icon,
32
+ description = _ref.description,
33
+ _ref$type = _ref.type,
34
+ type = _ref$type === void 0 ? 'default' : _ref$type,
35
+ _ref$shape = _ref.shape,
36
+ shape = _ref$shape === void 0 ? 'circle' : _ref$shape,
37
+ _ref$className = _ref.className,
38
+ className = _ref$className === void 0 ? '' : _ref$className,
39
+ style = _ref.style,
40
+ onClick = _ref.onClick,
41
+ tooltip = _ref.tooltip,
42
+ _ref$disabled = _ref.disabled,
43
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
44
+ _ref$danger = _ref.danger,
45
+ danger = _ref$danger === void 0 ? false : _ref$danger,
46
+ children = _ref.children;
47
+ var classNames = ['kage-float-btn', "kage-float-btn-".concat(type), "kage-float-btn-".concat(shape), danger && 'kage-float-btn-danger', disabled && 'kage-float-btn-disabled', className].filter(Boolean).join(' ');
48
+ var content = children || icon;
49
+ return /*#__PURE__*/_jsxs("div", {
50
+ className: "kage-float-btn-wrapper",
51
+ children: [tooltip && /*#__PURE__*/_jsx("div", {
52
+ className: "kage-float-btn-tooltip",
53
+ children: tooltip
54
+ }), /*#__PURE__*/_jsx("button", {
55
+ type: "button",
56
+ className: classNames,
57
+ style: style,
58
+ onClick: onClick,
59
+ disabled: disabled,
60
+ "aria-label": typeof (description || tooltip) === 'string' ? description || tooltip : undefined,
61
+ children: content
62
+ }), description && /*#__PURE__*/_jsx("div", {
63
+ className: "kage-float-btn-description",
64
+ children: description
65
+ })]
66
+ });
67
+ };
68
+
69
+ // ============ FloatButtonGroup 组件 ============
70
+ var FloatButtonGroup = function FloatButtonGroup(_ref2) {
71
+ var _ref2$trigger = _ref2.trigger,
72
+ trigger = _ref2$trigger === void 0 ? 'click' : _ref2$trigger,
73
+ controlledOpen = _ref2.open,
74
+ _ref2$defaultOpen = _ref2.defaultOpen,
75
+ defaultOpen = _ref2$defaultOpen === void 0 ? false : _ref2$defaultOpen,
76
+ onOpenChange = _ref2.onOpenChange,
77
+ _ref2$className = _ref2.className,
78
+ className = _ref2$className === void 0 ? '' : _ref2$className,
79
+ style = _ref2.style,
80
+ children = _ref2.children;
81
+ var _useState = useState(defaultOpen),
82
+ _useState2 = _slicedToArray(_useState, 2),
83
+ internalOpen = _useState2[0],
84
+ setInternalOpen = _useState2[1];
85
+ var isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;
86
+ var updateOpen = function updateOpen(newOpen) {
87
+ if (controlledOpen === undefined) {
88
+ setInternalOpen(newOpen);
89
+ }
90
+ onOpenChange === null || onOpenChange === void 0 || onOpenChange(newOpen);
91
+ };
92
+ var handleClick = function handleClick() {
93
+ if (trigger === 'click') {
94
+ updateOpen(!isOpen);
95
+ }
96
+ };
97
+ var handleMouseEnter = function handleMouseEnter() {
98
+ if (trigger === 'hover') {
99
+ updateOpen(true);
100
+ }
101
+ };
102
+ var handleMouseLeave = function handleMouseLeave() {
103
+ if (trigger === 'hover') {
104
+ updateOpen(false);
105
+ }
106
+ };
107
+ var classNames = ['kage-float-btn-group', isOpen && 'kage-float-btn-group-open', className].filter(Boolean).join(' ');
108
+ var groupProps = {};
109
+ if (trigger === 'click') {
110
+ groupProps.onClick = handleClick;
111
+ } else if (trigger === 'hover') {
112
+ groupProps.onMouseEnter = handleMouseEnter;
113
+ groupProps.onMouseLeave = handleMouseLeave;
114
+ }
115
+ return /*#__PURE__*/_jsx("div", _objectSpread(_objectSpread({
116
+ className: classNames,
117
+ style: style
118
+ }, groupProps), {}, {
119
+ children: children
120
+ }));
121
+ };
122
+ FloatButton.Group = FloatButtonGroup;
123
+ export default FloatButton;