@gunkin/uiify 0.0.1-alpha → 0.0.3-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/accordion/Accordion.d.ts +2 -2
- package/dist/components/accordion/Accordion.d.ts.map +1 -1
- package/dist/components/accordion/Accordion.js +1 -2
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/alert-modal/AlertModal.d.ts +1 -1
- package/dist/components/alert-modal/AlertModal.d.ts.map +1 -1
- package/dist/components/alert-modal/AlertModal.js +5 -8
- package/dist/components/alert-modal/AlertModal.js.map +1 -1
- package/dist/components/alert-modal/AlertModalParts.d.ts +4 -29
- package/dist/components/alert-modal/AlertModalParts.d.ts.map +1 -1
- package/dist/components/alert-modal/AlertModalParts.js +29 -36
- package/dist/components/alert-modal/AlertModalParts.js.map +1 -1
- package/dist/components/alert-modal/types.d.ts +0 -3
- package/dist/components/alert-modal/types.d.ts.map +1 -1
- package/dist/components/behavior.css +107 -49
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/button/Button.d.ts.map +1 -1
- package/dist/components/button/Button.js +1 -0
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.js +39 -55
- package/dist/components/candle-chart/CandleChart.js.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +26 -45
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/carousel/carousel-markup.d.ts +0 -1
- package/dist/components/carousel/carousel-markup.d.ts.map +1 -1
- package/dist/components/carousel/carousel-markup.js +0 -5
- package/dist/components/carousel/carousel-markup.js.map +1 -1
- package/dist/components/carousel/client/carousel-controller.js +2 -2
- package/dist/components/carousel/client/carousel-controller.js.map +1 -1
- package/dist/components/carousel/client/carousel-controls.d.ts.map +1 -1
- package/dist/components/carousel/client/carousel-controls.js +3 -5
- package/dist/components/carousel/client/carousel-controls.js.map +1 -1
- package/dist/components/carousel/client/carousel-drag.js +1 -1
- package/dist/components/carousel/client/carousel-drag.js.map +1 -1
- package/dist/components/carousel/client/carousel-observer.js +2 -2
- package/dist/components/carousel/client/carousel-observer.js.map +1 -1
- package/dist/components/carousel/fade/fade-controller.js +2 -2
- package/dist/components/carousel/fade/fade-controller.js.map +1 -1
- package/dist/components/carousel/fade/fade-swipe.js +1 -1
- package/dist/components/carousel/fade/fade-swipe.js.map +1 -1
- package/dist/components/carousel/index.d.ts +1 -1
- package/dist/components/carousel/index.d.ts.map +1 -1
- package/dist/components/carousel/index.js.map +1 -1
- package/dist/components/carousel/types.d.ts +0 -13
- package/dist/components/carousel/types.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.js +3 -2
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +7 -1
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/types.d.ts +1 -0
- package/dist/components/combobox/types.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.js +21 -4
- package/dist/components/context-menu/ContextMenu.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.js +15 -0
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/drawer/DrawerNative.d.ts +1 -1
- package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
- package/dist/components/drawer/DrawerNative.js +28 -13
- package/dist/components/drawer/DrawerNative.js.map +1 -1
- package/dist/components/drawer/types.d.ts +0 -2
- 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 +2 -1
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.js +12 -2
- package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
- package/dist/components/dropdown-menu/types.d.ts +1 -0
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/enhance/listeners.js +1 -1
- package/dist/components/enhance/listeners.js.map +1 -1
- package/dist/components/enhance/sync.d.ts.map +1 -1
- package/dist/components/enhance/sync.js +7 -4
- package/dist/components/enhance/sync.js.map +1 -1
- package/dist/components/field/Field.d.ts.map +1 -1
- package/dist/components/field/Field.js +6 -0
- package/dist/components/field/Field.js.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.js +8 -2
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/file-upload/types.d.ts +1 -0
- package/dist/components/file-upload/types.d.ts.map +1 -1
- package/dist/components/hover-card/HoverCard.d.ts.map +1 -1
- package/dist/components/hover-card/HoverCard.js +2 -0
- package/dist/components/hover-card/HoverCard.js.map +1 -1
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.js +1 -0
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.d.ts +1 -2
- package/dist/components/internal/choice-family/ChoiceGroup.d.ts.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.js +5 -6
- package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
- package/dist/components/internal/choice-family/types.d.ts +0 -4
- package/dist/components/internal/choice-family/types.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.js +30 -38
- package/dist/components/line-chart/LineChart.js.map +1 -1
- package/dist/components/line-chart/client/LineChartClient.js.map +1 -1
- package/dist/components/modal/Modal.d.ts +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +4 -6
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/ModalParts.d.ts +3 -30
- package/dist/components/modal/ModalParts.d.ts.map +1 -1
- package/dist/components/modal/ModalParts.js +20 -17
- package/dist/components/modal/ModalParts.js.map +1 -1
- package/dist/components/modal/client/ModalClientContent.d.ts.map +1 -1
- package/dist/components/modal/client/ModalClientContent.js +5 -2
- package/dist/components/modal/client/ModalClientContent.js.map +1 -1
- package/dist/components/modal/types.d.ts +0 -2
- package/dist/components/modal/types.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.js +3 -0
- package/dist/components/otp-input/OtpInput.js.map +1 -1
- package/dist/components/popup/Popup.d.ts.map +1 -1
- package/dist/components/popup/Popup.js +8 -3
- package/dist/components/popup/Popup.js.map +1 -1
- package/dist/components/popup/PopupParts.d.ts +3 -26
- package/dist/components/popup/PopupParts.d.ts.map +1 -1
- package/dist/components/popup/PopupParts.js +27 -18
- package/dist/components/popup/PopupParts.js.map +1 -1
- package/dist/components/radio-group/RadioGroup.d.ts.map +1 -1
- package/dist/components/radio-group/RadioGroup.js +0 -1
- package/dist/components/radio-group/RadioGroup.js.map +1 -1
- package/dist/components/select/Select.d.ts.map +1 -1
- package/dist/components/select/Select.js +1 -0
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/slider/Slider.d.ts.map +1 -1
- package/dist/components/slider/Slider.js +1 -0
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.js +2 -2
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/spinner/types.d.ts +1 -1
- package/dist/components/spinner/types.d.ts.map +1 -1
- package/dist/components/stepper/Stepper.js +2 -2
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/switch/Switch.d.ts.map +1 -1
- package/dist/components/switch/Switch.js +1 -0
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.js +1 -3
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.js +6 -1
- package/dist/components/tags-input/TagsInput.js.map +1 -1
- package/dist/components/tags-input/types.d.ts +1 -0
- package/dist/components/tags-input/types.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.js +1 -0
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/toast/Toast.d.ts.map +1 -1
- package/dist/components/toast/Toast.js +2 -1
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/toast/ToastElements.d.ts.map +1 -1
- package/dist/components/toast/ToastElements.js +4 -1
- package/dist/components/toast/ToastElements.js.map +1 -1
- package/dist/components/toggle/Toggle.d.ts.map +1 -1
- package/dist/components/toggle/Toggle.js +1 -0
- package/dist/components/toggle/Toggle.js.map +1 -1
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.js +5 -3
- package/dist/components/toolbar/Toolbar.js.map +1 -1
- package/dist/components/toolbar/ToolbarShell.d.ts.map +1 -1
- package/dist/components/toolbar/ToolbarShell.js +8 -5
- package/dist/components/toolbar/ToolbarShell.js.map +1 -1
- package/dist/components/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/Tooltip.js +2 -0
- 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 +42 -46
- package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
- package/dist/components/virtual-scroll/VirtualScrollRowShell.d.ts +1 -1
- package/dist/components/virtual-scroll/VirtualScrollRowShell.js +3 -3
- package/dist/components/virtual-scroll/VirtualScrollRowShell.js.map +1 -1
- package/dist/components/virtual-scroll/index.d.ts +1 -1
- package/dist/components/virtual-scroll/index.d.ts.map +1 -1
- package/dist/components/virtual-scroll/index.js.map +1 -1
- package/dist/components/virtual-scroll/types.d.ts +5 -0
- 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-axis.d.ts +9 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.d.ts.map +1 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.js +18 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.js.map +1 -0
- package/dist/components/virtual-scroll/virtual-scroll-scroll-sync.js +2 -2
- package/dist/components/virtual-scroll/virtual-scroll-scroll-sync.js.map +1 -1
- package/dist/core/render-native-invoker.d.ts +6 -3
- package/dist/core/render-native-invoker.d.ts.map +1 -1
- package/dist/core/render-native-invoker.js +5 -3
- package/dist/core/render-native-invoker.js.map +1 -1
- package/dist/elements/choice/Choice.d.ts +2 -2
- package/dist/elements/choice/Choice.js +1 -1
- package/dist/elements/choice/Choice.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/elements/dialog/Dialog.d.ts +3 -3
- package/dist/elements/dialog/Dialog.d.ts.map +1 -1
- package/dist/elements/dialog/Dialog.js +5 -3
- package/dist/elements/dialog/Dialog.js.map +1 -1
- package/dist/elements/popover/Popover.d.ts +6 -5
- package/dist/elements/popover/Popover.d.ts.map +1 -1
- package/dist/elements/popover/Popover.js +8 -4
- package/dist/elements/popover/Popover.js.map +1 -1
- package/dist/styles/index.css +1 -1
- package/dist/styles/tailwind.css +33 -35
- package/dist/styles/tokens.css +1 -1
- package/package.json +7 -2
|
@@ -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 {\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 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 ref = useRef<HTMLDivElement>(null);\n const scrollTopRef = 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 viewportHeight = 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 overscan,\n rowHeight,\n viewportHeight,\n });\n scrollOptionsRef.current = {\n dynamicLayout,\n itemCount: items.length,\n overscan,\n rowHeight,\n viewportHeight,\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, viewportHeight } =\n scrollOptionsRef.current;\n const scrollTop = scrollTopRef.current;\n\n if (dynamicLayout) {\n const store = measurementStoreRef.current;\n return computeDynamicVirtualScrollRange({\n scrollTop,\n viewportHeight,\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,\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 scrollTop = element.scrollTop; // banned-read-ok: scroll position drives the virtual range.\n const previousRange = computeRange();\n scrollTopRef.current = scrollTop;\n\n const nextRange = computeRange();\n if (rangesEqual(previousRange, nextRange)) return;\n\n emitRangeChange(nextRange);\n\n const { dynamicLayout, itemCount, viewportHeight, rowHeight, overscan } =\n scrollOptionsRef.current;\n const slotCount = computeActiveVirtualScrollSlotCount(\n itemCount,\n nextRange.start,\n Math.max(\n nextRange.end - nextRange.start,\n computeVirtualScrollSlotCount(viewportHeight, 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 scrollTop.\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 element.scrollTop += delta; // banned-read-ok: preserve the viewport while rows resize.\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, viewportHeight);\n const resolved = resolveScrollBehavior(behavior);\n\n if (typeof element.scrollTo === \"function\") {\n element.scrollTo({ top: clamped, behavior: resolved });\n } else {\n element.scrollTop = clamped; // banned-read-ok: native scroll fallback for this viewport.\n }\n syncRangeFromScrollRef.current();\n\n if (isSmoothScrollActive(behavior ?? \"auto\", element.scrollTop, clamped)) {\n // banned-read-ok: poll native smooth-scroll completion.\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\", node.scrollTop, clamped)) {\n // banned-read-ok: poll native smooth-scroll completion.\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.viewportHeight,\n scrollTopRef.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.viewportHeight);\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(viewportHeight, rowHeight, overscan),\n );\n }, [items.length, overscan, range.end, range.start, rowHeight, viewportHeight]);\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: scrollTopRef.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 handleRowMeasureRef.current(index, itemId, entry.contentRect.height);\n }\n });\n\n fragment.observeUsing(observer);\n return () => fragment.unobserveUsing(observer);\n }, [dynamicLayout]);\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 nextSnapshot = {\n firstItemId: items[0]?.id,\n itemCount: items.length,\n totalSize: nextTotalSize,\n scrollTop: element?.scrollTop ?? scrollTopRef.current, // banned-read-ok: anchor snapshot reads native position.\n };\n\n const adjustment = resolveVirtualScrollAnchorAdjustment({\n anchor,\n followAppend,\n viewportHeight,\n previous,\n next: nextSnapshot,\n });\n\n if (adjustment && element) {\n if (adjustment.behavior === \"smooth\" && typeof element.scrollTo === \"function\") {\n element.scrollTo({\n top: element.scrollTop + adjustment.delta, // banned-read-ok: retain the anchored viewport.\n behavior: \"smooth\",\n });\n } else {\n element.scrollTop += adjustment.delta; // banned-read-ok: retain the anchored viewport.\n }\n syncRangeFromScrollRef.current();\n }\n\n anchorSnapshotRef.current = nextSnapshot;\n }, [anchor, followAppend, items, dynamicLayout, rowHeight, viewportHeight]);\n\n useEffect(() => {\n emitRangeChange(range);\n }, [range]);\n\n const scrollportStyle = {\n height,\n overflowY: \"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-uiify-dynamic-layout={dynamicLayout ? \"\" : undefined}\n role={role}\n className={className}\n style={scrollportStyle}\n >\n <div data-uiify-virtual-scroll-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":";AAwhBgB;AAthBhB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SAAS,4CAA4C;AACrD;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,oCAAoC;AAS7C,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,cACP,OACA,YACA,WACoC;AACpC,QAAM,kBAAkB,oCAAoC,MAAM,QAAQ,YAAY,SAAS;AAC/F,SAAO,MAAM,KAAK,EAAE,QAAQ,gBAAgB,GAAG,CAAC,GAAG,cAAc;AAC/D,UAAM,QAAQ,aAAa;AAC3B,WAAO;AAAA,MACL;AAAA,MACA,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,cACd,OACc;AACd,QAAM;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf;AAAA,IACA,wBAAwB;AAAA,EAC1B,IAAI;AAEJ,QAAM,gBAAgB,sBAAsB;AAC5C,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AACnB,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,qBAAqB,OAAe,EAAE;AAC5C,QAAM,qBAAqB,OAAO,oBAAI,IAAoB,CAAC;AAC3D,QAAM,oBAAoB,OAAO;AAAA,IAC/B,aAAa,MAAM,CAAC,GAAG;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AAED,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,CAAC;AAE9D,QAAM,eAAe,kBAAkB,GAAG;AAC1C,QAAM,iBAAiB,cAAc,UAAU;AAE/C,QAAM,sBAAsB;AAAA,IAC1B,oCAAoC;AAAA,MAClC,WAAW,MAAM;AAAA,MACjB,kBAAkB;AAAA,MAClB,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,iBAAiB,mBAAmB;AAAA,MACpC,eAAe,CAAC,UAAU,SAAS,QAAQ,KAAK,GAAG;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,sBAAoB,QAAQ,cAAc,MAAM,MAAM;AAEtD,QAAM,mBAAmB,OAAO;AAAA,IAC9B;AAAA,IACA,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,mBAAiB,UAAU;AAAA,IACzB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,aAAa;AAC7C,mBAAiB,UAAU;AAE3B,QAAM,yBAAyB,OAAO,mBAAmB;AACzD,yBAAuB,UAAU;AAEjC,QAAM,eAAe,MAAoD;AACvE,UAAM,EAAE,eAAAA,gBAAe,WAAW,UAAAC,WAAU,WAAAC,YAAW,gBAAAC,gBAAe,IACpE,iBAAiB;AACnB,UAAM,YAAY,aAAa;AAE/B,QAAIH,gBAAe;AACjB,YAAM,QAAQ,oBAAoB;AAClC,aAAO,iCAAiC;AAAA,QACtC;AAAA,QACA,gBAAAG;AAAA,QACA;AAAA,QACA,UAAAF;AAAA,QACA,gBAAgB,MAAM;AAAA,QACtB,cAAc,MAAM;AAAA,QACpB,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,WAAO,0BAA0B;AAAA,MAC/B;AAAA,MACA,gBAAAE;AAAA,MACA;AAAA,MACA,WAAAD;AAAA,MACA,UAAAD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAACG,WAA8D;AACrF,UAAM,WAAW,iBAAiB;AAClC,QAAI,CAAC,SAAU;AACf,UAAM,UAAU,2BAA2BA,MAAK;AAChD,UAAM,YAAY,GAAG,QAAQ,aAAa,IAAI,QAAQ,WAAW;AACjE,QAAI,cAAc,mBAAmB,QAAS;AAC9C,uBAAmB,UAAU;AAC7B,aAAS,OAAO;AAAA,EAClB;AAEA,QAAM,yBAAyB,OAAO,MAAM;AAAA,EAAC,CAAC;AAE9C,yBAAuB,UAAU,MAAM;AACrC,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,QAAS;AAEd,UAAM,YAAY,QAAQ;AAC1B,UAAM,gBAAgB,aAAa;AACnC,iBAAa,UAAU;AAEvB,UAAM,YAAY,aAAa;AAC/B,QAAI,YAAY,eAAe,SAAS,EAAG;AAE3C,oBAAgB,SAAS;AAEzB,UAAM,EAAE,eAAAJ,gBAAe,WAAW,gBAAAG,iBAAgB,WAAAD,YAAW,UAAAD,UAAS,IACpE,iBAAiB;AACnB,UAAMI,aAAY;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,MACV,KAAK;AAAA,QACH,UAAU,MAAM,UAAU;AAAA,QAC1B,8BAA8BF,iBAAgBD,YAAWD,SAAQ;AAAA,MACnE;AAAA,IACF;AACA,UAAM,QAAQ,oBAAoB;AAGlC,iCAA6B,SAAS,WAAW;AAAA,MAC/C,eAAAD;AAAA,MACA,WAAAK;AAAA,MACA,cAAc,MAAM,aAAa,KAAK,KAAK;AAAA,IAC7C,CAAC;AAGD,cAAU,MAAM;AACd,sBAAgB,CAAC,YAAY,UAAU,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB;AAAA,IACvB,6BAA6B;AAAA,MAC3B,SAAS,6BAA6B;AAAA,MACtC,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,sBAAsB,OAAO,CAAC,WAAmB;AAAA,EAAC,CAAC;AAEzD,sBAAoB,UAAU,CAAC,UAAkB;AAC/C,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,WAAW,UAAU,EAAG;AAC7B,YAAQ,aAAa;AACrB,2BAAuB,QAAQ;AAAA,EACjC;AAEA,QAAM,oBAAoB,CACxB,QACA,aACS;AACT,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,QAAS;AAEd,UAAM,QAAQ,oBAAoB;AAClC,UAAMC,aAAY,gBAAgB,MAAM,aAAa,IAAI,MAAM,SAAS;AACxE,UAAM,UAAU,kBAAkB,QAAQA,YAAW,cAAc;AACnE,UAAM,WAAW,sBAAsB,QAAQ;AAE/C,QAAI,OAAO,QAAQ,aAAa,YAAY;AAC1C,cAAQ,SAAS,EAAE,KAAK,SAAS,UAAU,SAAS,CAAC;AAAA,IACvD,OAAO;AACL,cAAQ,YAAY;AAAA,IACtB;AACA,2BAAuB,QAAQ;AAE/B,QAAI,qBAAqB,YAAY,QAAQ,QAAQ,WAAW,OAAO,GAAG;AAExE,UAAI,aAAa,YAAY,EAAG,sBAAqB,aAAa,OAAO;AACzE,YAAM,OAAO,MAAY;AACvB,+BAAuB,QAAQ;AAC/B,cAAM,OAAO,IAAI;AACjB,YAAI,CAAC,MAAM;AACT,uBAAa,UAAU;AACvB;AAAA,QACF;AACA,YAAI,qBAAqB,UAAU,KAAK,WAAW,OAAO,GAAG;AAE3D,uBAAa,UAAU,sBAAsB,IAAI;AACjD;AAAA,QACF;AACA,qBAAa,UAAU;AAAA,MACzB;AACA,mBAAa,UAAU,sBAAsB,IAAI;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,uBAAuB;AAAA,IAC3B,CAAC,SAAiB,cAA8D;AAAA,IAAC;AAAA,EACnF;AAEA,uBAAqB,UAAU;AAE/B;AAAA,IACE;AAAA,IACA,OAA4B;AAAA,MAC1B,IAAI,UAAU;AACZ,eAAO,IAAI;AAAA,MACb;AAAA,MACA,cAAc,OAAe,SAAmD;AAC9E,cAAM,aAAa,8BAA8B,OAAO;AACxD,cAAM,QAAQ,oBAAoB;AAClC,cAAM,UAAU;AAAA,UACd,cAAc,MAAM,aAAa,KAAK,KAAK;AAAA,UAC3C,cAAc,MAAM,aAAa,KAAK,KAAK;AAAA,UAC3C,cAAc,MAAM,aAAa,KAAK,KAAK;AAAA,QAC7C;AACA,cAAM,SAAS;AAAA,UACb;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,iBAAiB,QAAQ;AAAA,UACzB,aAAa;AAAA,QACf;AACA,6BAAqB,QAAQ,QAAQ,WAAW,QAAQ;AAAA,MAC1D;AAAA,MACA,eAAe,QAAgB,SAAoD;AACjF,6BAAqB,QAAQ,QAAQ,+BAA+B,OAAO,CAAC;AAAA,MAC9E;AAAA,MACA,YAAY,SAAoD;AAC9D,cAAM,QAAQ,oBAAoB;AAClC,cAAMA,aAAY,gBACd,MAAM,aAAa,IACnB,iBAAiB,QAAQ,YAAY,iBAAiB,QAAQ;AAClE,cAAM,SAAS,KAAK,IAAI,GAAGA,aAAY,iBAAiB,QAAQ,cAAc;AAC9E,6BAAqB,QAAQ,QAAQ,+BAA+B,OAAO,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,QAAQ,QAAQ,MAAM;AAC1B,SAAK;AACL,SAAK;AACL,WAAO,aAAa;AAAA,EACtB,GAAG,CAAC,cAAc,kBAAkB,CAAC;AAErC,QAAM,YAAY,QAAQ,MAAM;AAC9B,SAAK;AACL,QAAI,cAAe,QAAO,oBAAoB,QAAQ,aAAa;AACnE,WAAO,MAAM,SAAS;AAAA,EACxB,GAAG,CAAC,eAAe,MAAM,QAAQ,oBAAoB,SAAS,CAAC;AAE/D,QAAM,YAAY,QAAQ,MAAM;AAC9B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,KAAK;AAAA,MACV,MAAM,MAAM,MAAM;AAAA,MAClB,8BAA8B,gBAAgB,WAAW,QAAQ;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,UAAU,MAAM,KAAK,MAAM,OAAO,WAAW,cAAc,CAAC;AAE9E,QAAM,WAAW;AAAA,IACf,MAAM,cAAc,OAAO,MAAM,OAAO,SAAS;AAAA,IACjD,CAAC,OAAO,MAAM,OAAO,SAAS;AAAA,EAChC;AAEA,QAAM,sBAAsB,OAAO,CAAC,OAAe,QAAgBC,YAAmB;AACpF,UAAM,QAAQ,oBAAoB;AAClC,UAAM,iBAAiB,MAAM,aAAa,KAAK;AAC/C,UAAM,YAAY,MAAM,aAAa,KAAK;AAC1C,QAAI,CAAC,MAAM,kBAAkB,QAAQ,OAAOA,OAAM,EAAG;AAErD,UAAM,aAAa,oCAAoC;AAAA,MACrD,WAAW,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA,YAAYA;AAAA,IACd,CAAC;AAED,QAAI,aAAa,GAAG;AAClB,YAAM,MAAM,iBAAiB;AAC7B,UAAI,IAAI,iBAAiB,GAAG;AAC1B,YAAI,gBAAgB,UAAU;AAAA,MAChC,OAAO;AACL,4BAAoB,QAAQ,UAAU;AAAA,MACxC;AAAA,IACF;AAEA,0BAAsB,CAAC,YAAY,UAAU,CAAC;AAAA,EAChD,CAAC;AAED,QAAM,kBAAkB,OAAyB,IAAI;AAMrD,YAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,UAAM,WAAW,gBAAgB;AACjC,QAAI,CAAC,YAAY,OAAO,mBAAmB,YAAa;AAExD,UAAM,WAAW,IAAI,eAAe,CAAC,YAAY;AAC/C,iBAAW,SAAS,SAAS;AAC3B,cAAM,SAAS,MAAM;AACrB,YAAI,EAAE,kBAAkB,aAAc;AACtC,cAAM,MAAM,OAAO,QAAQ,eAAe;AAC1C,YAAI,QAAQ,OAAW;AACvB,cAAM,QAAQ,OAAO,GAAG;AACxB,YAAI,CAAC,OAAO,UAAU,KAAK,EAAG;AAC9B,cAAM,SAAS,SAAS,QAAQ,KAAK,GAAG;AACxC,YAAI,WAAW,OAAW;AAC1B,4BAAoB,QAAQ,OAAO,QAAQ,MAAM,YAAY,MAAM;AAAA,MACrE;AAAA,IACF,CAAC;AAED,aAAS,aAAa,QAAQ;AAC9B,WAAO,MAAM,SAAS,eAAe,QAAQ;AAAA,EAC/C,GAAG,CAAC,aAAa,CAAC;AAElB,YAAU,MAAM;AACd,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,QAAS;AAEd,UAAM,cAAc,+BAA+B;AAAA,MACjD,YAAY;AAAA,MACZ,mBAAmB,uBAAuB;AAAA,MAC1C,UAAU,CAAC,gBAAgB;AACzB,+BAAuB,UAAU,EAAE,YAAY,CAAC;AAChD,YAAI,CAAC,aAAa;AAChB,2BAAiB,QAAQ,iBAAiB,oBAAoB,OAAO;AAAA,QACvE;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,WAAgC;AACpC,QAAI,cAAmC;AACvC,UAAM,MAAM,iBAAiB;AAC7B,UAAM,eAAe,MAAY,IAAI,aAAa;AAClD,UAAM,aAAa,MAAY,IAAI,WAAW;AAE9C,eAAW,MAAM;AACf,kBAAY,aAAa;AACzB,6BAAuB,QAAQ;AAAA,IACjC;AACA,YAAQ,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC9D,QAAI,uBAAuB,GAAG;AAC5B,oBAAc,MAAM;AAClB,oBAAY,gBAAgB;AAC5B,+BAAuB,QAAQ;AAAA,MACjC;AACA,cAAQ,iBAAiB,aAAa,aAAa,EAAE,SAAS,KAAK,CAAC;AAAA,IACtE;AACA,YAAQ,iBAAiB,cAAc,cAAc,EAAE,SAAS,KAAK,CAAC;AACtE,YAAQ,iBAAiB,YAAY,YAAY,EAAE,SAAS,KAAK,CAAC;AAElE,WAAO,MAAM;AACX,UAAI,aAAa,YAAY,EAAG,sBAAqB,aAAa,OAAO;AACzE,UAAI,SAAU,SAAQ,oBAAoB,UAAU,QAAQ;AAC5D,UAAI,YAAa,SAAQ,oBAAoB,aAAa,WAAW;AACrE,cAAQ,oBAAoB,cAAc,YAAY;AACtD,cAAQ,oBAAoB,YAAY,UAAU;AAClD,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,qBAAqB,CAAC;AAE1B,YAAU,MAAM;AACd,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,oBAAoB;AAClC,UAAM,gBAAgB,gBAAgB,MAAM,aAAa,IAAI,MAAM,SAAS;AAC5E,UAAM,WAAW,kBAAkB;AACnC,UAAM,eAAe;AAAA,MACnB,aAAa,MAAM,CAAC,GAAG;AAAA,MACvB,WAAW,MAAM;AAAA,MACjB,WAAW;AAAA,MACX,WAAW,SAAS,aAAa,aAAa;AAAA;AAAA,IAChD;AAEA,UAAM,aAAa,qCAAqC;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,QAAI,cAAc,SAAS;AACzB,UAAI,WAAW,aAAa,YAAY,OAAO,QAAQ,aAAa,YAAY;AAC9E,gBAAQ,SAAS;AAAA,UACf,KAAK,QAAQ,YAAY,WAAW;AAAA;AAAA,UACpC,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,aAAa,WAAW;AAAA,MAClC;AACA,6BAAuB,QAAQ;AAAA,IACjC;AAEA,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,QAAQ,cAAc,OAAO,eAAe,WAAW,cAAc,CAAC;AAE1E,YAAU,MAAM;AACd,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,WAAW;AAAA,IACX,gCAAgC,MAAM;AAAA,IACtC,qCAAqC,GAAG,SAAS;AAAA,IACjD,GAAI,gBAAgB,EAAE,qCAAqC,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,EACnF;AAEA,QAAM,cAAc,gBAChB,SACC;AAAA,IACC,uBAAuB,MAAM;AAAA,EAC/B;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAa;AAAA,MACb,6BAA0B;AAAA,MAC1B,6BAA2B,gBAAgB,KAAK;AAAA,MAChD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MAEP,8BAAC,SAAI,oCAAiC,IAAG,OAAO,aAC7C,mBAAS,IAAI,CAAC,SAAS;AACtB,cAAM,QAAQ,oBAAoB;AAClC,cAAM,YAAY,gBAAgB,MAAM,aAAa,KAAK,KAAK,IAAI;AACnE,cAAM,oBAAoB,gBAAgB,MAAM,aAAa,KAAK,KAAK,IAAI;AAE3E,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,KAAK;AAAA,YAChB,OAAO,KAAK;AAAA,YACZ,WAAW,MAAM;AAAA,YACjB,UAAU;AAAA,YACV;AAAA,YACC,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,YAC/C,GAAI,sBAAsB,SAAY,EAAE,WAAW,kBAAkB,IAAI,CAAC;AAAA,YAE1E,eAAK,OACJ,oBAAC,wBAAqB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,WAAsB,IAC9E;AAAA;AAAA,UAXC,QAAQ,KAAK,SAAS;AAAA,QAY7B;AAAA,MAEJ,CAAC,GACH;AAAA;AAAA,EACF;AAEJ;AACA,cAAc,cAAc;","names":["dynamicLayout","overscan","rowHeight","viewportHeight","range","slotCount","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 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"]}
|
|
@@ -18,7 +18,7 @@ interface VirtualScrollRowShellProps {
|
|
|
18
18
|
*
|
|
19
19
|
* Stateless by design: measurement is owned by the single ResizeObserver that
|
|
20
20
|
* VirtualScroll attaches to the row Fragment, so this component holds no hooks.
|
|
21
|
-
* `data-
|
|
21
|
+
* `data-row-index` is how that observer's callback maps an entry back to
|
|
22
22
|
* a list index.
|
|
23
23
|
*/
|
|
24
24
|
export declare function VirtualScrollRowShell({ slotIndex, index, itemCount, listRole, rowOffset, rowHeight, dynamicLayout, children, }: VirtualScrollRowShellProps): ReactElement;
|
|
@@ -27,9 +27,9 @@ function VirtualScrollRowShell({
|
|
|
27
27
|
return /* @__PURE__ */ jsx(
|
|
28
28
|
"div",
|
|
29
29
|
{
|
|
30
|
-
"data-
|
|
31
|
-
"data-
|
|
32
|
-
"data-
|
|
30
|
+
"data-part": "row",
|
|
31
|
+
"data-dynamic-row": dynamicLayout ? "" : void 0,
|
|
32
|
+
"data-row-index": index,
|
|
33
33
|
role: listRole === "list" ? "listitem" : "row",
|
|
34
34
|
"aria-setsize": itemCount,
|
|
35
35
|
"aria-posinset": index + 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/VirtualScrollRowShell.tsx"],"sourcesContent":["\"use client\";\n\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport type { VirtualScrollListRole } from \"./types.js\";\n\nexport function computeVirtualScrollSlotCount(\n viewportHeight: number,\n rowHeight: number,\n overscan: number,\n): number {\n if (rowHeight <= 0) return 0;\n const visible = Math.max(1, Math.ceil(viewportHeight / rowHeight));\n return visible + overscan * 2;\n}\n\n/** Clamp pooled slot count so indices never exceed the list tail. */\nexport function computeActiveVirtualScrollSlotCount(\n itemCount: number,\n rangeStart: number,\n slotCount: number,\n): number {\n if (itemCount <= 0 || slotCount <= 0) return 0;\n return Math.min(slotCount, Math.max(0, itemCount - rangeStart));\n}\n\ninterface VirtualScrollRowShellProps {\n readonly slotIndex: number;\n readonly index: number;\n readonly itemCount: number;\n readonly listRole: VirtualScrollListRole;\n readonly rowOffset?: number;\n readonly rowHeight?: number;\n readonly dynamicLayout: boolean;\n readonly children: ReactNode;\n}\n\n/**\n * Row shell — static `--uiify-slot-index` in fixed mode; per-row offset in dynamic mode.\n *\n * Stateless by design: measurement is owned by the single ResizeObserver that\n * VirtualScroll attaches to the row Fragment, so this component holds no hooks.\n * `data-
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/VirtualScrollRowShell.tsx"],"sourcesContent":["\"use client\";\n\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport type { VirtualScrollListRole } from \"./types.js\";\n\nexport function computeVirtualScrollSlotCount(\n viewportHeight: number,\n rowHeight: number,\n overscan: number,\n): number {\n if (rowHeight <= 0) return 0;\n const visible = Math.max(1, Math.ceil(viewportHeight / rowHeight));\n return visible + overscan * 2;\n}\n\n/** Clamp pooled slot count so indices never exceed the list tail. */\nexport function computeActiveVirtualScrollSlotCount(\n itemCount: number,\n rangeStart: number,\n slotCount: number,\n): number {\n if (itemCount <= 0 || slotCount <= 0) return 0;\n return Math.min(slotCount, Math.max(0, itemCount - rangeStart));\n}\n\ninterface VirtualScrollRowShellProps {\n readonly slotIndex: number;\n readonly index: number;\n readonly itemCount: number;\n readonly listRole: VirtualScrollListRole;\n readonly rowOffset?: number;\n readonly rowHeight?: number;\n readonly dynamicLayout: boolean;\n readonly children: ReactNode;\n}\n\n/**\n * Row shell — static `--uiify-slot-index` in fixed mode; per-row offset in dynamic mode.\n *\n * Stateless by design: measurement is owned by the single ResizeObserver that\n * VirtualScroll attaches to the row Fragment, so this component holds no hooks.\n * `data-row-index` is how that observer's callback maps an entry back to\n * a list index.\n */\nexport function VirtualScrollRowShell({\n slotIndex,\n index,\n itemCount,\n listRole,\n rowOffset,\n rowHeight,\n dynamicLayout,\n children,\n}: VirtualScrollRowShellProps): ReactElement {\n const style = {\n \"--uiify-slot-index\": slotIndex,\n ...(dynamicLayout && rowOffset !== undefined ? { \"--uiify-row-offset\": `${rowOffset}px` } : {}),\n ...(dynamicLayout && rowHeight !== undefined ? { \"--uiify-row-height\": `${rowHeight}px` } : {}),\n } as CSSProperties;\n\n return (\n <div\n data-part=\"row\"\n data-dynamic-row={dynamicLayout ? \"\" : undefined}\n data-row-index={index}\n role={listRole === \"list\" ? \"listitem\" : \"row\"}\n aria-setsize={itemCount}\n aria-posinset={index + 1}\n style={style}\n >\n {children}\n </div>\n );\n}\nVirtualScrollRowShell.displayName = \"VirtualScrollRowShell\";\n"],"mappings":";AA6DI;AAxDG,SAAS,8BACd,gBACA,WACA,UACQ;AACR,MAAI,aAAa,EAAG,QAAO;AAC3B,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,iBAAiB,SAAS,CAAC;AACjE,SAAO,UAAU,WAAW;AAC9B;AAGO,SAAS,oCACd,WACA,YACA,WACQ;AACR,MAAI,aAAa,KAAK,aAAa,EAAG,QAAO;AAC7C,SAAO,KAAK,IAAI,WAAW,KAAK,IAAI,GAAG,YAAY,UAAU,CAAC;AAChE;AAqBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,QAAM,QAAQ;AAAA,IACZ,sBAAsB;AAAA,IACtB,GAAI,iBAAiB,cAAc,SAAY,EAAE,sBAAsB,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,IAC7F,GAAI,iBAAiB,cAAc,SAAY,EAAE,sBAAsB,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,EAC/F;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,oBAAkB,gBAAgB,KAAK;AAAA,MACvC,kBAAgB;AAAA,MAChB,MAAM,aAAa,SAAS,aAAa;AAAA,MACzC,gBAAc;AAAA,MACd,iBAAe,QAAQ;AAAA,MACvB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AACA,sBAAsB,cAAc;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { VirtualScroll } from "./VirtualScroll.js";
|
|
2
|
-
export type { VirtualScrollAnchor, VirtualScrollHandle, VirtualScrollItem, VirtualScrollListRole, VirtualScrollOwnProps, VirtualScrollRangeChange, VirtualScrollRowSlot, VirtualScrollScrollAlign, VirtualScrollScrollBehavior, VirtualScrollScrollBehaviorOptions, VirtualScrollScrollState, VirtualScrollScrollToIndexOptions, } from "./types.js";
|
|
2
|
+
export type { VirtualScrollAnchor, VirtualScrollHandle, VirtualScrollItem, VirtualScrollListRole, VirtualScrollOrientation, VirtualScrollOwnProps, VirtualScrollRangeChange, VirtualScrollRowSlot, VirtualScrollScrollAlign, VirtualScrollScrollBehavior, VirtualScrollScrollBehaviorOptions, VirtualScrollScrollState, VirtualScrollScrollToIndexOptions, } from "./types.js";
|
|
3
3
|
export { VIRTUAL_SCROLL_ANCHOR_THRESHOLD, VIRTUAL_SCROLL_OVERSCAN, VIRTUAL_SCROLL_ROW_HEIGHT, VIRTUAL_SCROLL_SCROLL_RESET_DELAY, } from "./types.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,2BAA2B,EAC3B,kCAAkC,EAClC,wBAAwB,EACxB,iCAAiC,GAClC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,2BAA2B,EAC3B,kCAAkC,EAClC,wBAAwB,EACxB,iCAAiC,GAClC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/index.ts"],"sourcesContent":["export { VirtualScroll } from \"./VirtualScroll.js\";\nexport type {\n VirtualScrollAnchor,\n VirtualScrollHandle,\n VirtualScrollItem,\n VirtualScrollListRole,\n VirtualScrollOwnProps,\n VirtualScrollRangeChange,\n VirtualScrollRowSlot,\n VirtualScrollScrollAlign,\n VirtualScrollScrollBehavior,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollState,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\nexport {\n VIRTUAL_SCROLL_ANCHOR_THRESHOLD,\n VIRTUAL_SCROLL_OVERSCAN,\n VIRTUAL_SCROLL_ROW_HEIGHT,\n VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,qBAAqB;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/index.ts"],"sourcesContent":["export { VirtualScroll } from \"./VirtualScroll.js\";\nexport type {\n VirtualScrollAnchor,\n VirtualScrollHandle,\n VirtualScrollItem,\n VirtualScrollListRole,\n VirtualScrollOrientation,\n VirtualScrollOwnProps,\n VirtualScrollRangeChange,\n VirtualScrollRowSlot,\n VirtualScrollScrollAlign,\n VirtualScrollScrollBehavior,\n VirtualScrollScrollBehaviorOptions,\n VirtualScrollScrollState,\n VirtualScrollScrollToIndexOptions,\n} from \"./types.js\";\nexport {\n VIRTUAL_SCROLL_ANCHOR_THRESHOLD,\n VIRTUAL_SCROLL_OVERSCAN,\n VIRTUAL_SCROLL_ROW_HEIGHT,\n VIRTUAL_SCROLL_SCROLL_RESET_DELAY,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,qBAAqB;AAgB9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -12,6 +12,8 @@ export interface VirtualScrollItem {
|
|
|
12
12
|
}
|
|
13
13
|
export type VirtualScrollListRole = "list" | "grid";
|
|
14
14
|
export type VirtualScrollAnchor = "start" | "end";
|
|
15
|
+
/** Scroll axis. Row size props (`rowHeight`, `estimateRowHeight`) measure along this axis. */
|
|
16
|
+
export type VirtualScrollOrientation = "vertical" | "horizontal";
|
|
15
17
|
export type VirtualScrollScrollAlign = "start" | "center" | "end" | "auto";
|
|
16
18
|
export type VirtualScrollScrollBehavior = "auto" | "instant" | "smooth";
|
|
17
19
|
export interface VirtualScrollScrollBehaviorOptions {
|
|
@@ -41,8 +43,11 @@ export interface VirtualScrollHandle {
|
|
|
41
43
|
}
|
|
42
44
|
export interface VirtualScrollOwnProps<T extends VirtualScrollItem> {
|
|
43
45
|
readonly items: readonly T[];
|
|
46
|
+
/** Scrollport height; also the viewport extent used before the first resize measurement. */
|
|
44
47
|
readonly height?: number;
|
|
48
|
+
/** Fixed item size along the scroll axis — row height when vertical, item width when horizontal. */
|
|
45
49
|
readonly rowHeight?: number;
|
|
50
|
+
readonly orientation?: VirtualScrollOrientation;
|
|
46
51
|
readonly overscan?: number;
|
|
47
52
|
readonly className?: string;
|
|
48
53
|
readonly testId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/types.ts"],"names":[],"mappings":"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"}
|
|
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\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 readonly height?: number;\n readonly rowHeight?: number;\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 { 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":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VirtualScrollOrientation } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Logical scroll offset along the list axis. RTL `scrollLeft` runs from 0 to
|
|
4
|
+
* `-max`, so its magnitude is the distance from the inline-start edge.
|
|
5
|
+
*/
|
|
6
|
+
export declare function readScrollOffset(element: HTMLElement, orientation: VirtualScrollOrientation): number;
|
|
7
|
+
/** Move the scrollport to a logical offset along the list axis. */
|
|
8
|
+
export declare function writeScrollOffset(element: HTMLElement, orientation: VirtualScrollOrientation, offset: number, behavior: ScrollBehavior): void;
|
|
9
|
+
//# sourceMappingURL=virtual-scroll-axis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-scroll-axis.d.ts","sourceRoot":"","sources":["../../../src/components/virtual-scroll/virtual-scroll-axis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,wBAAwB,GACpC,MAAM,CAIR;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,wBAAwB,EACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,GACvB,IAAI,CAWN"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function readScrollOffset(element, orientation) {
|
|
2
|
+
return orientation === "horizontal" ? Math.abs(element.scrollLeft) : element.scrollTop;
|
|
3
|
+
}
|
|
4
|
+
function writeScrollOffset(element, orientation, offset, behavior) {
|
|
5
|
+
if (orientation === "horizontal") {
|
|
6
|
+
const left = element.matches(":dir(rtl)") ? -offset : offset;
|
|
7
|
+
if (typeof element.scrollTo === "function") element.scrollTo({ left, behavior });
|
|
8
|
+
else element.scrollLeft = left;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (typeof element.scrollTo === "function") element.scrollTo({ top: offset, behavior });
|
|
12
|
+
else element.scrollTop = offset;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
readScrollOffset,
|
|
16
|
+
writeScrollOffset
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=virtual-scroll-axis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/virtual-scroll-axis.ts"],"sourcesContent":["import type { VirtualScrollOrientation } from \"./types.js\";\n\n/**\n * Logical scroll offset along the list axis. RTL `scrollLeft` runs from 0 to\n * `-max`, so its magnitude is the distance from the inline-start edge.\n */\nexport function readScrollOffset(\n element: HTMLElement,\n orientation: VirtualScrollOrientation,\n): number {\n return orientation === \"horizontal\"\n ? Math.abs(element.scrollLeft) // banned-read-ok: scroll position drives the virtual range.\n : element.scrollTop; // banned-read-ok: scroll position drives the virtual range.\n}\n\n/** Move the scrollport to a logical offset along the list axis. */\nexport function writeScrollOffset(\n element: HTMLElement,\n orientation: VirtualScrollOrientation,\n offset: number,\n behavior: ScrollBehavior,\n): void {\n if (orientation === \"horizontal\") {\n // `:dir()` resolves from the DOM `dir` attribute — no style or layout read.\n const left = element.matches(\":dir(rtl)\") ? -offset : offset;\n if (typeof element.scrollTo === \"function\") element.scrollTo({ left, behavior });\n else element.scrollLeft = left; // banned-read-ok: native scroll fallback for this viewport.\n return;\n }\n\n if (typeof element.scrollTo === \"function\") element.scrollTo({ top: offset, behavior });\n else element.scrollTop = offset; // banned-read-ok: native scroll fallback for this viewport.\n}\n"],"mappings":"AAMO,SAAS,iBACd,SACA,aACQ;AACR,SAAO,gBAAgB,eACnB,KAAK,IAAI,QAAQ,UAAU,IAC3B,QAAQ;AACd;AAGO,SAAS,kBACd,SACA,aACA,QACA,UACM;AACN,MAAI,gBAAgB,cAAc;AAEhC,UAAM,OAAO,QAAQ,QAAQ,WAAW,IAAI,CAAC,SAAS;AACtD,QAAI,OAAO,QAAQ,aAAa,WAAY,SAAQ,SAAS,EAAE,MAAM,SAAS,CAAC;AAAA,QAC1E,SAAQ,aAAa;AAC1B;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,aAAa,WAAY,SAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS,CAAC;AAAA,MACjF,SAAQ,YAAY;AAC3B;","names":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
function applyVirtualScrollRangeToDom(scrollport, range, options) {
|
|
2
|
-
const spacer = scrollport.querySelector(
|
|
2
|
+
const spacer = scrollport.querySelector('[data-part="spacer"]');
|
|
3
3
|
if (!(spacer instanceof HTMLElement)) return;
|
|
4
4
|
if (!options.dynamicLayout) {
|
|
5
5
|
spacer.style.setProperty("--uiify-range-start", String(range.start));
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
8
|
-
const rows = spacer.querySelectorAll(
|
|
8
|
+
const rows = spacer.querySelectorAll('[data-part="row"]');
|
|
9
9
|
for (let slotIndex = 0; slotIndex < options.slotCount; slotIndex++) {
|
|
10
10
|
const row = rows[slotIndex];
|
|
11
11
|
if (!(row instanceof HTMLElement)) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll-sync.ts"],"sourcesContent":["import type { VirtualScrollRange } from \"./virtual-scroll-range.js\";\n\n/** Imperatively update row positions from scrollTop so the viewport stays filled before React paints. */\nexport function applyVirtualScrollRangeToDom(\n scrollport: HTMLElement,\n range: VirtualScrollRange,\n options: {\n readonly dynamicLayout: boolean;\n readonly slotCount: number;\n readonly getRowOffset: (index: number) => number;\n },\n): void {\n const spacer = scrollport.querySelector(
|
|
1
|
+
{"version":3,"sources":["../../../src/components/virtual-scroll/virtual-scroll-scroll-sync.ts"],"sourcesContent":["import type { VirtualScrollRange } from \"./virtual-scroll-range.js\";\n\n/** Imperatively update row positions from scrollTop so the viewport stays filled before React paints. */\nexport function applyVirtualScrollRangeToDom(\n scrollport: HTMLElement,\n range: VirtualScrollRange,\n options: {\n readonly dynamicLayout: boolean;\n readonly slotCount: number;\n readonly getRowOffset: (index: number) => number;\n },\n): void {\n const spacer = scrollport.querySelector('[data-part=\"spacer\"]');\n if (!(spacer instanceof HTMLElement)) return;\n\n if (!options.dynamicLayout) {\n spacer.style.setProperty(\"--uiify-range-start\", String(range.start));\n return;\n }\n\n const rows = spacer.querySelectorAll('[data-part=\"row\"]');\n for (let slotIndex = 0; slotIndex < options.slotCount; slotIndex++) {\n const row = rows[slotIndex];\n if (!(row instanceof HTMLElement)) continue;\n const index = range.start + slotIndex;\n row.style.setProperty(\"--uiify-row-offset\", `${options.getRowOffset(index)}px`);\n }\n}\n"],"mappings":"AAGO,SAAS,6BACd,YACA,OACA,SAKM;AACN,QAAM,SAAS,WAAW,cAAc,sBAAsB;AAC9D,MAAI,EAAE,kBAAkB,aAAc;AAEtC,MAAI,CAAC,QAAQ,eAAe;AAC1B,WAAO,MAAM,YAAY,uBAAuB,OAAO,MAAM,KAAK,CAAC;AACnE;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,iBAAiB,mBAAmB;AACxD,WAAS,YAAY,GAAG,YAAY,QAAQ,WAAW,aAAa;AAClE,UAAM,MAAM,KAAK,SAAS;AAC1B,QAAI,EAAE,eAAe,aAAc;AACnC,UAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAI,MAAM,YAAY,sBAAsB,GAAG,QAAQ,aAAa,KAAK,CAAC,IAAI;AAAA,EAChF;AACF;","names":[]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { ElementType, ReactElement } from "react";
|
|
2
2
|
export type NativeInvokerCommand = "show-modal" | "request-close";
|
|
3
|
+
interface NativeInvokerOptions {
|
|
4
|
+
readonly button?: boolean;
|
|
5
|
+
readonly variant?: "ghost" | "danger";
|
|
6
|
+
}
|
|
3
7
|
/**
|
|
4
8
|
* Render a native invoker button. `command`/`commandfor` are lowercase HTML
|
|
5
9
|
* attributes that React 19.2 passes through untouched; @types/react 19.2 does
|
|
@@ -9,8 +13,7 @@ export type NativeInvokerCommand = "show-modal" | "request-close";
|
|
|
9
13
|
* command semantics; Popup uses `popoverTarget`/`popoverTargetAction` instead
|
|
10
14
|
* and keeps its own renderer (see popup/PopupParts.tsx).
|
|
11
15
|
*
|
|
12
|
-
* `marker` accepts one or more attribute names so a component can emit its own
|
|
13
|
-
* marker alongside a deprecated one during a rename transition; every name is set to `""`.
|
|
14
16
|
*/
|
|
15
|
-
export declare function renderNativeInvoker(as: ElementType | undefined, marker: string
|
|
17
|
+
export declare function renderNativeInvoker(as: ElementType | undefined, marker: string, part: string, command: NativeInvokerCommand, target: string, consumerProps: Record<string, unknown>, options?: NativeInvokerOptions): ReactElement;
|
|
18
|
+
export {};
|
|
16
19
|
//# sourceMappingURL=render-native-invoker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-native-invoker.d.ts","sourceRoot":"","sources":["../../src/core/render-native-invoker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,eAAe,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"render-native-invoker.d.ts","sourceRoot":"","sources":["../../src/core/render-native-invoker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,eAAe,CAAC;AAElE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,WAAW,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,GAAE,oBAAyB,GACjC,YAAY,CAWd"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { createElement } from "react";
|
|
2
|
-
function renderNativeInvoker(as, marker, command, target, consumerProps) {
|
|
3
|
-
const markers = typeof marker === "string" ? [marker] : marker;
|
|
2
|
+
function renderNativeInvoker(as, marker, part, command, target, consumerProps, options = {}) {
|
|
4
3
|
return createElement(as ?? "button", {
|
|
5
4
|
...consumerProps,
|
|
6
|
-
...
|
|
5
|
+
...options.button ? { "data-uiify-button": "" } : {},
|
|
6
|
+
[marker]: "",
|
|
7
|
+
"data-part": part,
|
|
8
|
+
...options.variant ? { "data-variant": options.variant } : {},
|
|
7
9
|
command,
|
|
8
10
|
commandfor: target,
|
|
9
11
|
type: "button"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/render-native-invoker.ts"],"sourcesContent":["import { createElement } from \"react\";\nimport type { ElementType, ReactElement } from \"react\";\n\nexport type NativeInvokerCommand = \"show-modal\" | \"request-close\";\n\n/**\n * Render a native invoker button. `command`/`commandfor` are lowercase HTML\n * attributes that React 19.2 passes through untouched; @types/react 19.2 does\n * not declare them and the lint rule react/no-unknown-property rejects them in\n * JSX, so they travel as a props object through createElement. Shared by the\n * Modal and AlertModal parts, which use identical `show-modal`/`request-close`\n * command semantics; Popup uses `popoverTarget`/`popoverTargetAction` instead\n * and keeps its own renderer (see popup/PopupParts.tsx).\n *\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/render-native-invoker.ts"],"sourcesContent":["import { createElement } from \"react\";\nimport type { ElementType, ReactElement } from \"react\";\n\nexport type NativeInvokerCommand = \"show-modal\" | \"request-close\";\n\ninterface NativeInvokerOptions {\n readonly button?: boolean;\n readonly variant?: \"ghost\" | \"danger\";\n}\n\n/**\n * Render a native invoker button. `command`/`commandfor` are lowercase HTML\n * attributes that React 19.2 passes through untouched; @types/react 19.2 does\n * not declare them and the lint rule react/no-unknown-property rejects them in\n * JSX, so they travel as a props object through createElement. Shared by the\n * Modal and AlertModal parts, which use identical `show-modal`/`request-close`\n * command semantics; Popup uses `popoverTarget`/`popoverTargetAction` instead\n * and keeps its own renderer (see popup/PopupParts.tsx).\n *\n */\nexport function renderNativeInvoker(\n as: ElementType | undefined,\n marker: string,\n part: string,\n command: NativeInvokerCommand,\n target: string,\n consumerProps: Record<string, unknown>,\n options: NativeInvokerOptions = {},\n): ReactElement {\n return createElement(as ?? \"button\", {\n ...consumerProps,\n ...(options.button ? { \"data-uiify-button\": \"\" } : {}),\n [marker]: \"\",\n \"data-part\": part,\n ...(options.variant ? { \"data-variant\": options.variant } : {}),\n command,\n commandfor: target,\n type: \"button\",\n });\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAoBvB,SAAS,oBACd,IACA,QACA,MACA,SACA,QACA,eACA,UAAgC,CAAC,GACnB;AACd,SAAO,cAAc,MAAM,UAAU;AAAA,IACnC,GAAG;AAAA,IACH,GAAI,QAAQ,SAAS,EAAE,qBAAqB,GAAG,IAAI,CAAC;AAAA,IACpD,CAAC,MAAM,GAAG;AAAA,IACV,aAAa;AAAA,IACb,GAAI,QAAQ,UAAU,EAAE,gBAAgB,QAAQ,QAAQ,IAAI,CAAC;AAAA,IAC7D;AAAA,IACA,YAAY;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACH;","names":[]}
|
|
@@ -12,8 +12,8 @@ export declare namespace ChoiceGroup {
|
|
|
12
12
|
/**
|
|
13
13
|
* One radio/checkbox choice: an `<input>`, its `<label>`, and an optional panel. `groupId` and
|
|
14
14
|
* `kind` are explicit (see `ChoiceGroupOwnProps.id`) — this part does not read them from its
|
|
15
|
-
* `Choice.Group` ancestor. Emits `data-part` (default `"item"`)
|
|
16
|
-
*
|
|
15
|
+
* `Choice.Group` ancestor. Emits `data-uiify-choice` and `data-part` (default `"item"`) on the
|
|
16
|
+
* wrapper.
|
|
17
17
|
*/
|
|
18
18
|
export declare function ChoiceItem(props: ChoiceItemProps): ReactElement;
|
|
19
19
|
export declare namespace ChoiceItem {
|
|
@@ -34,7 +34,7 @@ function ChoiceItem(props) {
|
|
|
34
34
|
const { controlId, labelId, panelId } = choiceIds(groupId, value);
|
|
35
35
|
const groupName = name ?? choiceGroupName(groupId, kind);
|
|
36
36
|
const inputType = kind === "single" ? "radio" : "checkbox";
|
|
37
|
-
return /* @__PURE__ */ jsxs("div", { "data-part": part, "data-uiify-choice
|
|
37
|
+
return /* @__PURE__ */ jsxs("div", { ...consumerProps, "data-part": part, "data-uiify-choice": "", children: [
|
|
38
38
|
/* @__PURE__ */ jsx(
|
|
39
39
|
"input",
|
|
40
40
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/choice/Choice.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { choiceGroupName, choiceIds } from \"./ids.js\";\nimport type { ChoiceGroupProps, ChoiceItemProps } from \"./types.js\";\n\n/**\n * A group of `Choice.Item`s. Purely a marked, oriented `<div>` — the actual `<input>`s are\n * siblings-by-id, not parent/child data flow (no `useContext`, no `cloneElement`: Tier 0 bans\n * both). Emits `data-orientation` and `data-uiify-choice`.\n */\nexport function ChoiceGroup(props: ChoiceGroupProps): ReactElement {\n const {\n children,\n kind: _kind,\n name: _name,\n orientation = \"horizontal\",\n ...consumerProps\n } = props;\n return (\n <div {...consumerProps} data-orientation={orientation} data-uiify-choice=\"\">\n {children}\n </div>\n );\n}\nChoiceGroup.displayName = \"ChoiceGroup\";\n\n/**\n * One radio/checkbox choice: an `<input>`, its `<label>`, and an optional panel. `groupId` and\n * `kind` are explicit (see `ChoiceGroupOwnProps.id`) — this part does not read them from its\n * `Choice.Group` ancestor. Emits `data-part` (default `\"item\"`)
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/choice/Choice.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { choiceGroupName, choiceIds } from \"./ids.js\";\nimport type { ChoiceGroupProps, ChoiceItemProps } from \"./types.js\";\n\n/**\n * A group of `Choice.Item`s. Purely a marked, oriented `<div>` — the actual `<input>`s are\n * siblings-by-id, not parent/child data flow (no `useContext`, no `cloneElement`: Tier 0 bans\n * both). Emits `data-orientation` and `data-uiify-choice`.\n */\nexport function ChoiceGroup(props: ChoiceGroupProps): ReactElement {\n const {\n children,\n kind: _kind,\n name: _name,\n orientation = \"horizontal\",\n ...consumerProps\n } = props;\n return (\n <div {...consumerProps} data-orientation={orientation} data-uiify-choice=\"\">\n {children}\n </div>\n );\n}\nChoiceGroup.displayName = \"ChoiceGroup\";\n\n/**\n * One radio/checkbox choice: an `<input>`, its `<label>`, and an optional panel. `groupId` and\n * `kind` are explicit (see `ChoiceGroupOwnProps.id`) — this part does not read them from its\n * `Choice.Group` ancestor. Emits `data-uiify-choice` and `data-part` (default `\"item\"`) on the\n * wrapper.\n */\nexport function ChoiceItem(props: ChoiceItemProps): ReactElement {\n const {\n defaultChecked = false,\n checked,\n disabled = false,\n groupId,\n inputProps,\n kind,\n label,\n labelPart = false,\n labelProps,\n name,\n onChange,\n panel,\n panelProps,\n part = \"item\",\n value,\n ...consumerProps\n } = props;\n\n const isControlled = checked !== undefined;\n\n const { controlId, labelId, panelId } = choiceIds(groupId, value);\n const groupName = name ?? choiceGroupName(groupId, kind);\n const inputType = kind === \"single\" ? \"radio\" : \"checkbox\";\n\n return (\n <div {...consumerProps} data-part={part} data-uiify-choice=\"\">\n <input\n {...inputProps}\n aria-labelledby={labelId}\n {...(isControlled ? { checked } : { defaultChecked })}\n disabled={disabled}\n id={controlId}\n name={groupName}\n type={inputType}\n value={value}\n {...(onChange ? { onChange: () => onChange(value) } : {})}\n />\n <label\n {...labelProps}\n htmlFor={controlId}\n id={labelId}\n {...(labelPart ? { \"data-part\": \"label\" } : {})}\n >\n {label}\n </label>\n {panel === undefined ? null : (\n <div {...panelProps} data-part=\"panel\" id={panelId}>\n {panel}\n </div>\n )}\n </div>\n );\n}\nChoiceItem.displayName = \"ChoiceItem\";\n\nexport const Choice = {\n Group: ChoiceGroup,\n Item: ChoiceItem,\n};\n"],"mappings":"AAkBI,cAwCA,YAxCA;AAjBJ,SAAS,iBAAiB,iBAAiB;AAQpC,SAAS,YAAY,OAAuC;AACjE,QAAM;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAG;AAAA,EACL,IAAI;AACJ,SACE,oBAAC,SAAK,GAAG,eAAe,oBAAkB,aAAa,qBAAkB,IACtE,UACH;AAEJ;AACA,YAAY,cAAc;AAQnB,SAAS,WAAW,OAAsC;AAC/D,QAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,eAAe,YAAY;AAEjC,QAAM,EAAE,WAAW,SAAS,QAAQ,IAAI,UAAU,SAAS,KAAK;AAChE,QAAM,YAAY,QAAQ,gBAAgB,SAAS,IAAI;AACvD,QAAM,YAAY,SAAS,WAAW,UAAU;AAEhD,SACE,qBAAC,SAAK,GAAG,eAAe,aAAW,MAAM,qBAAkB,IACzD;AAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,mBAAiB;AAAA,QAChB,GAAI,eAAe,EAAE,QAAQ,IAAI,EAAE,eAAe;AAAA,QACnD;AAAA,QACA,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACC,GAAI,WAAW,EAAE,UAAU,MAAM,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,IACzD;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACH,GAAI,YAAY,EAAE,aAAa,QAAQ,IAAI,CAAC;AAAA,QAE5C;AAAA;AAAA,IACH;AAAA,IACC,UAAU,SAAY,OACrB,oBAAC,SAAK,GAAG,YAAY,aAAU,SAAQ,IAAI,SACxC,iBACH;AAAA,KAEJ;AAEJ;AACA,WAAW,cAAc;AAElB,MAAM,SAAS;AAAA,EACpB,OAAO;AAAA,EACP,MAAM;AACR;","names":[]}
|
|
@@ -42,7 +42,7 @@ export interface ChoiceItemOwnProps {
|
|
|
42
42
|
readonly part?: string;
|
|
43
43
|
/** Adds `data-part="label"` to the `<label>`. */
|
|
44
44
|
readonly labelPart?: boolean;
|
|
45
|
-
/** Escape hatch: extra attributes spread onto the `<input>` (
|
|
45
|
+
/** Escape hatch: extra attributes spread onto the `<input>` (for example, `data-part="control"`). */
|
|
46
46
|
readonly inputProps?: Record<string, unknown>;
|
|
47
47
|
/** Escape hatch: extra attributes spread onto the `<label>`. */
|
|
48
48
|
readonly labelProps?: Record<string, unknown>;
|
|
@@ -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,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B
|
|
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,yFAAyF;IACzF,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,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAC9C,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,kBAAkB,GAAG,UAAU,CAAC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { ElementType, ReactElement } from "react";
|
|
|
2
2
|
import type { DialogCloseProps, DialogContentProps, DialogTriggerProps } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Opens `target` modally through the browser: no React handler, works before hydration.
|
|
5
|
-
* Emits `data-uiify-dialog-trigger`.
|
|
5
|
+
* Emits `data-uiify-dialog` with `data-part="trigger"`.
|
|
6
6
|
*
|
|
7
7
|
* Defined via `Object.assign(fn, { displayName })` rather than this file's usual
|
|
8
8
|
* `fn.displayName = "…"` statement: `Dialog.Trigger`/`.Content`/`.Close` are meant to be
|
|
@@ -18,7 +18,7 @@ export declare const DialogTrigger: typeof dialogTrigger & {
|
|
|
18
18
|
displayName: string;
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
|
-
* A plain, initially closed `<dialog>`. Emits `data-uiify-dialog-content`.
|
|
21
|
+
* A plain, initially closed `<dialog>`. Emits `data-uiify-dialog` with `data-part="content"`.
|
|
22
22
|
*/
|
|
23
23
|
declare function dialogContent(props: DialogContentProps): ReactElement;
|
|
24
24
|
export declare const DialogContent: typeof dialogContent & {
|
|
@@ -26,7 +26,7 @@ export declare const DialogContent: typeof dialogContent & {
|
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
28
|
* Requests closing `target` (fires the cancelable `cancel` event first).
|
|
29
|
-
* Emits `data-uiify-dialog-close`.
|
|
29
|
+
* Emits `data-uiify-dialog` with `data-part="close"`.
|
|
30
30
|
*/
|
|
31
31
|
declare function dialogClose<TAs extends ElementType = "button">(props: DialogCloseProps<TAs>): ReactElement;
|
|
32
32
|
export declare const DialogClose: typeof dialogClose & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/elements/dialog/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3F;;;;;;;;;;;;GAYG;AACH,iBAAS,aAAa,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACvD,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAC7B,YAAY,
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/elements/dialog/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3F;;;;;;;;;;;;GAYG;AACH,iBAAS,aAAa,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACvD,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAC7B,YAAY,CAUd;AACD,eAAO,MAAM,aAAa;;CAExB,CAAC;AAEH;;GAEG;AACH,iBAAS,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAO9D;AACD,eAAO,MAAM,aAAa;;CAExB,CAAC;AAEH;;;GAGG;AACH,iBAAS,WAAW,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACrD,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAC3B,YAAY,CAUd;AACD,eAAO,MAAM,WAAW;;CAEtB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;CAIlB,CAAC"}
|
|
@@ -4,7 +4,8 @@ function dialogTrigger(props) {
|
|
|
4
4
|
const { as, target, ...consumerProps } = props;
|
|
5
5
|
return renderNativeInvoker(
|
|
6
6
|
as,
|
|
7
|
-
"data-uiify-dialog
|
|
7
|
+
"data-uiify-dialog",
|
|
8
|
+
"trigger",
|
|
8
9
|
"show-modal",
|
|
9
10
|
target,
|
|
10
11
|
consumerProps
|
|
@@ -15,7 +16,7 @@ const DialogTrigger = /* @__PURE__ */ Object.assign(dialogTrigger, {
|
|
|
15
16
|
});
|
|
16
17
|
function dialogContent(props) {
|
|
17
18
|
const { children, ...dialogProps } = props;
|
|
18
|
-
return /* @__PURE__ */ jsx("dialog", { ...dialogProps, "data-uiify-dialog
|
|
19
|
+
return /* @__PURE__ */ jsx("dialog", { ...dialogProps, "data-part": "content", "data-uiify-dialog": "", children });
|
|
19
20
|
}
|
|
20
21
|
const DialogContent = /* @__PURE__ */ Object.assign(dialogContent, {
|
|
21
22
|
displayName: "DialogContent"
|
|
@@ -24,7 +25,8 @@ function dialogClose(props) {
|
|
|
24
25
|
const { as, target, ...consumerProps } = props;
|
|
25
26
|
return renderNativeInvoker(
|
|
26
27
|
as,
|
|
27
|
-
"data-uiify-dialog
|
|
28
|
+
"data-uiify-dialog",
|
|
29
|
+
"close",
|
|
28
30
|
"request-close",
|
|
29
31
|
target,
|
|
30
32
|
consumerProps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/dialog/Dialog.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { renderNativeInvoker } from \"@gunkin/uiify/core/render\";\nimport type { DialogCloseProps, DialogContentProps, DialogTriggerProps } from \"./types.js\";\n\n/**\n * Opens `target` modally through the browser: no React handler, works before hydration.\n * Emits `data-uiify-dialog-trigger`.\n *\n * Defined via `Object.assign(fn, { displayName })` rather than this file's usual\n * `fn.displayName = \"…\"` statement: `Dialog.Trigger`/`.Content`/`.Close` are meant to be\n * consumed individually (`modal`, `alert-modal` and `drawer` each use a different subset), and\n * esbuild's default tree-shaking\n * cannot prove a bare `fn.displayName = \"…\"` assignment statement is side-effect-free, so it\n * keeps every part whose file is reachable at all. A pure-annotated expression assigned\n * directly to the export lets an unused part be dropped instead of taxing every consumer\n * for parts it never renders.\n */\nfunction dialogTrigger<TAs extends ElementType = \"button\">(\n props: DialogTriggerProps<TAs>,\n): ReactElement {\n const { as, target, ...consumerProps } = props as DialogTriggerProps<\"button\">;\n return renderNativeInvoker(\n as,\n \"data-uiify-dialog
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/dialog/Dialog.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { renderNativeInvoker } from \"@gunkin/uiify/core/render\";\nimport type { DialogCloseProps, DialogContentProps, DialogTriggerProps } from \"./types.js\";\n\n/**\n * Opens `target` modally through the browser: no React handler, works before hydration.\n * Emits `data-uiify-dialog` with `data-part=\"trigger\"`.\n *\n * Defined via `Object.assign(fn, { displayName })` rather than this file's usual\n * `fn.displayName = \"…\"` statement: `Dialog.Trigger`/`.Content`/`.Close` are meant to be\n * consumed individually (`modal`, `alert-modal` and `drawer` each use a different subset), and\n * esbuild's default tree-shaking\n * cannot prove a bare `fn.displayName = \"…\"` assignment statement is side-effect-free, so it\n * keeps every part whose file is reachable at all. A pure-annotated expression assigned\n * directly to the export lets an unused part be dropped instead of taxing every consumer\n * for parts it never renders.\n */\nfunction dialogTrigger<TAs extends ElementType = \"button\">(\n props: DialogTriggerProps<TAs>,\n): ReactElement {\n const { as, target, ...consumerProps } = props as DialogTriggerProps<\"button\">;\n return renderNativeInvoker(\n as,\n \"data-uiify-dialog\",\n \"trigger\",\n \"show-modal\",\n target,\n consumerProps as Record<string, unknown>,\n );\n}\nexport const DialogTrigger = /* @__PURE__ */ Object.assign(dialogTrigger, {\n displayName: \"DialogTrigger\",\n});\n\n/**\n * A plain, initially closed `<dialog>`. Emits `data-uiify-dialog` with `data-part=\"content\"`.\n */\nfunction dialogContent(props: DialogContentProps): ReactElement {\n const { children, ...dialogProps } = props;\n return (\n <dialog {...dialogProps} data-part=\"content\" data-uiify-dialog=\"\">\n {children}\n </dialog>\n );\n}\nexport const DialogContent = /* @__PURE__ */ Object.assign(dialogContent, {\n displayName: \"DialogContent\",\n});\n\n/**\n * Requests closing `target` (fires the cancelable `cancel` event first).\n * Emits `data-uiify-dialog` with `data-part=\"close\"`.\n */\nfunction dialogClose<TAs extends ElementType = \"button\">(\n props: DialogCloseProps<TAs>,\n): ReactElement {\n const { as, target, ...consumerProps } = props as DialogCloseProps<\"button\">;\n return renderNativeInvoker(\n as,\n \"data-uiify-dialog\",\n \"close\",\n \"request-close\",\n target,\n consumerProps as Record<string, unknown>,\n );\n}\nexport const DialogClose = /* @__PURE__ */ Object.assign(dialogClose, {\n displayName: \"DialogClose\",\n});\n\nexport const Dialog = {\n Trigger: DialogTrigger,\n Content: DialogContent,\n Close: DialogClose,\n};\n"],"mappings":"AAwCI;AAvCJ,SAAS,2BAA2B;AAgBpC,SAAS,cACP,OACc;AACd,QAAM,EAAE,IAAI,QAAQ,GAAG,cAAc,IAAI;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AACO,MAAM,gBAAgC,uBAAO,OAAO,eAAe;AAAA,EACxE,aAAa;AACf,CAAC;AAKD,SAAS,cAAc,OAAyC;AAC9D,QAAM,EAAE,UAAU,GAAG,YAAY,IAAI;AACrC,SACE,oBAAC,YAAQ,GAAG,aAAa,aAAU,WAAU,qBAAkB,IAC5D,UACH;AAEJ;AACO,MAAM,gBAAgC,uBAAO,OAAO,eAAe;AAAA,EACxE,aAAa;AACf,CAAC;AAMD,SAAS,YACP,OACc;AACd,QAAM,EAAE,IAAI,QAAQ,GAAG,cAAc,IAAI;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AACO,MAAM,cAA8B,uBAAO,OAAO,aAAa;AAAA,EACpE,aAAa;AACf,CAAC;AAEM,MAAM,SAAS;AAAA,EACpB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;","names":[]}
|
|
@@ -3,23 +3,24 @@ import type { PopoverCloseProps, PopoverSurfaceProps, PopoverTriggerProps } from
|
|
|
3
3
|
/**
|
|
4
4
|
* Acts on `target` (`action`, default `"toggle"`); light dismiss, Escape and nesting are
|
|
5
5
|
* handled by the browser. The popover opened this way uses the invoker as its implicit
|
|
6
|
-
* anchor, so no anchor name is emitted. Emits `data-uiify-popover
|
|
6
|
+
* anchor, so no anchor name is emitted. Emits `data-uiify-popover` with
|
|
7
|
+
* `data-part="trigger"`.
|
|
7
8
|
*/
|
|
8
9
|
declare function popoverTrigger<TAs extends ElementType = "button">(props: PopoverTriggerProps<TAs>): ReactElement;
|
|
9
10
|
export declare const PopoverTrigger: typeof popoverTrigger & {
|
|
10
11
|
displayName: string;
|
|
11
12
|
};
|
|
12
13
|
/**
|
|
13
|
-
* The popover surface. `data-side`/`data-align` drive
|
|
14
|
-
* `@gunkin/uiify/
|
|
15
|
-
* `data-uiify-popover-surface`.
|
|
14
|
+
* The popover surface. `data-side`/`data-align` drive required geometry in
|
|
15
|
+
* `@gunkin/uiify/components/behavior.css`; optional skins provide the gap. Emits `popover`, `data-side`, `data-align`, `data-positioning="native"` and
|
|
16
|
+
* `data-uiify-popover` with `data-part="surface"`.
|
|
16
17
|
*/
|
|
17
18
|
declare function popoverSurface(props: PopoverSurfaceProps): ReactElement;
|
|
18
19
|
export declare const PopoverSurface: typeof popoverSurface & {
|
|
19
20
|
displayName: string;
|
|
20
21
|
};
|
|
21
22
|
/**
|
|
22
|
-
* Hides `target`. Emits `data-uiify-popover-close`.
|
|
23
|
+
* Hides `target`. Emits `data-uiify-popover` with `data-part="close"`.
|
|
23
24
|
*/
|
|
24
25
|
declare function popoverClose<TAs extends ElementType = "button">(props: PopoverCloseProps<TAs>): ReactElement;
|
|
25
26
|
export declare const PopoverClose: typeof popoverClose & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/elements/popover/Popover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/elements/popover/Popover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAmCpB;;;;;GAKG;AACH,iBAAS,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACxD,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,CAed;AACD,eAAO,MAAM,cAAc;;CAEzB,CAAC;AAEH;;;;GAIG;AACH,iBAAS,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAehE;AACD,eAAO,MAAM,cAAc;;CAEzB,CAAC;AAEH;;GAEG;AACH,iBAAS,YAAY,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACtD,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAC5B,YAAY,CAUd;AACD,eAAO,MAAM,YAAY;;CAEvB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;CAInB,CAAC"}
|