@expcat/tigercat-react 0.2.10 → 0.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-6DYS4PJT.mjs → chunk-2UVQIL26.mjs} +1 -1
- package/dist/chunk-4MMT4EJJ.mjs +78 -0
- package/dist/chunk-67EK62HG.mjs +65 -0
- package/dist/{chunk-VXHBQTZS.js → chunk-GY6D4XS3.js} +13 -5
- package/dist/chunk-GZPMLPRW.js +107 -0
- package/dist/{chunk-7JQ7LURS.mjs → chunk-H36CWHUP.mjs} +9 -4
- package/dist/chunk-HUZVBDHV.js +81 -0
- package/dist/chunk-JOHKSMJM.mjs +266 -0
- package/dist/{chunk-WEGU7O4J.mjs → chunk-KOLLAGRK.mjs} +1 -1
- package/dist/{chunk-IS7YOBR7.mjs → chunk-NDOYQK2R.mjs} +13 -5
- package/dist/{chunk-2DOPHSZP.js → chunk-OWUGXP6K.js} +8 -3
- package/dist/chunk-Q2GPRAF4.js +66 -0
- package/dist/{chunk-6PUSRC6S.js → chunk-T3GSXTDU.js} +2 -2
- package/dist/{chunk-UG3I4PCY.js → chunk-VR5OP4MO.js} +2 -2
- package/dist/chunk-X4F6NSI5.mjs +104 -0
- package/dist/chunk-Y6557RWE.mjs +62 -0
- package/dist/chunk-YIF5VX7K.mjs +158 -0
- package/dist/chunk-Z5DDULTA.js +72 -0
- package/dist/chunk-Z6G4HABF.js +272 -0
- package/dist/chunk-ZPWDDAFE.js +162 -0
- package/dist/components/Anchor.d.mts +38 -0
- package/dist/components/Anchor.d.ts +38 -0
- package/dist/components/Anchor.js +20 -0
- package/dist/components/Anchor.mjs +1 -0
- package/dist/components/AnchorLink.d.mts +23 -0
- package/dist/components/AnchorLink.d.ts +23 -0
- package/dist/components/AnchorLink.js +17 -0
- package/dist/components/AnchorLink.mjs +2 -0
- package/dist/components/AreaChart.js +5 -5
- package/dist/components/AreaChart.mjs +3 -3
- package/dist/components/BackTop.d.mts +21 -0
- package/dist/components/BackTop.d.ts +21 -0
- package/dist/components/BackTop.js +16 -0
- package/dist/components/BackTop.mjs +1 -0
- package/dist/components/BarChart.js +5 -5
- package/dist/components/BarChart.mjs +3 -3
- package/dist/components/Breadcrumb.d.mts +4 -0
- package/dist/components/Breadcrumb.d.ts +4 -0
- package/dist/components/Breadcrumb.js +3 -3
- package/dist/components/Breadcrumb.mjs +1 -1
- package/dist/components/BreadcrumbItem.js +3 -3
- package/dist/components/BreadcrumbItem.mjs +2 -2
- package/dist/components/Carousel.d.mts +26 -0
- package/dist/components/Carousel.d.ts +26 -0
- package/dist/components/Carousel.js +10 -0
- package/dist/components/Carousel.mjs +1 -0
- package/dist/components/Collapse.d.mts +29 -0
- package/dist/components/Collapse.d.ts +29 -0
- package/dist/components/Collapse.js +20 -0
- package/dist/components/Collapse.mjs +1 -0
- package/dist/components/CollapsePanel.d.mts +24 -0
- package/dist/components/CollapsePanel.d.ts +24 -0
- package/dist/components/CollapsePanel.js +17 -0
- package/dist/components/CollapsePanel.mjs +2 -0
- package/dist/components/DonutChart.js +5 -5
- package/dist/components/DonutChart.mjs +3 -3
- package/dist/components/LineChart.js +5 -5
- package/dist/components/LineChart.mjs +3 -3
- package/dist/components/Pagination.js +3 -3
- package/dist/components/Pagination.mjs +1 -1
- package/dist/components/PieChart.js +4 -4
- package/dist/components/PieChart.mjs +2 -2
- package/dist/components/RadarChart.js +4 -4
- package/dist/components/RadarChart.mjs +2 -2
- package/dist/components/ScatterChart.js +5 -5
- package/dist/components/ScatterChart.mjs +3 -3
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +142 -104
- package/dist/index.mjs +34 -28
- package/package.json +2 -2
- package/dist/{chunk-N32MAX4A.js → chunk-2VXA4YOP.js} +1 -1
- package/dist/{chunk-VBSK4TGO.mjs → chunk-2WLSB7K2.mjs} +2 -2
- package/dist/{chunk-CBALIFPW.mjs → chunk-324UKFG2.mjs} +2 -2
- package/dist/{chunk-YER7IQF4.mjs → chunk-5QKBBGIA.mjs} +1 -1
- package/dist/{chunk-OONM7FO7.js → chunk-67WZRMD6.js} +2 -2
- package/dist/{chunk-QI6WAP6Y.js → chunk-7SOL3UJ2.js} +2 -2
- package/dist/{chunk-KBGURVTD.mjs → chunk-AFFSBNYB.mjs} +2 -2
- package/dist/{chunk-LZNG2HGC.mjs → chunk-E6GLWHRL.mjs} +1 -1
- package/dist/{chunk-ZUUG3WOL.js → chunk-KKHKQP6Z.js} +1 -1
- package/dist/{chunk-EJLJYOO7.js → chunk-LWW2LXCP.js} +2 -2
- package/dist/{chunk-A2UW5OKX.mjs → chunk-RKBNIEGF.mjs} +2 -2
- package/dist/{chunk-42UKIFFQ.js → chunk-ZYF5GI2Q.js} +2 -2
|
@@ -96,6 +96,18 @@ var Pagination = ({
|
|
|
96
96
|
},
|
|
97
97
|
[handleQuickJumperSubmit]
|
|
98
98
|
);
|
|
99
|
+
const normalizedPageSizeOptions = useMemo(() => {
|
|
100
|
+
return pageSizeOptions.map((option) => {
|
|
101
|
+
if (typeof option === "number") {
|
|
102
|
+
return {
|
|
103
|
+
value: option,
|
|
104
|
+
label: `${option} ${labels.itemsPerPageText}`
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const label = option.label ?? `${option.value} ${labels.itemsPerPageText}`;
|
|
108
|
+
return { value: option.value, label };
|
|
109
|
+
});
|
|
110
|
+
}, [pageSizeOptions, labels.itemsPerPageText]);
|
|
99
111
|
const containerClasses = getPaginationContainerClasses(align, className);
|
|
100
112
|
const elements = [];
|
|
101
113
|
if (showTotal) {
|
|
@@ -231,11 +243,7 @@ var Pagination = ({
|
|
|
231
243
|
value: currentPageSize,
|
|
232
244
|
onChange: (e) => handlePageSizeChange(parseInt(e.target.value, 10)),
|
|
233
245
|
"aria-label": labels.itemsPerPageText,
|
|
234
|
-
children:
|
|
235
|
-
sizeOption,
|
|
236
|
-
" ",
|
|
237
|
-
labels.itemsPerPageText
|
|
238
|
-
] }, sizeOption))
|
|
246
|
+
children: normalizedPageSizeOptions.map((sizeOption) => /* @__PURE__ */ jsx("option", { value: sizeOption.value, children: sizeOption.label }, sizeOption.value))
|
|
239
247
|
},
|
|
240
248
|
"size-changer"
|
|
241
249
|
)
|
|
@@ -17,15 +17,20 @@ var Breadcrumb = ({
|
|
|
17
17
|
separator = "/",
|
|
18
18
|
className,
|
|
19
19
|
style,
|
|
20
|
+
extra,
|
|
20
21
|
children,
|
|
21
22
|
...props
|
|
22
23
|
}) => {
|
|
24
|
+
const hasExtra = Boolean(extra);
|
|
23
25
|
const containerClasses = React__default.default.useMemo(
|
|
24
|
-
() => tigercatCore.classNames(tigercatCore.breadcrumbContainerClasses, className),
|
|
25
|
-
[className]
|
|
26
|
+
() => tigercatCore.classNames(tigercatCore.breadcrumbContainerClasses, hasExtra && "w-full", className),
|
|
27
|
+
[className, hasExtra]
|
|
26
28
|
);
|
|
27
29
|
const contextValue = React__default.default.useMemo(() => ({ separator }), [separator]);
|
|
28
|
-
return /* @__PURE__ */ jsxRuntime.jsx(BreadcrumbContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.
|
|
30
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BreadcrumbContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: containerClasses, "aria-label": "Breadcrumb", style, ...props, children: [
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex items-center flex-wrap gap-2", children }),
|
|
32
|
+
hasExtra && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex items-center", children: extra })
|
|
33
|
+
] }) });
|
|
29
34
|
};
|
|
30
35
|
|
|
31
36
|
exports.Breadcrumb = Breadcrumb;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var tigercatCore = require('@expcat/tigercat-core');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/components/Collapse.tsx
|
|
8
|
+
var CollapseContext = react.createContext(null);
|
|
9
|
+
function useCollapseContext() {
|
|
10
|
+
return react.useContext(CollapseContext);
|
|
11
|
+
}
|
|
12
|
+
var Collapse = ({
|
|
13
|
+
activeKey: controlledActiveKey,
|
|
14
|
+
defaultActiveKey,
|
|
15
|
+
accordion = false,
|
|
16
|
+
bordered = true,
|
|
17
|
+
expandIconPosition = "start",
|
|
18
|
+
ghost = false,
|
|
19
|
+
className,
|
|
20
|
+
style,
|
|
21
|
+
onChange,
|
|
22
|
+
children
|
|
23
|
+
}) => {
|
|
24
|
+
const [internalActiveKeys, setInternalActiveKeys] = react.useState(
|
|
25
|
+
tigercatCore.normalizeActiveKeys(defaultActiveKey)
|
|
26
|
+
);
|
|
27
|
+
const activeKeys = react.useMemo(() => {
|
|
28
|
+
return controlledActiveKey !== void 0 ? tigercatCore.normalizeActiveKeys(controlledActiveKey) : internalActiveKeys;
|
|
29
|
+
}, [controlledActiveKey, internalActiveKeys]);
|
|
30
|
+
const handlePanelClick = react.useCallback(
|
|
31
|
+
(key) => {
|
|
32
|
+
const newKeys = tigercatCore.togglePanelKey(key, activeKeys, accordion);
|
|
33
|
+
if (controlledActiveKey === void 0) {
|
|
34
|
+
setInternalActiveKeys(newKeys);
|
|
35
|
+
}
|
|
36
|
+
if (onChange) {
|
|
37
|
+
if (accordion) {
|
|
38
|
+
onChange(newKeys.length > 0 ? newKeys[0] : void 0);
|
|
39
|
+
} else {
|
|
40
|
+
onChange(newKeys);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
[activeKeys, accordion, controlledActiveKey, onChange]
|
|
45
|
+
);
|
|
46
|
+
const containerClasses = react.useMemo(() => {
|
|
47
|
+
return tigercatCore.classNames(tigercatCore.getCollapseContainerClasses(bordered, ghost, className));
|
|
48
|
+
}, [bordered, ghost, className]);
|
|
49
|
+
const contextValue = react.useMemo(
|
|
50
|
+
() => ({
|
|
51
|
+
activeKeys,
|
|
52
|
+
accordion,
|
|
53
|
+
expandIconPosition,
|
|
54
|
+
bordered,
|
|
55
|
+
ghost,
|
|
56
|
+
handlePanelClick
|
|
57
|
+
}),
|
|
58
|
+
[activeKeys, accordion, expandIconPosition, bordered, ghost, handlePanelClick]
|
|
59
|
+
);
|
|
60
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CollapseContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: containerClasses, style, role: "region", children }) });
|
|
61
|
+
};
|
|
62
|
+
var Collapse_default = Collapse;
|
|
63
|
+
|
|
64
|
+
exports.Collapse = Collapse;
|
|
65
|
+
exports.Collapse_default = Collapse_default;
|
|
66
|
+
exports.useCollapseContext = useCollapseContext;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkOWUGXP6K_js = require('./chunk-OWUGXP6K.js');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var tigercatCore = require('@expcat/tigercat-core');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -17,7 +17,7 @@ var BreadcrumbItem = ({
|
|
|
17
17
|
icon,
|
|
18
18
|
...props
|
|
19
19
|
}) => {
|
|
20
|
-
const breadcrumbContext =
|
|
20
|
+
const breadcrumbContext = chunkOWUGXP6K_js.useBreadcrumbContext();
|
|
21
21
|
const itemClasses = react.useMemo(
|
|
22
22
|
() => tigercatCore.getBreadcrumbItemClasses(current, className),
|
|
23
23
|
[current, className]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2VXA4YOP_js = require('./chunk-2VXA4YOP.js');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var tigercatCore = require('@expcat/tigercat-core');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -60,7 +60,7 @@ var DonutChart = ({
|
|
|
60
60
|
return resolvedOuterRadius * ratio;
|
|
61
61
|
}, [innerRadius, innerRadiusRatio, resolvedOuterRadius]);
|
|
62
62
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
63
|
-
|
|
63
|
+
chunk2VXA4YOP_js.PieChart,
|
|
64
64
|
{
|
|
65
65
|
width,
|
|
66
66
|
height,
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { useCollapseContext } from './chunk-Y6557RWE.mjs';
|
|
2
|
+
import { useMemo, useCallback } from 'react';
|
|
3
|
+
import { isPanelActive, classNames, getCollapsePanelClasses, getCollapsePanelHeaderClasses, getCollapseIconClasses, collapseHeaderTextClasses, collapsePanelContentWrapperClasses, collapsePanelContentBaseClasses } from '@expcat/tigercat-core';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var CollapsePanel = ({
|
|
7
|
+
panelKey,
|
|
8
|
+
header,
|
|
9
|
+
disabled = false,
|
|
10
|
+
showArrow = true,
|
|
11
|
+
className,
|
|
12
|
+
style,
|
|
13
|
+
extra,
|
|
14
|
+
children
|
|
15
|
+
}) => {
|
|
16
|
+
const collapseContext = useCollapseContext();
|
|
17
|
+
if (!collapseContext) {
|
|
18
|
+
throw new Error("CollapsePanel must be used within a Collapse component");
|
|
19
|
+
}
|
|
20
|
+
const isActive = useMemo(() => {
|
|
21
|
+
return isPanelActive(panelKey, collapseContext.activeKeys);
|
|
22
|
+
}, [panelKey, collapseContext.activeKeys]);
|
|
23
|
+
const panelClasses = useMemo(() => {
|
|
24
|
+
return classNames(getCollapsePanelClasses(collapseContext.ghost, className));
|
|
25
|
+
}, [collapseContext.ghost, className]);
|
|
26
|
+
const headerClasses = useMemo(() => {
|
|
27
|
+
return getCollapsePanelHeaderClasses(isActive, disabled);
|
|
28
|
+
}, [isActive, disabled]);
|
|
29
|
+
const iconClasses = useMemo(() => {
|
|
30
|
+
return getCollapseIconClasses(isActive, collapseContext.expandIconPosition);
|
|
31
|
+
}, [isActive, collapseContext.expandIconPosition]);
|
|
32
|
+
const handleClick = useCallback(() => {
|
|
33
|
+
if (!disabled) {
|
|
34
|
+
collapseContext.handlePanelClick(panelKey);
|
|
35
|
+
}
|
|
36
|
+
}, [disabled, collapseContext, panelKey]);
|
|
37
|
+
const handleKeyDown = useCallback(
|
|
38
|
+
(event) => {
|
|
39
|
+
if (disabled) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
collapseContext.handlePanelClick(panelKey);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
[disabled, collapseContext, panelKey]
|
|
48
|
+
);
|
|
49
|
+
const arrowIcon = /* @__PURE__ */ jsx(
|
|
50
|
+
"svg",
|
|
51
|
+
{
|
|
52
|
+
className: iconClasses,
|
|
53
|
+
width: "16",
|
|
54
|
+
height: "16",
|
|
55
|
+
viewBox: "0 0 16 16",
|
|
56
|
+
fill: "none",
|
|
57
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
58
|
+
children: /* @__PURE__ */ jsx(
|
|
59
|
+
"path",
|
|
60
|
+
{
|
|
61
|
+
d: "M6 12L10 8L6 4",
|
|
62
|
+
stroke: "currentColor",
|
|
63
|
+
strokeWidth: "2",
|
|
64
|
+
strokeLinecap: "round",
|
|
65
|
+
strokeLinejoin: "round"
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", { className: panelClasses, style, children: [
|
|
71
|
+
/* @__PURE__ */ jsxs(
|
|
72
|
+
"div",
|
|
73
|
+
{
|
|
74
|
+
className: headerClasses,
|
|
75
|
+
role: "button",
|
|
76
|
+
tabIndex: disabled ? -1 : 0,
|
|
77
|
+
"aria-expanded": isActive,
|
|
78
|
+
"aria-disabled": disabled,
|
|
79
|
+
onClick: handleClick,
|
|
80
|
+
onKeyDown: handleKeyDown,
|
|
81
|
+
children: [
|
|
82
|
+
showArrow && collapseContext.expandIconPosition === "start" && arrowIcon,
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: collapseHeaderTextClasses, children: header }),
|
|
84
|
+
extra && /* @__PURE__ */ jsx("span", { className: "ml-auto", children: extra }),
|
|
85
|
+
showArrow && collapseContext.expandIconPosition === "end" && arrowIcon
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
className: collapsePanelContentWrapperClasses,
|
|
93
|
+
style: {
|
|
94
|
+
maxHeight: isActive ? "none" : "0",
|
|
95
|
+
opacity: isActive ? "1" : "0"
|
|
96
|
+
},
|
|
97
|
+
children: /* @__PURE__ */ jsx("div", { className: collapsePanelContentBaseClasses, children })
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
] });
|
|
101
|
+
};
|
|
102
|
+
var CollapsePanel_default = CollapsePanel;
|
|
103
|
+
|
|
104
|
+
export { CollapsePanel, CollapsePanel_default };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createContext, useContext, useState, useMemo, useCallback } from 'react';
|
|
2
|
+
import { normalizeActiveKeys, togglePanelKey, classNames, getCollapseContainerClasses } from '@expcat/tigercat-core';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/components/Collapse.tsx
|
|
6
|
+
var CollapseContext = createContext(null);
|
|
7
|
+
function useCollapseContext() {
|
|
8
|
+
return useContext(CollapseContext);
|
|
9
|
+
}
|
|
10
|
+
var Collapse = ({
|
|
11
|
+
activeKey: controlledActiveKey,
|
|
12
|
+
defaultActiveKey,
|
|
13
|
+
accordion = false,
|
|
14
|
+
bordered = true,
|
|
15
|
+
expandIconPosition = "start",
|
|
16
|
+
ghost = false,
|
|
17
|
+
className,
|
|
18
|
+
style,
|
|
19
|
+
onChange,
|
|
20
|
+
children
|
|
21
|
+
}) => {
|
|
22
|
+
const [internalActiveKeys, setInternalActiveKeys] = useState(
|
|
23
|
+
normalizeActiveKeys(defaultActiveKey)
|
|
24
|
+
);
|
|
25
|
+
const activeKeys = useMemo(() => {
|
|
26
|
+
return controlledActiveKey !== void 0 ? normalizeActiveKeys(controlledActiveKey) : internalActiveKeys;
|
|
27
|
+
}, [controlledActiveKey, internalActiveKeys]);
|
|
28
|
+
const handlePanelClick = useCallback(
|
|
29
|
+
(key) => {
|
|
30
|
+
const newKeys = togglePanelKey(key, activeKeys, accordion);
|
|
31
|
+
if (controlledActiveKey === void 0) {
|
|
32
|
+
setInternalActiveKeys(newKeys);
|
|
33
|
+
}
|
|
34
|
+
if (onChange) {
|
|
35
|
+
if (accordion) {
|
|
36
|
+
onChange(newKeys.length > 0 ? newKeys[0] : void 0);
|
|
37
|
+
} else {
|
|
38
|
+
onChange(newKeys);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
[activeKeys, accordion, controlledActiveKey, onChange]
|
|
43
|
+
);
|
|
44
|
+
const containerClasses = useMemo(() => {
|
|
45
|
+
return classNames(getCollapseContainerClasses(bordered, ghost, className));
|
|
46
|
+
}, [bordered, ghost, className]);
|
|
47
|
+
const contextValue = useMemo(
|
|
48
|
+
() => ({
|
|
49
|
+
activeKeys,
|
|
50
|
+
accordion,
|
|
51
|
+
expandIconPosition,
|
|
52
|
+
bordered,
|
|
53
|
+
ghost,
|
|
54
|
+
handlePanelClick
|
|
55
|
+
}),
|
|
56
|
+
[activeKeys, accordion, expandIconPosition, bordered, ghost, handlePanelClick]
|
|
57
|
+
);
|
|
58
|
+
return /* @__PURE__ */ jsx(CollapseContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: containerClasses, style, role: "region", children }) });
|
|
59
|
+
};
|
|
60
|
+
var Collapse_default = Collapse;
|
|
61
|
+
|
|
62
|
+
export { Collapse, Collapse_default, useCollapseContext };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createContext, useContext, useState, useRef, useMemo, useCallback, useEffect } from 'react';
|
|
2
|
+
import { scrollToAnchor, classNames, getAnchorWrapperClasses, getAnchorInkContainerClasses, getAnchorInkActiveClasses, getAnchorLinkListClasses, findActiveAnchor } from '@expcat/tigercat-core';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
// src/components/Anchor.tsx
|
|
6
|
+
var AnchorContext = createContext(null);
|
|
7
|
+
function useAnchorContext() {
|
|
8
|
+
return useContext(AnchorContext);
|
|
9
|
+
}
|
|
10
|
+
var Anchor = ({
|
|
11
|
+
affix = true,
|
|
12
|
+
bounds = 5,
|
|
13
|
+
offsetTop = 0,
|
|
14
|
+
showInkInFixed = false,
|
|
15
|
+
targetOffset,
|
|
16
|
+
getCurrentAnchor,
|
|
17
|
+
getContainer = () => window,
|
|
18
|
+
direction = "vertical",
|
|
19
|
+
className,
|
|
20
|
+
style,
|
|
21
|
+
onClick,
|
|
22
|
+
onChange,
|
|
23
|
+
children
|
|
24
|
+
}) => {
|
|
25
|
+
const [activeLink, setActiveLink] = useState("");
|
|
26
|
+
const [links, setLinks] = useState([]);
|
|
27
|
+
const anchorRef = useRef(null);
|
|
28
|
+
const inkRef = useRef(null);
|
|
29
|
+
const isScrollingRef = useRef(false);
|
|
30
|
+
const animationFrameRef = useRef(null);
|
|
31
|
+
const getContainerRef = useRef(getContainer);
|
|
32
|
+
getContainerRef.current = getContainer;
|
|
33
|
+
const scrollOffset = useMemo(() => targetOffset ?? offsetTop, [targetOffset, offsetTop]);
|
|
34
|
+
const registerLink = useCallback((href) => {
|
|
35
|
+
setLinks((prevLinks) => {
|
|
36
|
+
if (href && !prevLinks.includes(href)) {
|
|
37
|
+
return [...prevLinks, href];
|
|
38
|
+
}
|
|
39
|
+
return prevLinks;
|
|
40
|
+
});
|
|
41
|
+
}, []);
|
|
42
|
+
const unregisterLink = useCallback((href) => {
|
|
43
|
+
setLinks((prevLinks) => prevLinks.filter((l) => l !== href));
|
|
44
|
+
}, []);
|
|
45
|
+
const scrollTo = useCallback(
|
|
46
|
+
(href) => {
|
|
47
|
+
const container = getContainerRef.current();
|
|
48
|
+
scrollToAnchor(href, container, scrollOffset);
|
|
49
|
+
},
|
|
50
|
+
[scrollOffset]
|
|
51
|
+
);
|
|
52
|
+
const handleLinkClick = useCallback(
|
|
53
|
+
(href, event) => {
|
|
54
|
+
onClick?.(event, href);
|
|
55
|
+
isScrollingRef.current = true;
|
|
56
|
+
setActiveLink(href);
|
|
57
|
+
scrollTo(href);
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
isScrollingRef.current = false;
|
|
60
|
+
}, 500);
|
|
61
|
+
},
|
|
62
|
+
[onClick, scrollTo]
|
|
63
|
+
);
|
|
64
|
+
const scrollHandlerRef = useRef(null);
|
|
65
|
+
const boundContainerRef = useRef(null);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const timeoutId = setTimeout(() => {
|
|
68
|
+
const container = getContainerRef.current();
|
|
69
|
+
boundContainerRef.current = container;
|
|
70
|
+
const handleScroll = () => {
|
|
71
|
+
if (isScrollingRef.current) return;
|
|
72
|
+
if (animationFrameRef.current !== null) {
|
|
73
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
74
|
+
}
|
|
75
|
+
animationFrameRef.current = requestAnimationFrame(() => {
|
|
76
|
+
const currentContainer = getContainerRef.current();
|
|
77
|
+
const newActiveLink = findActiveAnchor(links, currentContainer, bounds, scrollOffset);
|
|
78
|
+
const finalActiveLink = getCurrentAnchor ? getCurrentAnchor(newActiveLink) : newActiveLink;
|
|
79
|
+
setActiveLink((prevActiveLink) => {
|
|
80
|
+
if (finalActiveLink !== prevActiveLink) {
|
|
81
|
+
onChange?.(finalActiveLink);
|
|
82
|
+
return finalActiveLink;
|
|
83
|
+
}
|
|
84
|
+
return prevActiveLink;
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
scrollHandlerRef.current = handleScroll;
|
|
89
|
+
container.addEventListener("scroll", handleScroll, { passive: true });
|
|
90
|
+
handleScroll();
|
|
91
|
+
}, 0);
|
|
92
|
+
return () => {
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
if (boundContainerRef.current && scrollHandlerRef.current) {
|
|
95
|
+
boundContainerRef.current.removeEventListener("scroll", scrollHandlerRef.current);
|
|
96
|
+
}
|
|
97
|
+
if (animationFrameRef.current !== null) {
|
|
98
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}, [links, bounds, scrollOffset, getCurrentAnchor, onChange]);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (!inkRef.current || !anchorRef.current || !activeLink) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const activeLinkElement = anchorRef.current.querySelector(
|
|
107
|
+
`[data-anchor-href="${activeLink}"]`
|
|
108
|
+
);
|
|
109
|
+
if (!activeLinkElement) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const anchorRect = anchorRef.current.getBoundingClientRect();
|
|
113
|
+
const linkRect = activeLinkElement.getBoundingClientRect();
|
|
114
|
+
if (direction === "vertical") {
|
|
115
|
+
inkRef.current.style.top = `${linkRect.top - anchorRect.top}px`;
|
|
116
|
+
inkRef.current.style.height = `${linkRect.height}px`;
|
|
117
|
+
} else {
|
|
118
|
+
inkRef.current.style.left = `${linkRect.left - anchorRect.left}px`;
|
|
119
|
+
inkRef.current.style.width = `${linkRect.width}px`;
|
|
120
|
+
}
|
|
121
|
+
}, [activeLink, direction]);
|
|
122
|
+
const wrapperClasses = useMemo(
|
|
123
|
+
() => classNames(getAnchorWrapperClasses(affix, className)),
|
|
124
|
+
[affix, className]
|
|
125
|
+
);
|
|
126
|
+
const inkContainerClasses = useMemo(() => getAnchorInkContainerClasses(direction), [direction]);
|
|
127
|
+
const inkActiveClasses = useMemo(() => getAnchorInkActiveClasses(direction), [direction]);
|
|
128
|
+
const linkListClasses = useMemo(() => getAnchorLinkListClasses(direction), [direction]);
|
|
129
|
+
const showInk = useMemo(() => {
|
|
130
|
+
if (!affix) return true;
|
|
131
|
+
return showInkInFixed;
|
|
132
|
+
}, [affix, showInkInFixed]);
|
|
133
|
+
const wrapperStyle = useMemo(() => {
|
|
134
|
+
const baseStyle = {};
|
|
135
|
+
if (affix && offsetTop > 0) {
|
|
136
|
+
baseStyle.top = `${offsetTop}px`;
|
|
137
|
+
}
|
|
138
|
+
return { ...baseStyle, ...style };
|
|
139
|
+
}, [affix, offsetTop, style]);
|
|
140
|
+
const contextValue = useMemo(
|
|
141
|
+
() => ({
|
|
142
|
+
activeLink,
|
|
143
|
+
direction,
|
|
144
|
+
registerLink,
|
|
145
|
+
unregisterLink,
|
|
146
|
+
handleLinkClick,
|
|
147
|
+
scrollTo
|
|
148
|
+
}),
|
|
149
|
+
[activeLink, direction, registerLink, unregisterLink, handleLinkClick, scrollTo]
|
|
150
|
+
);
|
|
151
|
+
return /* @__PURE__ */ jsx(AnchorContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs("div", { ref: anchorRef, className: wrapperClasses, style: wrapperStyle, children: [
|
|
152
|
+
showInk && /* @__PURE__ */ jsx("div", { className: inkContainerClasses, children: /* @__PURE__ */ jsx("div", { ref: inkRef, className: inkActiveClasses }) }),
|
|
153
|
+
/* @__PURE__ */ jsx("div", { className: linkListClasses, children })
|
|
154
|
+
] }) });
|
|
155
|
+
};
|
|
156
|
+
var Anchor_default = Anchor;
|
|
157
|
+
|
|
158
|
+
export { Anchor, Anchor_default, useAnchorContext };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZPWDDAFE_js = require('./chunk-ZPWDDAFE.js');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var tigercatCore = require('@expcat/tigercat-core');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
11
|
+
|
|
12
|
+
var AnchorLink = ({
|
|
13
|
+
href,
|
|
14
|
+
title,
|
|
15
|
+
target,
|
|
16
|
+
className,
|
|
17
|
+
children,
|
|
18
|
+
...props
|
|
19
|
+
}) => {
|
|
20
|
+
const anchorContext = chunkZPWDDAFE_js.useAnchorContext();
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
anchorContext?.registerLink(href);
|
|
23
|
+
return () => {
|
|
24
|
+
anchorContext?.unregisterLink(href);
|
|
25
|
+
};
|
|
26
|
+
}, [href, anchorContext]);
|
|
27
|
+
const handleClick = (event) => {
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
anchorContext?.handleLinkClick(href, event);
|
|
30
|
+
};
|
|
31
|
+
const linkClasses = React.useMemo(() => {
|
|
32
|
+
const isActive = anchorContext?.activeLink === href;
|
|
33
|
+
return tigercatCore.classNames(tigercatCore.getAnchorLinkClasses(isActive, className));
|
|
34
|
+
}, [anchorContext?.activeLink, href, className]);
|
|
35
|
+
const hasNestedLinks = React__default.default.Children.toArray(children).some(
|
|
36
|
+
(child) => React__default.default.isValidElement(child) && child.type === AnchorLink
|
|
37
|
+
);
|
|
38
|
+
if (hasNestedLinks) {
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "anchor-link-wrapper", children: [
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
41
|
+
"a",
|
|
42
|
+
{
|
|
43
|
+
href,
|
|
44
|
+
target,
|
|
45
|
+
className: linkClasses,
|
|
46
|
+
"data-anchor-href": href,
|
|
47
|
+
onClick: handleClick,
|
|
48
|
+
...props,
|
|
49
|
+
children: title
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pl-3 mt-1 space-y-1", children })
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
const content = children ?? title;
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
57
|
+
"a",
|
|
58
|
+
{
|
|
59
|
+
href,
|
|
60
|
+
target,
|
|
61
|
+
className: linkClasses,
|
|
62
|
+
"data-anchor-href": href,
|
|
63
|
+
onClick: handleClick,
|
|
64
|
+
...props,
|
|
65
|
+
children: content
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
var AnchorLink_default = AnchorLink;
|
|
70
|
+
|
|
71
|
+
exports.AnchorLink = AnchorLink;
|
|
72
|
+
exports.AnchorLink_default = AnchorLink_default;
|