xxf_react 0.2.7 → 0.2.9
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/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -0
- package/dist/refresh/index.d.ts.map +1 -1
- package/dist/refresh/index.js +1 -0
- package/dist/responsive/index.d.ts.map +1 -1
- package/dist/responsive/index.js +1 -0
- package/dist/sse/index.d.ts.map +1 -1
- package/dist/sse/index.js +1 -0
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/scroll-to-center.d.ts +72 -0
- package/dist/utils/scroll-to-center.d.ts.map +1 -0
- package/dist/utils/scroll-to-center.js +145 -0
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAEA,cAAc,eAAe,CAAC"}
|
package/dist/media/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/refresh/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/refresh/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC"}
|
package/dist/refresh/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/responsive/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/responsive/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC"}
|
package/dist/responsive/index.js
CHANGED
package/dist/sse/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
package/dist/sse/index.js
CHANGED
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './scroll-to-center';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA,cAAc,oBAAoB,CAAA"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
export * from './scroll-to-center';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** 滚动对齐方式 */
|
|
2
|
+
type ScrollAlign = 'center' | 'start' | 'end' | 'nearest';
|
|
3
|
+
/** 滚动配置选项 */
|
|
4
|
+
interface ScrollOptions {
|
|
5
|
+
/** 滚动行为:'smooth' 平滑滚动 | 'instant' 瞬间滚动 | 'auto' 自动,默认 'smooth' */
|
|
6
|
+
behavior?: ScrollBehavior;
|
|
7
|
+
/** 对齐方式:'center' 居中 | 'start' 起始 | 'end' 末尾 | 'nearest' 最近可见,默认 'center' */
|
|
8
|
+
align?: ScrollAlign;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 将元素滚动到容器指定位置
|
|
12
|
+
* @param element - 要滚动到的目标元素,为 null 时不执行滚动
|
|
13
|
+
* @param container - 可滚动的容器元素,为 null 时不执行滚动
|
|
14
|
+
* @param options - 滚动配置选项
|
|
15
|
+
* @param options.behavior - 滚动行为,默认 'smooth'
|
|
16
|
+
* @param options.align - 对齐方式,默认 'center'
|
|
17
|
+
*/
|
|
18
|
+
export declare const scrollToElement: (element: HTMLElement | null, container: HTMLElement | null, options?: ScrollOptions) => void;
|
|
19
|
+
/**
|
|
20
|
+
* scrollToElement 的别名,保持向后兼容
|
|
21
|
+
* @deprecated 请使用 {@link scrollToElement} 代替
|
|
22
|
+
*/
|
|
23
|
+
export declare const scrollToCenter: (element: HTMLElement | null, container: HTMLElement | null, options?: ScrollOptions) => void;
|
|
24
|
+
/** useScrollToCenter Hook 的配置选项 */
|
|
25
|
+
interface UseScrollToCenterOptions {
|
|
26
|
+
/** 初始值,用于首次渲染时自动滚动到该值对应的元素(通过 data-value 属性匹配) */
|
|
27
|
+
initialValue?: string | number;
|
|
28
|
+
/** 对齐方式:'center' 居中 | 'start' 起始 | 'end' 末尾 | 'nearest' 最近可见,默认 'center' */
|
|
29
|
+
align?: ScrollAlign;
|
|
30
|
+
/** 滚动行为:'smooth' 平滑滚动 | 'instant' 瞬间滚动 | 'auto' 自动,默认 'smooth' */
|
|
31
|
+
behavior?: ScrollBehavior;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Hook: 用于可滚动 Tabs 的自动居中
|
|
35
|
+
* https://www.radix-ui.com/primitives/docs/components/tabs
|
|
36
|
+
*
|
|
37
|
+
* @param options - 配置选项
|
|
38
|
+
* @param options.initialValue - 初始值,首次渲染时自动滚动到该值对应的元素
|
|
39
|
+
* @param options.align - 对齐方式,默认 'center'
|
|
40
|
+
* @param options.behavior - 滚动行为,默认 'smooth'
|
|
41
|
+
*
|
|
42
|
+
* @returns 返回对象包含:
|
|
43
|
+
* - `containerRef` - 绑定到可滚动容器的 ref
|
|
44
|
+
* - `scrollToValue` - 滚动到指定 data-value 值的元素
|
|
45
|
+
* - `scrollTo` - 滚动到指定 HTMLElement 元素
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* const { containerRef, scrollToValue } = useScrollToCenter({
|
|
50
|
+
* initialValue: activeTab, // 首次渲染时滚动到初始值
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* <Tabs.List ref={containerRef}>
|
|
54
|
+
* <Tabs.Trigger data-value="tab1">Tab 1</Tabs.Trigger>
|
|
55
|
+
* </Tabs.List>
|
|
56
|
+
*
|
|
57
|
+
* 如果<Tabs.List 里面又嵌套了可以滚动的div,那么ref必须绑定在可以滚动的div上
|
|
58
|
+
*
|
|
59
|
+
* // 切换时调用
|
|
60
|
+
* scrollToValue('tab1');
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare const useScrollToCenter: <T extends string | number = string>(options?: UseScrollToCenterOptions) => {
|
|
64
|
+
/** 绑定到可滚动容器的 ref */
|
|
65
|
+
containerRef: import("react").RefObject<HTMLDivElement | null>;
|
|
66
|
+
/** 滚动到指定 data-value 值的元素 */
|
|
67
|
+
scrollToValue: (value: T, scrollOptions?: ScrollOptions) => void;
|
|
68
|
+
/** 滚动到指定 HTMLElement 元素 */
|
|
69
|
+
scrollTo: (element: HTMLElement | null, scrollOptions?: ScrollOptions) => void;
|
|
70
|
+
};
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=scroll-to-center.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-to-center.d.ts","sourceRoot":"","sources":["../../src/utils/scroll-to-center.ts"],"names":[],"mappings":"AAEA,aAAa;AACb,KAAK,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAE1D,aAAa;AACb,UAAU,aAAa;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,WAAW,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GACxB,SAAS,WAAW,GAAG,IAAI,EAC3B,WAAW,WAAW,GAAG,IAAI,EAC7B,UAAS,aAAkB,SAmD9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,YA3Dd,WAAW,GAAG,IAAI,aAChB,WAAW,GAAG,IAAI,YACpB,aAAa,SAyDmB,CAAC;AAE9C,mCAAmC;AACnC,UAAU,wBAAwB;IAC9B,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAChE,UAAS,wBAA6B;IA8DlC,oBAAoB;;IAEpB,4BAA4B;2BArCpB,CAAC,kBAAkB,aAAa;IAuCxC,2BAA2B;wBAjBjB,WAAW,GAAG,IAAI,kBAAkB,aAAa;CAoBlE,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 将元素滚动到容器指定位置
|
|
4
|
+
* @param element - 要滚动到的目标元素,为 null 时不执行滚动
|
|
5
|
+
* @param container - 可滚动的容器元素,为 null 时不执行滚动
|
|
6
|
+
* @param options - 滚动配置选项
|
|
7
|
+
* @param options.behavior - 滚动行为,默认 'smooth'
|
|
8
|
+
* @param options.align - 对齐方式,默认 'center'
|
|
9
|
+
*/
|
|
10
|
+
export const scrollToElement = (element, container, options = {}) => {
|
|
11
|
+
if (!element || !container)
|
|
12
|
+
return;
|
|
13
|
+
const { behavior = 'smooth', align = 'center' } = options;
|
|
14
|
+
// 使用 getBoundingClientRect 计算相对位置(更可靠,不受 DOM 层级影响)
|
|
15
|
+
const containerRect = container.getBoundingClientRect();
|
|
16
|
+
const elementRect = element.getBoundingClientRect();
|
|
17
|
+
const elementLeftRelative = elementRect.left - containerRect.left + container.scrollLeft;
|
|
18
|
+
const containerWidth = container.offsetWidth;
|
|
19
|
+
const elementWidth = element.offsetWidth;
|
|
20
|
+
const maxScroll = container.scrollWidth - containerWidth;
|
|
21
|
+
let scrollLeft;
|
|
22
|
+
switch (align) {
|
|
23
|
+
case 'start':
|
|
24
|
+
scrollLeft = elementLeftRelative;
|
|
25
|
+
break;
|
|
26
|
+
case 'end':
|
|
27
|
+
scrollLeft = elementLeftRelative - containerWidth + elementWidth;
|
|
28
|
+
break;
|
|
29
|
+
case 'nearest': {
|
|
30
|
+
const currentScroll = container.scrollLeft;
|
|
31
|
+
const elementRight = elementLeftRelative + elementWidth;
|
|
32
|
+
const visibleLeft = currentScroll;
|
|
33
|
+
const visibleRight = currentScroll + containerWidth;
|
|
34
|
+
if (elementLeftRelative < visibleLeft) {
|
|
35
|
+
scrollLeft = elementLeftRelative;
|
|
36
|
+
}
|
|
37
|
+
else if (elementRight > visibleRight) {
|
|
38
|
+
scrollLeft = elementRight - containerWidth;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return; // 已在视口内,不滚动
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'center':
|
|
46
|
+
default:
|
|
47
|
+
scrollLeft = elementLeftRelative - containerWidth / 2 + elementWidth / 2;
|
|
48
|
+
}
|
|
49
|
+
// 限制在有效范围内
|
|
50
|
+
const clampedScroll = Math.max(0, Math.min(scrollLeft, maxScroll));
|
|
51
|
+
container.scrollTo({
|
|
52
|
+
left: clampedScroll,
|
|
53
|
+
behavior,
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* scrollToElement 的别名,保持向后兼容
|
|
58
|
+
* @deprecated 请使用 {@link scrollToElement} 代替
|
|
59
|
+
*/
|
|
60
|
+
export const scrollToCenter = scrollToElement;
|
|
61
|
+
/**
|
|
62
|
+
* Hook: 用于可滚动 Tabs 的自动居中
|
|
63
|
+
* https://www.radix-ui.com/primitives/docs/components/tabs
|
|
64
|
+
*
|
|
65
|
+
* @param options - 配置选项
|
|
66
|
+
* @param options.initialValue - 初始值,首次渲染时自动滚动到该值对应的元素
|
|
67
|
+
* @param options.align - 对齐方式,默认 'center'
|
|
68
|
+
* @param options.behavior - 滚动行为,默认 'smooth'
|
|
69
|
+
*
|
|
70
|
+
* @returns 返回对象包含:
|
|
71
|
+
* - `containerRef` - 绑定到可滚动容器的 ref
|
|
72
|
+
* - `scrollToValue` - 滚动到指定 data-value 值的元素
|
|
73
|
+
* - `scrollTo` - 滚动到指定 HTMLElement 元素
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```tsx
|
|
77
|
+
* const { containerRef, scrollToValue } = useScrollToCenter({
|
|
78
|
+
* initialValue: activeTab, // 首次渲染时滚动到初始值
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* <Tabs.List ref={containerRef}>
|
|
82
|
+
* <Tabs.Trigger data-value="tab1">Tab 1</Tabs.Trigger>
|
|
83
|
+
* </Tabs.List>
|
|
84
|
+
*
|
|
85
|
+
* 如果<Tabs.List 里面又嵌套了可以滚动的div,那么ref必须绑定在可以滚动的div上
|
|
86
|
+
*
|
|
87
|
+
* // 切换时调用
|
|
88
|
+
* scrollToValue('tab1');
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export const useScrollToCenter = (options = {}) => {
|
|
92
|
+
const { initialValue, align = 'center', behavior = 'smooth' } = options;
|
|
93
|
+
const containerRef = useRef(null);
|
|
94
|
+
const initializedRef = useRef(false);
|
|
95
|
+
// 初始渲染时滚动到初始值(无动画)
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (initializedRef.current || initialValue === undefined)
|
|
98
|
+
return;
|
|
99
|
+
initializedRef.current = true;
|
|
100
|
+
// 延迟执行,确保 DOM 渲染完成
|
|
101
|
+
requestAnimationFrame(() => {
|
|
102
|
+
const container = containerRef.current;
|
|
103
|
+
const element = container === null || container === void 0 ? void 0 : container.querySelector(`[data-value="${initialValue}"]`);
|
|
104
|
+
scrollToElement(element, container, { behavior: 'instant', align });
|
|
105
|
+
});
|
|
106
|
+
}, [initialValue, align]);
|
|
107
|
+
/**
|
|
108
|
+
* 滚动到指定 data-value 值的元素
|
|
109
|
+
* @param value - 目标元素的 data-value 属性值
|
|
110
|
+
* @param scrollOptions - 可选的滚动配置,覆盖默认配置
|
|
111
|
+
*/
|
|
112
|
+
const scrollToValue = useCallback((value, scrollOptions) => {
|
|
113
|
+
requestAnimationFrame(() => {
|
|
114
|
+
const container = containerRef.current;
|
|
115
|
+
const element = container === null || container === void 0 ? void 0 : container.querySelector(`[data-value="${value}"]`);
|
|
116
|
+
scrollToElement(element, container, {
|
|
117
|
+
behavior,
|
|
118
|
+
align,
|
|
119
|
+
...scrollOptions,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}, [align, behavior]);
|
|
123
|
+
/**
|
|
124
|
+
* 滚动到指定的 HTMLElement 元素
|
|
125
|
+
* @param element - 目标 HTMLElement 元素
|
|
126
|
+
* @param scrollOptions - 可选的滚动配置,覆盖默认配置
|
|
127
|
+
*/
|
|
128
|
+
const scrollTo = useCallback((element, scrollOptions) => {
|
|
129
|
+
requestAnimationFrame(() => {
|
|
130
|
+
scrollToElement(element, containerRef.current, {
|
|
131
|
+
behavior,
|
|
132
|
+
align,
|
|
133
|
+
...scrollOptions,
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}, [align, behavior]);
|
|
137
|
+
return {
|
|
138
|
+
/** 绑定到可滚动容器的 ref */
|
|
139
|
+
containerRef,
|
|
140
|
+
/** 滚动到指定 data-value 值的元素 */
|
|
141
|
+
scrollToValue,
|
|
142
|
+
/** 滚动到指定 HTMLElement 元素 */
|
|
143
|
+
scrollTo,
|
|
144
|
+
};
|
|
145
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xxf_react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
|
|
6
6
|
"type": "module",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@microsoft/fetch-event-source": "^2.0.1",
|
|
66
|
+
"react-async-hook": "^4.0.0",
|
|
66
67
|
"react-responsive": "^10.0.1",
|
|
67
68
|
"react-toastify": "^11.0.5",
|
|
68
69
|
"react-virtuoso": "^4.17.0",
|