@expcat/tigercat-react 0.2.10 → 0.3.0

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 (125) hide show
  1. package/dist/chunk-4IO2M3ZJ.js +110 -0
  2. package/dist/chunk-4MMT4EJJ.mjs +78 -0
  3. package/dist/chunk-67EK62HG.mjs +65 -0
  4. package/dist/chunk-6YKZAWNX.js +258 -0
  5. package/dist/chunk-73DMQ2SR.mjs +206 -0
  6. package/dist/chunk-FAZQT7YP.mjs +255 -0
  7. package/dist/{chunk-HRYBEBZC.js → chunk-GJKT2B56.js} +5 -1
  8. package/dist/{chunk-VXHBQTZS.js → chunk-GY6D4XS3.js} +13 -5
  9. package/dist/chunk-GZPMLPRW.js +107 -0
  10. package/dist/{chunk-7JQ7LURS.mjs → chunk-H36CWHUP.mjs} +9 -4
  11. package/dist/{chunk-5XKYWZZZ.mjs → chunk-HGTF6A46.mjs} +5 -1
  12. package/dist/chunk-HT2BXCEM.js +264 -0
  13. package/dist/chunk-HUZVBDHV.js +81 -0
  14. package/dist/{chunk-6ZC7H22S.mjs → chunk-IAF24RKI.mjs} +1 -1
  15. package/dist/chunk-IYFSM2GA.mjs +141 -0
  16. package/dist/chunk-JAVDNFJD.js +144 -0
  17. package/dist/chunk-JOHKSMJM.mjs +266 -0
  18. package/dist/{chunk-WEGU7O4J.mjs → chunk-KOLLAGRK.mjs} +1 -1
  19. package/dist/{chunk-P273E6XE.js → chunk-MQTHGPHF.js} +37 -21
  20. package/dist/{chunk-IS7YOBR7.mjs → chunk-NDOYQK2R.mjs} +13 -5
  21. package/dist/chunk-OVWCTDAL.js +209 -0
  22. package/dist/{chunk-2DOPHSZP.js → chunk-OWUGXP6K.js} +8 -3
  23. package/dist/{chunk-GIYBVWR4.mjs → chunk-OZLAGTZW.mjs} +38 -22
  24. package/dist/{chunk-OD2NNQD2.js → chunk-PBJ2J2B3.js} +2 -2
  25. package/dist/chunk-PVOQUXIB.mjs +189 -0
  26. package/dist/chunk-Q2GPRAF4.js +66 -0
  27. package/dist/chunk-R67R3TVA.mjs +261 -0
  28. package/dist/{chunk-6PUSRC6S.js → chunk-T3GSXTDU.js} +2 -2
  29. package/dist/chunk-WKGCUR7O.mjs +107 -0
  30. package/dist/chunk-X4F6NSI5.mjs +104 -0
  31. package/dist/chunk-Y6557RWE.mjs +62 -0
  32. package/dist/chunk-YIF5VX7K.mjs +158 -0
  33. package/dist/chunk-Z5DDULTA.js +72 -0
  34. package/dist/chunk-Z6G4HABF.js +272 -0
  35. package/dist/chunk-ZN2BZCTI.js +192 -0
  36. package/dist/chunk-ZPWDDAFE.js +162 -0
  37. package/dist/components/ActivityFeed.d.mts +10 -0
  38. package/dist/components/ActivityFeed.d.ts +10 -0
  39. package/dist/components/ActivityFeed.js +23 -0
  40. package/dist/components/ActivityFeed.mjs +8 -0
  41. package/dist/components/Anchor.d.mts +38 -0
  42. package/dist/components/Anchor.d.ts +38 -0
  43. package/dist/components/Anchor.js +20 -0
  44. package/dist/components/Anchor.mjs +1 -0
  45. package/dist/components/AnchorLink.d.mts +23 -0
  46. package/dist/components/AnchorLink.d.ts +23 -0
  47. package/dist/components/AnchorLink.js +17 -0
  48. package/dist/components/AnchorLink.mjs +2 -0
  49. package/dist/components/AreaChart.js +4 -4
  50. package/dist/components/AreaChart.mjs +2 -2
  51. package/dist/components/BackTop.d.mts +21 -0
  52. package/dist/components/BackTop.d.ts +21 -0
  53. package/dist/components/BackTop.js +16 -0
  54. package/dist/components/BackTop.mjs +1 -0
  55. package/dist/components/BarChart.js +4 -4
  56. package/dist/components/BarChart.mjs +2 -2
  57. package/dist/components/Breadcrumb.d.mts +4 -0
  58. package/dist/components/Breadcrumb.d.ts +4 -0
  59. package/dist/components/Breadcrumb.js +3 -3
  60. package/dist/components/Breadcrumb.mjs +1 -1
  61. package/dist/components/BreadcrumbItem.js +3 -3
  62. package/dist/components/BreadcrumbItem.mjs +2 -2
  63. package/dist/components/Carousel.d.mts +26 -0
  64. package/dist/components/Carousel.d.ts +26 -0
  65. package/dist/components/Carousel.js +10 -0
  66. package/dist/components/Carousel.mjs +1 -0
  67. package/dist/components/ChatWindow.d.mts +12 -0
  68. package/dist/components/ChatWindow.d.ts +12 -0
  69. package/dist/components/ChatWindow.js +20 -0
  70. package/dist/components/ChatWindow.mjs +5 -0
  71. package/dist/components/Collapse.d.mts +29 -0
  72. package/dist/components/Collapse.d.ts +29 -0
  73. package/dist/components/Collapse.js +20 -0
  74. package/dist/components/Collapse.mjs +1 -0
  75. package/dist/components/CollapsePanel.d.mts +24 -0
  76. package/dist/components/CollapsePanel.d.ts +24 -0
  77. package/dist/components/CollapsePanel.js +17 -0
  78. package/dist/components/CollapsePanel.mjs +2 -0
  79. package/dist/components/CommentThread.d.mts +8 -0
  80. package/dist/components/CommentThread.d.ts +8 -0
  81. package/dist/components/CommentThread.js +21 -0
  82. package/dist/components/CommentThread.mjs +6 -0
  83. package/dist/components/DataTableWithToolbar.d.mts +51 -0
  84. package/dist/components/DataTableWithToolbar.d.ts +51 -0
  85. package/dist/components/DataTableWithToolbar.js +24 -0
  86. package/dist/components/DataTableWithToolbar.mjs +9 -0
  87. package/dist/components/Dropdown.js +4 -4
  88. package/dist/components/Dropdown.mjs +2 -2
  89. package/dist/components/DropdownItem.js +4 -4
  90. package/dist/components/DropdownItem.mjs +3 -3
  91. package/dist/components/FormItem.js +2 -2
  92. package/dist/components/FormItem.mjs +1 -1
  93. package/dist/components/FormWizard.d.mts +10 -0
  94. package/dist/components/FormWizard.d.ts +10 -0
  95. package/dist/components/FormWizard.js +19 -0
  96. package/dist/components/FormWizard.mjs +4 -0
  97. package/dist/components/LineChart.js +4 -4
  98. package/dist/components/LineChart.mjs +2 -2
  99. package/dist/components/NotificationCenter.d.mts +8 -0
  100. package/dist/components/NotificationCenter.d.ts +8 -0
  101. package/dist/components/NotificationCenter.js +23 -0
  102. package/dist/components/NotificationCenter.mjs +8 -0
  103. package/dist/components/Pagination.js +3 -3
  104. package/dist/components/Pagination.mjs +1 -1
  105. package/dist/components/ScatterChart.js +4 -4
  106. package/dist/components/ScatterChart.mjs +2 -2
  107. package/dist/components/Table.d.mts +1 -1
  108. package/dist/components/Table.d.ts +1 -1
  109. package/dist/components/Table.js +2 -2
  110. package/dist/components/Table.mjs +1 -1
  111. package/dist/index.d.mts +12 -0
  112. package/dist/index.d.ts +12 -0
  113. package/dist/index.js +221 -153
  114. package/dist/index.mjs +51 -39
  115. package/package.json +2 -2
  116. package/dist/{chunk-42UKIFFQ.js → chunk-4PTI6ZUK.js} +1 -1
  117. package/dist/{chunk-LIJLFLYE.js → chunk-4TWHENPT.js} +1 -1
  118. package/dist/{chunk-OONM7FO7.js → chunk-6E5UKM6O.js} +1 -1
  119. package/dist/{chunk-KBGURVTD.mjs → chunk-AITVDDCE.mjs} +1 -1
  120. package/dist/{chunk-CBALIFPW.mjs → chunk-IL2Y5RCX.mjs} +1 -1
  121. package/dist/{chunk-QI6WAP6Y.js → chunk-L63N3LCG.js} +1 -1
  122. package/dist/{chunk-A2UW5OKX.mjs → chunk-PT4WLSTJ.mjs} +1 -1
  123. package/dist/{chunk-EJLJYOO7.js → chunk-SIB4EHB6.js} +1 -1
  124. package/dist/{chunk-VBSK4TGO.mjs → chunk-WYTHTJN3.mjs} +1 -1
  125. package/dist/{chunk-7IKJBQQV.mjs → chunk-YGOTPK2W.mjs} +1 -1
@@ -0,0 +1,107 @@
1
+ import { Timeline } from './chunk-LADCWARG.mjs';
2
+ import { Link } from './chunk-WSJO2PIE.mjs';
3
+ import { Loading } from './chunk-PUDU34R4.mjs';
4
+ import { Tag } from './chunk-DIZNY6N4.mjs';
5
+ import { Text } from './chunk-6YDIBMCM.mjs';
6
+ import { Card } from './chunk-VD3IK5XT.mjs';
7
+ import { Avatar } from './chunk-V2HVHLBY.mjs';
8
+ import { useMemo } from 'react';
9
+ import { buildActivityGroups, classNames, toActivityTimelineItems, formatActivityTime } from '@expcat/tigercat-core';
10
+ import { jsx, jsxs } from 'react/jsx-runtime';
11
+
12
+ var renderAction = (item, action, index) => {
13
+ const key = action.key ?? `${item.id}-action-${index}`;
14
+ return /* @__PURE__ */ jsx(
15
+ Link,
16
+ {
17
+ size: "sm",
18
+ variant: "primary",
19
+ href: action.href,
20
+ target: action.target,
21
+ disabled: action.disabled,
22
+ onClick: () => action.onClick?.(item, action),
23
+ children: action.label
24
+ },
25
+ key
26
+ );
27
+ };
28
+ var ActivityFeed = ({
29
+ items = [],
30
+ groups,
31
+ groupBy,
32
+ groupOrder,
33
+ loading = false,
34
+ loadingText = "\u52A0\u8F7D\u4E2D...",
35
+ emptyText = "\u6682\u65E0\u52A8\u6001",
36
+ showAvatar = true,
37
+ showTime = true,
38
+ showGroupTitle = true,
39
+ renderItem,
40
+ renderGroupHeader,
41
+ className,
42
+ ...props
43
+ }) => {
44
+ const resolvedGroups = useMemo(
45
+ () => buildActivityGroups(items, groups, groupBy, groupOrder),
46
+ [items, groups, groupBy, groupOrder]
47
+ );
48
+ const wrapperClasses = classNames(
49
+ "tiger-activity-feed",
50
+ "flex",
51
+ "flex-col",
52
+ "gap-6",
53
+ "w-full",
54
+ className
55
+ );
56
+ const renderDefaultItem = (item, index, group) => {
57
+ if (renderItem) return renderItem(item, index, group);
58
+ const titleText = item.title ?? (typeof item.content === "string" || typeof item.content === "number" ? String(item.content) : "");
59
+ const descriptionText = item.description;
60
+ const timeText = showTime ? formatActivityTime(item.time) : "";
61
+ const actionNodes = item.actions?.map(
62
+ (action, actionIndex) => renderAction(item, action, actionIndex)
63
+ );
64
+ return /* @__PURE__ */ jsx("div", { className: "tiger-activity-item", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-3 items-start", children: [
65
+ showAvatar && item.user ? /* @__PURE__ */ jsx(Avatar, { size: "sm", src: item.user.avatar, text: item.user.name, className: "shrink-0" }) : null,
66
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
67
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 mb-1", children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
69
+ titleText ? /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", weight: "medium", className: "truncate", children: titleText }) : null,
70
+ item.status ? /* @__PURE__ */ jsx(Tag, { variant: item.status.variant ?? "default", size: "sm", className: "shrink-0", children: item.status.label }) : null
71
+ ] }),
72
+ timeText ? /* @__PURE__ */ jsx(Text, { tag: "div", size: "xs", color: "muted", className: "shrink-0 whitespace-nowrap", children: timeText }) : null
73
+ ] }),
74
+ descriptionText ? /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", color: "muted", className: "mb-2 break-words", children: descriptionText }) : null,
75
+ actionNodes?.length ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: actionNodes }) : null
76
+ ] })
77
+ ] }) });
78
+ };
79
+ if (loading) {
80
+ return /* @__PURE__ */ jsx("div", { className: wrapperClasses, ...props, "data-tiger-activity-feed": true, children: /* @__PURE__ */ jsx(Card, { variant: "bordered", size: "sm", className: "tiger-activity-feed-loading", children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-4", children: /* @__PURE__ */ jsx(Loading, { text: loadingText }) }) }) });
81
+ }
82
+ if (resolvedGroups.length === 0) {
83
+ return /* @__PURE__ */ jsx("div", { className: wrapperClasses, ...props, "data-tiger-activity-feed": true, children: /* @__PURE__ */ jsx(Card, { variant: "bordered", size: "sm", className: "tiger-activity-feed-empty", children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-6", children: /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", color: "muted", children: emptyText }) }) }) });
84
+ }
85
+ return /* @__PURE__ */ jsx("div", { className: wrapperClasses, ...props, "data-tiger-activity-feed": true, children: resolvedGroups.map((group, groupIndex) => {
86
+ const headerNode = renderGroupHeader?.(group);
87
+ const groupTitle = group.title;
88
+ const timelineItems = toActivityTimelineItems(group.items);
89
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
90
+ showGroupTitle && groupTitle ? headerNode ?? /* @__PURE__ */ jsx(Text, { tag: "div", size: "sm", weight: "medium", color: "muted", children: groupTitle }) : null,
91
+ /* @__PURE__ */ jsx(
92
+ Timeline,
93
+ {
94
+ items: timelineItems,
95
+ renderItem: (timelineItem, index) => {
96
+ const activity = timelineItem.activity;
97
+ if (!activity) return null;
98
+ return renderDefaultItem(activity, index, group);
99
+ }
100
+ }
101
+ )
102
+ ] }, group.key ?? groupIndex);
103
+ }) });
104
+ };
105
+ var ActivityFeed_default = ActivityFeed;
106
+
107
+ export { ActivityFeed, ActivityFeed_default };
@@ -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;