wssf-kage-ui 0.1.1 → 0.1.2

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 (179) hide show
  1. package/dist/cjs/Avatar/index.d.ts +47 -0
  2. package/dist/cjs/Avatar/index.js +147 -0
  3. package/dist/cjs/Avatar/style.less +193 -0
  4. package/dist/cjs/Badge/index.d.ts +48 -0
  5. package/dist/cjs/Badge/index.js +141 -0
  6. package/dist/cjs/Badge/style.less +237 -0
  7. package/dist/cjs/Calendar/index.d.ts +33 -0
  8. package/dist/cjs/Calendar/index.js +296 -0
  9. package/dist/cjs/Calendar/style.less +384 -0
  10. package/dist/cjs/Card/index.d.ts +68 -0
  11. package/dist/cjs/Card/index.js +155 -0
  12. package/dist/cjs/Card/style.less +356 -0
  13. package/dist/cjs/Carousel/index.d.ts +33 -0
  14. package/dist/cjs/Carousel/index.js +169 -0
  15. package/dist/cjs/Carousel/style.less +232 -0
  16. package/dist/cjs/Collapse/index.d.ts +55 -0
  17. package/dist/cjs/Collapse/index.js +191 -0
  18. package/dist/cjs/Collapse/style.less +217 -0
  19. package/dist/cjs/Descriptions/index.d.ts +54 -0
  20. package/dist/cjs/Descriptions/index.js +181 -0
  21. package/dist/cjs/Descriptions/style.less +259 -0
  22. package/dist/cjs/Empty/index.d.ts +21 -0
  23. package/dist/cjs/Empty/index.js +115 -0
  24. package/dist/cjs/Empty/style.less +103 -0
  25. package/dist/cjs/Image/index.d.ts +30 -0
  26. package/dist/cjs/Image/index.js +153 -0
  27. package/dist/cjs/Image/style.less +156 -0
  28. package/dist/cjs/Input/index.d.ts +24 -0
  29. package/dist/cjs/Input/index.js +158 -0
  30. package/dist/cjs/Input/style.less +276 -0
  31. package/dist/cjs/InputNumber/index.d.ts +47 -0
  32. package/dist/cjs/InputNumber/index.js +323 -0
  33. package/dist/cjs/InputNumber/style.less +392 -0
  34. package/dist/cjs/Mentions/index.d.ts +57 -0
  35. package/dist/cjs/Mentions/index.js +378 -0
  36. package/dist/cjs/Mentions/style.less +297 -0
  37. package/dist/cjs/Popover/index.d.ts +30 -0
  38. package/dist/cjs/Popover/index.js +131 -0
  39. package/dist/cjs/Popover/style.less +279 -0
  40. package/dist/cjs/QRCode/index.d.ts +30 -0
  41. package/dist/cjs/QRCode/index.js +167 -0
  42. package/dist/cjs/QRCode/style.less +201 -0
  43. package/dist/cjs/Radio/index.d.ts +70 -0
  44. package/dist/cjs/Radio/index.js +199 -0
  45. package/dist/cjs/Radio/style.less +326 -0
  46. package/dist/cjs/Rate/index.d.ts +37 -0
  47. package/dist/cjs/Rate/index.js +151 -0
  48. package/dist/cjs/Rate/style.less +170 -0
  49. package/dist/cjs/Segmented/index.d.ts +31 -0
  50. package/dist/cjs/Segmented/index.js +121 -0
  51. package/dist/cjs/Segmented/style.less +167 -0
  52. package/dist/cjs/Select/index.d.ts +67 -0
  53. package/dist/cjs/Select/index.js +403 -0
  54. package/dist/cjs/Select/style.less +523 -0
  55. package/dist/cjs/Slider/index.d.ts +41 -0
  56. package/dist/cjs/Slider/index.js +325 -0
  57. package/dist/cjs/Slider/style.less +287 -0
  58. package/dist/cjs/Statistic/index.d.ts +26 -0
  59. package/dist/cjs/Statistic/index.js +71 -0
  60. package/dist/cjs/Statistic/style.less +94 -0
  61. package/dist/cjs/Switch/index.d.ts +28 -0
  62. package/dist/cjs/Switch/index.js +71 -0
  63. package/dist/cjs/Switch/style.less +212 -0
  64. package/dist/cjs/Table/index.d.ts +188 -0
  65. package/dist/cjs/Table/index.js +787 -0
  66. package/dist/cjs/Table/style.less +663 -0
  67. package/dist/cjs/Tag/index.d.ts +51 -0
  68. package/dist/cjs/Tag/index.js +142 -0
  69. package/dist/cjs/Tag/style.less +356 -0
  70. package/dist/cjs/TimePicker/index.d.ts +51 -0
  71. package/dist/cjs/TimePicker/index.js +332 -0
  72. package/dist/cjs/TimePicker/style.less +384 -0
  73. package/dist/cjs/Timeline/index.d.ts +47 -0
  74. package/dist/cjs/Timeline/index.js +127 -0
  75. package/dist/cjs/Timeline/style.less +265 -0
  76. package/dist/cjs/Tooltip/index.d.ts +53 -0
  77. package/dist/cjs/Tooltip/index.js +468 -0
  78. package/dist/cjs/Tooltip/style.less +237 -0
  79. package/dist/cjs/Transfer/index.d.ts +52 -0
  80. package/dist/cjs/Transfer/index.js +344 -0
  81. package/dist/cjs/Transfer/style.less +331 -0
  82. package/dist/cjs/TreeSelect/index.d.ts +54 -0
  83. package/dist/cjs/TreeSelect/index.js +373 -0
  84. package/dist/cjs/TreeSelect/style.less +471 -0
  85. package/dist/cjs/Upload/index.d.ts +65 -0
  86. package/dist/cjs/Upload/index.js +517 -0
  87. package/dist/cjs/Upload/style.less +424 -0
  88. package/dist/cjs/index.d.ts +58 -0
  89. package/dist/cjs/index.js +227 -0
  90. package/dist/esm/Avatar/index.d.ts +47 -0
  91. package/dist/esm/Avatar/index.js +142 -0
  92. package/dist/esm/Avatar/style.less +193 -0
  93. package/dist/esm/Badge/index.d.ts +48 -0
  94. package/dist/esm/Badge/index.js +137 -0
  95. package/dist/esm/Badge/style.less +237 -0
  96. package/dist/esm/Calendar/index.d.ts +33 -0
  97. package/dist/esm/Calendar/index.js +291 -0
  98. package/dist/esm/Calendar/style.less +384 -0
  99. package/dist/esm/Card/index.d.ts +68 -0
  100. package/dist/esm/Card/index.js +149 -0
  101. package/dist/esm/Card/style.less +356 -0
  102. package/dist/esm/Carousel/index.d.ts +33 -0
  103. package/dist/esm/Carousel/index.js +163 -0
  104. package/dist/esm/Carousel/style.less +232 -0
  105. package/dist/esm/Collapse/index.d.ts +55 -0
  106. package/dist/esm/Collapse/index.js +187 -0
  107. package/dist/esm/Collapse/style.less +217 -0
  108. package/dist/esm/Descriptions/index.d.ts +54 -0
  109. package/dist/esm/Descriptions/index.js +179 -0
  110. package/dist/esm/Descriptions/style.less +259 -0
  111. package/dist/esm/Empty/index.d.ts +21 -0
  112. package/dist/esm/Empty/index.js +109 -0
  113. package/dist/esm/Empty/style.less +103 -0
  114. package/dist/esm/Image/index.d.ts +30 -0
  115. package/dist/esm/Image/index.js +149 -0
  116. package/dist/esm/Image/style.less +156 -0
  117. package/dist/esm/Input/index.d.ts +24 -0
  118. package/dist/esm/Input/index.js +151 -0
  119. package/dist/esm/Input/style.less +276 -0
  120. package/dist/esm/InputNumber/index.d.ts +47 -0
  121. package/dist/esm/InputNumber/index.js +316 -0
  122. package/dist/esm/InputNumber/style.less +392 -0
  123. package/dist/esm/Mentions/index.d.ts +57 -0
  124. package/dist/esm/Mentions/index.js +374 -0
  125. package/dist/esm/Mentions/style.less +297 -0
  126. package/dist/esm/Popover/index.d.ts +30 -0
  127. package/dist/esm/Popover/index.js +126 -0
  128. package/dist/esm/Popover/style.less +279 -0
  129. package/dist/esm/QRCode/index.d.ts +30 -0
  130. package/dist/esm/QRCode/index.js +158 -0
  131. package/dist/esm/QRCode/style.less +201 -0
  132. package/dist/esm/Radio/index.d.ts +70 -0
  133. package/dist/esm/Radio/index.js +193 -0
  134. package/dist/esm/Radio/style.less +326 -0
  135. package/dist/esm/Rate/index.d.ts +37 -0
  136. package/dist/esm/Rate/index.js +143 -0
  137. package/dist/esm/Rate/style.less +170 -0
  138. package/dist/esm/Segmented/index.d.ts +31 -0
  139. package/dist/esm/Segmented/index.js +113 -0
  140. package/dist/esm/Segmented/style.less +167 -0
  141. package/dist/esm/Select/index.d.ts +67 -0
  142. package/dist/esm/Select/index.js +398 -0
  143. package/dist/esm/Select/style.less +523 -0
  144. package/dist/esm/Slider/index.d.ts +41 -0
  145. package/dist/esm/Slider/index.js +318 -0
  146. package/dist/esm/Slider/style.less +287 -0
  147. package/dist/esm/Statistic/index.d.ts +26 -0
  148. package/dist/esm/Statistic/index.js +65 -0
  149. package/dist/esm/Statistic/style.less +94 -0
  150. package/dist/esm/Switch/index.d.ts +28 -0
  151. package/dist/esm/Switch/index.js +63 -0
  152. package/dist/esm/Switch/style.less +212 -0
  153. package/dist/esm/Table/index.d.ts +188 -0
  154. package/dist/esm/Table/index.js +797 -0
  155. package/dist/esm/Table/style.less +663 -0
  156. package/dist/esm/Tag/index.d.ts +51 -0
  157. package/dist/esm/Tag/index.js +144 -0
  158. package/dist/esm/Tag/style.less +356 -0
  159. package/dist/esm/TimePicker/index.d.ts +51 -0
  160. package/dist/esm/TimePicker/index.js +327 -0
  161. package/dist/esm/TimePicker/style.less +384 -0
  162. package/dist/esm/Timeline/index.d.ts +47 -0
  163. package/dist/esm/Timeline/index.js +130 -0
  164. package/dist/esm/Timeline/style.less +265 -0
  165. package/dist/esm/Tooltip/index.d.ts +53 -0
  166. package/dist/esm/Tooltip/index.js +471 -0
  167. package/dist/esm/Tooltip/style.less +237 -0
  168. package/dist/esm/Transfer/index.d.ts +52 -0
  169. package/dist/esm/Transfer/index.js +340 -0
  170. package/dist/esm/Transfer/style.less +331 -0
  171. package/dist/esm/TreeSelect/index.d.ts +54 -0
  172. package/dist/esm/TreeSelect/index.js +369 -0
  173. package/dist/esm/TreeSelect/style.less +471 -0
  174. package/dist/esm/Upload/index.d.ts +65 -0
  175. package/dist/esm/Upload/index.js +513 -0
  176. package/dist/esm/Upload/style.less +424 -0
  177. package/dist/esm/index.d.ts +58 -0
  178. package/dist/esm/index.js +30 -1
  179. package/package.json +6 -3
@@ -0,0 +1,163 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ 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."); }
3
+ 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); }
4
+ 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; }
5
+ 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; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import React, { useState, useEffect, useCallback, useRef } from 'react';
8
+ import "./style.less";
9
+
10
+ // ============ Carousel Props ============
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
+ // ============ Carousel Component ============
14
+ export var Carousel = function Carousel(_ref) {
15
+ var _ref$autoplay = _ref.autoplay,
16
+ autoplay = _ref$autoplay === void 0 ? false : _ref$autoplay,
17
+ _ref$autoplaySpeed = _ref.autoplaySpeed,
18
+ autoplaySpeed = _ref$autoplaySpeed === void 0 ? 3000 : _ref$autoplaySpeed,
19
+ _ref$dotPosition = _ref.dotPosition,
20
+ dotPosition = _ref$dotPosition === void 0 ? 'bottom' : _ref$dotPosition,
21
+ _ref$dots = _ref.dots,
22
+ dots = _ref$dots === void 0 ? true : _ref$dots,
23
+ _ref$effect = _ref.effect,
24
+ effect = _ref$effect === void 0 ? 'scrollx' : _ref$effect,
25
+ _ref$infinite = _ref.infinite,
26
+ infinite = _ref$infinite === void 0 ? true : _ref$infinite,
27
+ controlledIndex = _ref.activeIndex,
28
+ _ref$defaultActiveInd = _ref.defaultActiveIndex,
29
+ defaultActiveIndex = _ref$defaultActiveInd === void 0 ? 0 : _ref$defaultActiveInd,
30
+ onChange = _ref.onChange,
31
+ beforeChange = _ref.beforeChange,
32
+ _ref$className = _ref.className,
33
+ className = _ref$className === void 0 ? '' : _ref$className,
34
+ style = _ref.style,
35
+ children = _ref.children;
36
+ var _useState = useState(defaultActiveIndex),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ internalIndex = _useState2[0],
39
+ setInternalIndex = _useState2[1];
40
+ var _useState3 = useState(false),
41
+ _useState4 = _slicedToArray(_useState3, 2),
42
+ isTransitioning = _useState4[0],
43
+ setIsTransitioning = _useState4[1];
44
+ var timerRef = useRef();
45
+ var trackRef = useRef(null);
46
+ var currentIndex = controlledIndex !== undefined ? controlledIndex : internalIndex;
47
+ var childrenArray = React.Children.toArray(children);
48
+ var count = childrenArray.length;
49
+
50
+ // 切换到指定索引
51
+ var goTo = useCallback(function (index) {
52
+ if (isTransitioning || count === 0) return;
53
+ var nextIndex = index;
54
+
55
+ // 处理循环
56
+ if (infinite) {
57
+ if (nextIndex < 0) {
58
+ nextIndex = count - 1;
59
+ } else if (nextIndex >= count) {
60
+ nextIndex = 0;
61
+ }
62
+ } else {
63
+ if (nextIndex < 0 || nextIndex >= count) return;
64
+ }
65
+ if (nextIndex === currentIndex) return;
66
+ beforeChange === null || beforeChange === void 0 || beforeChange(currentIndex, nextIndex);
67
+ if (controlledIndex === undefined) {
68
+ setInternalIndex(nextIndex);
69
+ }
70
+ setIsTransitioning(true);
71
+ setTimeout(function () {
72
+ return setIsTransitioning(false);
73
+ }, 500);
74
+ onChange === null || onChange === void 0 || onChange(nextIndex);
75
+ }, [currentIndex, count, infinite, isTransitioning, controlledIndex, beforeChange, onChange]);
76
+
77
+ // 上一张
78
+ var prev = useCallback(function () {
79
+ goTo(currentIndex - 1);
80
+ }, [currentIndex, goTo]);
81
+
82
+ // 下一张
83
+ var next = useCallback(function () {
84
+ goTo(currentIndex + 1);
85
+ }, [currentIndex, goTo]);
86
+
87
+ // 自动播放
88
+ useEffect(function () {
89
+ if (autoplay && count > 1) {
90
+ timerRef.current = setInterval(function () {
91
+ next();
92
+ }, autoplaySpeed);
93
+ return function () {
94
+ if (timerRef.current) {
95
+ clearInterval(timerRef.current);
96
+ }
97
+ };
98
+ }
99
+ }, [autoplay, autoplaySpeed, count, next]);
100
+
101
+ // 鼠标悬停时暂停自动播放
102
+ var handleMouseEnter = useCallback(function () {
103
+ if (timerRef.current) {
104
+ clearInterval(timerRef.current);
105
+ }
106
+ }, []);
107
+ var handleMouseLeave = useCallback(function () {
108
+ if (autoplay && count > 1) {
109
+ timerRef.current = setInterval(function () {
110
+ next();
111
+ }, autoplaySpeed);
112
+ }
113
+ }, [autoplay, autoplaySpeed, count, next]);
114
+ if (count === 0) {
115
+ return null;
116
+ }
117
+ var classNames = ['kage-carousel', "kage-carousel-".concat(effect), "kage-carousel-dots-".concat(dotPosition), className].filter(Boolean).join(' ');
118
+ var trackStyle = effect === 'scrollx' ? {
119
+ transform: "translateX(-".concat(currentIndex * 100, "%)"),
120
+ transition: isTransitioning ? 'transform 0.5s ease' : 'none'
121
+ } : {};
122
+ return /*#__PURE__*/_jsxs("div", {
123
+ className: classNames,
124
+ style: style,
125
+ onMouseEnter: handleMouseEnter,
126
+ onMouseLeave: handleMouseLeave,
127
+ children: [/*#__PURE__*/_jsxs("div", {
128
+ className: "kage-carousel-container",
129
+ children: [/*#__PURE__*/_jsx("div", {
130
+ ref: trackRef,
131
+ className: "kage-carousel-track",
132
+ style: trackStyle,
133
+ children: childrenArray.map(function (child, index) {
134
+ return /*#__PURE__*/_jsx("div", {
135
+ className: "kage-carousel-item ".concat(effect === 'fade' ? index === currentIndex ? 'kage-carousel-item-active' : '' : ''),
136
+ children: child
137
+ }, index);
138
+ })
139
+ }), /*#__PURE__*/_jsx("button", {
140
+ className: "kage-carousel-arrow kage-carousel-arrow-left",
141
+ onClick: prev,
142
+ disabled: !infinite && currentIndex === 0,
143
+ children: "\u2039"
144
+ }), /*#__PURE__*/_jsx("button", {
145
+ className: "kage-carousel-arrow kage-carousel-arrow-right",
146
+ onClick: next,
147
+ disabled: !infinite && currentIndex === count - 1,
148
+ children: "\u203A"
149
+ })]
150
+ }), dots && /*#__PURE__*/_jsx("div", {
151
+ className: "kage-carousel-dots",
152
+ children: childrenArray.map(function (_, index) {
153
+ return /*#__PURE__*/_jsx("button", {
154
+ className: "kage-carousel-dot ".concat(index === currentIndex ? 'kage-carousel-dot-active' : ''),
155
+ onClick: function onClick() {
156
+ return goTo(index);
157
+ }
158
+ }, index);
159
+ })
160
+ })]
161
+ });
162
+ };
163
+ export default Carousel;
@@ -0,0 +1,232 @@
1
+ // Carousel 走马灯组件样式
2
+
3
+ @prefix: kage-carousel;
4
+
5
+ // 颜色变量
6
+ @carousel-arrow-bg: rgba(0, 0, 0, 0.3);
7
+ @carousel-arrow-hover-bg: rgba(0, 0, 0, 0.5);
8
+ @carousel-arrow-color: #fff;
9
+ @carousel-dot-bg: rgba(255, 255, 255, 0.5);
10
+ @carousel-dot-active-bg: #fff;
11
+ @carousel-dot-border: rgba(0, 0, 0, 0.2);
12
+
13
+ // ============ 容器 ============
14
+ .@{prefix} {
15
+ position: relative;
16
+ overflow: hidden;
17
+ width: 100%;
18
+ height: 100%;
19
+
20
+ * {
21
+ box-sizing: border-box;
22
+ }
23
+ }
24
+
25
+ // ============ 轮播容器 ============
26
+ .@{prefix}-container {
27
+ position: relative;
28
+ width: 100%;
29
+ height: 100%;
30
+ overflow: hidden;
31
+ }
32
+
33
+ .@{prefix}-track {
34
+ display: flex;
35
+ width: 100%;
36
+ height: 100%;
37
+ }
38
+
39
+ // ============ 轮播项 ============
40
+ .@{prefix}-item {
41
+ flex: 0 0 100%;
42
+ width: 100%;
43
+ height: 100%;
44
+ position: relative;
45
+
46
+ img {
47
+ width: 100%;
48
+ height: 100%;
49
+ object-fit: cover;
50
+ display: block;
51
+ }
52
+ }
53
+
54
+ // ============ 滚动效果 ============
55
+ .@{prefix}-scrollx {
56
+ .@{prefix}-track {
57
+ transition: transform 0.5s ease;
58
+ }
59
+ }
60
+
61
+ // ============ 渐变效果 ============
62
+ .@{prefix}-fade {
63
+ .@{prefix}-container {
64
+ position: relative;
65
+ height: 100%;
66
+ }
67
+
68
+ .@{prefix}-track {
69
+ position: relative;
70
+ height: 100%;
71
+ }
72
+
73
+ .@{prefix}-item {
74
+ position: absolute;
75
+ top: 0;
76
+ left: 0;
77
+ width: 100%;
78
+ height: 100%;
79
+ opacity: 0;
80
+ transition: opacity 0.5s ease;
81
+ pointer-events: none;
82
+ }
83
+
84
+ .@{prefix}-item-active {
85
+ opacity: 1;
86
+ pointer-events: auto;
87
+ z-index: 1;
88
+ }
89
+ }
90
+
91
+ // ============ 切换箭头 ============
92
+ .@{prefix}-arrow {
93
+ position: absolute;
94
+ top: 50%;
95
+ transform: translateY(-50%);
96
+ z-index: 10;
97
+ width: 40px;
98
+ height: 40px;
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ background: @carousel-arrow-bg;
103
+ color: @carousel-arrow-color;
104
+ border: none;
105
+ border-radius: 50%;
106
+ font-size: 24px;
107
+ cursor: pointer;
108
+ transition: all 0.3s ease;
109
+ opacity: 0;
110
+
111
+ &:hover:not(:disabled) {
112
+ background: @carousel-arrow-hover-bg;
113
+ }
114
+
115
+ &:disabled {
116
+ opacity: 0.3;
117
+ cursor: not-allowed;
118
+ }
119
+ }
120
+
121
+ .@{prefix}:hover .@{prefix}-arrow {
122
+ opacity: 1;
123
+ }
124
+
125
+ .@{prefix}-arrow-left {
126
+ left: 16px;
127
+ }
128
+
129
+ .@{prefix}-arrow-right {
130
+ right: 16px;
131
+ }
132
+
133
+ // ============ 指示器 ============
134
+ .@{prefix}-dots {
135
+ position: absolute;
136
+ z-index: 100;
137
+ display: flex;
138
+ gap: 8px;
139
+ padding: 4px;
140
+ pointer-events: none;
141
+
142
+ button {
143
+ pointer-events: auto;
144
+ }
145
+ }
146
+
147
+ .@{prefix}.@{prefix}-dots-bottom .@{prefix}-dots {
148
+ bottom: 12px;
149
+ left: 50%;
150
+ transform: translateX(-50%);
151
+ }
152
+
153
+ .@{prefix}.@{prefix}-dots-top .@{prefix}-dots {
154
+ top: 12px;
155
+ left: 50%;
156
+ transform: translateX(-50%);
157
+ }
158
+
159
+ .@{prefix}.@{prefix}-dots-left .@{prefix}-dots {
160
+ left: 12px;
161
+ top: 50%;
162
+ transform: translateY(-50%);
163
+ flex-direction: column;
164
+ }
165
+
166
+ .@{prefix}.@{prefix}-dots-right .@{prefix}-dots {
167
+ right: 12px;
168
+ top: 50%;
169
+ transform: translateY(-50%);
170
+ flex-direction: column;
171
+ }
172
+
173
+ .@{prefix}-dot {
174
+ width: 10px;
175
+ height: 10px;
176
+ background: @carousel-dot-bg;
177
+ border: 2px solid @carousel-dot-border;
178
+ border-radius: 50%;
179
+ cursor: pointer;
180
+ transition: all 0.3s ease;
181
+ padding: 0;
182
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
183
+
184
+ &:hover {
185
+ background: rgba(255, 255, 255, 0.8);
186
+ transform: scale(1.2);
187
+ }
188
+ }
189
+
190
+ .@{prefix}-dot-active {
191
+ width: 28px;
192
+ border-radius: 5px;
193
+ background: @carousel-dot-active-bg;
194
+ border-color: @carousel-dot-active-bg;
195
+ }
196
+
197
+ .@{prefix}-dots-left .@{prefix}-dot-active,
198
+ .@{prefix}-dots-right .@{prefix}-dot-active,
199
+ .@{prefix}.@{prefix}-dots-left .@{prefix}-dot-active,
200
+ .@{prefix}.@{prefix}-dots-right .@{prefix}-dot-active {
201
+ width: 10px;
202
+ height: 28px;
203
+ }
204
+
205
+ // ============ 暗色模式适配 ============
206
+ [data-theme='dark'],
207
+ [data-prefers-color-scheme='dark'],
208
+ [data-prefers-color='dark'] {
209
+ .@{prefix}-arrow {
210
+ background: rgba(255, 255, 255, 0.2);
211
+ color: #fff;
212
+
213
+ &:hover:not(:disabled) {
214
+ background: rgba(255, 255, 255, 0.3);
215
+ }
216
+ }
217
+
218
+ .@{prefix}-dot {
219
+ background: rgba(255, 255, 255, 0.5);
220
+ border-color: rgba(255, 255, 255, 0.3);
221
+
222
+ &:hover {
223
+ background: rgba(255, 255, 255, 0.7);
224
+ }
225
+ }
226
+
227
+ .@{prefix}-dot-active {
228
+ background: #a5b4fc;
229
+ border-color: #a5b4fc;
230
+ }
231
+ }
232
+
@@ -0,0 +1,55 @@
1
+ import React, { CSSProperties, ReactNode } from 'react';
2
+ import './style.less';
3
+ export interface CollapseItemProps {
4
+ /** 唯一标识符 */
5
+ key?: string | number;
6
+ /** 面板头内容 */
7
+ header: ReactNode;
8
+ /** 面板内容 */
9
+ children?: ReactNode;
10
+ /** 是否禁用 */
11
+ disabled?: boolean;
12
+ /** 额外的类名 */
13
+ className?: string;
14
+ /** 自定义样式 */
15
+ style?: CSSProperties;
16
+ /** 自定义展开图标 */
17
+ showArrow?: boolean;
18
+ /** 额外的右侧内容 */
19
+ extra?: ReactNode;
20
+ }
21
+ export interface CollapseProps {
22
+ /** 当前激活的面板 */
23
+ activeKey?: string | string[] | number | number[];
24
+ /** 默认激活的面板 */
25
+ defaultActiveKey?: string | string[] | number | number[];
26
+ /** 是否手风琴模式 */
27
+ accordion?: boolean;
28
+ /** 是否显示边框 */
29
+ bordered?: boolean;
30
+ /** 切换面板的回调 */
31
+ onChange?: (key: string | string[] | number | number[]) => void;
32
+ /** 自定义类名 */
33
+ className?: string;
34
+ /** 自定义样式 */
35
+ style?: CSSProperties;
36
+ /** 子元素 */
37
+ children?: ReactNode;
38
+ /** 展开图标位置 */
39
+ expandIconPosition?: 'start' | 'end';
40
+ /** 是否可折叠 */
41
+ collapsible?: 'header' | 'disabled';
42
+ /** 销毁隐藏的面板 */
43
+ destroyInactivePanel?: boolean;
44
+ }
45
+ export declare const CollapseItem: React.FC<CollapseItemProps & {
46
+ isActive?: boolean;
47
+ onToggle?: () => void;
48
+ expandIconPosition?: 'start' | 'end';
49
+ collapsible?: 'header' | 'disabled';
50
+ destroyInactivePanel?: boolean;
51
+ }>;
52
+ export declare const Collapse: React.FC<CollapseProps> & {
53
+ Item: typeof CollapseItem;
54
+ };
55
+ export default Collapse;
@@ -0,0 +1,187 @@
1
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
4
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
+ 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); }
6
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
7
+ 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."); }
8
+ 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); }
9
+ 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; }
10
+ 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; } }
11
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+ import React, { useState, useCallback } from 'react';
13
+ import "./style.less";
14
+
15
+ // ============ Collapse Item Props ============
16
+
17
+ // ============ Collapse Props ============
18
+ import { jsx as _jsx } from "react/jsx-runtime";
19
+ import { jsxs as _jsxs } from "react/jsx-runtime";
20
+ // ============ Collapse Item Component ============
21
+ export var CollapseItem = function CollapseItem(_ref) {
22
+ var header = _ref.header,
23
+ children = _ref.children,
24
+ _ref$disabled = _ref.disabled,
25
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
26
+ _ref$className = _ref.className,
27
+ className = _ref$className === void 0 ? '' : _ref$className,
28
+ style = _ref.style,
29
+ _ref$showArrow = _ref.showArrow,
30
+ showArrow = _ref$showArrow === void 0 ? true : _ref$showArrow,
31
+ extra = _ref.extra,
32
+ _ref$isActive = _ref.isActive,
33
+ isActive = _ref$isActive === void 0 ? false : _ref$isActive,
34
+ onToggle = _ref.onToggle,
35
+ _ref$expandIconPositi = _ref.expandIconPosition,
36
+ expandIconPosition = _ref$expandIconPositi === void 0 ? 'start' : _ref$expandIconPositi,
37
+ _ref$collapsible = _ref.collapsible,
38
+ collapsible = _ref$collapsible === void 0 ? 'header' : _ref$collapsible,
39
+ _ref$destroyInactiveP = _ref.destroyInactivePanel,
40
+ destroyInactivePanel = _ref$destroyInactiveP === void 0 ? false : _ref$destroyInactiveP;
41
+ var handleClick = useCallback(function () {
42
+ if (disabled || collapsible === 'disabled') return;
43
+ onToggle === null || onToggle === void 0 || onToggle();
44
+ }, [disabled, collapsible, onToggle]);
45
+ var classNames = ['kage-collapse-item', isActive ? 'kage-collapse-item-active' : '', disabled ? 'kage-collapse-item-disabled' : '', className].filter(Boolean).join(' ');
46
+ var headerClassNames = ['kage-collapse-header', expandIconPosition === 'end' ? 'kage-collapse-header-icon-end' : ''].filter(Boolean).join(' ');
47
+ return /*#__PURE__*/_jsxs("div", {
48
+ className: classNames,
49
+ style: style,
50
+ children: [/*#__PURE__*/_jsxs("div", {
51
+ className: headerClassNames,
52
+ onClick: handleClick,
53
+ children: [showArrow && /*#__PURE__*/_jsx("span", {
54
+ className: "kage-collapse-arrow ".concat(isActive ? 'kage-collapse-arrow-active' : ''),
55
+ children: "\u25B8"
56
+ }), /*#__PURE__*/_jsx("div", {
57
+ className: "kage-collapse-header-text",
58
+ children: header
59
+ }), extra && /*#__PURE__*/_jsx("div", {
60
+ className: "kage-collapse-extra",
61
+ children: extra
62
+ })]
63
+ }), /*#__PURE__*/_jsx("div", {
64
+ className: "kage-collapse-content ".concat(isActive ? 'kage-collapse-content-active' : ''),
65
+ children: /*#__PURE__*/_jsx("div", {
66
+ className: "kage-collapse-content-box",
67
+ children: destroyInactivePanel ? isActive ? children : null : children
68
+ })
69
+ })]
70
+ });
71
+ };
72
+
73
+ // ============ Collapse Component ============
74
+ export var Collapse = function Collapse(_ref2) {
75
+ var controlledActiveKey = _ref2.activeKey,
76
+ _ref2$defaultActiveKe = _ref2.defaultActiveKey,
77
+ defaultActiveKey = _ref2$defaultActiveKe === void 0 ? [] : _ref2$defaultActiveKe,
78
+ _ref2$accordion = _ref2.accordion,
79
+ accordion = _ref2$accordion === void 0 ? false : _ref2$accordion,
80
+ _ref2$bordered = _ref2.bordered,
81
+ bordered = _ref2$bordered === void 0 ? true : _ref2$bordered,
82
+ onChange = _ref2.onChange,
83
+ _ref2$className = _ref2.className,
84
+ className = _ref2$className === void 0 ? '' : _ref2$className,
85
+ style = _ref2.style,
86
+ children = _ref2.children,
87
+ _ref2$expandIconPosit = _ref2.expandIconPosition,
88
+ expandIconPosition = _ref2$expandIconPosit === void 0 ? 'start' : _ref2$expandIconPosit,
89
+ _ref2$collapsible = _ref2.collapsible,
90
+ collapsible = _ref2$collapsible === void 0 ? 'header' : _ref2$collapsible,
91
+ _ref2$destroyInactive = _ref2.destroyInactivePanel,
92
+ destroyInactivePanel = _ref2$destroyInactive === void 0 ? false : _ref2$destroyInactive;
93
+ // 内部状态
94
+ var _useState = useState(defaultActiveKey),
95
+ _useState2 = _slicedToArray(_useState, 2),
96
+ internalActiveKey = _useState2[0],
97
+ setInternalActiveKey = _useState2[1];
98
+ var activeKey = controlledActiveKey !== undefined ? controlledActiveKey : internalActiveKey;
99
+
100
+ // 规范化 activeKey 为数组
101
+ var activeKeys = Array.isArray(activeKey) ? activeKey : [activeKey];
102
+ var activeKeysSet = new Set(activeKeys.map(String));
103
+
104
+ // 切换面板
105
+ var togglePanel = useCallback(function (key) {
106
+ var keyStr = String(key);
107
+ var newActiveKey;
108
+ if (accordion) {
109
+ // 手风琴模式:只允许一个面板展开
110
+ if (activeKeysSet.has(keyStr)) {
111
+ newActiveKey = typeof key === 'number' ? [] : [];
112
+ } else {
113
+ newActiveKey = typeof key === 'number' ? [key] : [key];
114
+ }
115
+ } else {
116
+ // 普通模式:允许多个面板展开
117
+ if (activeKeysSet.has(keyStr)) {
118
+ var filtered = activeKeys.filter(function (k) {
119
+ return String(k) !== keyStr;
120
+ });
121
+ // 根据第一个元素的类型确定数组类型
122
+ if (filtered.length === 0) {
123
+ newActiveKey = typeof key === 'number' ? [] : [];
124
+ } else {
125
+ var firstType = _typeof(filtered[0]);
126
+ if (firstType === 'number') {
127
+ newActiveKey = filtered.filter(function (k) {
128
+ return typeof k === 'number';
129
+ });
130
+ } else {
131
+ newActiveKey = filtered.filter(function (k) {
132
+ return typeof k === 'string';
133
+ });
134
+ }
135
+ }
136
+ } else {
137
+ // 根据第一个元素的类型确定数组类型
138
+ if (activeKeys.length === 0) {
139
+ newActiveKey = typeof key === 'number' ? [key] : [key];
140
+ } else {
141
+ var _firstType = _typeof(activeKeys[0]);
142
+ var newKeys = [].concat(_toConsumableArray(activeKeys), [key]);
143
+ if (_firstType === 'number') {
144
+ newActiveKey = newKeys.filter(function (k) {
145
+ return typeof k === 'number';
146
+ });
147
+ } else {
148
+ newActiveKey = newKeys.filter(function (k) {
149
+ return typeof k === 'string';
150
+ });
151
+ }
152
+ }
153
+ }
154
+ }
155
+ if (controlledActiveKey === undefined) {
156
+ setInternalActiveKey(newActiveKey);
157
+ }
158
+ onChange === null || onChange === void 0 || onChange(newActiveKey);
159
+ }, [accordion, activeKeys, activeKeysSet, controlledActiveKey, onChange]);
160
+ var classNames = ['kage-collapse', bordered ? 'kage-collapse-bordered' : 'kage-collapse-borderless', className].filter(Boolean).join(' ');
161
+
162
+ // 处理子元素
163
+ var items = React.Children.map(children, function (child, index) {
164
+ var _child$key;
165
+ if (! /*#__PURE__*/React.isValidElement(child)) return null;
166
+ var key = (_child$key = child.key) !== null && _child$key !== void 0 ? _child$key : index;
167
+ var isActive = activeKeysSet.has(String(key));
168
+ return /*#__PURE__*/React.cloneElement(child, {
169
+ isActive: isActive,
170
+ onToggle: function onToggle() {
171
+ return togglePanel(key);
172
+ },
173
+ expandIconPosition: expandIconPosition,
174
+ collapsible: collapsible,
175
+ destroyInactivePanel: destroyInactivePanel
176
+ });
177
+ });
178
+ return /*#__PURE__*/_jsx("div", {
179
+ className: classNames,
180
+ style: style,
181
+ children: items
182
+ });
183
+ };
184
+
185
+ // 绑定子组件
186
+ Collapse.Item = CollapseItem;
187
+ export default Collapse;