@tarojs/components-react 4.1.4-beta.2 → 4.1.4-beta.21
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/README.md +31 -0
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/icon/index.js.map +1 -1
- package/dist/components/image/index.js.map +1 -1
- package/dist/components/input/index.js.map +1 -1
- package/dist/components/list/ListItem.js +18 -0
- package/dist/components/list/ListItem.js.map +1 -0
- package/dist/components/list/StickyHeader.js +18 -0
- package/dist/components/list/StickyHeader.js.map +1 -0
- package/dist/components/list/StickySection.js +18 -0
- package/dist/components/list/StickySection.js.map +1 -0
- package/dist/components/list/index.js +348 -0
- package/dist/components/list/index.js.map +1 -0
- package/dist/components/list/style/index.scss.js +4 -0
- package/dist/components/list/style/index.scss.js.map +1 -0
- package/dist/components/picker/index.js +749 -0
- package/dist/components/picker/index.js.map +1 -0
- package/dist/components/picker/picker-group.js +477 -0
- package/dist/components/picker/picker-group.js.map +1 -0
- package/dist/components/picker/react-style/style.css +2 -0
- package/dist/components/picker/react-style/style.css.map +1 -0
- package/dist/components/picker/react-style/style.js +4 -0
- package/dist/components/picker/react-style/style.js.map +1 -0
- package/dist/components/picker/style/index.scss.js +4 -0
- package/dist/components/picker/style/index.scss.js.map +1 -0
- package/dist/components/pull-down-refresh/index.js +14 -10
- package/dist/components/pull-down-refresh/index.js.map +1 -1
- package/dist/components/scroll-view/index.js +18 -5
- package/dist/components/scroll-view/index.js.map +1 -1
- package/dist/components/swiper/index.js +30 -27
- package/dist/components/swiper/index.js.map +1 -1
- package/dist/components/text/index.js.map +1 -1
- package/dist/components/view/index.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/solid/components/button/index.js.map +1 -1
- package/dist/solid/components/icon/index.js.map +1 -1
- package/dist/solid/components/image/index.js.map +1 -1
- package/dist/solid/components/list/ListItem.js +21 -0
- package/dist/solid/components/list/ListItem.js.map +1 -0
- package/dist/solid/components/list/StickyHeader.js +21 -0
- package/dist/solid/components/list/StickyHeader.js.map +1 -0
- package/dist/solid/components/list/StickySection.js +21 -0
- package/dist/solid/components/list/StickySection.js.map +1 -0
- package/dist/solid/components/list/index.js +355 -0
- package/dist/solid/components/list/index.js.map +1 -0
- package/dist/solid/components/list/style/index.scss.js +4 -0
- package/dist/solid/components/list/style/index.scss.js.map +1 -0
- package/dist/solid/components/picker/index.js +794 -0
- package/dist/solid/components/picker/index.js.map +1 -0
- package/dist/solid/components/picker/picker-group.js +490 -0
- package/dist/solid/components/picker/picker-group.js.map +1 -0
- package/dist/solid/components/picker/style/index.scss.js +4 -0
- package/dist/solid/components/picker/style/index.scss.js.map +1 -0
- package/dist/solid/components/scroll-view/index.js +18 -5
- package/dist/solid/components/scroll-view/index.js.map +1 -1
- package/dist/solid/components/text/index.js.map +1 -1
- package/dist/solid/components/view/index.js.map +1 -1
- package/dist/solid/index.css +1 -1
- package/dist/solid/index.js +6 -1
- package/dist/solid/index.js.map +1 -1
- package/dist/solid/utils/hooks.solid.js +10 -5
- package/dist/solid/utils/hooks.solid.js.map +1 -1
- package/dist/solid/utils/index.js +117 -5
- package/dist/solid/utils/index.js.map +1 -1
- package/dist/utils/hooks.react.js.map +1 -1
- package/dist/utils/index.js +117 -5
- package/dist/utils/index.js.map +1 -1
- package/package.json +22 -7
|
@@ -0,0 +1,355 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|