wssf-kage-ui 0.1.0 → 0.1.1
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/README.md +4 -4
- package/dist/cjs/Anchor/index.d.ts +56 -0
- package/dist/cjs/Anchor/index.js +307 -0
- package/dist/cjs/Anchor/style.less +183 -0
- package/dist/cjs/AutoComplete/index.d.ts +54 -0
- package/dist/cjs/AutoComplete/index.js +273 -0
- package/dist/cjs/AutoComplete/style.less +325 -0
- package/dist/cjs/Breadcrumb/index.d.ts +51 -0
- package/dist/cjs/Breadcrumb/index.js +129 -0
- package/dist/cjs/Breadcrumb/style.less +96 -0
- package/dist/cjs/Cascader/index.d.ts +53 -0
- package/dist/cjs/Cascader/index.js +338 -0
- package/dist/cjs/Cascader/style.less +457 -0
- package/dist/cjs/Checkbox/index.d.ts +52 -0
- package/dist/cjs/Checkbox/index.js +158 -0
- package/dist/cjs/Checkbox/style.less +211 -0
- package/dist/cjs/ColorPicker/index.d.ts +28 -0
- package/dist/cjs/ColorPicker/index.js +381 -0
- package/dist/cjs/ColorPicker/style.less +276 -0
- package/dist/cjs/DatePicker/index.d.ts +32 -0
- package/dist/cjs/DatePicker/index.js +377 -0
- package/dist/cjs/DatePicker/style.less +498 -0
- package/dist/cjs/Divider/index.d.ts +24 -0
- package/dist/cjs/Divider/index.js +75 -0
- package/dist/cjs/Divider/style.less +144 -0
- package/dist/cjs/Dropdown/index.d.ts +88 -0
- package/dist/cjs/Dropdown/index.js +253 -0
- package/dist/cjs/Dropdown/style.less +430 -0
- package/dist/cjs/Flex/index.d.ts +37 -0
- package/dist/cjs/Flex/index.js +76 -0
- package/dist/cjs/Flex/style.less +13 -0
- package/dist/cjs/Form/index.d.ts +89 -0
- package/dist/cjs/Form/index.js +421 -0
- package/dist/cjs/Form/style.less +203 -0
- package/dist/cjs/Grid/index.d.ts +69 -0
- package/dist/cjs/Grid/index.js +171 -0
- package/dist/cjs/Grid/style.less +273 -0
- package/dist/cjs/Layout/index.d.ts +74 -0
- package/dist/cjs/Layout/index.js +166 -0
- package/dist/cjs/Layout/style.less +145 -0
- package/dist/cjs/Masonry/index.d.ts +18 -0
- package/dist/cjs/Masonry/index.js +146 -0
- package/dist/cjs/Masonry/style.less +15 -0
- package/dist/cjs/Menu/index.d.ts +87 -0
- package/dist/cjs/Menu/index.js +306 -0
- package/dist/cjs/Menu/style.less +363 -0
- package/dist/cjs/Pagination/index.d.ts +38 -0
- package/dist/cjs/Pagination/index.js +255 -0
- package/dist/cjs/Pagination/style.less +353 -0
- package/dist/cjs/Space/index.d.ts +41 -0
- package/dist/cjs/Space/index.js +137 -0
- package/dist/cjs/Space/style.less +116 -0
- package/dist/cjs/Splitter/index.d.ts +43 -0
- package/dist/cjs/Splitter/index.js +219 -0
- package/dist/cjs/Splitter/style.less +99 -0
- package/dist/cjs/Steps/index.d.ts +58 -0
- package/dist/cjs/Steps/index.js +180 -0
- package/dist/cjs/Steps/style.less +507 -0
- package/dist/cjs/Tabs/index.d.ts +58 -0
- package/dist/cjs/Tabs/index.js +196 -0
- package/dist/cjs/Tabs/style.less +423 -0
- package/dist/cjs/Typography/index.d.ts +102 -0
- package/dist/cjs/Typography/index.js +168 -0
- package/dist/cjs/Typography/style.less +246 -0
- package/dist/cjs/index.d.ts +42 -0
- package/dist/cjs/index.js +260 -1
- package/dist/esm/Anchor/index.d.ts +56 -0
- package/dist/esm/Anchor/index.js +302 -0
- package/dist/esm/Anchor/style.less +183 -0
- package/dist/esm/AutoComplete/index.d.ts +54 -0
- package/dist/esm/AutoComplete/index.js +268 -0
- package/dist/esm/AutoComplete/style.less +325 -0
- package/dist/esm/Breadcrumb/index.d.ts +51 -0
- package/dist/esm/Breadcrumb/index.js +124 -0
- package/dist/esm/Breadcrumb/style.less +96 -0
- package/dist/esm/Cascader/index.d.ts +53 -0
- package/dist/esm/Cascader/index.js +333 -0
- package/dist/esm/Cascader/style.less +457 -0
- package/dist/esm/Checkbox/index.d.ts +52 -0
- package/dist/esm/Checkbox/index.js +152 -0
- package/dist/esm/Checkbox/style.less +211 -0
- package/dist/esm/ColorPicker/index.d.ts +28 -0
- package/dist/esm/ColorPicker/index.js +375 -0
- package/dist/esm/ColorPicker/style.less +276 -0
- package/dist/esm/DatePicker/index.d.ts +32 -0
- package/dist/esm/DatePicker/index.js +371 -0
- package/dist/esm/DatePicker/style.less +498 -0
- package/dist/esm/Divider/index.d.ts +24 -0
- package/dist/esm/Divider/index.js +68 -0
- package/dist/esm/Divider/style.less +144 -0
- package/dist/esm/Dropdown/index.d.ts +88 -0
- package/dist/esm/Dropdown/index.js +249 -0
- package/dist/esm/Dropdown/style.less +430 -0
- package/dist/esm/Flex/index.d.ts +37 -0
- package/dist/esm/Flex/index.js +69 -0
- package/dist/esm/Flex/style.less +13 -0
- package/dist/esm/Form/index.d.ts +89 -0
- package/dist/esm/Form/index.js +416 -0
- package/dist/esm/Form/style.less +203 -0
- package/dist/esm/Grid/index.d.ts +69 -0
- package/dist/esm/Grid/index.js +165 -0
- package/dist/esm/Grid/style.less +273 -0
- package/dist/esm/Layout/index.d.ts +74 -0
- package/dist/esm/Layout/index.js +161 -0
- package/dist/esm/Layout/style.less +145 -0
- package/dist/esm/Masonry/index.d.ts +18 -0
- package/dist/esm/Masonry/index.js +138 -0
- package/dist/esm/Masonry/style.less +15 -0
- package/dist/esm/Menu/index.d.ts +87 -0
- package/dist/esm/Menu/index.js +301 -0
- package/dist/esm/Menu/style.less +363 -0
- package/dist/esm/Pagination/index.d.ts +38 -0
- package/dist/esm/Pagination/index.js +247 -0
- package/dist/esm/Pagination/style.less +353 -0
- package/dist/esm/Space/index.d.ts +41 -0
- package/dist/esm/Space/index.js +131 -0
- package/dist/esm/Space/style.less +116 -0
- package/dist/esm/Splitter/index.d.ts +43 -0
- package/dist/esm/Splitter/index.js +214 -0
- package/dist/esm/Splitter/style.less +99 -0
- package/dist/esm/Steps/index.d.ts +58 -0
- package/dist/esm/Steps/index.js +174 -0
- package/dist/esm/Steps/style.less +507 -0
- package/dist/esm/Tabs/index.d.ts +58 -0
- package/dist/esm/Tabs/index.js +193 -0
- package/dist/esm/Tabs/style.less +423 -0
- package/dist/esm/Typography/index.d.ts +102 -0
- package/dist/esm/Typography/index.js +161 -0
- package/dist/esm/Typography/style.less +246 -0
- package/dist/esm/index.d.ts +42 -0
- package/dist/esm/index.js +22 -1
- package/package.json +13 -10
package/README.md
CHANGED
|
@@ -12,17 +12,17 @@
|
|
|
12
12
|
## 📦 安装
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
npm install kage-ui
|
|
15
|
+
npm install wssf-kage-ui
|
|
16
16
|
# 或
|
|
17
|
-
yarn add kage-ui
|
|
17
|
+
yarn add wssf-kage-ui
|
|
18
18
|
# 或
|
|
19
|
-
pnpm add kage-ui
|
|
19
|
+
pnpm add wssf-kage-ui
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
## 🔨 使用
|
|
23
23
|
|
|
24
24
|
```tsx
|
|
25
|
-
import { Button } from 'kage-ui';
|
|
25
|
+
import { Button } from 'wssf-kage-ui';
|
|
26
26
|
|
|
27
27
|
function App() {
|
|
28
28
|
return <Button type="primary">Hello Kage UI</Button>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
export interface AnchorLinkProps {
|
|
4
|
+
/** 锚点链接 */
|
|
5
|
+
href: string;
|
|
6
|
+
/** 显示文字 */
|
|
7
|
+
title: React.ReactNode;
|
|
8
|
+
/** 子链接 */
|
|
9
|
+
children?: React.ReactNode;
|
|
10
|
+
/** 自定义类名 */
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const AnchorLink: React.FC<AnchorLinkProps>;
|
|
14
|
+
export interface AnchorItem {
|
|
15
|
+
key: string;
|
|
16
|
+
href: string;
|
|
17
|
+
title: React.ReactNode;
|
|
18
|
+
children?: AnchorItem[];
|
|
19
|
+
}
|
|
20
|
+
export interface AnchorProps {
|
|
21
|
+
/** 锚点配置列表 */
|
|
22
|
+
items?: AnchorItem[];
|
|
23
|
+
/** 固定模式 */
|
|
24
|
+
affix?: boolean;
|
|
25
|
+
/** 距离窗口顶部达到指定偏移量后触发 */
|
|
26
|
+
offsetTop?: number;
|
|
27
|
+
/** 锚点滚动偏移量 */
|
|
28
|
+
targetOffset?: number;
|
|
29
|
+
/** 滚动容器 */
|
|
30
|
+
getContainer?: () => HTMLElement | Window;
|
|
31
|
+
/** 是否显示小圆点 */
|
|
32
|
+
showInkInFixed?: boolean;
|
|
33
|
+
/** 点击锚点回调 */
|
|
34
|
+
onClick?: (e: React.MouseEvent, link: {
|
|
35
|
+
title: React.ReactNode;
|
|
36
|
+
href: string;
|
|
37
|
+
}) => void;
|
|
38
|
+
/** 滚动变化回调 */
|
|
39
|
+
onChange?: (currentActiveLink: string) => void;
|
|
40
|
+
/** 当前激活的锚点 */
|
|
41
|
+
getCurrentAnchor?: (activeLink: string) => string;
|
|
42
|
+
/** 方向 */
|
|
43
|
+
direction?: 'vertical' | 'horizontal';
|
|
44
|
+
/** 是否禁用滚动监听(静态模式) */
|
|
45
|
+
replace?: boolean;
|
|
46
|
+
/** 子元素 */
|
|
47
|
+
children?: React.ReactNode;
|
|
48
|
+
/** 自定义类名 */
|
|
49
|
+
className?: string;
|
|
50
|
+
/** 自定义样式 */
|
|
51
|
+
style?: React.CSSProperties;
|
|
52
|
+
}
|
|
53
|
+
export declare const Anchor: React.FC<AnchorProps> & {
|
|
54
|
+
Link: typeof AnchorLink;
|
|
55
|
+
};
|
|
56
|
+
export default Anchor;
|
|
@@ -0,0 +1,307 @@
|
|
|
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.AnchorLink = exports.Anchor = 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 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; }
|
|
14
|
+
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; }
|
|
15
|
+
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; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
17
|
+
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); }
|
|
18
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (_e) { function e(_x) { return _e.apply(this, arguments); } e.toString = function () { return _e.toString(); }; return e; }(function (e) { throw e; }), f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function (_e2) { function e(_x2) { return _e2.apply(this, arguments); } e.toString = function () { return _e2.toString(); }; return e; }(function (e) { didErr = true; err = e; }), f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
19
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
20
|
+
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."); }
|
|
21
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
22
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
23
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
24
|
+
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."); }
|
|
25
|
+
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); }
|
|
26
|
+
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; }
|
|
27
|
+
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; } }
|
|
28
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // ============ Anchor Link 锚点链接 ============
|
|
29
|
+
var AnchorLink = exports.AnchorLink = function AnchorLink(_ref) {
|
|
30
|
+
var href = _ref.href,
|
|
31
|
+
title = _ref.title,
|
|
32
|
+
children = _ref.children,
|
|
33
|
+
_ref$className = _ref.className,
|
|
34
|
+
className = _ref$className === void 0 ? '' : _ref$className;
|
|
35
|
+
// 这个组件主要用于声明式配置,实际渲染在 Anchor 中处理
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
AnchorLink.displayName = 'AnchorLink';
|
|
39
|
+
|
|
40
|
+
// ============ Anchor 锚点组件 ============
|
|
41
|
+
|
|
42
|
+
// 获取元素距离顶部的距离
|
|
43
|
+
var getOffsetTop = function getOffsetTop(element, container) {
|
|
44
|
+
if (!element) return 0;
|
|
45
|
+
var rect = element.getBoundingClientRect();
|
|
46
|
+
if (container === window) {
|
|
47
|
+
return rect.top + window.scrollY;
|
|
48
|
+
}
|
|
49
|
+
var containerEl = container;
|
|
50
|
+
return rect.top - containerEl.getBoundingClientRect().top + containerEl.scrollTop;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// 获取当前滚动位置
|
|
54
|
+
var getScrollTop = function getScrollTop(container) {
|
|
55
|
+
if (container === window) {
|
|
56
|
+
return window.scrollY || document.documentElement.scrollTop;
|
|
57
|
+
}
|
|
58
|
+
return container.scrollTop;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// 滚动到指定元素
|
|
62
|
+
var scrollToElement = function scrollToElement(element, container) {
|
|
63
|
+
var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
64
|
+
var rect = element.getBoundingClientRect();
|
|
65
|
+
if (container === window) {
|
|
66
|
+
var targetTop = rect.top + window.scrollY - offset;
|
|
67
|
+
window.scrollTo({
|
|
68
|
+
top: targetTop,
|
|
69
|
+
behavior: 'smooth'
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
var containerEl = container;
|
|
73
|
+
var _targetTop = rect.top - containerEl.getBoundingClientRect().top + containerEl.scrollTop - offset;
|
|
74
|
+
containerEl.scrollTo({
|
|
75
|
+
top: _targetTop,
|
|
76
|
+
behavior: 'smooth'
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var Anchor = exports.Anchor = function Anchor(_ref2) {
|
|
81
|
+
var items = _ref2.items,
|
|
82
|
+
_ref2$affix = _ref2.affix,
|
|
83
|
+
affix = _ref2$affix === void 0 ? false : _ref2$affix,
|
|
84
|
+
_ref2$offsetTop = _ref2.offsetTop,
|
|
85
|
+
offsetTop = _ref2$offsetTop === void 0 ? 0 : _ref2$offsetTop,
|
|
86
|
+
_ref2$targetOffset = _ref2.targetOffset,
|
|
87
|
+
targetOffset = _ref2$targetOffset === void 0 ? 0 : _ref2$targetOffset,
|
|
88
|
+
_ref2$getContainer = _ref2.getContainer,
|
|
89
|
+
getContainer = _ref2$getContainer === void 0 ? function () {
|
|
90
|
+
return window;
|
|
91
|
+
} : _ref2$getContainer,
|
|
92
|
+
_ref2$showInkInFixed = _ref2.showInkInFixed,
|
|
93
|
+
showInkInFixed = _ref2$showInkInFixed === void 0 ? false : _ref2$showInkInFixed,
|
|
94
|
+
onClick = _ref2.onClick,
|
|
95
|
+
onChange = _ref2.onChange,
|
|
96
|
+
getCurrentAnchor = _ref2.getCurrentAnchor,
|
|
97
|
+
_ref2$direction = _ref2.direction,
|
|
98
|
+
direction = _ref2$direction === void 0 ? 'vertical' : _ref2$direction,
|
|
99
|
+
_ref2$replace = _ref2.replace,
|
|
100
|
+
replace = _ref2$replace === void 0 ? false : _ref2$replace,
|
|
101
|
+
children = _ref2.children,
|
|
102
|
+
_ref2$className = _ref2.className,
|
|
103
|
+
className = _ref2$className === void 0 ? '' : _ref2$className,
|
|
104
|
+
style = _ref2.style;
|
|
105
|
+
var _useState = (0, _react.useState)(''),
|
|
106
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
107
|
+
activeLink = _useState2[0],
|
|
108
|
+
setActiveLink = _useState2[1];
|
|
109
|
+
var _useState3 = (0, _react.useState)({}),
|
|
110
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
111
|
+
inkStyle = _useState4[0],
|
|
112
|
+
setInkStyle = _useState4[1];
|
|
113
|
+
var anchorRef = (0, _react.useRef)(null);
|
|
114
|
+
var linksRef = (0, _react.useRef)(new Map());
|
|
115
|
+
|
|
116
|
+
// 从 children 解析 items
|
|
117
|
+
var getItemsFromChildren = (0, _react.useCallback)(function () {
|
|
118
|
+
if (items) return items;
|
|
119
|
+
var result = [];
|
|
120
|
+
_react.default.Children.forEach(children, function (child) {
|
|
121
|
+
var _child$type;
|
|
122
|
+
if ( /*#__PURE__*/_react.default.isValidElement(child) && ((_child$type = child.type) === null || _child$type === void 0 ? void 0 : _child$type.displayName) === 'AnchorLink') {
|
|
123
|
+
var _ref3 = child.props,
|
|
124
|
+
href = _ref3.href,
|
|
125
|
+
title = _ref3.title,
|
|
126
|
+
subChildren = _ref3.children;
|
|
127
|
+
var item = {
|
|
128
|
+
key: href,
|
|
129
|
+
href: href,
|
|
130
|
+
title: title
|
|
131
|
+
};
|
|
132
|
+
if (subChildren) {
|
|
133
|
+
item.children = [];
|
|
134
|
+
_react.default.Children.forEach(subChildren, function (subChild) {
|
|
135
|
+
var _subChild$type;
|
|
136
|
+
if ( /*#__PURE__*/_react.default.isValidElement(subChild) && ((_subChild$type = subChild.type) === null || _subChild$type === void 0 ? void 0 : _subChild$type.displayName) === 'AnchorLink') {
|
|
137
|
+
var subProps = subChild.props;
|
|
138
|
+
item.children.push({
|
|
139
|
+
key: subProps.href,
|
|
140
|
+
href: subProps.href,
|
|
141
|
+
title: subProps.title
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
result.push(item);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return result;
|
|
150
|
+
}, [items, children]);
|
|
151
|
+
var anchorItems = getItemsFromChildren();
|
|
152
|
+
|
|
153
|
+
// 获取所有链接
|
|
154
|
+
var getAllLinks = (0, _react.useCallback)(function (itemList) {
|
|
155
|
+
var links = [];
|
|
156
|
+
itemList.forEach(function (item) {
|
|
157
|
+
links.push(item.href);
|
|
158
|
+
if (item.children) {
|
|
159
|
+
links.push.apply(links, _toConsumableArray(getAllLinks(item.children)));
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return links;
|
|
163
|
+
}, []);
|
|
164
|
+
|
|
165
|
+
// 更新墨点位置
|
|
166
|
+
var updateInk = (0, _react.useCallback)(function (href) {
|
|
167
|
+
if (!href) {
|
|
168
|
+
setInkStyle({
|
|
169
|
+
opacity: 0
|
|
170
|
+
});
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
var linkEl = linksRef.current.get(href);
|
|
174
|
+
if (!linkEl || !anchorRef.current) return;
|
|
175
|
+
var anchorRect = anchorRef.current.getBoundingClientRect();
|
|
176
|
+
var linkRect = linkEl.getBoundingClientRect();
|
|
177
|
+
if (direction === 'vertical') {
|
|
178
|
+
setInkStyle({
|
|
179
|
+
top: linkRect.top - anchorRect.top + linkRect.height / 2 - 4,
|
|
180
|
+
opacity: 1
|
|
181
|
+
});
|
|
182
|
+
} else {
|
|
183
|
+
// 水平方向:墨点在链接下方居中
|
|
184
|
+
setInkStyle({
|
|
185
|
+
left: linkRect.left - anchorRect.left + (linkRect.width - 20) / 2,
|
|
186
|
+
opacity: 1
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}, [direction]);
|
|
190
|
+
|
|
191
|
+
// 滚动监听(replace 模式下不监听)
|
|
192
|
+
(0, _react.useEffect)(function () {
|
|
193
|
+
if (replace) return;
|
|
194
|
+
var container = getContainer();
|
|
195
|
+
var links = getAllLinks(anchorItems);
|
|
196
|
+
var handleScroll = function handleScroll() {
|
|
197
|
+
var currentActive = '';
|
|
198
|
+
|
|
199
|
+
// 找到当前视口中最靠近顶部的锚点
|
|
200
|
+
var _iterator = _createForOfIteratorHelper(links),
|
|
201
|
+
_step;
|
|
202
|
+
try {
|
|
203
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
204
|
+
var href = _step.value;
|
|
205
|
+
var targetId = href.startsWith('#') ? href.slice(1) : href;
|
|
206
|
+
var element = document.getElementById(targetId);
|
|
207
|
+
if (element) {
|
|
208
|
+
var rect = element.getBoundingClientRect();
|
|
209
|
+
// 元素顶部在视口顶部 + 偏移量之上,说明已经滚动过了这个锚点
|
|
210
|
+
if (rect.top <= targetOffset + 100) {
|
|
211
|
+
currentActive = href;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
} catch (err) {
|
|
216
|
+
_iterator.e(err);
|
|
217
|
+
} finally {
|
|
218
|
+
_iterator.f();
|
|
219
|
+
}
|
|
220
|
+
if (currentActive !== activeLink) {
|
|
221
|
+
var finalActive = getCurrentAnchor ? getCurrentAnchor(currentActive) : currentActive;
|
|
222
|
+
setActiveLink(finalActive);
|
|
223
|
+
onChange === null || onChange === void 0 || onChange(finalActive);
|
|
224
|
+
updateInk(finalActive);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
container.addEventListener('scroll', handleScroll);
|
|
228
|
+
// 初始化时延迟执行,确保 DOM 已渲染
|
|
229
|
+
var timer = setTimeout(handleScroll, 100);
|
|
230
|
+
return function () {
|
|
231
|
+
container.removeEventListener('scroll', handleScroll);
|
|
232
|
+
clearTimeout(timer);
|
|
233
|
+
};
|
|
234
|
+
}, [anchorItems, getContainer, targetOffset, activeLink, onChange, getCurrentAnchor, getAllLinks, updateInk, replace]);
|
|
235
|
+
|
|
236
|
+
// 处理点击
|
|
237
|
+
var handleClick = function handleClick(e, item) {
|
|
238
|
+
e.preventDefault();
|
|
239
|
+
|
|
240
|
+
// replace 模式下不滚动,只更新状态
|
|
241
|
+
if (!replace) {
|
|
242
|
+
var targetId = item.href.startsWith('#') ? item.href.slice(1) : item.href;
|
|
243
|
+
var element = document.getElementById(targetId);
|
|
244
|
+
var container = getContainer();
|
|
245
|
+
if (element) {
|
|
246
|
+
scrollToElement(element, container, targetOffset);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
setActiveLink(item.href);
|
|
250
|
+
updateInk(item.href);
|
|
251
|
+
onClick === null || onClick === void 0 || onClick(e, {
|
|
252
|
+
title: item.title,
|
|
253
|
+
href: item.href
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// 渲染链接
|
|
258
|
+
var renderLink = function renderLink(item) {
|
|
259
|
+
var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
260
|
+
var isActive = activeLink === item.href;
|
|
261
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
262
|
+
className: "kage-anchor-link-wrapper",
|
|
263
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
264
|
+
ref: function ref(el) {
|
|
265
|
+
if (el) linksRef.current.set(item.href, el);
|
|
266
|
+
},
|
|
267
|
+
className: "kage-anchor-link ".concat(isActive ? 'kage-anchor-link-active' : ''),
|
|
268
|
+
href: item.href,
|
|
269
|
+
title: typeof item.title === 'string' ? item.title : undefined,
|
|
270
|
+
onClick: function onClick(e) {
|
|
271
|
+
return handleClick(e, item);
|
|
272
|
+
},
|
|
273
|
+
style: {
|
|
274
|
+
paddingLeft: direction === 'vertical' ? 16 + level * 16 : undefined
|
|
275
|
+
},
|
|
276
|
+
children: item.title
|
|
277
|
+
}), item.children && item.children.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
278
|
+
className: "kage-anchor-link-children",
|
|
279
|
+
children: item.children.map(function (child) {
|
|
280
|
+
return renderLink(child, level + 1);
|
|
281
|
+
})
|
|
282
|
+
})]
|
|
283
|
+
}, item.key);
|
|
284
|
+
};
|
|
285
|
+
var classNames = ['kage-anchor', "kage-anchor-".concat(direction), affix && 'kage-anchor-fixed', className].filter(Boolean).join(' ');
|
|
286
|
+
var anchorStyle = _objectSpread(_objectSpread({}, style), affix ? {
|
|
287
|
+
position: 'fixed',
|
|
288
|
+
top: offsetTop
|
|
289
|
+
} : {});
|
|
290
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
291
|
+
ref: anchorRef,
|
|
292
|
+
className: classNames,
|
|
293
|
+
style: anchorStyle,
|
|
294
|
+
children: [(showInkInFixed || !affix) && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
295
|
+
className: "kage-anchor-ink ".concat(activeLink ? 'kage-anchor-ink-visible' : ''),
|
|
296
|
+
style: inkStyle
|
|
297
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
298
|
+
className: "kage-anchor-content",
|
|
299
|
+
children: anchorItems.map(function (item) {
|
|
300
|
+
return renderLink(item);
|
|
301
|
+
})
|
|
302
|
+
})]
|
|
303
|
+
});
|
|
304
|
+
};
|
|
305
|
+
Anchor.Link = AnchorLink;
|
|
306
|
+
Anchor.displayName = 'Anchor';
|
|
307
|
+
var _default = exports.default = Anchor;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Anchor 锚点组件样式
|
|
2
|
+
|
|
3
|
+
@prefix: kage-anchor;
|
|
4
|
+
|
|
5
|
+
// 颜色变量
|
|
6
|
+
@anchor-bg: transparent;
|
|
7
|
+
@anchor-border-color: #f0f0f0;
|
|
8
|
+
@anchor-link-color: rgba(0, 0, 0, 0.65);
|
|
9
|
+
@anchor-link-hover-color: #1f1f1f;
|
|
10
|
+
@anchor-link-active-color: #6366f1;
|
|
11
|
+
@anchor-ink-color: #6366f1;
|
|
12
|
+
|
|
13
|
+
.@{prefix} {
|
|
14
|
+
position: relative;
|
|
15
|
+
padding-left: 2px;
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
|
|
18
|
+
// ============ 垂直方向 ============
|
|
19
|
+
&-vertical {
|
|
20
|
+
&::before {
|
|
21
|
+
content: '';
|
|
22
|
+
position: absolute;
|
|
23
|
+
left: 0;
|
|
24
|
+
top: 0;
|
|
25
|
+
bottom: 0;
|
|
26
|
+
width: 2px;
|
|
27
|
+
background: @anchor-border-color;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.@{prefix}-ink {
|
|
31
|
+
position: absolute;
|
|
32
|
+
left: 0;
|
|
33
|
+
width: 2px;
|
|
34
|
+
height: 8px;
|
|
35
|
+
background: @anchor-ink-color;
|
|
36
|
+
border-radius: 1px;
|
|
37
|
+
transition: top 0.2s ease, opacity 0.2s ease;
|
|
38
|
+
opacity: 0;
|
|
39
|
+
|
|
40
|
+
&-visible {
|
|
41
|
+
opacity: 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.@{prefix}-link {
|
|
46
|
+
display: block;
|
|
47
|
+
padding: 4px 0 4px 16px;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ============ 水平方向 ============
|
|
52
|
+
&-horizontal {
|
|
53
|
+
position: relative;
|
|
54
|
+
padding-left: 0;
|
|
55
|
+
padding-bottom: 2px;
|
|
56
|
+
|
|
57
|
+
&::before {
|
|
58
|
+
content: '';
|
|
59
|
+
position: absolute;
|
|
60
|
+
left: 0;
|
|
61
|
+
right: 0;
|
|
62
|
+
bottom: 0;
|
|
63
|
+
height: 2px;
|
|
64
|
+
background: @anchor-border-color;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.@{prefix}-ink {
|
|
68
|
+
position: absolute;
|
|
69
|
+
bottom: 0;
|
|
70
|
+
width: 20px;
|
|
71
|
+
height: 2px;
|
|
72
|
+
background: @anchor-ink-color;
|
|
73
|
+
border-radius: 1px;
|
|
74
|
+
transition: left 0.2s ease, opacity 0.2s ease;
|
|
75
|
+
opacity: 0;
|
|
76
|
+
|
|
77
|
+
&-visible {
|
|
78
|
+
opacity: 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.@{prefix}-content {
|
|
83
|
+
display: flex;
|
|
84
|
+
gap: 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.@{prefix}-link-wrapper {
|
|
88
|
+
display: inline-flex;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.@{prefix}-link {
|
|
92
|
+
display: inline-block;
|
|
93
|
+
padding: 8px 16px;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.@{prefix}-link-children {
|
|
97
|
+
display: none;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ============ 固定模式 ============
|
|
102
|
+
&-fixed {
|
|
103
|
+
background: #fff;
|
|
104
|
+
padding: 8px 12px;
|
|
105
|
+
border-radius: 8px;
|
|
106
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ============ 链接样式 ============
|
|
111
|
+
.@{prefix}-link-wrapper {
|
|
112
|
+
position: relative;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.@{prefix}-link {
|
|
116
|
+
color: @anchor-link-color;
|
|
117
|
+
text-decoration: none;
|
|
118
|
+
font-size: 14px;
|
|
119
|
+
line-height: 1.5;
|
|
120
|
+
transition: color 0.2s ease;
|
|
121
|
+
white-space: nowrap;
|
|
122
|
+
overflow: hidden;
|
|
123
|
+
text-overflow: ellipsis;
|
|
124
|
+
|
|
125
|
+
&:hover {
|
|
126
|
+
color: @anchor-link-hover-color;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&-active {
|
|
130
|
+
color: @anchor-link-active-color;
|
|
131
|
+
font-weight: 500;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.@{prefix}-link-children {
|
|
136
|
+
.@{prefix}-link {
|
|
137
|
+
font-size: 13px;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ============ 暗色模式适配 ============
|
|
142
|
+
// 仅通过 dumi 主题选择器,不使用 prefers-color-scheme
|
|
143
|
+
// 避免系统暗色+dumi浅色主题时的冲突
|
|
144
|
+
|
|
145
|
+
[data-theme='dark'],
|
|
146
|
+
[data-prefers-color-scheme='dark'],
|
|
147
|
+
[data-prefers-color='dark'] {
|
|
148
|
+
.@{prefix} {
|
|
149
|
+
&::before {
|
|
150
|
+
background: rgba(255, 255, 255, 0.2);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
&-fixed {
|
|
154
|
+
background: #1f1f1f;
|
|
155
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.@{prefix}-vertical::before {
|
|
160
|
+
background: rgba(255, 255, 255, 0.2);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.@{prefix}-horizontal::before {
|
|
164
|
+
background: rgba(255, 255, 255, 0.2);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.@{prefix}-link {
|
|
168
|
+
color: rgba(255, 255, 255, 0.65);
|
|
169
|
+
|
|
170
|
+
&:hover {
|
|
171
|
+
color: rgba(255, 255, 255, 0.85);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.@{prefix}-link-active {
|
|
176
|
+
color: #818cf8;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.@{prefix}-ink {
|
|
180
|
+
background: #818cf8;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './style.less';
|
|
3
|
+
export interface AutoCompleteOption {
|
|
4
|
+
/** 选项值 */
|
|
5
|
+
value: string;
|
|
6
|
+
/** 显示文本 */
|
|
7
|
+
label?: React.ReactNode;
|
|
8
|
+
/** 是否禁用 */
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface AutoCompleteProps {
|
|
12
|
+
/** 选项数据 */
|
|
13
|
+
options?: AutoCompleteOption[] | string[];
|
|
14
|
+
/** 当前值 */
|
|
15
|
+
value?: string;
|
|
16
|
+
/** 默认值 */
|
|
17
|
+
defaultValue?: string;
|
|
18
|
+
/** 占位符 */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** 是否禁用 */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** 允许清除 */
|
|
23
|
+
allowClear?: boolean;
|
|
24
|
+
/** 尺寸 */
|
|
25
|
+
size?: 'large' | 'middle' | 'small';
|
|
26
|
+
/** 状态 */
|
|
27
|
+
status?: 'error' | 'warning';
|
|
28
|
+
/** 下拉菜单是否与输入框同宽 */
|
|
29
|
+
popupMatchSelectWidth?: boolean | number;
|
|
30
|
+
/** 选中回调 */
|
|
31
|
+
onSelect?: (value: string, option: AutoCompleteOption) => void;
|
|
32
|
+
/** 搜索回调 */
|
|
33
|
+
onSearch?: (value: string) => void;
|
|
34
|
+
/** 值改变回调 */
|
|
35
|
+
onChange?: (value: string) => void;
|
|
36
|
+
/** 失焦回调 */
|
|
37
|
+
onBlur?: (e: React.FocusEvent) => void;
|
|
38
|
+
/** 聚焦回调 */
|
|
39
|
+
onFocus?: (e: React.FocusEvent) => void;
|
|
40
|
+
/** 下拉菜单打开/关闭回调 */
|
|
41
|
+
onDropdownVisibleChange?: (open: boolean) => void;
|
|
42
|
+
/** 自定义过滤 */
|
|
43
|
+
filterOption?: boolean | ((inputValue: string, option: AutoCompleteOption) => boolean);
|
|
44
|
+
/** 无匹配时的内容 */
|
|
45
|
+
notFoundContent?: React.ReactNode;
|
|
46
|
+
/** 自定义类名 */
|
|
47
|
+
className?: string;
|
|
48
|
+
/** 自定义样式 */
|
|
49
|
+
style?: React.CSSProperties;
|
|
50
|
+
/** 自定义输入框 */
|
|
51
|
+
children?: React.ReactElement;
|
|
52
|
+
}
|
|
53
|
+
export declare const AutoComplete: React.FC<AutoCompleteProps>;
|
|
54
|
+
export default AutoComplete;
|