@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.
Files changed (83) hide show
  1. package/dist/{chunk-6DYS4PJT.mjs → chunk-2UVQIL26.mjs} +1 -1
  2. package/dist/chunk-4MMT4EJJ.mjs +78 -0
  3. package/dist/chunk-67EK62HG.mjs +65 -0
  4. package/dist/{chunk-VXHBQTZS.js → chunk-GY6D4XS3.js} +13 -5
  5. package/dist/chunk-GZPMLPRW.js +107 -0
  6. package/dist/{chunk-7JQ7LURS.mjs → chunk-H36CWHUP.mjs} +9 -4
  7. package/dist/chunk-HUZVBDHV.js +81 -0
  8. package/dist/chunk-JOHKSMJM.mjs +266 -0
  9. package/dist/{chunk-WEGU7O4J.mjs → chunk-KOLLAGRK.mjs} +1 -1
  10. package/dist/{chunk-IS7YOBR7.mjs → chunk-NDOYQK2R.mjs} +13 -5
  11. package/dist/{chunk-2DOPHSZP.js → chunk-OWUGXP6K.js} +8 -3
  12. package/dist/chunk-Q2GPRAF4.js +66 -0
  13. package/dist/{chunk-6PUSRC6S.js → chunk-T3GSXTDU.js} +2 -2
  14. package/dist/{chunk-UG3I4PCY.js → chunk-VR5OP4MO.js} +2 -2
  15. package/dist/chunk-X4F6NSI5.mjs +104 -0
  16. package/dist/chunk-Y6557RWE.mjs +62 -0
  17. package/dist/chunk-YIF5VX7K.mjs +158 -0
  18. package/dist/chunk-Z5DDULTA.js +72 -0
  19. package/dist/chunk-Z6G4HABF.js +272 -0
  20. package/dist/chunk-ZPWDDAFE.js +162 -0
  21. package/dist/components/Anchor.d.mts +38 -0
  22. package/dist/components/Anchor.d.ts +38 -0
  23. package/dist/components/Anchor.js +20 -0
  24. package/dist/components/Anchor.mjs +1 -0
  25. package/dist/components/AnchorLink.d.mts +23 -0
  26. package/dist/components/AnchorLink.d.ts +23 -0
  27. package/dist/components/AnchorLink.js +17 -0
  28. package/dist/components/AnchorLink.mjs +2 -0
  29. package/dist/components/AreaChart.js +5 -5
  30. package/dist/components/AreaChart.mjs +3 -3
  31. package/dist/components/BackTop.d.mts +21 -0
  32. package/dist/components/BackTop.d.ts +21 -0
  33. package/dist/components/BackTop.js +16 -0
  34. package/dist/components/BackTop.mjs +1 -0
  35. package/dist/components/BarChart.js +5 -5
  36. package/dist/components/BarChart.mjs +3 -3
  37. package/dist/components/Breadcrumb.d.mts +4 -0
  38. package/dist/components/Breadcrumb.d.ts +4 -0
  39. package/dist/components/Breadcrumb.js +3 -3
  40. package/dist/components/Breadcrumb.mjs +1 -1
  41. package/dist/components/BreadcrumbItem.js +3 -3
  42. package/dist/components/BreadcrumbItem.mjs +2 -2
  43. package/dist/components/Carousel.d.mts +26 -0
  44. package/dist/components/Carousel.d.ts +26 -0
  45. package/dist/components/Carousel.js +10 -0
  46. package/dist/components/Carousel.mjs +1 -0
  47. package/dist/components/Collapse.d.mts +29 -0
  48. package/dist/components/Collapse.d.ts +29 -0
  49. package/dist/components/Collapse.js +20 -0
  50. package/dist/components/Collapse.mjs +1 -0
  51. package/dist/components/CollapsePanel.d.mts +24 -0
  52. package/dist/components/CollapsePanel.d.ts +24 -0
  53. package/dist/components/CollapsePanel.js +17 -0
  54. package/dist/components/CollapsePanel.mjs +2 -0
  55. package/dist/components/DonutChart.js +5 -5
  56. package/dist/components/DonutChart.mjs +3 -3
  57. package/dist/components/LineChart.js +5 -5
  58. package/dist/components/LineChart.mjs +3 -3
  59. package/dist/components/Pagination.js +3 -3
  60. package/dist/components/Pagination.mjs +1 -1
  61. package/dist/components/PieChart.js +4 -4
  62. package/dist/components/PieChart.mjs +2 -2
  63. package/dist/components/RadarChart.js +4 -4
  64. package/dist/components/RadarChart.mjs +2 -2
  65. package/dist/components/ScatterChart.js +5 -5
  66. package/dist/components/ScatterChart.mjs +3 -3
  67. package/dist/index.d.mts +6 -0
  68. package/dist/index.d.ts +6 -0
  69. package/dist/index.js +142 -104
  70. package/dist/index.mjs +34 -28
  71. package/package.json +2 -2
  72. package/dist/{chunk-N32MAX4A.js → chunk-2VXA4YOP.js} +1 -1
  73. package/dist/{chunk-VBSK4TGO.mjs → chunk-2WLSB7K2.mjs} +2 -2
  74. package/dist/{chunk-CBALIFPW.mjs → chunk-324UKFG2.mjs} +2 -2
  75. package/dist/{chunk-YER7IQF4.mjs → chunk-5QKBBGIA.mjs} +1 -1
  76. package/dist/{chunk-OONM7FO7.js → chunk-67WZRMD6.js} +2 -2
  77. package/dist/{chunk-QI6WAP6Y.js → chunk-7SOL3UJ2.js} +2 -2
  78. package/dist/{chunk-KBGURVTD.mjs → chunk-AFFSBNYB.mjs} +2 -2
  79. package/dist/{chunk-LZNG2HGC.mjs → chunk-E6GLWHRL.mjs} +1 -1
  80. package/dist/{chunk-ZUUG3WOL.js → chunk-KKHKQP6Z.js} +1 -1
  81. package/dist/{chunk-EJLJYOO7.js → chunk-LWW2LXCP.js} +2 -2
  82. package/dist/{chunk-A2UW5OKX.mjs → chunk-RKBNIEGF.mjs} +2 -2
  83. 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: pageSizeOptions.map((sizeOption) => /* @__PURE__ */ jsxs("option", { value: sizeOption, 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.jsx("nav", { className: containerClasses, "aria-label": "Breadcrumb", style, ...props, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex items-center flex-wrap gap-2", children }) }) });
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 chunk2DOPHSZP_js = require('./chunk-2DOPHSZP.js');
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 = chunk2DOPHSZP_js.useBreadcrumbContext();
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 chunkN32MAX4A_js = require('./chunk-N32MAX4A.js');
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
- chunkN32MAX4A_js.PieChart,
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;