@rainbow-oh/yee-c 0.4.0 → 0.4.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.
@@ -67,7 +67,6 @@ var import_lucide_react = require("lucide-react");
67
67
  var import_react = __toESM(require("react"));
68
68
  var import_Config_Provider = require("../Config-Provider");
69
69
  var import_useMergedState = __toESM(require("../hooks/useMergedState"));
70
- var import_debounce = __toESM(require("../utils/debounce"));
71
70
  var import_mergeContextToProps = __toESM(require("../utils/mergeContextToProps"));
72
71
  var import_anchor_item = __toESM(require("./anchor-item"));
73
72
  var import_style = require("./style/index.less");
@@ -158,31 +157,50 @@ var Anchor = (0, import_react.forwardRef)((baseprops, ref) => {
158
157
  const currentItems2 = auto ? anchorList : items;
159
158
  if (!currentItems2 || currentItems2.length === 0)
160
159
  return;
160
+ let nextActiveKey;
161
161
  for (let i = currentItems2.length - 1; i >= 0; i--) {
162
162
  const item = currentItems2[i];
163
163
  const target = document.getElementById(item.key);
164
164
  if (target) {
165
165
  const targetTop = getTargetOffsetTop(target);
166
166
  if (scrollTop + offsetTop >= targetTop) {
167
- if (activeKeyRef.current !== item.key) {
168
- setMergedActiveKey(item.key);
169
- onChange == null ? void 0 : onChange(item.key);
170
- }
167
+ nextActiveKey = item.key;
171
168
  break;
172
169
  }
173
170
  }
174
171
  }
172
+ if (nextActiveKey === void 0) {
173
+ const first = currentItems2.find(
174
+ (item) => document.getElementById(item.key)
175
+ );
176
+ nextActiveKey = first == null ? void 0 : first.key;
177
+ }
178
+ if (nextActiveKey && activeKeyRef.current !== nextActiveKey) {
179
+ setMergedActiveKey(nextActiveKey);
180
+ onChange == null ? void 0 : onChange(nextActiveKey);
181
+ }
175
182
  }, [auto, anchorList, items, offsetTop, onChange, getTargetOffsetTop]);
176
183
  (0, import_react.useEffect)(() => {
177
- const container = containerRef.current;
184
+ const container = getContainer ? getContainer() : window;
185
+ containerRef.current = container;
178
186
  if (!container)
179
187
  return;
180
- const debouncedScroll = (0, import_debounce.default)(handleScroll, 100);
181
- container.addEventListener("scroll", debouncedScroll);
188
+ let rafId = null;
189
+ const onScroll = () => {
190
+ if (rafId !== null)
191
+ return;
192
+ rafId = requestAnimationFrame(() => {
193
+ rafId = null;
194
+ handleScroll();
195
+ });
196
+ };
197
+ container.addEventListener("scroll", onScroll);
182
198
  handleScroll();
183
199
  return () => {
184
- container.removeEventListener("scroll", debouncedScroll);
185
- debouncedScroll.cancel();
200
+ container.removeEventListener("scroll", onScroll);
201
+ if (rafId !== null) {
202
+ cancelAnimationFrame(rafId);
203
+ }
186
204
  };
187
205
  }, [getContainer, handleScroll]);
188
206
  const scrollToAnchor = (0, import_react.useCallback)(
@@ -205,10 +223,7 @@ var Anchor = (0, import_react.forwardRef)((baseprops, ref) => {
205
223
  },
206
224
  [offsetTop, getTargetOffsetTop]
207
225
  );
208
- (0, import_react.useLayoutEffect)(() => {
209
- containerRef.current = getContainer ? getContainer() : window;
210
- }, [getContainer]);
211
- (0, import_react.useLayoutEffect)(() => {
226
+ (0, import_react.useEffect)(() => {
212
227
  if (defaultActiveKey) {
213
228
  scrollToAnchor(defaultActiveKey);
214
229
  }
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-06-26T09:17:49.742Z
4
+ * Generated on 2026-06-30T03:06:46.452Z
5
5
  */
6
6
 
7
7
  /* ========== color.blue.css ========== */
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-06-26T09:17:49.742Z
4
+ * Generated on 2026-06-30T03:06:46.452Z
5
5
  */
6
6
 
7
7
  /* ========== color.css ========== */
@@ -3,4 +3,4 @@ declare global {
3
3
  __yee_c_version__: string;
4
4
  }
5
5
  }
6
- export declare const version = "0.4.0";
6
+ export declare const version = "0.4.1";
@@ -22,7 +22,7 @@ __export(version_exports, {
22
22
  version: () => version
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- var version = "0.4.0";
25
+ var version = "0.4.1";
26
26
  if (typeof window !== "undefined") {
27
27
  window.__yee_c_version__ = version;
28
28
  }
@@ -14,10 +14,9 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
14
14
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
15
15
  import clsx from 'clsx';
16
16
  import { ChevronLeft } from 'lucide-react';
17
- import React, { createContext, forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
17
+ import React, { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from 'react';
18
18
  import { GlobalContext } from "../Config-Provider";
19
19
  import useMergedState from "../hooks/useMergedState";
20
- import debounce from "../utils/debounce";
21
20
  import mergeContextToProps from "../utils/mergeContextToProps";
22
21
  import AnchorItem from "./anchor-item";
23
22
  import "./style/index.less";
@@ -109,30 +108,56 @@ var Anchor = /*#__PURE__*/forwardRef(function (baseprops, ref) {
109
108
 
110
109
  // Empty array guard
111
110
  if (!currentItems || currentItems.length === 0) return;
111
+
112
+ // Pick the last anchor whose top has crossed the activation line.
113
+ var nextActiveKey;
112
114
  for (var i = currentItems.length - 1; i >= 0; i--) {
113
115
  var item = currentItems[i];
114
116
  var target = document.getElementById(item.key);
115
117
  if (target) {
116
118
  var targetTop = getTargetOffsetTop(target);
117
119
  if (scrollTop + offsetTop >= targetTop) {
118
- if (activeKeyRef.current !== item.key) {
119
- setMergedActiveKey(item.key);
120
- onChange === null || onChange === void 0 || onChange(item.key);
121
- }
120
+ nextActiveKey = item.key;
122
121
  break;
123
122
  }
124
123
  }
125
124
  }
125
+
126
+ // Scrolled above the first anchor — reset to the top item.
127
+ if (nextActiveKey === undefined) {
128
+ var first = currentItems.find(function (item) {
129
+ return document.getElementById(item.key);
130
+ });
131
+ nextActiveKey = first === null || first === void 0 ? void 0 : first.key;
132
+ }
133
+ if (nextActiveKey && activeKeyRef.current !== nextActiveKey) {
134
+ setMergedActiveKey(nextActiveKey);
135
+ onChange === null || onChange === void 0 || onChange(nextActiveKey);
136
+ }
126
137
  }, [auto, anchorList, items, offsetTop, onChange, getTargetOffsetTop]);
127
138
  useEffect(function () {
128
- var container = containerRef.current;
139
+ // Resolve in a passive effect: parent-owned refs passed via `getContainer`
140
+ // aren't attached until after child layout effects run.
141
+ var container = getContainer ? getContainer() : window;
142
+ containerRef.current = container;
129
143
  if (!container) return;
130
- var debouncedScroll = debounce(handleScroll, 100);
131
- container.addEventListener('scroll', debouncedScroll);
144
+
145
+ // rAF throttle so the active key tracks scroll live.
146
+ var rafId = null;
147
+ var onScroll = function onScroll() {
148
+ if (rafId !== null) return;
149
+ rafId = requestAnimationFrame(function () {
150
+ rafId = null;
151
+ handleScroll();
152
+ });
153
+ };
154
+ container.addEventListener('scroll', onScroll);
132
155
  handleScroll();
133
156
  return function () {
134
- container.removeEventListener('scroll', debouncedScroll);
135
- debouncedScroll.cancel();
157
+ container.removeEventListener('scroll', onScroll);
158
+ if (rafId !== null) {
159
+ cancelAnimationFrame(rafId);
160
+ }
136
161
  };
137
162
  }, [getContainer, handleScroll]);
138
163
 
@@ -155,10 +180,7 @@ var Anchor = /*#__PURE__*/forwardRef(function (baseprops, ref) {
155
180
  });
156
181
  }
157
182
  }, [offsetTop, getTargetOffsetTop]);
158
- useLayoutEffect(function () {
159
- containerRef.current = getContainer ? getContainer() : window;
160
- }, [getContainer]);
161
- useLayoutEffect(function () {
183
+ useEffect(function () {
162
184
  if (defaultActiveKey) {
163
185
  scrollToAnchor(defaultActiveKey);
164
186
  }
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-06-26T09:17:49.742Z
4
+ * Generated on 2026-06-30T03:06:46.452Z
5
5
  */
6
6
 
7
7
  /* ========== color.blue.css ========== */
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-06-26T09:17:49.742Z
4
+ * Generated on 2026-06-30T03:06:46.452Z
5
5
  */
6
6
 
7
7
  /* ========== color.css ========== */
@@ -3,4 +3,4 @@ declare global {
3
3
  __yee_c_version__: string;
4
4
  }
5
5
  }
6
- export declare const version = "0.4.0";
6
+ export declare const version = "0.4.1";
@@ -1,4 +1,4 @@
1
- export var version = "0.4.0";
1
+ export var version = "0.4.1";
2
2
  if (typeof window !== 'undefined') {
3
3
  window.__yee_c_version__ = version;
4
4
  }