@tarojs/components-react 4.1.4-beta.21 → 4.1.4-beta.22
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/index.css +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/solid/index.css +1 -1
- package/dist/solid/index.js +0 -4
- package/dist/solid/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/components/list/ListItem.js +0 -18
- package/dist/components/list/ListItem.js.map +0 -1
- package/dist/components/list/StickyHeader.js +0 -18
- package/dist/components/list/StickyHeader.js.map +0 -1
- package/dist/components/list/StickySection.js +0 -18
- package/dist/components/list/StickySection.js.map +0 -1
- package/dist/components/list/index.js +0 -348
- package/dist/components/list/index.js.map +0 -1
- package/dist/components/list/style/index.scss.js +0 -4
- package/dist/components/list/style/index.scss.js.map +0 -1
- package/dist/solid/components/list/ListItem.js +0 -21
- package/dist/solid/components/list/ListItem.js.map +0 -1
- package/dist/solid/components/list/StickyHeader.js +0 -21
- package/dist/solid/components/list/StickyHeader.js.map +0 -1
- package/dist/solid/components/list/StickySection.js +0 -21
- package/dist/solid/components/list/StickySection.js.map +0 -1
- package/dist/solid/components/list/index.js +0 -355
- package/dist/solid/components/list/index.js.map +0 -1
- package/dist/solid/components/list/style/index.scss.js +0 -4
- package/dist/solid/components/list/style/index.scss.js.map +0 -1
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { createComponent, mergeProps, memo } from 'solid-js/web';
|
|
2
|
-
import './style/index.scss.js';
|
|
3
|
-
import { View, ScrollView } from '@tarojs/components';
|
|
4
|
-
import React__default from 'react';
|
|
5
|
-
import ListItem from './ListItem.js';
|
|
6
|
-
import StickyHeader from './StickyHeader.js';
|
|
7
|
-
import StickySection from './StickySection.js';
|
|
8
|
-
|
|
9
|
-
// 工具:累加数组
|
|
10
|
-
function accumulate(arr) {
|
|
11
|
-
const result = [0];
|
|
12
|
-
for (let i = 0; i < arr.length; i++) {
|
|
13
|
-
result[i + 1] = result[i] + arr[i];
|
|
14
|
-
}
|
|
15
|
-
return result;
|
|
16
|
-
}
|
|
17
|
-
// 检测抖动
|
|
18
|
-
function isShaking(diffList) {
|
|
19
|
-
if (diffList.length < 3) return false;
|
|
20
|
-
// 检查是否有连续的正负交替
|
|
21
|
-
const signs = diffList.map(diff => Math.sign(diff));
|
|
22
|
-
let alternations = 0;
|
|
23
|
-
for (let i = 1; i < signs.length; i++) {
|
|
24
|
-
if (signs[i] !== 0 && signs[i] !== signs[i - 1]) {
|
|
25
|
-
alternations++;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
// 如果交替次数过多,认为是抖动
|
|
29
|
-
return alternations >= 2;
|
|
30
|
-
}
|
|
31
|
-
const List = props => {
|
|
32
|
-
const isH5 = process.env.TARO_ENV === 'h5';
|
|
33
|
-
const {
|
|
34
|
-
stickyHeader = false,
|
|
35
|
-
space = 0,
|
|
36
|
-
height = 400,
|
|
37
|
-
width = '100%',
|
|
38
|
-
showScrollbar = true,
|
|
39
|
-
scrollTop: controlledScrollTop,
|
|
40
|
-
onScroll,
|
|
41
|
-
onScrollToUpper,
|
|
42
|
-
onScrollToLower,
|
|
43
|
-
upperThresholdCount = 0,
|
|
44
|
-
lowerThresholdCount = 0,
|
|
45
|
-
cacheCount = 2,
|
|
46
|
-
style,
|
|
47
|
-
children,
|
|
48
|
-
layout = 'vertical'
|
|
49
|
-
} = props;
|
|
50
|
-
const isHorizontal = layout === 'horizontal';
|
|
51
|
-
const DEFAULT_ITEM_WIDTH = 120;
|
|
52
|
-
const DEFAULT_ITEM_HEIGHT = 40;
|
|
53
|
-
// 滚动状态管理
|
|
54
|
-
const containerRef = React__default.useRef(null);
|
|
55
|
-
// 渲染偏移量 - 用于计算应该渲染哪些元素
|
|
56
|
-
const [renderOffset, setRenderOffset] = React__default.useState(controlledScrollTop !== null && controlledScrollTop !== void 0 ? controlledScrollTop : 0);
|
|
57
|
-
// 滚动视图偏移量 - 只在滚动结束或明确请求时更新到ScrollView
|
|
58
|
-
const [scrollViewOffset, setScrollViewOffset] = React__default.useState(controlledScrollTop !== null && controlledScrollTop !== void 0 ? controlledScrollTop : 0);
|
|
59
|
-
const [containerLength] = React__default.useState(typeof (isHorizontal ? width : height) === 'number' ? isHorizontal ? width : height : 400);
|
|
60
|
-
// 滚动追踪相关refs
|
|
61
|
-
const isScrollingRef = React__default.useRef(false);
|
|
62
|
-
const lastScrollTopRef = React__default.useRef(controlledScrollTop !== null && controlledScrollTop !== void 0 ? controlledScrollTop : 0);
|
|
63
|
-
const scrollDiffListRef = React__default.useRef([0, 0, 0]);
|
|
64
|
-
const scrollTimeoutRef = React__default.useRef(null);
|
|
65
|
-
// 解析分组结构,只支持 StickySection 和 ListItem 作为直接子组件
|
|
66
|
-
const sections = React__default.useMemo(() => {
|
|
67
|
-
const result = [];
|
|
68
|
-
const defaultItems = [];
|
|
69
|
-
React__default.Children.forEach(children, (child, idx) => {
|
|
70
|
-
if (/*#__PURE__*/React__default.isValidElement(child) && child.type === StickySection) {
|
|
71
|
-
// 分组模式
|
|
72
|
-
const sectionProps = child.props;
|
|
73
|
-
let header = null;
|
|
74
|
-
const items = [];
|
|
75
|
-
React__default.Children.forEach(sectionProps.children, subChild => {
|
|
76
|
-
if (/*#__PURE__*/React__default.isValidElement(subChild) && subChild.type === StickyHeader) header = subChild;else if (/*#__PURE__*/React__default.isValidElement(subChild) && subChild.type === ListItem) items.push(subChild);
|
|
77
|
-
});
|
|
78
|
-
result.push({
|
|
79
|
-
header,
|
|
80
|
-
items,
|
|
81
|
-
key: child.key || String(idx)
|
|
82
|
-
});
|
|
83
|
-
} else if (/*#__PURE__*/React__default.isValidElement(child) && child.type === ListItem) {
|
|
84
|
-
// 普通 ListItem
|
|
85
|
-
defaultItems.push(child);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
if (defaultItems.length > 0) {
|
|
89
|
-
result.push({
|
|
90
|
-
header: null,
|
|
91
|
-
items: defaultItems,
|
|
92
|
-
key: 'default'
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
return result;
|
|
96
|
-
}, [children]);
|
|
97
|
-
// 工具:获取 header 尺寸,确保所有 header 相关逻辑一致
|
|
98
|
-
const getHeaderSize = () => {
|
|
99
|
-
if (isHorizontal) {
|
|
100
|
-
if (typeof props.headerWidth === 'number') return props.headerWidth;
|
|
101
|
-
if (typeof props.itemWidth === 'number') return props.itemWidth;
|
|
102
|
-
if (typeof props.itemSize === 'number') return props.itemSize;
|
|
103
|
-
if (typeof props.itemSize === 'function') return props.itemSize(0, props.itemData) || DEFAULT_ITEM_WIDTH;
|
|
104
|
-
return DEFAULT_ITEM_WIDTH;
|
|
105
|
-
} else {
|
|
106
|
-
if (typeof props.headerHeight === 'number') return props.headerHeight;
|
|
107
|
-
if (typeof props.itemHeight === 'number') return props.itemHeight;
|
|
108
|
-
if (typeof props.itemSize === 'number') return props.itemSize;
|
|
109
|
-
if (typeof props.itemSize === 'function') return props.itemSize(0, props.itemData) || DEFAULT_ITEM_HEIGHT;
|
|
110
|
-
return DEFAULT_ITEM_HEIGHT;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
// 工具:获取 item 尺寸,支持函数/props/默认值
|
|
114
|
-
const getItemSize = index => {
|
|
115
|
-
if (isHorizontal) {
|
|
116
|
-
if (typeof props.itemWidth === 'number') return props.itemWidth;
|
|
117
|
-
if (typeof props.itemSize === 'number') return props.itemSize;
|
|
118
|
-
if (typeof props.itemSize === 'function') return props.itemSize(index, props.itemData) || DEFAULT_ITEM_WIDTH;
|
|
119
|
-
return DEFAULT_ITEM_WIDTH;
|
|
120
|
-
} else {
|
|
121
|
-
if (typeof props.itemHeight === 'number') return props.itemHeight;
|
|
122
|
-
if (typeof props.itemSize === 'number') return props.itemSize;
|
|
123
|
-
if (typeof props.itemSize === 'function') return props.itemSize(index, props.itemData) || DEFAULT_ITEM_HEIGHT;
|
|
124
|
-
return DEFAULT_ITEM_HEIGHT;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
// 计算分组累积高度/宽度
|
|
128
|
-
const sectionOffsets = React__default.useMemo(() => {
|
|
129
|
-
const offsets = [0];
|
|
130
|
-
sections.forEach(section => {
|
|
131
|
-
const headerSize = getHeaderSize();
|
|
132
|
-
const itemSizes = section.items.map((_, i) => getItemSize(i));
|
|
133
|
-
const groupSize = (section.header ? headerSize : 0) + itemSizes.reduce((a, b) => a + b, 0) + Math.max(0, section.items.length) * space;
|
|
134
|
-
offsets.push(offsets[offsets.length - 1] + groupSize);
|
|
135
|
-
});
|
|
136
|
-
return offsets;
|
|
137
|
-
}, [sections, space, isHorizontal, props.headerHeight, props.headerWidth, props.itemHeight, props.itemWidth, props.itemSize, props.itemData]);
|
|
138
|
-
// 外层虚拟滚动:可见分组
|
|
139
|
-
const [startSection, endSection] = React__default.useMemo(() => {
|
|
140
|
-
let start = 0;
|
|
141
|
-
let end = sections.length - 1;
|
|
142
|
-
for (let i = 0; i < sections.length; i++) {
|
|
143
|
-
if (sectionOffsets[i + 1] > renderOffset) {
|
|
144
|
-
start = Math.max(0, i - cacheCount);
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
for (let i = start; i < sections.length; i++) {
|
|
149
|
-
if (sectionOffsets[i] >= renderOffset + containerLength) {
|
|
150
|
-
end = Math.min(sections.length - 1, i + cacheCount);
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return [start, end];
|
|
155
|
-
}, [renderOffset, containerLength, sectionOffsets, sections.length, cacheCount]);
|
|
156
|
-
// 触顶/触底事件
|
|
157
|
-
React__default.useEffect(() => {
|
|
158
|
-
if (onScrollToUpper && renderOffset <= (upperThresholdCount > 0 ? sectionOffsets[upperThresholdCount] : 0)) {
|
|
159
|
-
onScrollToUpper();
|
|
160
|
-
}
|
|
161
|
-
if (onScrollToLower && renderOffset + containerLength >= sectionOffsets[sectionOffsets.length - 1] - (lowerThresholdCount > 0 ? sectionOffsets[sectionOffsets.length - 1] - sectionOffsets[sections.length - lowerThresholdCount] : 0)) {
|
|
162
|
-
onScrollToLower();
|
|
163
|
-
}
|
|
164
|
-
}, [renderOffset, containerLength, sectionOffsets, sections.length, upperThresholdCount, lowerThresholdCount, onScrollToUpper, onScrollToLower]);
|
|
165
|
-
// 处理渲染偏移量更新
|
|
166
|
-
const updateRenderOffset = React__default.useCallback(newOffset => {
|
|
167
|
-
lastScrollTopRef.current = newOffset;
|
|
168
|
-
isScrollingRef.current = true;
|
|
169
|
-
if (scrollTimeoutRef.current) {
|
|
170
|
-
clearTimeout(scrollTimeoutRef.current);
|
|
171
|
-
}
|
|
172
|
-
setRenderOffset(newOffset); // 立即更新渲染偏移量
|
|
173
|
-
scrollTimeoutRef.current = setTimeout(() => {
|
|
174
|
-
isScrollingRef.current = false;
|
|
175
|
-
setScrollViewOffset(newOffset); // 滚动结束后,同步滚动视图偏移量
|
|
176
|
-
}, 200);
|
|
177
|
-
}, []);
|
|
178
|
-
// 智能滚动处理函数
|
|
179
|
-
const handleScroll = React__default.useCallback(e => {
|
|
180
|
-
const newOffset = isHorizontal ? e.detail.scrollLeft : e.detail.scrollTop;
|
|
181
|
-
const diff = newOffset - lastScrollTopRef.current;
|
|
182
|
-
scrollDiffListRef.current.shift();
|
|
183
|
-
scrollDiffListRef.current.push(diff);
|
|
184
|
-
// 只保留抖动检测,移除方向检测
|
|
185
|
-
if (isScrollingRef.current && isShaking(scrollDiffListRef.current)) {
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
updateRenderOffset(newOffset); // 直接更新渲染偏移量
|
|
189
|
-
onScroll === null || onScroll === void 0 ? void 0 : onScroll({
|
|
190
|
-
scrollTop: isHorizontal ? 0 : newOffset,
|
|
191
|
-
scrollLeft: isHorizontal ? newOffset : 0
|
|
192
|
-
});
|
|
193
|
-
}, [isHorizontal, onScroll, updateRenderOffset, containerLength]);
|
|
194
|
-
// 初始化后的延迟同步 - 确保ScrollView正确设置初始位置
|
|
195
|
-
React__default.useEffect(() => {
|
|
196
|
-
if (typeof controlledScrollTop === 'number') {
|
|
197
|
-
setScrollViewOffset(controlledScrollTop);
|
|
198
|
-
lastScrollTopRef.current = controlledScrollTop;
|
|
199
|
-
}
|
|
200
|
-
}, [controlledScrollTop]);
|
|
201
|
-
// 清理定时器
|
|
202
|
-
React__default.useEffect(() => {
|
|
203
|
-
return () => {
|
|
204
|
-
if (scrollTimeoutRef.current) {
|
|
205
|
-
clearTimeout(scrollTimeoutRef.current);
|
|
206
|
-
}
|
|
207
|
-
};
|
|
208
|
-
}, []);
|
|
209
|
-
// 容器样式
|
|
210
|
-
const containerStyle = Object.assign({
|
|
211
|
-
height: isHorizontal ? width : height,
|
|
212
|
-
width: isHorizontal ? height : width
|
|
213
|
-
}, style);
|
|
214
|
-
// 修改ScrollView组件的props,添加data-testid属性
|
|
215
|
-
// ScrollView 属性
|
|
216
|
-
const scrollViewProps = {
|
|
217
|
-
scrollY: !isHorizontal,
|
|
218
|
-
scrollX: isHorizontal,
|
|
219
|
-
style: containerStyle,
|
|
220
|
-
enhanced: true,
|
|
221
|
-
showScrollbar: showScrollbar,
|
|
222
|
-
onScroll: handleScroll,
|
|
223
|
-
onScrollToUpper,
|
|
224
|
-
onScrollToLower,
|
|
225
|
-
'data-testid': 'taro-list-container'
|
|
226
|
-
};
|
|
227
|
-
// 设置ScrollView的滚动位置
|
|
228
|
-
if (isHorizontal) {
|
|
229
|
-
scrollViewProps.scrollLeft = scrollViewOffset;
|
|
230
|
-
} else {
|
|
231
|
-
scrollViewProps.scrollTop = scrollViewOffset;
|
|
232
|
-
}
|
|
233
|
-
// H5上额外使用DOM直接操作确保滚动位置正确
|
|
234
|
-
if (isH5) {
|
|
235
|
-
React__default.useEffect(() => {
|
|
236
|
-
if (containerRef.current && typeof scrollViewOffset === 'number') {
|
|
237
|
-
if (isHorizontal) {
|
|
238
|
-
containerRef.current.scrollLeft = scrollViewOffset;
|
|
239
|
-
} else {
|
|
240
|
-
containerRef.current.scrollTop = scrollViewOffset;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}, [scrollViewOffset, isHorizontal]);
|
|
244
|
-
}
|
|
245
|
-
// 总高度/宽度
|
|
246
|
-
const totalLength = sectionOffsets[sectionOffsets.length - 1];
|
|
247
|
-
// 吸顶/吸左 header
|
|
248
|
-
const stickyHeaderNode = React__default.useMemo(() => {
|
|
249
|
-
if (!stickyHeader) return null;
|
|
250
|
-
for (let i = 0; i < sections.length; i++) {
|
|
251
|
-
if (sectionOffsets[i] <= renderOffset && renderOffset < sectionOffsets[i + 1]) {
|
|
252
|
-
const section = sections[i];
|
|
253
|
-
if (section.header) {
|
|
254
|
-
const headerSize = getHeaderSize();
|
|
255
|
-
return createComponent(View, {
|
|
256
|
-
className: "taro-list-sticky-header",
|
|
257
|
-
style: isHorizontal ? {
|
|
258
|
-
width: headerSize
|
|
259
|
-
} : {
|
|
260
|
-
height: headerSize
|
|
261
|
-
},
|
|
262
|
-
get children() {
|
|
263
|
-
return section.header;
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return null;
|
|
270
|
-
}, [stickyHeader, renderOffset, sectionOffsets, sections, isHorizontal, props.headerHeight, props.headerWidth, props.itemHeight, props.itemWidth, props.itemSize, props.itemData]);
|
|
271
|
-
// 渲染分组+item双层虚拟滚动
|
|
272
|
-
const renderSections = () => {
|
|
273
|
-
const nodes = [];
|
|
274
|
-
let offset = sectionOffsets[startSection];
|
|
275
|
-
for (let s = startSection; s <= endSection; s++) {
|
|
276
|
-
const section = sections[s];
|
|
277
|
-
const headerSize = getHeaderSize();
|
|
278
|
-
const itemSizes = section.items.map((_, i) => getItemSize(i));
|
|
279
|
-
// header
|
|
280
|
-
if (section.header) {
|
|
281
|
-
nodes.push(/*#__PURE__*/React__default.createElement('div', {
|
|
282
|
-
key: section.key + '-header' + '-' + layout,
|
|
283
|
-
className: isHorizontal ? 'taro-list-section-header horizontal' : 'taro-list-section-header',
|
|
284
|
-
style: isHorizontal ? {
|
|
285
|
-
left: offset,
|
|
286
|
-
width: headerSize
|
|
287
|
-
} : {
|
|
288
|
-
top: offset,
|
|
289
|
-
height: headerSize
|
|
290
|
-
}
|
|
291
|
-
}, section.header));
|
|
292
|
-
offset += headerSize;
|
|
293
|
-
}
|
|
294
|
-
// item offsets
|
|
295
|
-
const itemOffsets = accumulate(itemSizes.map(size => size + space));
|
|
296
|
-
// 内层虚拟滚动:可见item区间
|
|
297
|
-
let startItem = 0;
|
|
298
|
-
let endItem = section.items.length - 1;
|
|
299
|
-
for (let i = 0; i < section.items.length; i++) {
|
|
300
|
-
if (offset + itemOffsets[i + 1] > renderOffset) {
|
|
301
|
-
startItem = Math.max(0, i - cacheCount);
|
|
302
|
-
break;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
for (let i = startItem; i < section.items.length; i++) {
|
|
306
|
-
if (offset + itemOffsets[i] >= renderOffset + containerLength) {
|
|
307
|
-
endItem = Math.min(section.items.length - 1, i + cacheCount);
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
// 渲染可见item
|
|
312
|
-
for (let i = startItem; i <= endItem; i++) {
|
|
313
|
-
nodes.push(/*#__PURE__*/React__default.createElement('div', {
|
|
314
|
-
key: section.key + '-item-' + i + '-' + layout,
|
|
315
|
-
className: isHorizontal ? 'taro-list-section-item horizontal' : 'taro-list-section-item',
|
|
316
|
-
style: isHorizontal ? {
|
|
317
|
-
left: offset + itemOffsets[i],
|
|
318
|
-
width: itemSizes[i],
|
|
319
|
-
marginRight: space
|
|
320
|
-
} : {
|
|
321
|
-
top: offset + itemOffsets[i],
|
|
322
|
-
height: itemSizes[i],
|
|
323
|
-
marginBottom: space
|
|
324
|
-
}
|
|
325
|
-
}, section.items[i]));
|
|
326
|
-
}
|
|
327
|
-
offset += itemOffsets[itemOffsets.length - 1];
|
|
328
|
-
}
|
|
329
|
-
return nodes;
|
|
330
|
-
};
|
|
331
|
-
return createComponent(ScrollView, mergeProps({
|
|
332
|
-
ref: containerRef,
|
|
333
|
-
className: "taro-list-container"
|
|
334
|
-
}, scrollViewProps, {
|
|
335
|
-
get children() {
|
|
336
|
-
return createComponent(View, {
|
|
337
|
-
style: isHorizontal ? {
|
|
338
|
-
width: totalLength,
|
|
339
|
-
position: 'relative',
|
|
340
|
-
height: '100%'
|
|
341
|
-
} : {
|
|
342
|
-
height: totalLength,
|
|
343
|
-
position: 'relative',
|
|
344
|
-
width: '100%'
|
|
345
|
-
},
|
|
346
|
-
get children() {
|
|
347
|
-
return [stickyHeaderNode, memo(() => renderSections())];
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
}));
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
export { accumulate, List as default, isShaking };
|
|
355
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/list/index.tsx"],"sourcesContent":["import './style/index.scss'\n\nimport { ScrollView, View } from '@tarojs/components'\nimport React from 'react'\n\nimport ListItem from './ListItem'\nimport StickyHeader from './StickyHeader'\nimport StickySection from './StickySection'\n\nexport interface ListProps {\n showScrollbar?: boolean\n scrollTop?: number\n onScroll?: (e: { scrollTop: number, scrollLeft: number }) => void\n onScrollToUpper?: () => void\n onScrollToLower?: () => void\n upperThresholdCount?: number\n lowerThresholdCount?: number\n cacheCount?: number\n stickyHeader?: boolean\n space?: number\n item?: React.ComponentType<any>\n itemCount?: number\n itemData?: any[]\n itemSize?: number | ((index: number, data?: any[]) => number)\n height?: number | string\n width?: number | string\n layout?: 'vertical' | 'horizontal'\n style?: React.CSSProperties\n children?: React.ReactNode\n headerHeight?: number // 纵向 header 高度\n headerWidth?: number // 横向 header 宽度\n itemHeight?: number // 纵向 item 高度\n itemWidth?: number // 横向 item 宽度\n}\n\n// 工具:累加数组\nexport function accumulate(arr: number[]) {\n const result = [0]\n for (let i = 0; i < arr.length; i++) {\n result[i + 1] = result[i] + arr[i]\n }\n return result\n}\n\n// 检测抖动\nexport function isShaking(diffList: number[]): boolean {\n if (diffList.length < 3) return false\n\n // 检查是否有连续的正负交替\n const signs = diffList.map(diff => Math.sign(diff))\n let alternations = 0\n for (let i = 1; i < signs.length; i++) {\n if (signs[i] !== 0 && signs[i] !== signs[i - 1]) {\n alternations++\n }\n }\n\n // 如果交替次数过多,认为是抖动\n return alternations >= 2\n}\n\nconst List: React.FC<ListProps> = (props) => {\n const isH5 = process.env.TARO_ENV === 'h5'\n const {\n stickyHeader = false,\n space = 0,\n height = 400,\n width = '100%',\n showScrollbar = true,\n scrollTop: controlledScrollTop,\n onScroll,\n onScrollToUpper,\n onScrollToLower,\n upperThresholdCount = 0,\n lowerThresholdCount = 0,\n cacheCount = 2,\n style,\n children,\n layout = 'vertical'\n } = props\n\n const isHorizontal = layout === 'horizontal'\n const DEFAULT_ITEM_WIDTH = 120\n const DEFAULT_ITEM_HEIGHT = 40\n\n // 滚动状态管理\n const containerRef = React.useRef<HTMLDivElement>(null)\n\n // 渲染偏移量 - 用于计算应该渲染哪些元素\n const [renderOffset, setRenderOffset] = React.useState(controlledScrollTop ?? 0)\n\n // 滚动视图偏移量 - 只在滚动结束或明确请求时更新到ScrollView\n const [scrollViewOffset, setScrollViewOffset] = React.useState(controlledScrollTop ?? 0)\n\n\n const [containerLength] = React.useState<number>(typeof (isHorizontal ? width : height) === 'number' ? (isHorizontal ? (width as number) : (height as number)) : 400)\n\n // 滚动追踪相关refs\n const isScrollingRef = React.useRef(false)\n const lastScrollTopRef = React.useRef(controlledScrollTop ?? 0)\n const scrollDiffListRef = React.useRef<number[]>([0, 0, 0])\n const scrollTimeoutRef = React.useRef<NodeJS.Timeout | null>(null)\n\n // 解析分组结构,只支持 StickySection 和 ListItem 作为直接子组件\n const sections = React.useMemo(() => {\n const result: Array<{\n header: React.ReactElement | null\n items: React.ReactElement[]\n key: string\n }> = []\n const defaultItems: React.ReactElement[] = []\n React.Children.forEach(children, (child, idx) => {\n if (React.isValidElement(child) && child.type === StickySection) {\n // 分组模式\n const sectionProps = child.props as any\n let header: React.ReactElement | null = null\n const items: React.ReactElement[] = []\n React.Children.forEach(sectionProps.children, (subChild) => {\n if (React.isValidElement(subChild) && subChild.type === StickyHeader) header = subChild\n else if (React.isValidElement(subChild) && subChild.type === ListItem) items.push(subChild)\n })\n result.push({ header, items, key: child.key || String(idx) })\n } else if (React.isValidElement(child) && child.type === ListItem) {\n // 普通 ListItem\n defaultItems.push(child)\n }\n })\n if (defaultItems.length > 0) {\n result.push({ header: null, items: defaultItems, key: 'default' })\n }\n return result\n }, [children])\n\n // 工具:获取 header 尺寸,确保所有 header 相关逻辑一致\n const getHeaderSize = () => {\n if (isHorizontal) {\n if (typeof props.headerWidth === 'number') return props.headerWidth\n if (typeof props.itemWidth === 'number') return props.itemWidth\n if (typeof props.itemSize === 'number') return props.itemSize\n if (typeof props.itemSize === 'function') return props.itemSize(0, props.itemData) || DEFAULT_ITEM_WIDTH\n return DEFAULT_ITEM_WIDTH\n } else {\n if (typeof props.headerHeight === 'number') return props.headerHeight\n if (typeof props.itemHeight === 'number') return props.itemHeight\n if (typeof props.itemSize === 'number') return props.itemSize\n if (typeof props.itemSize === 'function') return props.itemSize(0, props.itemData) || DEFAULT_ITEM_HEIGHT\n return DEFAULT_ITEM_HEIGHT\n }\n }\n\n // 工具:获取 item 尺寸,支持函数/props/默认值\n const getItemSize = (index: number) => {\n if (isHorizontal) {\n if (typeof props.itemWidth === 'number') return props.itemWidth\n if (typeof props.itemSize === 'number') return props.itemSize\n if (typeof props.itemSize === 'function') return props.itemSize(index, props.itemData) || DEFAULT_ITEM_WIDTH\n return DEFAULT_ITEM_WIDTH\n } else {\n if (typeof props.itemHeight === 'number') return props.itemHeight\n if (typeof props.itemSize === 'number') return props.itemSize\n if (typeof props.itemSize === 'function') return props.itemSize(index, props.itemData) || DEFAULT_ITEM_HEIGHT\n return DEFAULT_ITEM_HEIGHT\n }\n }\n\n // 计算分组累积高度/宽度\n const sectionOffsets = React.useMemo(() => {\n const offsets: number[] = [0]\n sections.forEach((section) => {\n const headerSize = getHeaderSize()\n const itemSizes = section.items.map((_, i) => getItemSize(i))\n const groupSize = (section.header ? headerSize : 0) +\n itemSizes.reduce((a, b) => a + b, 0) +\n Math.max(0, section.items.length) * space\n offsets.push(offsets[offsets.length - 1] + groupSize)\n })\n return offsets\n }, [sections, space, isHorizontal, props.headerHeight, props.headerWidth, props.itemHeight, props.itemWidth, props.itemSize, props.itemData])\n\n // 外层虚拟滚动:可见分组\n const [startSection, endSection] = React.useMemo(() => {\n let start = 0; let end = sections.length - 1\n for (let i = 0; i < sections.length; i++) {\n if (sectionOffsets[i + 1] > renderOffset) {\n start = Math.max(0, i - cacheCount)\n break\n }\n }\n for (let i = start; i < sections.length; i++) {\n if (sectionOffsets[i] >= renderOffset + containerLength) {\n end = Math.min(sections.length - 1, i + cacheCount)\n break\n }\n }\n return [start, end]\n }, [renderOffset, containerLength, sectionOffsets, sections.length, cacheCount])\n\n // 触顶/触底事件\n React.useEffect(() => {\n if (onScrollToUpper && renderOffset <= (upperThresholdCount > 0 ? sectionOffsets[upperThresholdCount] : 0)) {\n onScrollToUpper()\n }\n if (onScrollToLower && renderOffset + containerLength >= sectionOffsets[sectionOffsets.length - 1] - (lowerThresholdCount > 0 ? sectionOffsets[sectionOffsets.length - 1] - sectionOffsets[sections.length - lowerThresholdCount] : 0)) {\n onScrollToLower()\n }\n }, [renderOffset, containerLength, sectionOffsets, sections.length, upperThresholdCount, lowerThresholdCount, onScrollToUpper, onScrollToLower])\n\n // 处理渲染偏移量更新\n const updateRenderOffset = React.useCallback((newOffset: number) => {\n lastScrollTopRef.current = newOffset\n isScrollingRef.current = true\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current)\n }\n\n setRenderOffset(newOffset) // 立即更新渲染偏移量\n\n scrollTimeoutRef.current = setTimeout(() => {\n isScrollingRef.current = false\n setScrollViewOffset(newOffset) // 滚动结束后,同步滚动视图偏移量\n }, 200)\n }, [])\n\n\n\n // 智能滚动处理函数\n const handleScroll = React.useCallback((e: any) => {\n const newOffset = isHorizontal ? e.detail.scrollLeft : e.detail.scrollTop\n\n const diff = newOffset - lastScrollTopRef.current\n scrollDiffListRef.current.shift()\n scrollDiffListRef.current.push(diff)\n\n // 只保留抖动检测,移除方向检测\n if (isScrollingRef.current && isShaking(scrollDiffListRef.current)) {\n return\n }\n\n updateRenderOffset(newOffset) // 直接更新渲染偏移量\n\n onScroll?.({\n scrollTop: isHorizontal ? 0 : newOffset,\n scrollLeft: isHorizontal ? newOffset : 0\n })\n }, [isHorizontal, onScroll, updateRenderOffset, containerLength])\n\n // 初始化后的延迟同步 - 确保ScrollView正确设置初始位置\n React.useEffect(() => {\n if (typeof controlledScrollTop === 'number') {\n setScrollViewOffset(controlledScrollTop)\n lastScrollTopRef.current = controlledScrollTop\n }\n }, [controlledScrollTop])\n\n // 清理定时器\n React.useEffect(() => {\n return () => {\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current)\n }\n }\n }, [])\n\n // 容器样式\n const containerStyle: React.CSSProperties = {\n height: isHorizontal ? width : height,\n width: isHorizontal ? height : width,\n ...style,\n }\n\n // 修改ScrollView组件的props,添加data-testid属性\n // ScrollView 属性\n const scrollViewProps: any = {\n scrollY: !isHorizontal,\n scrollX: isHorizontal,\n style: containerStyle,\n enhanced: true,\n showScrollbar: showScrollbar,\n onScroll: handleScroll,\n onScrollToUpper,\n onScrollToLower,\n 'data-testid': 'taro-list-container'\n }\n\n // 设置ScrollView的滚动位置\n if (isHorizontal) {\n scrollViewProps.scrollLeft = scrollViewOffset\n } else {\n scrollViewProps.scrollTop = scrollViewOffset\n }\n\n // H5上额外使用DOM直接操作确保滚动位置正确\n if (isH5) {\n React.useEffect(() => {\n if (containerRef.current && typeof scrollViewOffset === 'number') {\n if (isHorizontal) {\n containerRef.current.scrollLeft = scrollViewOffset\n } else {\n containerRef.current.scrollTop = scrollViewOffset\n }\n }\n }, [scrollViewOffset, isHorizontal])\n }\n\n // 总高度/宽度\n const totalLength = sectionOffsets[sectionOffsets.length - 1]\n\n // 吸顶/吸左 header\n const stickyHeaderNode = React.useMemo(() => {\n if (!stickyHeader) return null\n for (let i = 0; i < sections.length; i++) {\n if (sectionOffsets[i] <= renderOffset && renderOffset < sectionOffsets[i + 1]) {\n const section = sections[i]\n if (section.header) {\n const headerSize = getHeaderSize()\n return (\n <View className=\"taro-list-sticky-header\" style={isHorizontal ? { width: headerSize } : { height: headerSize }}>\n {section.header}\n </View>\n )\n }\n }\n }\n return null\n }, [stickyHeader, renderOffset, sectionOffsets, sections, isHorizontal, props.headerHeight, props.headerWidth, props.itemHeight, props.itemWidth, props.itemSize, props.itemData])\n\n // 渲染分组+item双层虚拟滚动\n const renderSections = () => {\n const nodes: React.ReactNode[] = []\n let offset = sectionOffsets[startSection]\n for (let s = startSection; s <= endSection; s++) {\n const section = sections[s]\n const headerSize = getHeaderSize()\n const itemSizes = section.items.map((_, i) => getItemSize(i))\n // header\n if (section.header) {\n nodes.push(\n React.createElement('div', {\n key: section.key + '-header' + '-' + layout,\n className: isHorizontal ? 'taro-list-section-header horizontal' : 'taro-list-section-header',\n style: isHorizontal ? { left: offset, width: headerSize } : { top: offset, height: headerSize },\n }, section.header)\n )\n offset += headerSize\n }\n // item offsets\n const itemOffsets = accumulate(itemSizes.map((size) => size + space))\n // 内层虚拟滚动:可见item区间\n let startItem = 0; let endItem = section.items.length - 1\n for (let i = 0; i < section.items.length; i++) {\n if (offset + itemOffsets[i + 1] > renderOffset) {\n startItem = Math.max(0, i - cacheCount)\n break\n }\n }\n for (let i = startItem; i < section.items.length; i++) {\n if (offset + itemOffsets[i] >= renderOffset + containerLength) {\n endItem = Math.min(section.items.length - 1, i + cacheCount)\n break\n }\n }\n // 渲染可见item\n for (let i = startItem; i <= endItem; i++) {\n nodes.push(\n React.createElement('div', {\n key: section.key + '-item-' + i + '-' + layout,\n className: isHorizontal ? 'taro-list-section-item horizontal' : 'taro-list-section-item',\n style: isHorizontal\n ? {\n left: offset + itemOffsets[i],\n width: itemSizes[i],\n marginRight: space,\n }\n : {\n top: offset + itemOffsets[i],\n height: itemSizes[i],\n marginBottom: space,\n },\n }, section.items[i])\n )\n }\n offset += itemOffsets[itemOffsets.length - 1]\n }\n return nodes\n }\n\n return (\n <ScrollView ref={containerRef} className=\"taro-list-container\" {...scrollViewProps}>\n <View style={isHorizontal ? { width: totalLength, position: 'relative', height: '100%' } : { height: totalLength, position: 'relative', width: '100%' }}>\n {stickyHeaderNode}\n {renderSections()}\n </View>\n </ScrollView>\n )\n}\n\nexport default List\n"],"names":["accumulate","arr","result","i","length","isShaking","diffList","signs","map","diff","Math","sign","alternations","List","props","isH5","process","env","TARO_ENV","stickyHeader","space","height","width","showScrollbar","scrollTop","controlledScrollTop","onScroll","onScrollToUpper","onScrollToLower","upperThresholdCount","lowerThresholdCount","cacheCount","style","children","layout","isHorizontal","DEFAULT_ITEM_WIDTH","DEFAULT_ITEM_HEIGHT","containerRef","React","useRef","renderOffset","setRenderOffset","useState","scrollViewOffset","setScrollViewOffset","containerLength","isScrollingRef","lastScrollTopRef","scrollDiffListRef","scrollTimeoutRef","sections","useMemo","defaultItems","Children","forEach","child","idx","isValidElement","type","StickySection","sectionProps","header","items","subChild","StickyHeader","ListItem","push","key","String","getHeaderSize","headerWidth","itemWidth","itemSize","itemData","headerHeight","itemHeight","getItemSize","index","sectionOffsets","offsets","section","headerSize","itemSizes","_","groupSize","reduce","a","b","max","startSection","endSection","start","end","min","useEffect","updateRenderOffset","useCallback","newOffset","current","clearTimeout","setTimeout","handleScroll","e","detail","scrollLeft","shift","containerStyle","Object","assign","scrollViewProps","scrollY","scrollX","enhanced","totalLength","stickyHeaderNode","_$createComponent","View","className","renderSections","nodes","offset","s","createElement","left","top","itemOffsets","size","startItem","endItem","marginRight","marginBottom","ScrollView","_$mergeProps","ref","position","_$memo"],"mappings":";;;;;;;;AAmCA;AACM,SAAUA,UAAUA,CAACC,GAAa,EAAA;AACtC,EAAA,MAAMC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClB,EAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,GAAG,CAACG,MAAM,EAAED,CAAC,EAAE,EAAE;AACnCD,IAAAA,MAAM,CAACC,CAAC,GAAG,CAAC,CAAC,GAAGD,MAAM,CAACC,CAAC,CAAC,GAAGF,GAAG,CAACE,CAAC,CAAC;AACpC;AACA,EAAA,OAAOD,MAAM;AACf;AAEA;AACM,SAAUG,SAASA,CAACC,QAAkB,EAAA;AAC1C,EAAA,IAAIA,QAAQ,CAACF,MAAM,GAAG,CAAC,EAAE,OAAO,KAAK;AAErC;AACA,EAAA,MAAMG,KAAK,GAAGD,QAAQ,CAACE,GAAG,CAACC,IAAI,IAAIC,IAAI,CAACC,IAAI,CAACF,IAAI,CAAC,CAAC;EACnD,IAAIG,YAAY,GAAG,CAAC;AACpB,EAAA,KAAK,IAAIT,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGI,KAAK,CAACH,MAAM,EAAED,CAAC,EAAE,EAAE;AACrC,IAAA,IAAII,KAAK,CAACJ,CAAC,CAAC,KAAK,CAAC,IAAII,KAAK,CAACJ,CAAC,CAAC,KAAKI,KAAK,CAACJ,CAAC,GAAG,CAAC,CAAC,EAAE;AAC/CS,MAAAA,YAAY,EAAE;AAChB;AACF;AAEA;EACA,OAAOA,YAAY,IAAI,CAAC;AAC1B;AAEMC,MAAAA,IAAI,GAAyBC,KAAK,IAAI;EAC1C,MAAMC,IAAI,GAAGC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,IAAI;EAC1C,MAAM;AACJC,IAAAA,YAAY,GAAG,KAAK;AACpBC,IAAAA,KAAK,GAAG,CAAC;AACTC,IAAAA,MAAM,GAAG,GAAG;AACZC,IAAAA,KAAK,GAAG,MAAM;AACdC,IAAAA,aAAa,GAAG,IAAI;AACpBC,IAAAA,SAAS,EAAEC,mBAAmB;IAC9BC,QAAQ;IACRC,eAAe;IACfC,eAAe;AACfC,IAAAA,mBAAmB,GAAG,CAAC;AACvBC,IAAAA,mBAAmB,GAAG,CAAC;AACvBC,IAAAA,UAAU,GAAG,CAAC;IACdC,KAAK;IACLC,QAAQ;AACRC,IAAAA,MAAM,GAAG;AAAU,GACpB,GAAGpB,KAAK;AAET,EAAA,MAAMqB,YAAY,GAAGD,MAAM,KAAK,YAAY;EAC5C,MAAME,kBAAkB,GAAG,GAAG;EAC9B,MAAMC,mBAAmB,GAAG,EAAE;AAE9B;AACA,EAAA,MAAMC,YAAY,GAAGC,cAAK,CAACC,MAAM,CAAiB,IAAI,CAAC;AAEvD;EACA,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAGH,cAAK,CAACI,QAAQ,CAAClB,mBAAmB,aAAnBA,mBAAmB,KAAA,KAAA,CAAA,GAAnBA,mBAAmB,GAAI,CAAC,CAAC;AAEhF;EACA,MAAM,CAACmB,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGN,cAAK,CAACI,QAAQ,CAAClB,mBAAmB,aAAnBA,mBAAmB,KAAA,KAAA,CAAA,GAAnBA,mBAAmB,GAAI,CAAC,CAAC;EAGxF,MAAM,CAACqB,eAAe,CAAC,GAAGP,cAAK,CAACI,QAAQ,CAAS,QAAQR,YAAY,GAAGb,KAAK,GAAGD,MAAM,CAAC,KAAK,QAAQ,GAAIc,YAAY,GAAIb,KAAgB,GAAID,MAAiB,GAAI,GAAG,CAAC;AAErK;AACA,EAAA,MAAM0B,cAAc,GAAGR,cAAK,CAACC,MAAM,CAAC,KAAK,CAAC;AAC1C,EAAA,MAAMQ,gBAAgB,GAAGT,cAAK,CAACC,MAAM,CAACf,mBAAmB,KAAnB,IAAA,IAAAA,mBAAmB,KAAnB,KAAA,CAAA,GAAAA,mBAAmB,GAAI,CAAC,CAAC;AAC/D,EAAA,MAAMwB,iBAAiB,GAAGV,cAAK,CAACC,MAAM,CAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,EAAA,MAAMU,gBAAgB,GAAGX,cAAK,CAACC,MAAM,CAAwB,IAAI,CAAC;AAElE;AACA,EAAA,MAAMW,QAAQ,GAAGZ,cAAK,CAACa,OAAO,CAAC,MAAK;IAClC,MAAMlD,MAAM,GAIP,EAAE;IACP,MAAMmD,YAAY,GAAyB,EAAE;IAC7Cd,cAAK,CAACe,QAAQ,CAACC,OAAO,CAACtB,QAAQ,EAAE,CAACuB,KAAK,EAAEC,GAAG,KAAI;AAC9C,MAAA,iBAAIlB,cAAK,CAACmB,cAAc,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACG,IAAI,KAAKC,aAAa,EAAE;AAC/D;AACA,QAAA,MAAMC,YAAY,GAAGL,KAAK,CAAC1C,KAAY;QACvC,IAAIgD,MAAM,GAA8B,IAAI;QAC5C,MAAMC,KAAK,GAAyB,EAAE;QACtCxB,cAAK,CAACe,QAAQ,CAACC,OAAO,CAACM,YAAY,CAAC5B,QAAQ,EAAG+B,QAAQ,IAAI;AACzD,UAAA,iBAAIzB,cAAK,CAACmB,cAAc,CAACM,QAAQ,CAAC,IAAIA,QAAQ,CAACL,IAAI,KAAKM,YAAY,EAAEH,MAAM,GAAGE,QAAQ,CAAA,KAClF,iBAAIzB,cAAK,CAACmB,cAAc,CAACM,QAAQ,CAAC,IAAIA,QAAQ,CAACL,IAAI,KAAKO,QAAQ,EAAEH,KAAK,CAACI,IAAI,CAACH,QAAQ,CAAC;AAC7F,SAAC,CAAC;QACF9D,MAAM,CAACiE,IAAI,CAAC;UAAEL,MAAM;UAAEC,KAAK;AAAEK,UAAAA,GAAG,EAAEZ,KAAK,CAACY,GAAG,IAAIC,MAAM,CAACZ,GAAG;AAAC,SAAE,CAAC;AAC/D,OAAC,MAAM,iBAAIlB,cAAK,CAACmB,cAAc,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACG,IAAI,KAAKO,QAAQ,EAAE;AACjE;AACAb,QAAAA,YAAY,CAACc,IAAI,CAACX,KAAK,CAAC;AAC1B;AACF,KAAC,CAAC;AACF,IAAA,IAAIH,YAAY,CAACjD,MAAM,GAAG,CAAC,EAAE;MAC3BF,MAAM,CAACiE,IAAI,CAAC;AAAEL,QAAAA,MAAM,EAAE,IAAI;AAAEC,QAAAA,KAAK,EAAEV,YAAY;AAAEe,QAAAA,GAAG,EAAE;AAAS,OAAE,CAAC;AACpE;AACA,IAAA,OAAOlE,MAAM;AACf,GAAC,EAAE,CAAC+B,QAAQ,CAAC,CAAC;AAEd;EACA,MAAMqC,aAAa,GAAGA,MAAK;AACzB,IAAA,IAAInC,YAAY,EAAE;MAChB,IAAI,OAAOrB,KAAK,CAACyD,WAAW,KAAK,QAAQ,EAAE,OAAOzD,KAAK,CAACyD,WAAW;MACnE,IAAI,OAAOzD,KAAK,CAAC0D,SAAS,KAAK,QAAQ,EAAE,OAAO1D,KAAK,CAAC0D,SAAS;MAC/D,IAAI,OAAO1D,KAAK,CAAC2D,QAAQ,KAAK,QAAQ,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ;AAC7D,MAAA,IAAI,OAAO3D,KAAK,CAAC2D,QAAQ,KAAK,UAAU,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ,CAAC,CAAC,EAAE3D,KAAK,CAAC4D,QAAQ,CAAC,IAAItC,kBAAkB;AACxG,MAAA,OAAOA,kBAAkB;AAC3B,KAAC,MAAM;MACL,IAAI,OAAOtB,KAAK,CAAC6D,YAAY,KAAK,QAAQ,EAAE,OAAO7D,KAAK,CAAC6D,YAAY;MACrE,IAAI,OAAO7D,KAAK,CAAC8D,UAAU,KAAK,QAAQ,EAAE,OAAO9D,KAAK,CAAC8D,UAAU;MACjE,IAAI,OAAO9D,KAAK,CAAC2D,QAAQ,KAAK,QAAQ,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ;AAC7D,MAAA,IAAI,OAAO3D,KAAK,CAAC2D,QAAQ,KAAK,UAAU,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ,CAAC,CAAC,EAAE3D,KAAK,CAAC4D,QAAQ,CAAC,IAAIrC,mBAAmB;AACzG,MAAA,OAAOA,mBAAmB;AAC5B;GACD;AAED;EACA,MAAMwC,WAAW,GAAIC,KAAa,IAAI;AACpC,IAAA,IAAI3C,YAAY,EAAE;MAChB,IAAI,OAAOrB,KAAK,CAAC0D,SAAS,KAAK,QAAQ,EAAE,OAAO1D,KAAK,CAAC0D,SAAS;MAC/D,IAAI,OAAO1D,KAAK,CAAC2D,QAAQ,KAAK,QAAQ,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ;AAC7D,MAAA,IAAI,OAAO3D,KAAK,CAAC2D,QAAQ,KAAK,UAAU,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ,CAACK,KAAK,EAAEhE,KAAK,CAAC4D,QAAQ,CAAC,IAAItC,kBAAkB;AAC5G,MAAA,OAAOA,kBAAkB;AAC3B,KAAC,MAAM;MACL,IAAI,OAAOtB,KAAK,CAAC8D,UAAU,KAAK,QAAQ,EAAE,OAAO9D,KAAK,CAAC8D,UAAU;MACjE,IAAI,OAAO9D,KAAK,CAAC2D,QAAQ,KAAK,QAAQ,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ;AAC7D,MAAA,IAAI,OAAO3D,KAAK,CAAC2D,QAAQ,KAAK,UAAU,EAAE,OAAO3D,KAAK,CAAC2D,QAAQ,CAACK,KAAK,EAAEhE,KAAK,CAAC4D,QAAQ,CAAC,IAAIrC,mBAAmB;AAC7G,MAAA,OAAOA,mBAAmB;AAC5B;GACD;AAED;AACA,EAAA,MAAM0C,cAAc,GAAGxC,cAAK,CAACa,OAAO,CAAC,MAAK;AACxC,IAAA,MAAM4B,OAAO,GAAa,CAAC,CAAC,CAAC;AAC7B7B,IAAAA,QAAQ,CAACI,OAAO,CAAE0B,OAAO,IAAI;AAC3B,MAAA,MAAMC,UAAU,GAAGZ,aAAa,EAAE;AAClC,MAAA,MAAMa,SAAS,GAAGF,OAAO,CAAClB,KAAK,CAACvD,GAAG,CAAC,CAAC4E,CAAC,EAAEjF,CAAC,KAAK0E,WAAW,CAAC1E,CAAC,CAAC,CAAC;AAC7D,MAAA,MAAMkF,SAAS,GAAG,CAACJ,OAAO,CAACnB,MAAM,GAAGoB,UAAU,GAAG,CAAC,IAChDC,SAAS,CAACG,MAAM,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,EAAE,CAAC,CAAC,GACpC9E,IAAI,CAAC+E,GAAG,CAAC,CAAC,EAAER,OAAO,CAAClB,KAAK,CAAC3D,MAAM,CAAC,GAAGgB,KAAK;AAC3C4D,MAAAA,OAAO,CAACb,IAAI,CAACa,OAAO,CAACA,OAAO,CAAC5E,MAAM,GAAG,CAAC,CAAC,GAAGiF,SAAS,CAAC;AACvD,KAAC,CAAC;AACF,IAAA,OAAOL,OAAO;AAChB,GAAC,EAAE,CAAC7B,QAAQ,EAAE/B,KAAK,EAAEe,YAAY,EAAErB,KAAK,CAAC6D,YAAY,EAAE7D,KAAK,CAACyD,WAAW,EAAEzD,KAAK,CAAC8D,UAAU,EAAE9D,KAAK,CAAC0D,SAAS,EAAE1D,KAAK,CAAC2D,QAAQ,EAAE3D,KAAK,CAAC4D,QAAQ,CAAC,CAAC;AAE7I;EACA,MAAM,CAACgB,YAAY,EAAEC,UAAU,CAAC,GAAGpD,cAAK,CAACa,OAAO,CAAC,MAAK;IACpD,IAAIwC,KAAK,GAAG,CAAC;AAAE,IAAA,IAAIC,GAAG,GAAG1C,QAAQ,CAAC/C,MAAM,GAAG,CAAC;AAC5C,IAAA,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgD,QAAQ,CAAC/C,MAAM,EAAED,CAAC,EAAE,EAAE;MACxC,IAAI4E,cAAc,CAAC5E,CAAC,GAAG,CAAC,CAAC,GAAGsC,YAAY,EAAE;QACxCmD,KAAK,GAAGlF,IAAI,CAAC+E,GAAG,CAAC,CAAC,EAAEtF,CAAC,GAAG4B,UAAU,CAAC;AACnC,QAAA;AACF;AACF;AACA,IAAA,KAAK,IAAI5B,CAAC,GAAGyF,KAAK,EAAEzF,CAAC,GAAGgD,QAAQ,CAAC/C,MAAM,EAAED,CAAC,EAAE,EAAE;MAC5C,IAAI4E,cAAc,CAAC5E,CAAC,CAAC,IAAIsC,YAAY,GAAGK,eAAe,EAAE;AACvD+C,QAAAA,GAAG,GAAGnF,IAAI,CAACoF,GAAG,CAAC3C,QAAQ,CAAC/C,MAAM,GAAG,CAAC,EAAED,CAAC,GAAG4B,UAAU,CAAC;AACnD,QAAA;AACF;AACF;AACA,IAAA,OAAO,CAAC6D,KAAK,EAAEC,GAAG,CAAC;AACrB,GAAC,EAAE,CAACpD,YAAY,EAAEK,eAAe,EAAEiC,cAAc,EAAE5B,QAAQ,CAAC/C,MAAM,EAAE2B,UAAU,CAAC,CAAC;AAEhF;EACAQ,cAAK,CAACwD,SAAS,CAAC,MAAK;AACnB,IAAA,IAAIpE,eAAe,IAAIc,YAAY,KAAKZ,mBAAmB,GAAG,CAAC,GAAGkD,cAAc,CAAClD,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE;AAC1GF,MAAAA,eAAe,EAAE;AACnB;AACA,IAAA,IAAIC,eAAe,IAAIa,YAAY,GAAGK,eAAe,IAAIiC,cAAc,CAACA,cAAc,CAAC3E,MAAM,GAAG,CAAC,CAAC,IAAI0B,mBAAmB,GAAG,CAAC,GAAGiD,cAAc,CAACA,cAAc,CAAC3E,MAAM,GAAG,CAAC,CAAC,GAAG2E,cAAc,CAAC5B,QAAQ,CAAC/C,MAAM,GAAG0B,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE;AACtOF,MAAAA,eAAe,EAAE;AACnB;GACD,EAAE,CAACa,YAAY,EAAEK,eAAe,EAAEiC,cAAc,EAAE5B,QAAQ,CAAC/C,MAAM,EAAEyB,mBAAmB,EAAEC,mBAAmB,EAAEH,eAAe,EAAEC,eAAe,CAAC,CAAC;AAEhJ;AACA,EAAA,MAAMoE,kBAAkB,GAAGzD,cAAK,CAAC0D,WAAW,CAAEC,SAAiB,IAAI;IACjElD,gBAAgB,CAACmD,OAAO,GAAGD,SAAS;IACpCnD,cAAc,CAACoD,OAAO,GAAG,IAAI;IAE7B,IAAIjD,gBAAgB,CAACiD,OAAO,EAAE;AAC5BC,MAAAA,YAAY,CAAClD,gBAAgB,CAACiD,OAAO,CAAC;AACxC;AAEAzD,IAAAA,eAAe,CAACwD,SAAS,CAAC,CAAA;AAE1BhD,IAAAA,gBAAgB,CAACiD,OAAO,GAAGE,UAAU,CAAC,MAAK;MACzCtD,cAAc,CAACoD,OAAO,GAAG,KAAK;AAC9BtD,MAAAA,mBAAmB,CAACqD,SAAS,CAAC,CAAA;KAC/B,EAAE,GAAG,CAAC;GACR,EAAE,EAAE,CAAC;AAIN;AACA,EAAA,MAAMI,YAAY,GAAG/D,cAAK,CAAC0D,WAAW,CAAEM,CAAM,IAAI;AAChD,IAAA,MAAML,SAAS,GAAG/D,YAAY,GAAGoE,CAAC,CAACC,MAAM,CAACC,UAAU,GAAGF,CAAC,CAACC,MAAM,CAAChF,SAAS;AAEzE,IAAA,MAAMf,IAAI,GAAGyF,SAAS,GAAGlD,gBAAgB,CAACmD,OAAO;AACjDlD,IAAAA,iBAAiB,CAACkD,OAAO,CAACO,KAAK,EAAE;AACjCzD,IAAAA,iBAAiB,CAACkD,OAAO,CAAChC,IAAI,CAAC1D,IAAI,CAAC;AAEpC;IACA,IAAIsC,cAAc,CAACoD,OAAO,IAAI9F,SAAS,CAAC4C,iBAAiB,CAACkD,OAAO,CAAC,EAAE;AAClE,MAAA;AACF;AAEAH,IAAAA,kBAAkB,CAACE,SAAS,CAAC,CAAA;AAE7BxE,IAAAA,QAAQ,KAAR,IAAA,IAAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAAA,QAAQ,CAAG;AACTF,MAAAA,SAAS,EAAEW,YAAY,GAAG,CAAC,GAAG+D,SAAS;AACvCO,MAAAA,UAAU,EAAEtE,YAAY,GAAG+D,SAAS,GAAG;AACxC,KAAA,CAAC;GACH,EAAE,CAAC/D,YAAY,EAAET,QAAQ,EAAEsE,kBAAkB,EAAElD,eAAe,CAAC,CAAC;AAEjE;EACAP,cAAK,CAACwD,SAAS,CAAC,MAAK;AACnB,IAAA,IAAI,OAAOtE,mBAAmB,KAAK,QAAQ,EAAE;MAC3CoB,mBAAmB,CAACpB,mBAAmB,CAAC;MACxCuB,gBAAgB,CAACmD,OAAO,GAAG1E,mBAAmB;AAChD;AACF,GAAC,EAAE,CAACA,mBAAmB,CAAC,CAAC;AAEzB;EACAc,cAAK,CAACwD,SAAS,CAAC,MAAK;AACnB,IAAA,OAAO,MAAK;MACV,IAAI7C,gBAAgB,CAACiD,OAAO,EAAE;AAC5BC,QAAAA,YAAY,CAAClD,gBAAgB,CAACiD,OAAO,CAAC;AACxC;KACD;GACF,EAAE,EAAE,CAAC;AAEN;AACA,EAAA,MAAMQ,cAAc,GAAAC,MAAA,CAAAC,MAAA,CAAA;AAClBxF,IAAAA,MAAM,EAAEc,YAAY,GAAGb,KAAK,GAAGD,MAAM;AACrCC,IAAAA,KAAK,EAAEa,YAAY,GAAGd,MAAM,GAAGC;GAAK,EACjCU,KAAK,CACT;AAED;AACA;AACA,EAAA,MAAM8E,eAAe,GAAQ;IAC3BC,OAAO,EAAE,CAAC5E,YAAY;AACtB6E,IAAAA,OAAO,EAAE7E,YAAY;AACrBH,IAAAA,KAAK,EAAE2E,cAAc;AACrBM,IAAAA,QAAQ,EAAE,IAAI;AACd1F,IAAAA,aAAa,EAAEA,aAAa;AAC5BG,IAAAA,QAAQ,EAAE4E,YAAY;IACtB3E,eAAe;IACfC,eAAe;AACf,IAAA,aAAa,EAAE;GAChB;AAED;AACA,EAAA,IAAIO,YAAY,EAAE;IAChB2E,eAAe,CAACL,UAAU,GAAG7D,gBAAgB;AAC/C,GAAC,MAAM;IACLkE,eAAe,CAACtF,SAAS,GAAGoB,gBAAgB;AAC9C;AAEA;AACA,EAAA,IAAI7B,IAAI,EAAE;IACRwB,cAAK,CAACwD,SAAS,CAAC,MAAK;MACnB,IAAIzD,YAAY,CAAC6D,OAAO,IAAI,OAAOvD,gBAAgB,KAAK,QAAQ,EAAE;AAChE,QAAA,IAAIT,YAAY,EAAE;AAChBG,UAAAA,YAAY,CAAC6D,OAAO,CAACM,UAAU,GAAG7D,gBAAgB;AACpD,SAAC,MAAM;AACLN,UAAAA,YAAY,CAAC6D,OAAO,CAAC3E,SAAS,GAAGoB,gBAAgB;AACnD;AACF;AACF,KAAC,EAAE,CAACA,gBAAgB,EAAET,YAAY,CAAC,CAAC;AACtC;AAEA;EACA,MAAM+E,WAAW,GAAGnC,cAAc,CAACA,cAAc,CAAC3E,MAAM,GAAG,CAAC,CAAC;AAE7D;AACA,EAAA,MAAM+G,gBAAgB,GAAG5E,cAAK,CAACa,OAAO,CAAC,MAAK;AAC1C,IAAA,IAAI,CAACjC,YAAY,EAAE,OAAO,IAAI;AAC9B,IAAA,KAAK,IAAIhB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgD,QAAQ,CAAC/C,MAAM,EAAED,CAAC,EAAE,EAAE;AACxC,MAAA,IAAI4E,cAAc,CAAC5E,CAAC,CAAC,IAAIsC,YAAY,IAAIA,YAAY,GAAGsC,cAAc,CAAC5E,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7E,QAAA,MAAM8E,OAAO,GAAG9B,QAAQ,CAAChD,CAAC,CAAC;QAC3B,IAAI8E,OAAO,CAACnB,MAAM,EAAE;AAClB,UAAA,MAAMoB,UAAU,GAAGZ,aAAa,EAAE;UAClC,OAAA8C,eAAA,CACGC,IAAI,EAAA;YAACC,SAAS,EAAA,yBAAA;YAA2BtF,KAAK,EAAEG,YAAY,GAAG;AAAEb,cAAAA,KAAK,EAAE4D;AAAU,aAAE,GAAG;AAAE7D,cAAAA,MAAM,EAAE6D;aAAY;AAAA,YAAA,IAAAjD,QAAA,GAAA;cAAA,OAC3GgD,OAAO,CAACnB,MAAM;AAAA;AAAA,WAAA,CAAA;AAGrB;AACF;AACF;AACA,IAAA,OAAO,IAAI;AACb,GAAC,EAAE,CAAC3C,YAAY,EAAEsB,YAAY,EAAEsC,cAAc,EAAE5B,QAAQ,EAAEhB,YAAY,EAAErB,KAAK,CAAC6D,YAAY,EAAE7D,KAAK,CAACyD,WAAW,EAAEzD,KAAK,CAAC8D,UAAU,EAAE9D,KAAK,CAAC0D,SAAS,EAAE1D,KAAK,CAAC2D,QAAQ,EAAE3D,KAAK,CAAC4D,QAAQ,CAAC,CAAC;AAElL;EACA,MAAM6C,cAAc,GAAGA,MAAK;IAC1B,MAAMC,KAAK,GAAsB,EAAE;AACnC,IAAA,IAAIC,MAAM,GAAG1C,cAAc,CAACW,YAAY,CAAC;IACzC,KAAK,IAAIgC,CAAC,GAAGhC,YAAY,EAAEgC,CAAC,IAAI/B,UAAU,EAAE+B,CAAC,EAAE,EAAE;AAC/C,MAAA,MAAMzC,OAAO,GAAG9B,QAAQ,CAACuE,CAAC,CAAC;AAC3B,MAAA,MAAMxC,UAAU,GAAGZ,aAAa,EAAE;AAClC,MAAA,MAAMa,SAAS,GAAGF,OAAO,CAAClB,KAAK,CAACvD,GAAG,CAAC,CAAC4E,CAAC,EAAEjF,CAAC,KAAK0E,WAAW,CAAC1E,CAAC,CAAC,CAAC;AAC7D;MACA,IAAI8E,OAAO,CAACnB,MAAM,EAAE;QAClB0D,KAAK,CAACrD,IAAI,cACR5B,cAAK,CAACoF,aAAa,CAAC,KAAK,EAAE;UACzBvD,GAAG,EAAEa,OAAO,CAACb,GAAG,GAAG,SAAS,GAAG,GAAG,GAAGlC,MAAM;AAC3CoF,UAAAA,SAAS,EAAEnF,YAAY,GAAG,qCAAqC,GAAG,0BAA0B;UAC5FH,KAAK,EAAEG,YAAY,GAAG;AAAEyF,YAAAA,IAAI,EAAEH,MAAM;AAAEnG,YAAAA,KAAK,EAAE4D;AAAY,WAAA,GAAG;AAAE2C,YAAAA,GAAG,EAAEJ,MAAM;AAAEpG,YAAAA,MAAM,EAAE6D;AAAY;AAChG,SAAA,EAAED,OAAO,CAACnB,MAAM,CAAC,CACnB;AACD2D,QAAAA,MAAM,IAAIvC,UAAU;AACtB;AACA;AACA,MAAA,MAAM4C,WAAW,GAAG9H,UAAU,CAACmF,SAAS,CAAC3E,GAAG,CAAEuH,IAAI,IAAKA,IAAI,GAAG3G,KAAK,CAAC,CAAC;AACrE;MACA,IAAI4G,SAAS,GAAG,CAAC;MAAE,IAAIC,OAAO,GAAGhD,OAAO,CAAClB,KAAK,CAAC3D,MAAM,GAAG,CAAC;AACzD,MAAA,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG8E,OAAO,CAAClB,KAAK,CAAC3D,MAAM,EAAED,CAAC,EAAE,EAAE;QAC7C,IAAIsH,MAAM,GAAGK,WAAW,CAAC3H,CAAC,GAAG,CAAC,CAAC,GAAGsC,YAAY,EAAE;UAC9CuF,SAAS,GAAGtH,IAAI,CAAC+E,GAAG,CAAC,CAAC,EAAEtF,CAAC,GAAG4B,UAAU,CAAC;AACvC,UAAA;AACF;AACF;AACA,MAAA,KAAK,IAAI5B,CAAC,GAAG6H,SAAS,EAAE7H,CAAC,GAAG8E,OAAO,CAAClB,KAAK,CAAC3D,MAAM,EAAED,CAAC,EAAE,EAAE;QACrD,IAAIsH,MAAM,GAAGK,WAAW,CAAC3H,CAAC,CAAC,IAAIsC,YAAY,GAAGK,eAAe,EAAE;AAC7DmF,UAAAA,OAAO,GAAGvH,IAAI,CAACoF,GAAG,CAACb,OAAO,CAAClB,KAAK,CAAC3D,MAAM,GAAG,CAAC,EAAED,CAAC,GAAG4B,UAAU,CAAC;AAC5D,UAAA;AACF;AACF;AACA;MACA,KAAK,IAAI5B,CAAC,GAAG6H,SAAS,EAAE7H,CAAC,IAAI8H,OAAO,EAAE9H,CAAC,EAAE,EAAE;QACzCqH,KAAK,CAACrD,IAAI,cACR5B,cAAK,CAACoF,aAAa,CAAC,KAAK,EAAE;UACzBvD,GAAG,EAAEa,OAAO,CAACb,GAAG,GAAG,QAAQ,GAAGjE,CAAC,GAAG,GAAG,GAAG+B,MAAM;AAC9CoF,UAAAA,SAAS,EAAEnF,YAAY,GAAG,mCAAmC,GAAG,wBAAwB;UACxFH,KAAK,EAAEG,YAAY,GACf;AACAyF,YAAAA,IAAI,EAAEH,MAAM,GAAGK,WAAW,CAAC3H,CAAC,CAAC;AAC7BmB,YAAAA,KAAK,EAAE6D,SAAS,CAAChF,CAAC,CAAC;AACnB+H,YAAAA,WAAW,EAAE9G;AACd,WAAA,GACC;AACAyG,YAAAA,GAAG,EAAEJ,MAAM,GAAGK,WAAW,CAAC3H,CAAC,CAAC;AAC5BkB,YAAAA,MAAM,EAAE8D,SAAS,CAAChF,CAAC,CAAC;AACpBgI,YAAAA,YAAY,EAAE/G;AACf;SACJ,EAAE6D,OAAO,CAAClB,KAAK,CAAC5D,CAAC,CAAC,CAAC,CACrB;AACH;MACAsH,MAAM,IAAIK,WAAW,CAACA,WAAW,CAAC1H,MAAM,GAAG,CAAC,CAAC;AAC/C;AACA,IAAA,OAAOoH,KAAK;GACb;AAED,EAAA,OAAAJ,eAAA,CACGgB,UAAU,EAAAC,UAAA,CAAA;AAAAC,IAAAA,GAAA,EAAMhG,YAAY;IAAEgF,SAAS,EAAA;AAAA,GAAA,EAA2BR,eAAe,EAAA;AAAA,IAAA,IAAA7E,QAAA,GAAA;MAAA,OAAAmF,eAAA,CAC/EC,IAAI,EAAA;QAACrF,KAAK,EAAEG,YAAY,GAAG;AAAEb,UAAAA,KAAK,EAAE4F,WAAW;AAAEqB,UAAAA,QAAQ,EAAE,UAAU;AAAElH,UAAAA,MAAM,EAAE;SAAQ,GAAG;AAAEA,UAAAA,MAAM,EAAE6F,WAAW;AAAEqB,UAAAA,QAAQ,EAAE,UAAU;AAAEjH,UAAAA,KAAK,EAAE;SAAQ;AAAA,QAAA,IAAAW,QAAA,GAAA;AAAA,UAAA,OAAA,CACpJkF,gBAAgB,EAAAqB,IAAA,CAChBjB,MAAAA,cAAc,EAAE,CAAA,CAAA;AAAA;AAAA,OAAA,CAAA;AAAA;AAAA,GAAA,CAAA,CAAA;AAIzB;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|