@gunkin/uiify 0.0.11-alpha → 0.0.13-alpha
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/components/behavior.css +21 -6
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +5 -4
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +2 -1
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/carousel/client/CarouselClientView.d.ts.map +1 -1
- package/dist/components/carousel/client/CarouselClientView.js +1 -0
- package/dist/components/carousel/client/CarouselClientView.js.map +1 -1
- package/dist/components/carousel/client/carousel-controller.d.ts.map +1 -1
- package/dist/components/carousel/client/carousel-controller.js +25 -4
- package/dist/components/carousel/client/carousel-controller.js.map +1 -1
- package/dist/components/carousel/client/carousel-observer.d.ts.map +1 -1
- package/dist/components/carousel/client/carousel-observer.js +40 -0
- package/dist/components/carousel/client/carousel-observer.js.map +1 -1
- package/dist/components/carousel/fade/fade-controller.d.ts.map +1 -1
- package/dist/components/carousel/fade/fade-controller.js +3 -0
- package/dist/components/carousel/fade/fade-controller.js.map +1 -1
- package/dist/components/carousel/types.d.ts +2 -0
- package/dist/components/carousel/types.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.d.ts +1 -6
- package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.js +2 -52
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts +1 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.js +46 -9
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/drawer/DrawerNative.d.ts +8 -16
- package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
- package/dist/components/drawer/DrawerNative.js +80 -34
- package/dist/components/drawer/DrawerNative.js.map +1 -1
- package/dist/components/drawer/drawer-store.d.ts +1 -1
- package/dist/components/drawer/drawer-store.d.ts.map +1 -1
- package/dist/components/drawer/drawer-store.js +7 -3
- package/dist/components/drawer/drawer-store.js.map +1 -1
- package/dist/components/drawer/index.d.ts +3 -3
- package/dist/components/drawer/index.d.ts.map +1 -1
- package/dist/components/drawer/index.js +9 -1
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/types.d.ts +114 -3
- package/dist/components/drawer/types.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.js +1 -0
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/enhance/dialog-dismiss.d.ts +1 -1
- package/dist/components/enhance/dialog-dismiss.d.ts.map +1 -1
- package/dist/components/enhance/dialog-dismiss.js +19 -10
- package/dist/components/enhance/dialog-dismiss.js.map +1 -1
- package/dist/components/enhance/internal/box-observer.d.ts +4 -0
- package/dist/components/enhance/internal/box-observer.d.ts.map +1 -0
- package/dist/components/enhance/internal/box-observer.js +32 -0
- package/dist/components/enhance/internal/box-observer.js.map +1 -0
- package/dist/components/enhance/sheet-swipe.d.ts.map +1 -1
- package/dist/components/enhance/sheet-swipe.js +42 -14
- package/dist/components/enhance/sheet-swipe.js.map +1 -1
- package/dist/components/enhance/types.d.ts +5 -0
- package/dist/components/enhance/types.d.ts.map +1 -0
- package/dist/components/field/Field.d.ts.map +1 -1
- package/dist/components/field/Field.js +1 -0
- package/dist/components/field/Field.js.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts +4 -7
- package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.js +28 -122
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/file-upload/FileUploadInput.d.ts +7 -0
- package/dist/components/file-upload/FileUploadInput.d.ts.map +1 -0
- package/dist/components/file-upload/FileUploadInput.js +60 -0
- package/dist/components/file-upload/FileUploadInput.js.map +1 -0
- package/dist/components/file-upload/FileUploadRoot.d.ts +8 -0
- package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -0
- package/dist/components/file-upload/FileUploadRoot.js +70 -0
- package/dist/components/file-upload/FileUploadRoot.js.map +1 -0
- package/dist/components/file-upload/file-upload-context.d.ts +3 -0
- package/dist/components/file-upload/file-upload-context.d.ts.map +1 -0
- package/dist/components/file-upload/file-upload-context.js +8 -0
- package/dist/components/file-upload/file-upload-context.js.map +1 -0
- package/dist/components/file-upload/index.d.ts +1 -1
- package/dist/components/file-upload/index.d.ts.map +1 -1
- package/dist/components/file-upload/index.js.map +1 -1
- package/dist/components/file-upload/types.d.ts +8 -10
- package/dist/components/file-upload/types.d.ts.map +1 -1
- package/dist/components/form/Form.d.ts.map +1 -1
- package/dist/components/form/Form.js +2 -1
- package/dist/components/form/Form.js.map +1 -1
- package/dist/components/header/Header.d.ts +3 -19
- package/dist/components/header/Header.d.ts.map +1 -1
- package/dist/components/header/Header.js +4 -253
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/client/HeaderClient.d.ts +7 -0
- package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
- package/dist/components/header/client/HeaderClient.js +93 -0
- package/dist/components/header/client/HeaderClient.js.map +1 -0
- package/dist/components/header/client/index.d.ts +3 -0
- package/dist/components/header/client/index.d.ts.map +1 -0
- package/dist/components/header/client/index.js +6 -0
- package/dist/components/header/client/index.js.map +1 -0
- package/dist/components/header/client.d.ts +1 -0
- package/dist/components/header/client.js +1 -0
- package/dist/components/header/index.d.ts +2 -3
- package/dist/components/header/index.d.ts.map +1 -1
- package/dist/components/header/index.js +2 -15
- package/dist/components/header/index.js.map +1 -1
- package/dist/components/header/types.d.ts +7 -63
- package/dist/components/header/types.d.ts.map +1 -1
- package/dist/components/hover-card/HoverCard.js +1 -1
- package/dist/components/hover-card/HoverCard.js.map +1 -1
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.js +1 -1
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.js +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
- package/dist/components/internal/choice-family/types.d.ts +3 -3
- package/dist/components/internal/choice-family/types.d.ts.map +1 -1
- package/dist/components/internal/native-check-control/NativeCheckControl.d.ts +7 -0
- package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -0
- package/dist/components/internal/native-check-control/NativeCheckControl.js +56 -0
- package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -0
- package/dist/components/internal/native-check-control/types.d.ts +13 -0
- package/dist/components/internal/native-check-control/types.d.ts.map +1 -0
- package/dist/components/internal/native-check-control/types.js +1 -0
- package/dist/components/number-field/NumberField.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.js +11 -2
- package/dist/components/number-field/NumberField.js.map +1 -1
- package/dist/components/number-field/format.d.ts +1 -0
- package/dist/components/number-field/format.d.ts.map +1 -1
- package/dist/components/number-field/format.js +18 -6
- package/dist/components/number-field/format.js.map +1 -1
- package/dist/components/popup/PopupParts.d.ts.map +1 -1
- package/dist/components/popup/PopupParts.js +2 -0
- package/dist/components/popup/PopupParts.js.map +1 -1
- package/dist/components/select/Select.d.ts.map +1 -1
- package/dist/components/select/Select.js +1 -1
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/skeleton/Skeleton.js +14 -35
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/skeleton/types.d.ts +1 -8
- package/dist/components/skeleton/types.d.ts.map +1 -1
- package/dist/components/table/Table.d.ts +1 -40
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +9 -259
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/TableShell.d.ts +5 -1
- package/dist/components/table/TableShell.d.ts.map +1 -1
- package/dist/components/table/TableShell.js +63 -9
- package/dist/components/table/TableShell.js.map +1 -1
- package/dist/components/table/client/Table.d.ts +30 -0
- package/dist/components/table/client/Table.d.ts.map +1 -0
- package/dist/components/table/client/Table.js +135 -0
- package/dist/components/table/client/Table.js.map +1 -0
- package/dist/components/table/client/TableBody.d.ts +7 -0
- package/dist/components/table/client/TableBody.d.ts.map +1 -0
- package/dist/components/table/client/TableBody.js +35 -0
- package/dist/components/table/client/TableBody.js.map +1 -0
- package/dist/components/table/client/TableColumnHeader.d.ts +7 -0
- package/dist/components/table/client/TableColumnHeader.d.ts.map +1 -0
- package/dist/components/table/client/TableColumnHeader.js +69 -0
- package/dist/components/table/client/TableColumnHeader.js.map +1 -0
- package/dist/components/table/client/TableExpansion.d.ts +11 -0
- package/dist/components/table/client/TableExpansion.d.ts.map +1 -0
- package/dist/components/table/client/TableExpansion.js +43 -0
- package/dist/components/table/client/TableExpansion.js.map +1 -0
- package/dist/components/table/client/TableRow.d.ts +7 -0
- package/dist/components/table/client/TableRow.d.ts.map +1 -0
- package/dist/components/table/client/TableRow.js +95 -0
- package/dist/components/table/client/TableRow.js.map +1 -0
- package/dist/components/table/client/TableSelection.d.ts +11 -0
- package/dist/components/table/client/TableSelection.d.ts.map +1 -0
- package/dist/components/table/client/TableSelection.js +48 -0
- package/dist/components/table/client/TableSelection.js.map +1 -0
- package/dist/components/table/client/table-context.d.ts +3 -0
- package/dist/components/table/client/table-context.d.ts.map +1 -0
- package/dist/components/table/client/table-context.js +8 -0
- package/dist/components/table/client/table-context.js.map +1 -0
- package/dist/components/table/client.d.ts +4 -0
- package/dist/components/table/client.d.ts.map +1 -0
- package/dist/components/table/client.js +30 -0
- package/dist/components/table/client.js.map +1 -0
- package/dist/components/table/index.d.ts +2 -2
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +7 -7
- package/dist/components/table/index.js.map +1 -1
- package/dist/components/table/types.d.ts +42 -15
- package/dist/components/table/types.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.js +1 -1
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/tooltip/Tooltip.js +1 -1
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
- package/dist/components/virtual-scroll/VirtualScroll.js +54 -34
- package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
- package/dist/components/virtual-scroll/types.d.ts +2 -2
- package/dist/components/virtual-scroll/types.d.ts.map +1 -1
- package/dist/components/virtual-scroll/types.js.map +1 -1
- package/dist/components/virtual-scroll/virtual-scroll-scroll.d.ts.map +1 -1
- package/dist/components/virtual-scroll/virtual-scroll-scroll.js +0 -1
- package/dist/components/virtual-scroll/virtual-scroll-scroll.js.map +1 -1
- package/dist/core/roving-focus.d.ts +2 -1
- package/dist/core/roving-focus.d.ts.map +1 -1
- package/dist/core/roving-focus.js.map +1 -1
- package/dist/core/use-popover.d.ts.map +1 -1
- package/dist/core/use-popover.js +6 -1
- package/dist/core/use-popover.js.map +1 -1
- package/dist/elements/choice/types.d.ts +1 -1
- package/dist/elements/choice/types.d.ts.map +1 -1
- package/dist/styles/index.css +1 -1
- package/dist/styles/tailwind.css +1 -0
- package/dist/styles/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/components/drawer/client-types.d.ts +0 -99
- package/dist/components/drawer/client-types.d.ts.map +0 -1
- package/dist/components/drawer/client-types.js +0 -1
- package/dist/components/enhance/internal/read-box.d.ts +0 -3
- package/dist/components/enhance/internal/read-box.d.ts.map +0 -1
- package/dist/components/enhance/internal/read-box.js +0 -7
- package/dist/components/enhance/internal/read-box.js.map +0 -1
- package/dist/components/header/use-header-scroll-state.d.ts +0 -4
- package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
- package/dist/components/header/use-header-scroll-state.js +0 -83
- package/dist/components/header/use-header-scroll-state.js.map +0 -1
- package/dist/components/header/use-header.d.ts +0 -4
- package/dist/components/header/use-header.d.ts.map +0 -1
- package/dist/components/header/use-header.js +0 -80
- package/dist/components/header/use-header.js.map +0 -1
- package/dist/components/stepper/Stepper.d.ts +0 -7
- package/dist/components/stepper/Stepper.d.ts.map +0 -1
- package/dist/components/stepper/Stepper.js +0 -35
- package/dist/components/stepper/Stepper.js.map +0 -1
- package/dist/components/stepper/index.d.ts +0 -3
- package/dist/components/stepper/index.d.ts.map +0 -1
- package/dist/components/stepper/index.js +0 -5
- package/dist/components/stepper/index.js.map +0 -1
- package/dist/components/stepper/types.d.ts +0 -14
- package/dist/components/stepper/types.d.ts.map +0 -1
- package/dist/components/stepper.d.ts +0 -1
- package/dist/components/stepper.js +0 -1
- /package/dist/components/{stepper → enhance}/types.js +0 -0
- /package/dist/components/{stepper → enhance}/types.js.map +0 -0
- /package/dist/components/{drawer/client-types.js.map → internal/native-check-control/types.js.map} +0 -0
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
import {
|
|
34
34
|
clampScrollOffset,
|
|
35
35
|
computeScrollOffsetForIndex,
|
|
36
|
-
isSmoothScrollActive,
|
|
37
36
|
normalizeScrollBehaviorOptions,
|
|
38
37
|
normalizeScrollToIndexOptions,
|
|
39
38
|
resolveScrollBehavior
|
|
@@ -63,7 +62,8 @@ function buildRowSlots(items, rangeStart, slotCount) {
|
|
|
63
62
|
function VirtualScroll(props) {
|
|
64
63
|
const {
|
|
65
64
|
items,
|
|
66
|
-
height
|
|
65
|
+
height: suppliedHeight,
|
|
66
|
+
style: consumerStyle,
|
|
67
67
|
rowHeight = VIRTUAL_SCROLL_ROW_HEIGHT,
|
|
68
68
|
orientation = "vertical",
|
|
69
69
|
overscan = VIRTUAL_SCROLL_OVERSCAN,
|
|
@@ -77,15 +77,17 @@ function VirtualScroll(props) {
|
|
|
77
77
|
anchor = "start",
|
|
78
78
|
followAppend = false,
|
|
79
79
|
onScrollStateChange,
|
|
80
|
-
isScrollingResetDelay = VIRTUAL_SCROLL_SCROLL_RESET_DELAY
|
|
80
|
+
isScrollingResetDelay = VIRTUAL_SCROLL_SCROLL_RESET_DELAY,
|
|
81
|
+
...consumerProps
|
|
81
82
|
} = props;
|
|
83
|
+
const height = suppliedHeight ?? 600;
|
|
82
84
|
const dynamicLayout = estimateRowHeight !== void 0;
|
|
83
85
|
const horizontal = orientation === "horizontal";
|
|
84
86
|
const ref = useRef(null);
|
|
85
87
|
const scrollOffsetRef = useRef(0);
|
|
88
|
+
const programmaticScrollRef = useRef(false);
|
|
86
89
|
const itemsRef = useRef(items);
|
|
87
90
|
itemsRef.current = items;
|
|
88
|
-
const smoothRafRef = useRef(0);
|
|
89
91
|
const lastRangeChangeRef = useRef("");
|
|
90
92
|
const measuredHeightsRef = useRef(/* @__PURE__ */ new Map());
|
|
91
93
|
const anchorSnapshotRef = useRef({
|
|
@@ -160,12 +162,12 @@ function VirtualScroll(props) {
|
|
|
160
162
|
lastRangeChangeRef.current = signature;
|
|
161
163
|
callback(payload);
|
|
162
164
|
};
|
|
163
|
-
const syncRangeFromScrollRef = useRef(() => {
|
|
165
|
+
const syncRangeFromScrollRef = useRef((_offset) => {
|
|
164
166
|
});
|
|
165
|
-
syncRangeFromScrollRef.current = () => {
|
|
167
|
+
syncRangeFromScrollRef.current = (offset) => {
|
|
166
168
|
const element = ref.current;
|
|
167
169
|
if (!element) return;
|
|
168
|
-
const scrollOffset = readScrollOffset(element, scrollOptionsRef.current.orientation);
|
|
170
|
+
const scrollOffset = offset ?? readScrollOffset(element, scrollOptionsRef.current.orientation);
|
|
169
171
|
const previousRange = computeRange();
|
|
170
172
|
scrollOffsetRef.current = scrollOffset;
|
|
171
173
|
const nextRange = computeRange();
|
|
@@ -202,8 +204,10 @@ function VirtualScroll(props) {
|
|
|
202
204
|
const element = ref.current;
|
|
203
205
|
if (!element || delta === 0) return;
|
|
204
206
|
const { orientation: orientation2 } = scrollOptionsRef.current;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
+
const next = scrollOffsetRef.current + delta;
|
|
208
|
+
programmaticScrollRef.current = true;
|
|
209
|
+
writeScrollOffset(element, orientation2, next, "auto");
|
|
210
|
+
syncRangeFromScrollRef.current(next);
|
|
207
211
|
};
|
|
208
212
|
const applyScrollOffset = (offset, behavior) => {
|
|
209
213
|
const element = ref.current;
|
|
@@ -211,25 +215,10 @@ function VirtualScroll(props) {
|
|
|
211
215
|
const store = measurementStoreRef.current;
|
|
212
216
|
const totalSize2 = dynamicLayout ? store.getTotalSize() : items.length * rowHeight;
|
|
213
217
|
const clamped = clampScrollOffset(offset, totalSize2, viewportSize);
|
|
218
|
+
const current = scrollOffsetRef.current;
|
|
219
|
+
programmaticScrollRef.current = behavior === "instant";
|
|
214
220
|
writeScrollOffset(element, orientation, clamped, resolveScrollBehavior(behavior));
|
|
215
|
-
syncRangeFromScrollRef.current();
|
|
216
|
-
if (isSmoothScrollActive(behavior ?? "auto", readScrollOffset(element, orientation), clamped)) {
|
|
217
|
-
if (smoothRafRef.current !== 0) cancelAnimationFrame(smoothRafRef.current);
|
|
218
|
-
const tick = () => {
|
|
219
|
-
syncRangeFromScrollRef.current();
|
|
220
|
-
const node = ref.current;
|
|
221
|
-
if (!node) {
|
|
222
|
-
smoothRafRef.current = 0;
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
if (isSmoothScrollActive("smooth", readScrollOffset(node, orientation), clamped)) {
|
|
226
|
-
smoothRafRef.current = requestAnimationFrame(tick);
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
smoothRafRef.current = 0;
|
|
230
|
-
};
|
|
231
|
-
smoothRafRef.current = requestAnimationFrame(tick);
|
|
232
|
-
}
|
|
221
|
+
syncRangeFromScrollRef.current(behavior === "instant" ? clamped : current);
|
|
233
222
|
};
|
|
234
223
|
const applyScrollOffsetRef = useRef(
|
|
235
224
|
(_offset, _behavior) => {
|
|
@@ -275,7 +264,15 @@ function VirtualScroll(props) {
|
|
|
275
264
|
void rangeVersion;
|
|
276
265
|
void measurementVersion;
|
|
277
266
|
return computeRange();
|
|
278
|
-
}, [
|
|
267
|
+
}, [
|
|
268
|
+
rangeVersion,
|
|
269
|
+
measurementVersion,
|
|
270
|
+
dynamicLayout,
|
|
271
|
+
items.length,
|
|
272
|
+
overscan,
|
|
273
|
+
rowHeight,
|
|
274
|
+
viewportSize
|
|
275
|
+
]);
|
|
279
276
|
const totalSize = useMemo(() => {
|
|
280
277
|
void measurementVersion;
|
|
281
278
|
if (dynamicLayout) return measurementStoreRef.current.getTotalSize();
|
|
@@ -353,22 +350,40 @@ function VirtualScroll(props) {
|
|
|
353
350
|
const ios = iosControllerRef.current;
|
|
354
351
|
const onTouchStart = () => ios.onTouchStart();
|
|
355
352
|
const onTouchEnd = () => ios.onTouchEnd();
|
|
353
|
+
let verifyFrame = 0;
|
|
354
|
+
let verifyTimer = 0;
|
|
355
|
+
const syncNativeScroll = () => {
|
|
356
|
+
if (!programmaticScrollRef.current) {
|
|
357
|
+
syncRangeFromScrollRef.current();
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
if (verifyFrame !== 0) return;
|
|
361
|
+
verifyFrame = requestAnimationFrame(() => {
|
|
362
|
+
verifyTimer = window.setTimeout(() => {
|
|
363
|
+
verifyFrame = 0;
|
|
364
|
+
verifyTimer = 0;
|
|
365
|
+
programmaticScrollRef.current = false;
|
|
366
|
+
syncRangeFromScrollRef.current();
|
|
367
|
+
}, 0);
|
|
368
|
+
});
|
|
369
|
+
};
|
|
356
370
|
onScroll = () => {
|
|
371
|
+
syncNativeScroll();
|
|
357
372
|
scrollState.notifyScroll();
|
|
358
|
-
syncRangeFromScrollRef.current();
|
|
359
373
|
};
|
|
360
374
|
element.addEventListener("scroll", onScroll, { passive: true });
|
|
361
375
|
if (supportsScrollEndEvent()) {
|
|
362
376
|
onScrollEnd = () => {
|
|
377
|
+
syncNativeScroll();
|
|
363
378
|
scrollState.notifyScrollEnd();
|
|
364
|
-
syncRangeFromScrollRef.current();
|
|
365
379
|
};
|
|
366
380
|
element.addEventListener("scrollend", onScrollEnd, { passive: true });
|
|
367
381
|
}
|
|
368
382
|
element.addEventListener("touchstart", onTouchStart, { passive: true });
|
|
369
383
|
element.addEventListener("touchend", onTouchEnd, { passive: true });
|
|
370
384
|
return () => {
|
|
371
|
-
if (
|
|
385
|
+
if (verifyFrame !== 0) cancelAnimationFrame(verifyFrame);
|
|
386
|
+
if (verifyTimer !== 0) window.clearTimeout(verifyTimer);
|
|
372
387
|
if (onScroll) element.removeEventListener("scroll", onScroll);
|
|
373
388
|
if (onScrollEnd) element.removeEventListener("scrollend", onScrollEnd);
|
|
374
389
|
element.removeEventListener("touchstart", onTouchStart);
|
|
@@ -396,8 +411,11 @@ function VirtualScroll(props) {
|
|
|
396
411
|
next: nextSnapshot
|
|
397
412
|
});
|
|
398
413
|
if (adjustment && element) {
|
|
414
|
+
programmaticScrollRef.current = true;
|
|
399
415
|
writeScrollOffset(element, orientation, scrollOffset + adjustment.delta, adjustment.behavior);
|
|
400
|
-
syncRangeFromScrollRef.current(
|
|
416
|
+
syncRangeFromScrollRef.current(
|
|
417
|
+
adjustment.behavior === "smooth" ? scrollOffset : scrollOffset + adjustment.delta
|
|
418
|
+
);
|
|
401
419
|
}
|
|
402
420
|
anchorSnapshotRef.current = nextSnapshot;
|
|
403
421
|
}, [anchor, followAppend, items, dynamicLayout, orientation, rowHeight, viewportSize]);
|
|
@@ -405,7 +423,8 @@ function VirtualScroll(props) {
|
|
|
405
423
|
emitRangeChange(range);
|
|
406
424
|
}, [range]);
|
|
407
425
|
const scrollportStyle = {
|
|
408
|
-
height,
|
|
426
|
+
...suppliedHeight !== void 0 || !consumerStyle?.blockSize && !consumerStyle?.height ? { blockSize: height } : {},
|
|
427
|
+
...consumerStyle,
|
|
409
428
|
overflowX: horizontal ? "auto" : void 0,
|
|
410
429
|
overflowY: horizontal ? "hidden" : "auto",
|
|
411
430
|
"--uiify-virtual-scroll-count": items.length,
|
|
@@ -418,8 +437,9 @@ function VirtualScroll(props) {
|
|
|
418
437
|
return /* @__PURE__ */ jsx(
|
|
419
438
|
"div",
|
|
420
439
|
{
|
|
440
|
+
...consumerProps,
|
|
421
441
|
ref,
|
|
422
|
-
"data-testid": testId,
|
|
442
|
+
"data-testid": testId ?? consumerProps["data-testid"],
|
|
423
443
|
"data-uiify-virtual-scroll": "",
|
|
424
444
|
"data-dynamic-layout": dynamicLayout ? "" : void 0,
|
|
425
445
|
"data-orientation": orientation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/VirtualScroll.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FragmentInstance,\n type ReactElement,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useResizeObserver } from \"@gunkin/uiify/hooks\";\nimport { resolveVirtualScrollAnchorAdjustment } from \"./virtual-scroll-anchor.js\";\nimport { readScrollOffset, writeScrollOffset } from \"./virtual-scroll-axis.js\";\nimport {\n createVirtualScrollIosScroll,\n detectTouchScrollEnvironment,\n} from \"./virtual-scroll-ios.js\";\nimport {\n computeScrollAdjustmentForRowResize,\n createVirtualScrollMeasurementStore,\n} from \"./virtual-scroll-measurements.js\";\nimport {\n computeDynamicVirtualScrollRange,\n computeVirtualScrollRange,\n rangesEqual,\n toVirtualScrollRangeChange,\n} from \"./virtual-scroll-range.js\";\nimport {\n computeActiveVirtualScrollSlotCount,\n computeVirtualScrollSlotCount,\n VirtualScrollRowShell,\n} from \"./VirtualScrollRowShell.js\";\nimport {\n clampScrollOffset,\n computeScrollOffsetForIndex,\n isSmoothScrollActive,\n normalizeScrollBehaviorOptions,\n normalizeScrollToIndexOptions,\n resolveScrollBehavior,\n} from \"./virtual-scroll-scroll.js\";\nimport {\n createVirtualScrollScrollState,\n supportsScrollEndEvent,\n} from \"./virtual-scroll-scroll-state.js\";\nimport { applyVirtualScrollRangeToDom } from \"./virtual-scroll-scroll-sync.js\";\nimport type {\n VirtualScrollHandle,\n VirtualScrollItem,\n VirtualScrollOwnProps,\n VirtualScrollRowSlot,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\nimport { VirtualScrollRowItem } from \"./VirtualScrollRowItem.js\";\nimport {\n VIRTUAL_SCROLL_OVERSCAN,\n VIRTUAL_SCROLL_ROW_HEIGHT,\n VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n} from \"./types.js\";\n\nfunction buildRowSlots<T extends VirtualScrollItem>(\n items: readonly T[],\n rangeStart: number,\n slotCount: number,\n): readonly VirtualScrollRowSlot<T>[] {\n const activeSlotCount = computeActiveVirtualScrollSlotCount(items.length, rangeStart, slotCount);\n return Array.from({ length: activeSlotCount }, (_, slotIndex) => {\n const index = rangeStart + slotIndex;\n return {\n index,\n item: items[index] ?? null,\n slotIndex,\n };\n });\n}\n\nexport function VirtualScroll<T extends VirtualScrollItem>(\n props: VirtualScrollOwnProps<T>,\n): ReactElement {\n const {\n items,\n height = 600,\n rowHeight = VIRTUAL_SCROLL_ROW_HEIGHT,\n orientation = \"vertical\",\n overscan = VIRTUAL_SCROLL_OVERSCAN,\n className,\n testId,\n renderRow,\n scrollRef,\n estimateRowHeight,\n onRangeChange,\n role = \"list\",\n anchor = \"start\",\n followAppend = false,\n onScrollStateChange,\n isScrollingResetDelay = VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n } = props;\n\n const dynamicLayout = estimateRowHeight !== undefined;\n const horizontal = orientation === \"horizontal\";\n const ref = useRef<HTMLDivElement>(null);\n const scrollOffsetRef = useRef(0);\n const itemsRef = useRef(items);\n itemsRef.current = items;\n const smoothRafRef = useRef(0);\n const lastRangeChangeRef = useRef<string>(\"\");\n const measuredHeightsRef = useRef(new Map<string, number>());\n const anchorSnapshotRef = useRef({\n firstItemId: items[0]?.id,\n itemCount: items.length,\n totalSize: 0,\n scrollTop: 0,\n });\n\n const [rangeVersion, setRangeVersion] = useState(0);\n const [measurementVersion, setMeasurementVersion] = useState(0);\n\n const measuredSize = useResizeObserver(ref);\n const viewportSize = (horizontal ? measuredSize?.width : measuredSize?.height) ?? height;\n\n const measurementStoreRef = useRef(\n createVirtualScrollMeasurementStore({\n itemCount: items.length,\n defaultRowHeight: rowHeight,\n ...(estimateRowHeight ? { estimateRowHeight } : {}),\n measuredHeights: measuredHeightsRef.current,\n itemIdAtIndex: (index) => itemsRef.current[index]?.id,\n }),\n );\n\n measurementStoreRef.current.syncItemCount(items.length);\n\n const scrollOptionsRef = useRef({\n dynamicLayout,\n itemCount: items.length,\n orientation,\n overscan,\n rowHeight,\n viewportSize,\n });\n scrollOptionsRef.current = {\n dynamicLayout,\n itemCount: items.length,\n orientation,\n overscan,\n rowHeight,\n viewportSize,\n };\n\n const onRangeChangeRef = useRef(onRangeChange);\n onRangeChangeRef.current = onRangeChange;\n\n const onScrollStateChangeRef = useRef(onScrollStateChange);\n onScrollStateChangeRef.current = onScrollStateChange;\n\n const computeRange = (): ReturnType<typeof computeVirtualScrollRange> => {\n const { dynamicLayout, itemCount, overscan, rowHeight, viewportSize } =\n scrollOptionsRef.current;\n const scrollTop = scrollOffsetRef.current;\n\n if (dynamicLayout) {\n const store = measurementStoreRef.current;\n return computeDynamicVirtualScrollRange({\n scrollTop,\n viewportHeight: viewportSize,\n itemCount,\n overscan,\n findStartIndex: store.findStartIndex,\n findEndIndex: store.findEndIndex,\n getRowOffset: store.getRowOffset,\n });\n }\n\n return computeVirtualScrollRange({\n scrollTop,\n viewportHeight: viewportSize,\n itemCount,\n rowHeight,\n overscan,\n });\n };\n\n const emitRangeChange = (range: ReturnType<typeof computeVirtualScrollRange>): void => {\n const callback = onRangeChangeRef.current;\n if (!callback) return;\n const payload = toVirtualScrollRangeChange(range);\n const signature = `${payload.overscanStart}:${payload.overscanEnd}`;\n if (signature === lastRangeChangeRef.current) return;\n lastRangeChangeRef.current = signature;\n callback(payload);\n };\n\n const syncRangeFromScrollRef = useRef(() => {});\n\n syncRangeFromScrollRef.current = () => {\n const element = ref.current;\n if (!element) return;\n\n const scrollOffset = readScrollOffset(element, scrollOptionsRef.current.orientation);\n const previousRange = computeRange();\n scrollOffsetRef.current = scrollOffset;\n\n const nextRange = computeRange();\n if (rangesEqual(previousRange, nextRange)) return;\n\n emitRangeChange(nextRange);\n\n const { dynamicLayout, itemCount, viewportSize, rowHeight, overscan } =\n scrollOptionsRef.current;\n const slotCount = computeActiveVirtualScrollSlotCount(\n itemCount,\n nextRange.start,\n Math.max(\n nextRange.end - nextRange.start,\n computeVirtualScrollSlotCount(viewportSize, rowHeight, overscan),\n ),\n );\n const store = measurementStoreRef.current;\n\n // Write range CSS vars on the scroll handler so rows move in the same frame as the scroll offset.\n applyVirtualScrollRangeToDom(element, nextRange, {\n dynamicLayout,\n slotCount,\n getRowOffset: store.getRowOffset.bind(store),\n });\n\n // Commit the visible slice synchronously so content matches scroll position on large jumps.\n flushSync(() => {\n setRangeVersion((version) => version + 1);\n });\n };\n\n const iosControllerRef = useRef(\n createVirtualScrollIosScroll({\n enabled: detectTouchScrollEnvironment(),\n resetDelay: isScrollingResetDelay,\n }),\n );\n\n const applyScrollDeltaRef = useRef((_delta: number) => {});\n\n applyScrollDeltaRef.current = (delta: number) => {\n const element = ref.current;\n if (!element || delta === 0) return;\n // Preserve the viewport while rows resize.\n const { orientation } = scrollOptionsRef.current;\n writeScrollOffset(element, orientation, readScrollOffset(element, orientation) + delta, \"auto\");\n syncRangeFromScrollRef.current();\n };\n\n const applyScrollOffset = (\n offset: number,\n behavior: VirtualScrollScrollBehaviorOptions[\"behavior\"],\n ): void => {\n const element = ref.current;\n if (!element) return;\n\n const store = measurementStoreRef.current;\n const totalSize = dynamicLayout ? store.getTotalSize() : items.length * rowHeight;\n const clamped = clampScrollOffset(offset, totalSize, viewportSize);\n writeScrollOffset(element, orientation, clamped, resolveScrollBehavior(behavior));\n syncRangeFromScrollRef.current();\n\n if (isSmoothScrollActive(behavior ?? \"auto\", readScrollOffset(element, orientation), clamped)) {\n if (smoothRafRef.current !== 0) cancelAnimationFrame(smoothRafRef.current);\n const tick = (): void => {\n syncRangeFromScrollRef.current();\n const node = ref.current;\n if (!node) {\n smoothRafRef.current = 0;\n return;\n }\n if (isSmoothScrollActive(\"smooth\", readScrollOffset(node, orientation), clamped)) {\n smoothRafRef.current = requestAnimationFrame(tick);\n return;\n }\n smoothRafRef.current = 0;\n };\n smoothRafRef.current = requestAnimationFrame(tick);\n }\n };\n\n const applyScrollOffsetRef = useRef(\n (_offset: number, _behavior: VirtualScrollScrollBehaviorOptions[\"behavior\"]) => {},\n );\n\n applyScrollOffsetRef.current = applyScrollOffset;\n\n useImperativeHandle(\n scrollRef,\n (): VirtualScrollHandle => ({\n get element() {\n return ref.current;\n },\n scrollToIndex(index: number, options?: VirtualScrollScrollToIndexOptions): void {\n const normalized = normalizeScrollToIndexOptions(options);\n const store = measurementStoreRef.current;\n const metrics = {\n getRowOffset: store.getRowOffset.bind(store),\n getRowHeight: store.getRowHeight.bind(store),\n getTotalSize: store.getTotalSize.bind(store),\n };\n const offset = computeScrollOffsetForIndex(\n index,\n normalized.align,\n metrics,\n scrollOptionsRef.current.viewportSize,\n scrollOffsetRef.current,\n );\n applyScrollOffsetRef.current(offset, normalized.behavior);\n },\n scrollToOffset(offset: number, options?: VirtualScrollScrollBehaviorOptions): void {\n applyScrollOffsetRef.current(offset, normalizeScrollBehaviorOptions(options));\n },\n scrollToEnd(options?: VirtualScrollScrollBehaviorOptions): void {\n const store = measurementStoreRef.current;\n const totalSize = dynamicLayout\n ? store.getTotalSize()\n : scrollOptionsRef.current.itemCount * scrollOptionsRef.current.rowHeight;\n const offset = Math.max(0, totalSize - scrollOptionsRef.current.viewportSize);\n applyScrollOffsetRef.current(offset, normalizeScrollBehaviorOptions(options));\n },\n }),\n [dynamicLayout],\n );\n\n const range = useMemo(() => {\n void rangeVersion;\n void measurementVersion;\n return computeRange();\n }, [rangeVersion, measurementVersion]);\n\n const totalSize = useMemo(() => {\n void measurementVersion;\n if (dynamicLayout) return measurementStoreRef.current.getTotalSize();\n return items.length * rowHeight;\n }, [dynamicLayout, items.length, measurementVersion, rowHeight]);\n\n const slotCount = useMemo(() => {\n if (items.length === 0) return 0;\n return Math.max(\n range.end - range.start,\n computeVirtualScrollSlotCount(viewportSize, rowHeight, overscan),\n );\n }, [items.length, overscan, range.end, range.start, rowHeight, viewportSize]);\n\n const rowSlots = useMemo(\n () => buildRowSlots(items, range.start, slotCount),\n [items, range.start, slotCount],\n );\n\n const handleRowMeasureRef = useRef((index: number, itemId: string, height: number) => {\n const store = measurementStoreRef.current;\n const previousHeight = store.getRowHeight(index);\n const rowOffset = store.getRowOffset(index);\n if (!store.setMeasuredHeight(itemId, index, height)) return;\n\n const adjustment = computeScrollAdjustmentForRowResize({\n scrollTop: scrollOffsetRef.current,\n rowOffset,\n previousHeight,\n nextHeight: height,\n });\n\n if (adjustment > 0) {\n const ios = iosControllerRef.current;\n if (ios.isTouchScrolling()) {\n ios.queueAdjustment(adjustment);\n } else {\n applyScrollDeltaRef.current(adjustment);\n }\n }\n\n setMeasurementVersion((version) => version + 1);\n });\n\n const rowsFragmentRef = useRef<FragmentInstance>(null);\n\n // One ResizeObserver for the whole pooled row set. React keeps the\n // subscription in sync as slots mount and unmount — pinned by\n // core/fragment-instance.test.tsx. Fixed layout never measures rows, so no\n // observer is created there at all.\n useEffect(() => {\n if (!dynamicLayout) return;\n const fragment = rowsFragmentRef.current;\n if (!fragment || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const target = entry.target;\n if (!(target instanceof HTMLElement)) continue;\n const raw = target.dataset[\"uiifyRowIndex\"];\n if (raw === undefined) continue;\n const index = Number(raw);\n if (!Number.isInteger(index)) continue;\n const itemId = itemsRef.current[index]?.id;\n if (itemId === undefined) continue;\n const size = horizontal ? entry.contentRect.width : entry.contentRect.height;\n handleRowMeasureRef.current(index, itemId, size);\n }\n });\n\n fragment.observeUsing(observer);\n return () => fragment.unobserveUsing(observer);\n }, [dynamicLayout, horizontal]);\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const scrollState = createVirtualScrollScrollState({\n resetDelay: isScrollingResetDelay,\n supportsScrollEnd: supportsScrollEndEvent(),\n onChange: (isScrolling) => {\n onScrollStateChangeRef.current?.({ isScrolling });\n if (!isScrolling) {\n iosControllerRef.current.flushAdjustments(applyScrollDeltaRef.current);\n }\n },\n });\n\n let onScroll: (() => void) | null = null;\n let onScrollEnd: (() => void) | null = null;\n const ios = iosControllerRef.current;\n const onTouchStart = (): void => ios.onTouchStart();\n const onTouchEnd = (): void => ios.onTouchEnd();\n\n onScroll = () => {\n scrollState.notifyScroll();\n syncRangeFromScrollRef.current();\n };\n element.addEventListener(\"scroll\", onScroll, { passive: true });\n if (supportsScrollEndEvent()) {\n onScrollEnd = () => {\n scrollState.notifyScrollEnd();\n syncRangeFromScrollRef.current();\n };\n element.addEventListener(\"scrollend\", onScrollEnd, { passive: true });\n }\n element.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n element.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n\n return () => {\n if (smoothRafRef.current !== 0) cancelAnimationFrame(smoothRafRef.current);\n if (onScroll) element.removeEventListener(\"scroll\", onScroll);\n if (onScrollEnd) element.removeEventListener(\"scrollend\", onScrollEnd);\n element.removeEventListener(\"touchstart\", onTouchStart);\n element.removeEventListener(\"touchend\", onTouchEnd);\n scrollState.dispose();\n };\n }, [isScrollingResetDelay]);\n\n useEffect(() => {\n const element = ref.current;\n const store = measurementStoreRef.current;\n const nextTotalSize = dynamicLayout ? store.getTotalSize() : items.length * rowHeight;\n const previous = anchorSnapshotRef.current;\n const scrollOffset = element ? readScrollOffset(element, orientation) : scrollOffsetRef.current;\n const nextSnapshot = {\n firstItemId: items[0]?.id,\n itemCount: items.length,\n totalSize: nextTotalSize,\n scrollTop: scrollOffset,\n };\n\n const adjustment = resolveVirtualScrollAnchorAdjustment({\n anchor,\n followAppend,\n viewportHeight: viewportSize,\n previous,\n next: nextSnapshot,\n });\n\n if (adjustment && element) {\n // Retain the anchored viewport.\n writeScrollOffset(element, orientation, scrollOffset + adjustment.delta, adjustment.behavior);\n syncRangeFromScrollRef.current();\n }\n\n anchorSnapshotRef.current = nextSnapshot;\n }, [anchor, followAppend, items, dynamicLayout, orientation, rowHeight, viewportSize]);\n\n useEffect(() => {\n emitRangeChange(range);\n }, [range]);\n\n const scrollportStyle = {\n height,\n overflowX: horizontal ? \"auto\" : undefined,\n overflowY: horizontal ? \"hidden\" : \"auto\",\n \"--uiify-virtual-scroll-count\": items.length,\n \"--uiify-virtual-scroll-row-height\": `${rowHeight}px`,\n ...(dynamicLayout ? { \"--uiify-virtual-scroll-total-size\": `${totalSize}px` } : {}),\n } as CSSProperties;\n\n const spacerStyle = dynamicLayout\n ? undefined\n : ({\n \"--uiify-range-start\": range.start,\n } as CSSProperties);\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n data-uiify-virtual-scroll=\"\"\n data-dynamic-layout={dynamicLayout ? \"\" : undefined}\n data-orientation={orientation}\n role={role}\n className={className}\n style={scrollportStyle}\n >\n <div data-part=\"spacer\" style={spacerStyle}>\n {rowSlots.map((slot) => {\n const store = measurementStoreRef.current;\n const rowOffset = dynamicLayout ? store.getRowOffset(slot.index) : undefined;\n const measuredRowHeight = dynamicLayout ? store.getRowHeight(slot.index) : undefined;\n\n return (\n <VirtualScrollRowShell\n key={`slot-${slot.slotIndex}`}\n slotIndex={slot.slotIndex}\n index={slot.index}\n itemCount={items.length}\n listRole={role}\n dynamicLayout={dynamicLayout}\n {...(rowOffset !== undefined ? { rowOffset } : {})}\n {...(measuredRowHeight !== undefined ? { rowHeight: measuredRowHeight } : {})}\n >\n {slot.item ? (\n <VirtualScrollRowItem item={slot.item} index={slot.index} renderRow={renderRow} />\n ) : null}\n </VirtualScrollRowShell>\n );\n })}\n </div>\n </div>\n );\n}\nVirtualScroll.displayName = \"VirtualScroll\";\n"],"mappings":"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","names":["dynamicLayout","overscan","rowHeight","viewportSize","range","slotCount","orientation","totalSize","height"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/VirtualScroll.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FragmentInstance,\n type ReactElement,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useResizeObserver } from \"@gunkin/uiify/hooks\";\nimport { resolveVirtualScrollAnchorAdjustment } from \"./virtual-scroll-anchor.js\";\nimport { readScrollOffset, writeScrollOffset } from \"./virtual-scroll-axis.js\";\nimport {\n createVirtualScrollIosScroll,\n detectTouchScrollEnvironment,\n} from \"./virtual-scroll-ios.js\";\nimport {\n computeScrollAdjustmentForRowResize,\n createVirtualScrollMeasurementStore,\n} from \"./virtual-scroll-measurements.js\";\nimport {\n computeDynamicVirtualScrollRange,\n computeVirtualScrollRange,\n rangesEqual,\n toVirtualScrollRangeChange,\n} from \"./virtual-scroll-range.js\";\nimport {\n computeActiveVirtualScrollSlotCount,\n computeVirtualScrollSlotCount,\n VirtualScrollRowShell,\n} from \"./VirtualScrollRowShell.js\";\nimport {\n clampScrollOffset,\n computeScrollOffsetForIndex,\n normalizeScrollBehaviorOptions,\n normalizeScrollToIndexOptions,\n resolveScrollBehavior,\n} from \"./virtual-scroll-scroll.js\";\nimport {\n createVirtualScrollScrollState,\n supportsScrollEndEvent,\n} from \"./virtual-scroll-scroll-state.js\";\nimport { applyVirtualScrollRangeToDom } from \"./virtual-scroll-scroll-sync.js\";\nimport type {\n VirtualScrollHandle,\n VirtualScrollItem,\n VirtualScrollOwnProps,\n VirtualScrollRowSlot,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\nimport { VirtualScrollRowItem } from \"./VirtualScrollRowItem.js\";\nimport {\n VIRTUAL_SCROLL_OVERSCAN,\n VIRTUAL_SCROLL_ROW_HEIGHT,\n VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n} from \"./types.js\";\n\nfunction buildRowSlots<T extends VirtualScrollItem>(\n items: readonly T[],\n rangeStart: number,\n slotCount: number,\n): readonly VirtualScrollRowSlot<T>[] {\n const activeSlotCount = computeActiveVirtualScrollSlotCount(items.length, rangeStart, slotCount);\n return Array.from({ length: activeSlotCount }, (_, slotIndex) => {\n const index = rangeStart + slotIndex;\n return {\n index,\n item: items[index] ?? null,\n slotIndex,\n };\n });\n}\n\nexport function VirtualScroll<T extends VirtualScrollItem>(\n props: VirtualScrollOwnProps<T>,\n): ReactElement {\n const {\n items,\n height: suppliedHeight,\n style: consumerStyle,\n rowHeight = VIRTUAL_SCROLL_ROW_HEIGHT,\n orientation = \"vertical\",\n overscan = VIRTUAL_SCROLL_OVERSCAN,\n className,\n testId,\n renderRow,\n scrollRef,\n estimateRowHeight,\n onRangeChange,\n role = \"list\",\n anchor = \"start\",\n followAppend = false,\n onScrollStateChange,\n isScrollingResetDelay = VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n ...consumerProps\n } = props;\n\n const height = suppliedHeight ?? 600;\n const dynamicLayout = estimateRowHeight !== undefined;\n const horizontal = orientation === \"horizontal\";\n const ref = useRef<HTMLDivElement>(null);\n const scrollOffsetRef = useRef(0);\n const programmaticScrollRef = useRef(false);\n const itemsRef = useRef(items);\n itemsRef.current = items;\n const lastRangeChangeRef = useRef<string>(\"\");\n const measuredHeightsRef = useRef(new Map<string, number>());\n const anchorSnapshotRef = useRef({\n firstItemId: items[0]?.id,\n itemCount: items.length,\n totalSize: 0,\n scrollTop: 0,\n });\n\n const [rangeVersion, setRangeVersion] = useState(0);\n const [measurementVersion, setMeasurementVersion] = useState(0);\n\n const measuredSize = useResizeObserver(ref);\n const viewportSize = (horizontal ? measuredSize?.width : measuredSize?.height) ?? height;\n\n const measurementStoreRef = useRef(\n createVirtualScrollMeasurementStore({\n itemCount: items.length,\n defaultRowHeight: rowHeight,\n ...(estimateRowHeight ? { estimateRowHeight } : {}),\n measuredHeights: measuredHeightsRef.current,\n itemIdAtIndex: (index) => itemsRef.current[index]?.id,\n }),\n );\n\n measurementStoreRef.current.syncItemCount(items.length);\n\n const scrollOptionsRef = useRef({\n dynamicLayout,\n itemCount: items.length,\n orientation,\n overscan,\n rowHeight,\n viewportSize,\n });\n scrollOptionsRef.current = {\n dynamicLayout,\n itemCount: items.length,\n orientation,\n overscan,\n rowHeight,\n viewportSize,\n };\n\n const onRangeChangeRef = useRef(onRangeChange);\n onRangeChangeRef.current = onRangeChange;\n\n const onScrollStateChangeRef = useRef(onScrollStateChange);\n onScrollStateChangeRef.current = onScrollStateChange;\n\n const computeRange = (): ReturnType<typeof computeVirtualScrollRange> => {\n const { dynamicLayout, itemCount, overscan, rowHeight, viewportSize } =\n scrollOptionsRef.current;\n const scrollTop = scrollOffsetRef.current;\n\n if (dynamicLayout) {\n const store = measurementStoreRef.current;\n return computeDynamicVirtualScrollRange({\n scrollTop,\n viewportHeight: viewportSize,\n itemCount,\n overscan,\n findStartIndex: store.findStartIndex,\n findEndIndex: store.findEndIndex,\n getRowOffset: store.getRowOffset,\n });\n }\n\n return computeVirtualScrollRange({\n scrollTop,\n viewportHeight: viewportSize,\n itemCount,\n rowHeight,\n overscan,\n });\n };\n\n const emitRangeChange = (range: ReturnType<typeof computeVirtualScrollRange>): void => {\n const callback = onRangeChangeRef.current;\n if (!callback) return;\n const payload = toVirtualScrollRangeChange(range);\n const signature = `${payload.overscanStart}:${payload.overscanEnd}`;\n if (signature === lastRangeChangeRef.current) return;\n lastRangeChangeRef.current = signature;\n callback(payload);\n };\n\n const syncRangeFromScrollRef = useRef((_offset?: number) => {});\n\n syncRangeFromScrollRef.current = (offset?: number) => {\n const element = ref.current;\n if (!element) return;\n\n const scrollOffset = offset ?? readScrollOffset(element, scrollOptionsRef.current.orientation);\n const previousRange = computeRange();\n scrollOffsetRef.current = scrollOffset;\n\n const nextRange = computeRange();\n if (rangesEqual(previousRange, nextRange)) return;\n\n emitRangeChange(nextRange);\n\n const { dynamicLayout, itemCount, viewportSize, rowHeight, overscan } =\n scrollOptionsRef.current;\n const slotCount = computeActiveVirtualScrollSlotCount(\n itemCount,\n nextRange.start,\n Math.max(\n nextRange.end - nextRange.start,\n computeVirtualScrollSlotCount(viewportSize, rowHeight, overscan),\n ),\n );\n const store = measurementStoreRef.current;\n\n // Write range CSS vars on the scroll handler so rows move in the same frame as the scroll offset.\n applyVirtualScrollRangeToDom(element, nextRange, {\n dynamicLayout,\n slotCount,\n getRowOffset: store.getRowOffset.bind(store),\n });\n\n // Commit the visible slice synchronously so content matches scroll position on large jumps.\n flushSync(() => {\n setRangeVersion((version) => version + 1);\n });\n };\n\n const iosControllerRef = useRef(\n createVirtualScrollIosScroll({\n enabled: detectTouchScrollEnvironment(),\n resetDelay: isScrollingResetDelay,\n }),\n );\n\n const applyScrollDeltaRef = useRef((_delta: number) => {});\n\n applyScrollDeltaRef.current = (delta: number) => {\n const element = ref.current;\n if (!element || delta === 0) return;\n // Preserve the viewport while rows resize.\n const { orientation } = scrollOptionsRef.current;\n const next = scrollOffsetRef.current + delta;\n programmaticScrollRef.current = true;\n writeScrollOffset(element, orientation, next, \"auto\");\n syncRangeFromScrollRef.current(next);\n };\n\n const applyScrollOffset = (\n offset: number,\n behavior: VirtualScrollScrollBehaviorOptions[\"behavior\"],\n ): void => {\n const element = ref.current;\n if (!element) return;\n\n const store = measurementStoreRef.current;\n const totalSize = dynamicLayout ? store.getTotalSize() : items.length * rowHeight;\n const clamped = clampScrollOffset(offset, totalSize, viewportSize);\n const current = scrollOffsetRef.current;\n programmaticScrollRef.current = behavior === \"instant\";\n writeScrollOffset(element, orientation, clamped, resolveScrollBehavior(behavior));\n syncRangeFromScrollRef.current(behavior === \"instant\" ? clamped : current);\n };\n\n const applyScrollOffsetRef = useRef(\n (_offset: number, _behavior: VirtualScrollScrollBehaviorOptions[\"behavior\"]) => {},\n );\n\n applyScrollOffsetRef.current = applyScrollOffset;\n\n useImperativeHandle(\n scrollRef,\n (): VirtualScrollHandle => ({\n get element() {\n return ref.current;\n },\n scrollToIndex(index: number, options?: VirtualScrollScrollToIndexOptions): void {\n const normalized = normalizeScrollToIndexOptions(options);\n const store = measurementStoreRef.current;\n const metrics = {\n getRowOffset: store.getRowOffset.bind(store),\n getRowHeight: store.getRowHeight.bind(store),\n getTotalSize: store.getTotalSize.bind(store),\n };\n const offset = computeScrollOffsetForIndex(\n index,\n normalized.align,\n metrics,\n scrollOptionsRef.current.viewportSize,\n scrollOffsetRef.current,\n );\n applyScrollOffsetRef.current(offset, normalized.behavior);\n },\n scrollToOffset(offset: number, options?: VirtualScrollScrollBehaviorOptions): void {\n applyScrollOffsetRef.current(offset, normalizeScrollBehaviorOptions(options));\n },\n scrollToEnd(options?: VirtualScrollScrollBehaviorOptions): void {\n const store = measurementStoreRef.current;\n const totalSize = dynamicLayout\n ? store.getTotalSize()\n : scrollOptionsRef.current.itemCount * scrollOptionsRef.current.rowHeight;\n const offset = Math.max(0, totalSize - scrollOptionsRef.current.viewportSize);\n applyScrollOffsetRef.current(offset, normalizeScrollBehaviorOptions(options));\n },\n }),\n [dynamicLayout],\n );\n\n const range = useMemo(() => {\n void rangeVersion;\n void measurementVersion;\n return computeRange();\n }, [\n rangeVersion,\n measurementVersion,\n dynamicLayout,\n items.length,\n overscan,\n rowHeight,\n viewportSize,\n ]);\n\n const totalSize = useMemo(() => {\n void measurementVersion;\n if (dynamicLayout) return measurementStoreRef.current.getTotalSize();\n return items.length * rowHeight;\n }, [dynamicLayout, items.length, measurementVersion, rowHeight]);\n\n const slotCount = useMemo(() => {\n if (items.length === 0) return 0;\n return Math.max(\n range.end - range.start,\n computeVirtualScrollSlotCount(viewportSize, rowHeight, overscan),\n );\n }, [items.length, overscan, range.end, range.start, rowHeight, viewportSize]);\n\n const rowSlots = useMemo(\n () => buildRowSlots(items, range.start, slotCount),\n [items, range.start, slotCount],\n );\n\n const handleRowMeasureRef = useRef((index: number, itemId: string, height: number) => {\n const store = measurementStoreRef.current;\n const previousHeight = store.getRowHeight(index);\n const rowOffset = store.getRowOffset(index);\n if (!store.setMeasuredHeight(itemId, index, height)) return;\n\n const adjustment = computeScrollAdjustmentForRowResize({\n scrollTop: scrollOffsetRef.current,\n rowOffset,\n previousHeight,\n nextHeight: height,\n });\n\n if (adjustment > 0) {\n const ios = iosControllerRef.current;\n if (ios.isTouchScrolling()) {\n ios.queueAdjustment(adjustment);\n } else {\n applyScrollDeltaRef.current(adjustment);\n }\n }\n\n setMeasurementVersion((version) => version + 1);\n });\n\n const rowsFragmentRef = useRef<FragmentInstance>(null);\n\n // One ResizeObserver for the whole pooled row set. React keeps the\n // subscription in sync as slots mount and unmount — pinned by\n // core/fragment-instance.test.tsx. Fixed layout never measures rows, so no\n // observer is created there at all.\n useEffect(() => {\n if (!dynamicLayout) return;\n const fragment = rowsFragmentRef.current;\n if (!fragment || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const target = entry.target;\n if (!(target instanceof HTMLElement)) continue;\n const raw = target.dataset[\"uiifyRowIndex\"];\n if (raw === undefined) continue;\n const index = Number(raw);\n if (!Number.isInteger(index)) continue;\n const itemId = itemsRef.current[index]?.id;\n if (itemId === undefined) continue;\n const size = horizontal ? entry.contentRect.width : entry.contentRect.height;\n handleRowMeasureRef.current(index, itemId, size);\n }\n });\n\n fragment.observeUsing(observer);\n return () => fragment.unobserveUsing(observer);\n }, [dynamicLayout, horizontal]);\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const scrollState = createVirtualScrollScrollState({\n resetDelay: isScrollingResetDelay,\n supportsScrollEnd: supportsScrollEndEvent(),\n onChange: (isScrolling) => {\n onScrollStateChangeRef.current?.({ isScrolling });\n if (!isScrolling) {\n iosControllerRef.current.flushAdjustments(applyScrollDeltaRef.current);\n }\n },\n });\n\n let onScroll: (() => void) | null = null;\n let onScrollEnd: (() => void) | null = null;\n const ios = iosControllerRef.current;\n const onTouchStart = (): void => ios.onTouchStart();\n const onTouchEnd = (): void => ios.onTouchEnd();\n let verifyFrame = 0;\n let verifyTimer = 0;\n const syncNativeScroll = (): void => {\n if (!programmaticScrollRef.current) {\n syncRangeFromScrollRef.current();\n return;\n }\n // The imperative path already rendered its range. Verify the browser's\n // actual offset after layout, including coalesced external scroll writes.\n if (verifyFrame !== 0) return;\n verifyFrame = requestAnimationFrame(() => {\n verifyTimer = window.setTimeout(() => {\n verifyFrame = 0;\n verifyTimer = 0;\n programmaticScrollRef.current = false;\n syncRangeFromScrollRef.current();\n }, 0);\n });\n };\n\n onScroll = () => {\n syncNativeScroll();\n scrollState.notifyScroll();\n };\n element.addEventListener(\"scroll\", onScroll, { passive: true });\n if (supportsScrollEndEvent()) {\n onScrollEnd = () => {\n syncNativeScroll();\n scrollState.notifyScrollEnd();\n };\n element.addEventListener(\"scrollend\", onScrollEnd, { passive: true });\n }\n element.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n element.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n\n return () => {\n if (verifyFrame !== 0) cancelAnimationFrame(verifyFrame);\n if (verifyTimer !== 0) window.clearTimeout(verifyTimer);\n if (onScroll) element.removeEventListener(\"scroll\", onScroll);\n if (onScrollEnd) element.removeEventListener(\"scrollend\", onScrollEnd);\n element.removeEventListener(\"touchstart\", onTouchStart);\n element.removeEventListener(\"touchend\", onTouchEnd);\n scrollState.dispose();\n };\n }, [isScrollingResetDelay]);\n\n useEffect(() => {\n const element = ref.current;\n const store = measurementStoreRef.current;\n const nextTotalSize = dynamicLayout ? store.getTotalSize() : items.length * rowHeight;\n const previous = anchorSnapshotRef.current;\n const scrollOffset = element ? readScrollOffset(element, orientation) : scrollOffsetRef.current;\n const nextSnapshot = {\n firstItemId: items[0]?.id,\n itemCount: items.length,\n totalSize: nextTotalSize,\n scrollTop: scrollOffset,\n };\n\n const adjustment = resolveVirtualScrollAnchorAdjustment({\n anchor,\n followAppend,\n viewportHeight: viewportSize,\n previous,\n next: nextSnapshot,\n });\n\n if (adjustment && element) {\n // Retain the anchored viewport.\n programmaticScrollRef.current = true;\n writeScrollOffset(element, orientation, scrollOffset + adjustment.delta, adjustment.behavior);\n syncRangeFromScrollRef.current(\n adjustment.behavior === \"smooth\" ? scrollOffset : scrollOffset + adjustment.delta,\n );\n }\n\n anchorSnapshotRef.current = nextSnapshot;\n }, [anchor, followAppend, items, dynamicLayout, orientation, rowHeight, viewportSize]);\n\n useEffect(() => {\n emitRangeChange(range);\n }, [range]);\n\n const scrollportStyle = {\n ...(suppliedHeight !== undefined || (!consumerStyle?.blockSize && !consumerStyle?.height)\n ? { blockSize: height }\n : {}),\n ...consumerStyle,\n overflowX: horizontal ? \"auto\" : undefined,\n overflowY: horizontal ? \"hidden\" : \"auto\",\n \"--uiify-virtual-scroll-count\": items.length,\n \"--uiify-virtual-scroll-row-height\": `${rowHeight}px`,\n ...(dynamicLayout ? { \"--uiify-virtual-scroll-total-size\": `${totalSize}px` } : {}),\n } as CSSProperties;\n\n const spacerStyle = dynamicLayout\n ? undefined\n : ({\n \"--uiify-range-start\": range.start,\n } as CSSProperties);\n\n return (\n <div\n {...consumerProps}\n ref={ref}\n data-testid={testId ?? consumerProps[\"data-testid\" as keyof typeof consumerProps]}\n data-uiify-virtual-scroll=\"\"\n data-dynamic-layout={dynamicLayout ? \"\" : undefined}\n data-orientation={orientation}\n role={role}\n className={className}\n style={scrollportStyle}\n >\n <div data-part=\"spacer\" style={spacerStyle}>\n {rowSlots.map((slot) => {\n const store = measurementStoreRef.current;\n const rowOffset = dynamicLayout ? store.getRowOffset(slot.index) : undefined;\n const measuredRowHeight = dynamicLayout ? store.getRowHeight(slot.index) : undefined;\n\n return (\n <VirtualScrollRowShell\n key={`slot-${slot.slotIndex}`}\n slotIndex={slot.slotIndex}\n index={slot.index}\n itemCount={items.length}\n listRole={role}\n dynamicLayout={dynamicLayout}\n {...(rowOffset !== undefined ? { rowOffset } : {})}\n {...(measuredRowHeight !== undefined ? { rowHeight: measuredRowHeight } : {})}\n >\n {slot.item ? (\n <VirtualScrollRowItem item={slot.item} index={slot.index} renderRow={renderRow} />\n ) : null}\n </VirtualScrollRowShell>\n );\n })}\n </div>\n </div>\n );\n}\nVirtualScroll.displayName = \"VirtualScroll\";\n"],"mappings":"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","names":["dynamicLayout","overscan","rowHeight","viewportSize","range","slotCount","orientation","totalSize","height"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ReactNode, Ref } from "react";
|
|
1
|
+
import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
|
|
2
2
|
/** Fixed row height — default for scroll math when `estimateRowHeight` is omitted. */
|
|
3
3
|
export declare const VIRTUAL_SCROLL_ROW_HEIGHT = 64;
|
|
4
4
|
/** Overscan rows above and below the viewport to avoid flicker during fast scroll. */
|
|
@@ -41,7 +41,7 @@ export interface VirtualScrollHandle {
|
|
|
41
41
|
scrollToOffset(offset: number, options?: VirtualScrollScrollBehaviorOptions): void;
|
|
42
42
|
scrollToEnd(options?: VirtualScrollScrollBehaviorOptions): void;
|
|
43
43
|
}
|
|
44
|
-
export interface VirtualScrollOwnProps<T extends VirtualScrollItem> {
|
|
44
|
+
export interface VirtualScrollOwnProps<T extends VirtualScrollItem> extends Omit<ComponentPropsWithoutRef<"div">, "children" | "role"> {
|
|
45
45
|
readonly items: readonly T[];
|
|
46
46
|
/** Scrollport height; also the viewport extent used before the first resize measurement. */
|
|
47
47
|
readonly height?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/types.ts"],"sourcesContent":["import type { ReactNode, Ref } from \"react\";\n\n/** Fixed row height — default for scroll math when `estimateRowHeight` is omitted. */\nexport const VIRTUAL_SCROLL_ROW_HEIGHT = 64;\n\n/** Overscan rows above and below the viewport to avoid flicker during fast scroll. */\nexport const VIRTUAL_SCROLL_OVERSCAN = 5;\n\n/** Default delay before treating scroll as settled when `scrollend` is unavailable. */\nexport const VIRTUAL_SCROLL_SCROLL_RESET_DELAY = 150;\n\n/** Distance from list bottom treated as \"pinned to end\" for anchor/follow. */\nexport const VIRTUAL_SCROLL_ANCHOR_THRESHOLD = 1;\n\nexport interface VirtualScrollItem {\n readonly id: string;\n}\n\nexport type VirtualScrollListRole = \"list\" | \"grid\";\n\nexport type VirtualScrollAnchor = \"start\" | \"end\";\n\n/** Scroll axis. Row size props (`rowHeight`, `estimateRowHeight`) measure along this axis. */\nexport type VirtualScrollOrientation = \"vertical\" | \"horizontal\";\n\nexport type VirtualScrollScrollAlign = \"start\" | \"center\" | \"end\" | \"auto\";\n\nexport type VirtualScrollScrollBehavior = \"auto\" | \"instant\" | \"smooth\";\n\nexport interface VirtualScrollScrollBehaviorOptions {\n readonly behavior?: VirtualScrollScrollBehavior;\n}\n\nexport interface VirtualScrollScrollToIndexOptions extends VirtualScrollScrollBehaviorOptions {\n readonly align?: VirtualScrollScrollAlign;\n}\n\nexport interface VirtualScrollRangeChange {\n /** First visible row index (no overscan). */\n readonly startIndex: number;\n /** Last visible row index, inclusive (no overscan). */\n readonly endIndex: number;\n /** First rendered row index including overscan. */\n readonly overscanStart: number;\n /** Last rendered row index, inclusive, including overscan. */\n readonly overscanEnd: number;\n}\n\nexport interface VirtualScrollScrollState {\n readonly isScrolling: boolean;\n}\n\nexport interface VirtualScrollHandle {\n readonly element: HTMLDivElement | null;\n scrollToIndex(index: number, options?: VirtualScrollScrollToIndexOptions): void;\n scrollToOffset(offset: number, options?: VirtualScrollScrollBehaviorOptions): void;\n scrollToEnd(options?: VirtualScrollScrollBehaviorOptions): void;\n}\n\nexport interface VirtualScrollOwnProps<T extends VirtualScrollItem> {\n readonly items: readonly T[];\n /** Scrollport height; also the viewport extent used before the first resize measurement. */\n readonly height?: number;\n /** Fixed item size along the scroll axis — row height when vertical, item width when horizontal. */\n readonly rowHeight?: number;\n readonly orientation?: VirtualScrollOrientation;\n readonly overscan?: number;\n readonly className?: string;\n readonly testId?: string;\n readonly renderRow: (item: T, index: number) => ReactNode;\n readonly scrollRef?: Ref<VirtualScrollHandle>;\n readonly estimateRowHeight?: (index: number) => number;\n readonly onRangeChange?: (range: VirtualScrollRangeChange) => void;\n readonly role?: VirtualScrollListRole;\n readonly anchor?: VirtualScrollAnchor;\n readonly followAppend?: boolean | \"smooth\";\n readonly onScrollStateChange?: (state: VirtualScrollScrollState) => void;\n readonly isScrollingResetDelay?: number;\n}\n\nexport interface VirtualScrollRowSlot<T extends VirtualScrollItem> {\n readonly slotIndex: number;\n readonly index: number;\n readonly item: T | null;\n}\n"],"mappings":"AAGO,MAAM,4BAA4B;AAGlC,MAAM,0BAA0B;AAGhC,MAAM,oCAAoC;AAG1C,MAAM,kCAAkC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/types.ts"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode, Ref } from \"react\";\n\n/** Fixed row height — default for scroll math when `estimateRowHeight` is omitted. */\nexport const VIRTUAL_SCROLL_ROW_HEIGHT = 64;\n\n/** Overscan rows above and below the viewport to avoid flicker during fast scroll. */\nexport const VIRTUAL_SCROLL_OVERSCAN = 5;\n\n/** Default delay before treating scroll as settled when `scrollend` is unavailable. */\nexport const VIRTUAL_SCROLL_SCROLL_RESET_DELAY = 150;\n\n/** Distance from list bottom treated as \"pinned to end\" for anchor/follow. */\nexport const VIRTUAL_SCROLL_ANCHOR_THRESHOLD = 1;\n\nexport interface VirtualScrollItem {\n readonly id: string;\n}\n\nexport type VirtualScrollListRole = \"list\" | \"grid\";\n\nexport type VirtualScrollAnchor = \"start\" | \"end\";\n\n/** Scroll axis. Row size props (`rowHeight`, `estimateRowHeight`) measure along this axis. */\nexport type VirtualScrollOrientation = \"vertical\" | \"horizontal\";\n\nexport type VirtualScrollScrollAlign = \"start\" | \"center\" | \"end\" | \"auto\";\n\nexport type VirtualScrollScrollBehavior = \"auto\" | \"instant\" | \"smooth\";\n\nexport interface VirtualScrollScrollBehaviorOptions {\n readonly behavior?: VirtualScrollScrollBehavior;\n}\n\nexport interface VirtualScrollScrollToIndexOptions extends VirtualScrollScrollBehaviorOptions {\n readonly align?: VirtualScrollScrollAlign;\n}\n\nexport interface VirtualScrollRangeChange {\n /** First visible row index (no overscan). */\n readonly startIndex: number;\n /** Last visible row index, inclusive (no overscan). */\n readonly endIndex: number;\n /** First rendered row index including overscan. */\n readonly overscanStart: number;\n /** Last rendered row index, inclusive, including overscan. */\n readonly overscanEnd: number;\n}\n\nexport interface VirtualScrollScrollState {\n readonly isScrolling: boolean;\n}\n\nexport interface VirtualScrollHandle {\n readonly element: HTMLDivElement | null;\n scrollToIndex(index: number, options?: VirtualScrollScrollToIndexOptions): void;\n scrollToOffset(offset: number, options?: VirtualScrollScrollBehaviorOptions): void;\n scrollToEnd(options?: VirtualScrollScrollBehaviorOptions): void;\n}\n\nexport interface VirtualScrollOwnProps<T extends VirtualScrollItem> extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"children\" | \"role\"\n> {\n readonly items: readonly T[];\n /** Scrollport height; also the viewport extent used before the first resize measurement. */\n readonly height?: number;\n /** Fixed item size along the scroll axis — row height when vertical, item width when horizontal. */\n readonly rowHeight?: number;\n readonly orientation?: VirtualScrollOrientation;\n readonly overscan?: number;\n readonly className?: string;\n readonly testId?: string;\n readonly renderRow: (item: T, index: number) => ReactNode;\n readonly scrollRef?: Ref<VirtualScrollHandle>;\n readonly estimateRowHeight?: (index: number) => number;\n readonly onRangeChange?: (range: VirtualScrollRangeChange) => void;\n readonly role?: VirtualScrollListRole;\n readonly anchor?: VirtualScrollAnchor;\n readonly followAppend?: boolean | \"smooth\";\n readonly onScrollStateChange?: (state: VirtualScrollScrollState) => void;\n readonly isScrollingResetDelay?: number;\n}\n\nexport interface VirtualScrollRowSlot<T extends VirtualScrollItem> {\n readonly slotIndex: number;\n readonly index: number;\n readonly item: T | null;\n}\n"],"mappings":"AAGO,MAAM,4BAA4B;AAGlC,MAAM,0BAA0B;AAGhC,MAAM,oCAAoC;AAG1C,MAAM,kCAAkC;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual-scroll-scroll.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EAClC,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,2BAA2B,GAAG,SAAS,GAChD,cAAc,
|
|
1
|
+
{"version":3,"file":"virtual-scroll-scroll.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EAClC,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,2BAA2B,GAAG,SAAS,GAChD,cAAc,CAEhB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,0BAA0B,EACnC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,CA8BR;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,CAAC,EAAE,iCAAiC,GAC1C,QAAQ,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC,CAKzE;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,CAAC,EAAE,kCAAkC,GAC3C,2BAA2B,CAE7B;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,2BAA2B,EACrC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,OAAO,CAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll.ts"],"sourcesContent":["import type {\n VirtualScrollScrollAlign,\n VirtualScrollScrollBehavior,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\n\nexport interface VirtualScrollScrollMetrics {\n readonly getRowOffset: (index: number) => number;\n readonly getRowHeight: (index: number) => number;\n readonly getTotalSize: () => number;\n}\n\nexport function resolveScrollBehavior(\n behavior: VirtualScrollScrollBehavior | undefined,\n): ScrollBehavior {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll.ts"],"sourcesContent":["import type {\n VirtualScrollScrollAlign,\n VirtualScrollScrollBehavior,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\n\nexport interface VirtualScrollScrollMetrics {\n readonly getRowOffset: (index: number) => number;\n readonly getRowHeight: (index: number) => number;\n readonly getTotalSize: () => number;\n}\n\nexport function resolveScrollBehavior(\n behavior: VirtualScrollScrollBehavior | undefined,\n): ScrollBehavior {\n return behavior ?? \"auto\";\n}\n\nexport function clampScrollOffset(\n offset: number,\n totalSize: number,\n viewportHeight: number,\n): number {\n const maxOffset = Math.max(0, totalSize - viewportHeight);\n return Math.min(maxOffset, Math.max(0, offset));\n}\n\nexport function computeScrollOffsetForIndex(\n index: number,\n align: VirtualScrollScrollAlign,\n metrics: VirtualScrollScrollMetrics,\n viewportHeight: number,\n scrollTop: number,\n): number {\n const rowOffset = metrics.getRowOffset(index);\n const rowHeight = metrics.getRowHeight(index);\n const totalSize = metrics.getTotalSize();\n\n if (align === \"start\") {\n return clampScrollOffset(rowOffset, totalSize, viewportHeight);\n }\n\n if (align === \"center\") {\n return clampScrollOffset(\n rowOffset - (viewportHeight - rowHeight) / 2,\n totalSize,\n viewportHeight,\n );\n }\n\n if (align === \"end\") {\n return clampScrollOffset(rowOffset - viewportHeight + rowHeight, totalSize, viewportHeight);\n }\n\n const rowEnd = rowOffset + rowHeight;\n const viewportEnd = scrollTop + viewportHeight;\n if (rowOffset >= scrollTop && rowEnd <= viewportEnd) {\n return scrollTop;\n }\n if (rowOffset < scrollTop) {\n return clampScrollOffset(rowOffset, totalSize, viewportHeight);\n }\n return clampScrollOffset(rowEnd - viewportHeight, totalSize, viewportHeight);\n}\n\nexport function normalizeScrollToIndexOptions(\n options?: VirtualScrollScrollToIndexOptions,\n): Required<Pick<VirtualScrollScrollToIndexOptions, \"align\" | \"behavior\">> {\n return {\n align: options?.align ?? \"auto\",\n behavior: options?.behavior ?? \"auto\",\n };\n}\n\nexport function normalizeScrollBehaviorOptions(\n options?: VirtualScrollScrollBehaviorOptions,\n): VirtualScrollScrollBehavior {\n return options?.behavior ?? \"auto\";\n}\n\nexport function isSmoothScrollActive(\n behavior: VirtualScrollScrollBehavior,\n currentScrollTop: number,\n targetScrollTop: number,\n): boolean {\n return behavior === \"smooth\" && Math.abs(currentScrollTop - targetScrollTop) > 1;\n}\n"],"mappings":"AAaO,SAAS,sBACd,UACgB;AAChB,SAAO,YAAY;AACrB;AAEO,SAAS,kBACd,QACA,WACA,gBACQ;AACR,QAAM,YAAY,KAAK,IAAI,GAAG,YAAY,cAAc;AACxD,SAAO,KAAK,IAAI,WAAW,KAAK,IAAI,GAAG,MAAM,CAAC;AAChD;AAEO,SAAS,4BACd,OACA,OACA,SACA,gBACA,WACQ;AACR,QAAM,YAAY,QAAQ,aAAa,KAAK;AAC5C,QAAM,YAAY,QAAQ,aAAa,KAAK;AAC5C,QAAM,YAAY,QAAQ,aAAa;AAEvC,MAAI,UAAU,SAAS;AACrB,WAAO,kBAAkB,WAAW,WAAW,cAAc;AAAA,EAC/D;AAEA,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,MACL,aAAa,iBAAiB,aAAa;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACnB,WAAO,kBAAkB,YAAY,iBAAiB,WAAW,WAAW,cAAc;AAAA,EAC5F;AAEA,QAAM,SAAS,YAAY;AAC3B,QAAM,cAAc,YAAY;AAChC,MAAI,aAAa,aAAa,UAAU,aAAa;AACnD,WAAO;AAAA,EACT;AACA,MAAI,YAAY,WAAW;AACzB,WAAO,kBAAkB,WAAW,WAAW,cAAc;AAAA,EAC/D;AACA,SAAO,kBAAkB,SAAS,gBAAgB,WAAW,cAAc;AAC7E;AAEO,SAAS,8BACd,SACyE;AACzE,SAAO;AAAA,IACL,OAAO,SAAS,SAAS;AAAA,IACzB,UAAU,SAAS,YAAY;AAAA,EACjC;AACF;AAEO,SAAS,+BACd,SAC6B;AAC7B,SAAO,SAAS,YAAY;AAC9B;AAEO,SAAS,qBACd,UACA,kBACA,iBACS;AACT,SAAO,aAAa,YAAY,KAAK,IAAI,mBAAmB,eAAe,IAAI;AACjF;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ElementType, ReactElement } from "react";
|
|
1
|
+
import type { ElementType, ReactElement, Ref } from "react";
|
|
2
2
|
import { type Direction } from "./direction.js";
|
|
3
3
|
import type { RenderableProps } from "./polymorphic.js";
|
|
4
4
|
import { createRovingFocusStore, type RovingFocusOrientation, type RovingFocusStore } from "./roving-focus-store.js";
|
|
@@ -15,6 +15,7 @@ export declare namespace RovingFocusRoot {
|
|
|
15
15
|
var displayName: string;
|
|
16
16
|
}
|
|
17
17
|
export interface RovingFocusItemOwnProps {
|
|
18
|
+
readonly ref?: Ref<HTMLElement>;
|
|
18
19
|
readonly disabled?: boolean;
|
|
19
20
|
readonly id?: string;
|
|
20
21
|
readonly textValue?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roving-focus.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EAGX,YAAY,
|
|
1
|
+
{"version":3,"file":"roving-focus.d.ts","sourceRoot":"","sources":["../../src/core/roving-focus.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EAGX,YAAY,EACZ,GAAG,EACJ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,WAAW,EAAE,sBAAsB,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CA0BrB;yBA5Be,eAAe;;;AA+B/B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,IAAI,eAAe,CACjF,GAAG,EACH,uBAAuB,EACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EACvC,WAAW,CACZ,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CA+ErB;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/roving-focus.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useSyncExternalStore } from \"react\";\nimport { useId, useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport type {\n ElementType,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n ReactElement,\n Ref,\n} from \"react\";\nimport { composeEventHandlers } from \"./compose-event-handlers.js\";\nimport { useDirection, type Direction } from \"./direction.js\";\nimport type { RenderableProps } from \"./polymorphic.js\";\nimport {\n createRovingFocusStore,\n type RovingFocusOrientation,\n type RovingFocusStore,\n} from \"./roving-focus-store.js\";\nimport { useRenderElement } from \"./use-render-element.js\";\n\nconst RovingFocusContext = createContext<RovingFocusStore | null>(null);\n\nexport interface RovingFocusRootOwnProps {\n readonly direction?: Direction;\n readonly loop?: boolean;\n readonly orientation?: RovingFocusOrientation;\n}\n\nexport type RovingFocusRootProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusRootOwnProps,\n { orientation: RovingFocusOrientation },\n HTMLElement\n>;\n\nexport function RovingFocusRoot<TAs extends ElementType = \"div\">(\n props: RovingFocusRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n direction: localDirection,\n loop = true,\n orientation = \"both\",\n render,\n ...consumerProps\n } = props as RovingFocusRootProps<ElementType>;\n const direction = useDirection(localDirection);\n const storeRef = useRef<RovingFocusStore | null>(null);\n storeRef.current ??= createRovingFocusStore({ direction, loop, orientation });\n storeRef.current.updateConfig({ direction, loop, orientation });\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-orientation\": orientation,\n dir: direction,\n },\n render,\n state: { orientation },\n });\n return <RovingFocusContext value={storeRef.current}>{element}</RovingFocusContext>;\n}\nRovingFocusRoot.displayName = \"RovingFocusRoot\";\n\nexport interface RovingFocusItemOwnProps {\n readonly disabled?: boolean;\n readonly id?: string;\n readonly textValue?: string;\n}\n\nexport type RovingFocusItemProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusItemOwnProps,\n { current: boolean; disabled: boolean },\n HTMLElement\n>;\n\nexport function RovingFocusItem<TAs extends ElementType = \"div\">(\n props: RovingFocusItemProps<TAs>,\n): ReactElement | null {\n const {\n as,\n disabled = false,\n id: providedId,\n ref: consumerRef,\n render,\n textValue = \"\",\n ...consumerProps\n } = props as RovingFocusItemProps<ElementType> & { ref?: Ref<HTMLElement> };\n const { onFocus: consumerOnFocus, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onKeyDown?: (event: ReactKeyboardEvent<HTMLElement>) => void;\n };\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const store = useContext(RovingFocusContext);\n if (!store) throw new Error(\"RovingFocusItem must be used inside RovingFocusRoot\");\n const elementRef = useRef<HTMLElement | null>(null);\n const current = useSyncExternalStore(\n (listener) => store.subscribeItem(id, listener),\n () => store.getCurrentId() === id,\n () => false,\n );\n const setElement = useCallback(\n (element: HTMLElement | null) => store.setElement(id, element),\n [id, store],\n );\n const mergedRef = useMergedRefs(elementRef, consumerRef, setElement);\n\n useIsomorphicLayoutEffect(\n () =>\n store.register({\n disabled,\n element: elementRef.current,\n id,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n }),\n [id, store],\n );\n useIsomorphicLayoutEffect(() => {\n store.updateItem(id, {\n disabled,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n });\n }, [disabled, id, store, textValue]);\n\n const nativeButton = as === \"button\";\n\n const handleFocus = () => {\n if (!disabled) store.setCurrentId(id);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key === \"Home\" || event.key === \"End\" || event.key.startsWith(\"Arrow\")) {\n if (store.move(id, event.key)) event.preventDefault();\n } else if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n store.search(event.key);\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n id,\n \"aria-disabled\": disabled || undefined,\n \"data-current\": current ? \"\" : undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(nativeButton ? { disabled: disabled || undefined } : {}),\n onFocus: composeEventHandlers(consumerOnFocus, handleFocus),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ref: mergedRef,\n tabIndex: current && !disabled ? 0 : -1,\n },\n render,\n state: { current, disabled },\n });\n}\n\nexport { createRovingFocusStore };\nexport type { RovingFocusOrientation, RovingFocusStore };\n"],"mappings":";AA+DS;AA7DT,SAAS,eAAe,aAAa,YAAY,QAAQ,4BAA4B;AACrF,SAAS,OAAO,2BAA2B,qBAAqB;AAQhE,SAAS,4BAA4B;AACrC,SAAS,oBAAoC;AAE7C;AAAA,EACE;AAAA,OAGK;AACP,SAAS,wBAAwB;AAEjC,MAAM,qBAAqB,cAAuC,IAAI;AAe/D,SAAS,gBACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,IACd;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,YAAY,aAAa,cAAc;AAC7C,QAAM,WAAW,OAAgC,IAAI;AACrD,WAAS,YAAY,uBAAuB,EAAE,WAAW,MAAM,YAAY,CAAC;AAC5E,WAAS,QAAQ,aAAa,EAAE,WAAW,MAAM,YAAY,CAAC;AAE9D,QAAM,UAAU,iBAAiB;AAAA,IAC/B;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,oBAAoB;AAAA,MACpB,KAAK;AAAA,IACP;AAAA,IACA;AAAA,IACA,OAAO,EAAE,YAAY;AAAA,EACvB,CAAC;AACD,SAAO,oBAAC,sBAAmB,OAAO,SAAS,SAAU,mBAAQ;AAC/D;AACA,gBAAgB,cAAc;
|
|
1
|
+
{"version":3,"sources":["../../src/core/roving-focus.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useSyncExternalStore } from \"react\";\nimport { useId, useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport type {\n ElementType,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n ReactElement,\n Ref,\n} from \"react\";\nimport { composeEventHandlers } from \"./compose-event-handlers.js\";\nimport { useDirection, type Direction } from \"./direction.js\";\nimport type { RenderableProps } from \"./polymorphic.js\";\nimport {\n createRovingFocusStore,\n type RovingFocusOrientation,\n type RovingFocusStore,\n} from \"./roving-focus-store.js\";\nimport { useRenderElement } from \"./use-render-element.js\";\n\nconst RovingFocusContext = createContext<RovingFocusStore | null>(null);\n\nexport interface RovingFocusRootOwnProps {\n readonly direction?: Direction;\n readonly loop?: boolean;\n readonly orientation?: RovingFocusOrientation;\n}\n\nexport type RovingFocusRootProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusRootOwnProps,\n { orientation: RovingFocusOrientation },\n HTMLElement\n>;\n\nexport function RovingFocusRoot<TAs extends ElementType = \"div\">(\n props: RovingFocusRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n direction: localDirection,\n loop = true,\n orientation = \"both\",\n render,\n ...consumerProps\n } = props as RovingFocusRootProps<ElementType>;\n const direction = useDirection(localDirection);\n const storeRef = useRef<RovingFocusStore | null>(null);\n storeRef.current ??= createRovingFocusStore({ direction, loop, orientation });\n storeRef.current.updateConfig({ direction, loop, orientation });\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-orientation\": orientation,\n dir: direction,\n },\n render,\n state: { orientation },\n });\n return <RovingFocusContext value={storeRef.current}>{element}</RovingFocusContext>;\n}\nRovingFocusRoot.displayName = \"RovingFocusRoot\";\n\nexport interface RovingFocusItemOwnProps {\n readonly ref?: Ref<HTMLElement>;\n readonly disabled?: boolean;\n readonly id?: string;\n readonly textValue?: string;\n}\n\nexport type RovingFocusItemProps<TAs extends ElementType = \"div\"> = RenderableProps<\n TAs,\n RovingFocusItemOwnProps,\n { current: boolean; disabled: boolean },\n HTMLElement\n>;\n\nexport function RovingFocusItem<TAs extends ElementType = \"div\">(\n props: RovingFocusItemProps<TAs>,\n): ReactElement | null {\n const {\n as,\n disabled = false,\n id: providedId,\n ref: consumerRef,\n render,\n textValue = \"\",\n ...consumerProps\n } = props as RovingFocusItemProps<ElementType> & { ref?: Ref<HTMLElement> };\n const { onFocus: consumerOnFocus, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onKeyDown?: (event: ReactKeyboardEvent<HTMLElement>) => void;\n };\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const store = useContext(RovingFocusContext);\n if (!store) throw new Error(\"RovingFocusItem must be used inside RovingFocusRoot\");\n const elementRef = useRef<HTMLElement | null>(null);\n const current = useSyncExternalStore(\n (listener) => store.subscribeItem(id, listener),\n () => store.getCurrentId() === id,\n () => false,\n );\n const setElement = useCallback(\n (element: HTMLElement | null) => store.setElement(id, element),\n [id, store],\n );\n const mergedRef = useMergedRefs(elementRef, consumerRef, setElement);\n\n useIsomorphicLayoutEffect(\n () =>\n store.register({\n disabled,\n element: elementRef.current,\n id,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n }),\n [id, store],\n );\n useIsomorphicLayoutEffect(() => {\n store.updateItem(id, {\n disabled,\n textValue: textValue || elementRef.current?.textContent?.trim() || \"\",\n });\n }, [disabled, id, store, textValue]);\n\n const nativeButton = as === \"button\";\n\n const handleFocus = () => {\n if (!disabled) store.setCurrentId(id);\n };\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n if (event.key === \"Home\" || event.key === \"End\" || event.key.startsWith(\"Arrow\")) {\n if (store.move(id, event.key)) event.preventDefault();\n } else if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n store.search(event.key);\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n id,\n \"aria-disabled\": disabled || undefined,\n \"data-current\": current ? \"\" : undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(nativeButton ? { disabled: disabled || undefined } : {}),\n onFocus: composeEventHandlers(consumerOnFocus, handleFocus),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ref: mergedRef,\n tabIndex: current && !disabled ? 0 : -1,\n },\n render,\n state: { current, disabled },\n });\n}\n\nexport { createRovingFocusStore };\nexport type { RovingFocusOrientation, RovingFocusStore };\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-popover.d.ts","sourceRoot":"","sources":["../../src/core/use-popover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EAEd,WAAW,EACZ,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,oBAAoB,GAAG,gCAAgC,CAAC,cAAc,CAAC,CAAC;AAEpF,MAAM,WAAW,iBAAkB,SAAQ,gCAAgC;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/D,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;CACrD;AAMD,wBAAgB,UAAU,CAAC,EACzB,WAAmB,EACnB,IAAa,EACb,YAAY,EACZ,IAAI,EAAE,cAAc,GACrB,GAAE,iBAAsB,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-popover.d.ts","sourceRoot":"","sources":["../../src/core/use-popover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EAEd,WAAW,EACZ,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,oBAAoB,GAAG,gCAAgC,CAAC,cAAc,CAAC,CAAC;AAEpF,MAAM,WAAW,iBAAkB,SAAQ,gCAAgC;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/D,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;CACrD;AAMD,wBAAgB,UAAU,CAAC,EACzB,WAAmB,EACnB,IAAa,EACb,YAAY,EACZ,IAAI,EAAE,cAAc,GACrB,GAAE,iBAAsB,GAAG,gBAAgB,CA4E3C"}
|
package/dist/core/use-popover.js
CHANGED
|
@@ -49,7 +49,12 @@ function usePopover({
|
|
|
49
49
|
"aria-controls": id,
|
|
50
50
|
"aria-expanded": open,
|
|
51
51
|
onClick(event) {
|
|
52
|
-
|
|
52
|
+
const accepted = requestChange(
|
|
53
|
+
!open,
|
|
54
|
+
isNative ? "native-toggle" : "trigger-press",
|
|
55
|
+
event.nativeEvent
|
|
56
|
+
);
|
|
57
|
+
if (isNative || !accepted) event.preventDefault();
|
|
53
58
|
},
|
|
54
59
|
type: "button",
|
|
55
60
|
...isNative ? { command: "toggle-popover", commandfor: id } : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/use-popover.ts"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState, useSyncExternalStore } from \"react\";\nimport type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n MouseEvent as ReactMouseEvent,\n RefCallback,\n} from \"react\";\nimport { useId, useIsomorphicLayoutEffect } from \"@gunkin/uiify/hooks\";\nimport { supportsPopover } from \"./platform.js\";\nimport {\n useControllableOpenChange,\n type UseControllableOpenChangeOptions,\n} from \"./use-controllable-open-change.js\";\n\nexport type PopoverMode = \"auto\" | \"manual\" | \"hint\";\nexport type PopoverChangeHandler = UseControllableOpenChangeOptions[\"onOpenChange\"];\n\nexport interface UsePopoverOptions extends UseControllableOpenChangeOptions {\n readonly mode?: PopoverMode;\n}\n\nexport interface UsePopoverReturn {\n readonly close: () => void;\n readonly isNative: boolean;\n readonly open: boolean;\n readonly openPopover: () => void;\n readonly popupProps: HTMLAttributes<HTMLElement>;\n readonly popupRef: RefCallback<HTMLElement>;\n readonly toggle: () => void;\n readonly triggerProps: ButtonHTMLAttributes<HTMLButtonElement>;\n readonly triggerRef: RefCallback<HTMLButtonElement>;\n}\n\ninterface ToggleEventLike extends Event {\n readonly newState?: \"closed\" | \"open\";\n}\n\nexport function usePopover({\n defaultOpen = false,\n mode = \"auto\",\n onOpenChange,\n open: controlledOpen,\n}: UsePopoverOptions = {}): UsePopoverReturn {\n const id = useId();\n const [popup, setPopup] = useState<HTMLElement | null>(null);\n const { open, requestChange } = useControllableOpenChange({\n defaultOpen,\n onOpenChange,\n open: controlledOpen,\n });\n const openRef = useRef(open);\n openRef.current = open;\n // SSR markup matches the initial open state so pre-hydration toggling works.\n const isNative = useSyncExternalStore(\n () => () => {},\n () => supportsPopover(),\n () => true,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!popup || !isNative) return;\n\n const onBeforeToggle = (event: Event) => {\n const next = (event as ToggleEventLike).newState === \"open\";\n if (next !== openRef.current && !requestChange(next, \"native-toggle\", event)) {\n event.preventDefault();\n }\n };\n popup.addEventListener(\"beforetoggle\", onBeforeToggle);\n return () => popup.removeEventListener(\"beforetoggle\", onBeforeToggle);\n }, [isNative, popup, requestChange]);\n\n useIsomorphicLayoutEffect(() => {\n if (!popup || !isNative) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [isNative, open, popup]);\n\n const triggerProps = {\n \"aria-controls\": id,\n \"aria-expanded\": open,\n onClick(event: ReactMouseEvent<HTMLButtonElement>) {\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/use-popover.ts"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState, useSyncExternalStore } from \"react\";\nimport type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n MouseEvent as ReactMouseEvent,\n RefCallback,\n} from \"react\";\nimport { useId, useIsomorphicLayoutEffect } from \"@gunkin/uiify/hooks\";\nimport { supportsPopover } from \"./platform.js\";\nimport {\n useControllableOpenChange,\n type UseControllableOpenChangeOptions,\n} from \"./use-controllable-open-change.js\";\n\nexport type PopoverMode = \"auto\" | \"manual\" | \"hint\";\nexport type PopoverChangeHandler = UseControllableOpenChangeOptions[\"onOpenChange\"];\n\nexport interface UsePopoverOptions extends UseControllableOpenChangeOptions {\n readonly mode?: PopoverMode;\n}\n\nexport interface UsePopoverReturn {\n readonly close: () => void;\n readonly isNative: boolean;\n readonly open: boolean;\n readonly openPopover: () => void;\n readonly popupProps: HTMLAttributes<HTMLElement>;\n readonly popupRef: RefCallback<HTMLElement>;\n readonly toggle: () => void;\n readonly triggerProps: ButtonHTMLAttributes<HTMLButtonElement>;\n readonly triggerRef: RefCallback<HTMLButtonElement>;\n}\n\ninterface ToggleEventLike extends Event {\n readonly newState?: \"closed\" | \"open\";\n}\n\nexport function usePopover({\n defaultOpen = false,\n mode = \"auto\",\n onOpenChange,\n open: controlledOpen,\n}: UsePopoverOptions = {}): UsePopoverReturn {\n const id = useId();\n const [popup, setPopup] = useState<HTMLElement | null>(null);\n const { open, requestChange } = useControllableOpenChange({\n defaultOpen,\n onOpenChange,\n open: controlledOpen,\n });\n const openRef = useRef(open);\n openRef.current = open;\n // SSR markup matches the initial open state so pre-hydration toggling works.\n const isNative = useSyncExternalStore(\n () => () => {},\n () => supportsPopover(),\n () => true,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!popup || !isNative) return;\n\n const onBeforeToggle = (event: Event) => {\n const next = (event as ToggleEventLike).newState === \"open\";\n if (next !== openRef.current && !requestChange(next, \"native-toggle\", event)) {\n event.preventDefault();\n }\n };\n popup.addEventListener(\"beforetoggle\", onBeforeToggle);\n return () => popup.removeEventListener(\"beforetoggle\", onBeforeToggle);\n }, [isNative, popup, requestChange]);\n\n useIsomorphicLayoutEffect(() => {\n if (!popup || !isNative) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [isNative, open, popup]);\n\n const triggerProps = {\n \"aria-controls\": id,\n \"aria-expanded\": open,\n onClick(event: ReactMouseEvent<HTMLButtonElement>) {\n const accepted = requestChange(\n !open,\n isNative ? \"native-toggle\" : \"trigger-press\",\n event.nativeEvent,\n );\n // Commit the React state first, then open from the layout effect. Letting\n // the invoker open it first exposes the surface before its state/styles settle.\n if (isNative || !accepted) event.preventDefault();\n },\n type: \"button\",\n ...(isNative ? { command: \"toggle-popover\", commandfor: id } : {}),\n } as ButtonHTMLAttributes<HTMLButtonElement>;\n\n const popupProps = {\n \"data-native\": isNative ? \"\" : undefined,\n hidden: isNative ? undefined : !open,\n id,\n ...(isNative ? { popover: mode } : {}),\n ...(isNative && open ? { open: true } : {}),\n } as HTMLAttributes<HTMLElement>;\n\n return {\n close: () => requestChange(false, \"programmatic\"),\n isNative,\n open,\n openPopover: () => requestChange(true, \"programmatic\"),\n popupProps,\n popupRef: setPopup,\n toggle: () => requestChange(!open, \"programmatic\"),\n triggerProps,\n triggerRef() {},\n };\n}\n"],"mappings":";AAEA,SAAS,QAAQ,UAAU,4BAA4B;AAOvD,SAAS,OAAO,iCAAiC;AACjD,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,OAEK;AAyBA,SAAS,WAAW;AAAA,EACzB,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA,MAAM;AACR,IAAuB,CAAC,GAAqB;AAC3C,QAAM,KAAK,MAAM;AACjB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA6B,IAAI;AAC3D,QAAM,EAAE,MAAM,cAAc,IAAI,0BAA0B;AAAA,IACxD;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACD,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,WAAW;AAAA,IACf,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM,gBAAgB;AAAA,IACtB,MAAM;AAAA,EACR;AAEA,4BAA0B,MAAM;AAC9B,QAAI,CAAC,SAAS,CAAC,SAAU;AAEzB,UAAM,iBAAiB,CAAC,UAAiB;AACvC,YAAM,OAAQ,MAA0B,aAAa;AACrD,UAAI,SAAS,QAAQ,WAAW,CAAC,cAAc,MAAM,iBAAiB,KAAK,GAAG;AAC5E,cAAM,eAAe;AAAA,MACvB;AAAA,IACF;AACA,UAAM,iBAAiB,gBAAgB,cAAc;AACrD,WAAO,MAAM,MAAM,oBAAoB,gBAAgB,cAAc;AAAA,EACvE,GAAG,CAAC,UAAU,OAAO,aAAa,CAAC;AAEnC,4BAA0B,MAAM;AAC9B,QAAI,CAAC,SAAS,CAAC,SAAU;AACzB,QAAI;AACF,UAAI,QAAQ,CAAC,MAAM,QAAQ,eAAe,EAAG,OAAM,YAAY;AAC/D,UAAI,CAAC,QAAQ,MAAM,QAAQ,eAAe,EAAG,OAAM,YAAY;AAAA,IACjE,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,KAAK,CAAC;AAE1B,QAAM,eAAe;AAAA,IACnB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,QAAQ,OAA2C;AACjD,YAAM,WAAW;AAAA,QACf,CAAC;AAAA,QACD,WAAW,kBAAkB;AAAA,QAC7B,MAAM;AAAA,MACR;AAGA,UAAI,YAAY,CAAC,SAAU,OAAM,eAAe;AAAA,IAClD;AAAA,IACA,MAAM;AAAA,IACN,GAAI,WAAW,EAAE,SAAS,kBAAkB,YAAY,GAAG,IAAI,CAAC;AAAA,EAClE;AAEA,QAAM,aAAa;AAAA,IACjB,eAAe,WAAW,KAAK;AAAA,IAC/B,QAAQ,WAAW,SAAY,CAAC;AAAA,IAChC;AAAA,IACA,GAAI,WAAW,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACpC,GAAI,YAAY,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,cAAc,OAAO,cAAc;AAAA,IAChD;AAAA,IACA;AAAA,IACA,aAAa,MAAM,cAAc,MAAM,cAAc;AAAA,IACrD;AAAA,IACA,UAAU;AAAA,IACV,QAAQ,MAAM,cAAc,CAAC,MAAM,cAAc;AAAA,IACjD;AAAA,IACA,aAAa;AAAA,IAAC;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -38,7 +38,7 @@ export interface ChoiceItemOwnProps {
|
|
|
38
38
|
/** Controlled checked state for client-enhanced choice groups. */
|
|
39
39
|
readonly checked?: boolean;
|
|
40
40
|
readonly disabled?: boolean;
|
|
41
|
-
/** Wrapper `data-part`. Defaults to `"item"
|
|
41
|
+
/** Wrapper `data-part`. Defaults to `"item"`. */
|
|
42
42
|
readonly part?: string;
|
|
43
43
|
/** Adds `data-part="label"` to the `<label>`. */
|
|
44
44
|
readonly labelPart?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/elements/choice/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,iFAAiF;AACjF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/elements/choice/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,iFAAiF;AACjF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,qGAAqG;IACrG,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,gEAAgE;IAChE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAC9C,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,kBAAkB,GAAG,UAAU,CAAC,CAAC"}
|