@tarojs/components-advanced 4.1.12-beta.8 → 4.1.12-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/index.js +2 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/list/hooks/useListNestedScroll.d.ts +13 -0
- package/dist/components/list/hooks/useListNestedScroll.js +46 -0
- package/dist/components/list/hooks/useListNestedScroll.js.map +1 -0
- package/dist/components/list/hooks/useListScrollElementAttach.d.ts +21 -0
- package/dist/components/list/hooks/useListScrollElementAttach.js +86 -0
- package/dist/components/list/hooks/useListScrollElementAttach.js.map +1 -0
- package/dist/components/list/hooks/useMeasureStartOffset.d.ts +4 -2
- package/dist/components/list/hooks/useMeasureStartOffset.js +56 -15
- package/dist/components/list/hooks/useMeasureStartOffset.js.map +1 -1
- package/dist/components/list/hooks/useScrollParentAutoFind.d.ts +17 -0
- package/dist/components/list/hooks/useScrollParentAutoFind.js +54 -0
- package/dist/components/list/hooks/useScrollParentAutoFind.js.map +1 -0
- package/dist/components/list/index.d.ts +7 -12
- package/dist/components/list/index.js +53 -119
- package/dist/components/list/index.js.map +1 -1
- package/dist/components/water-flow/interface.d.ts +3 -3
- package/dist/components/water-flow/root.d.ts +8 -0
- package/dist/components/water-flow/root.js +33 -17
- package/dist/components/water-flow/root.js.map +1 -1
- package/dist/components/water-flow/section.d.ts +1 -1
- package/dist/components/water-flow/section.js +2 -2
- package/dist/components/water-flow/section.js.map +1 -1
- package/dist/components/water-flow/water-flow.d.ts +1 -0
- package/dist/components/water-flow/water-flow.js +79 -43
- package/dist/components/water-flow/water-flow.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/scrollParent.d.ts +22 -0
- package/dist/utils/scrollParent.js +55 -0
- package/dist/utils/scrollParent.js.map +1 -0
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"water-flow.js","sources":["../../../src/components/water-flow/water-flow.ts"],"sourcesContent":["import { BaseEventOrig, ScrollView, ScrollViewProps, View } from '@tarojs/components'\nimport { nextTick } from '@tarojs/taro'\nimport {\n Children,\n cloneElement,\n createElement,\n PropsWithChildren,\n ReactElement,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react'\n\nimport { debounce, getScrollViewContextNode } from '../../utils'\nimport { ListScrollElementContext } from '../list'\nimport { useMeasureStartOffset } from '../list/hooks/useMeasureStartOffset'\nimport { _FlowSectionProps } from './flow-section'\nimport { Root, RootEvents } from './root'\nimport { Section } from './section'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { getSysInfo, isH5 } from './utils'\n\nimport type { ScrollDirection, WaterFlowProps } from './interface'\n\ngetSysInfo()\n\nexport function WaterFlow({ children, ...props }: PropsWithChildren<WaterFlowProps>) {\n const {\n id,\n style = {},\n className,\n cacheCount = 1,\n onScrollToUpper,\n onScrollToLower,\n upperThresholdCount,\n lowerThresholdCount,\n scrollIntoView,\n type: flowType = 'default',\n scrollElement,\n startOffset,\n containerHeight,\n onScrollHeightChange,\n onScrollIntoViewComplete,\n ...rest\n } = props\n // 任务 4.1:支持从 ListScrollElementContext 获取(List 内嵌 WaterFlow 时)\n const listScrollCtx = useContext(ListScrollElementContext)\n const effectiveScrollElement = scrollElement ?? listScrollCtx?.scrollRef\n const contentWrapperRef = useRef<HTMLDivElement>(null)\n const measuredStartOffset = useMeasureStartOffset(\n effectiveScrollElement ?? { current: null },\n contentWrapperRef,\n {\n enabled: !!(\n (flowType === 'nested' && effectiveScrollElement && isH5) &&\n startOffset == null &&\n !listScrollCtx\n ),\n isHorizontal: false,\n }\n )\n const effectiveStartOffset = startOffset ?? listScrollCtx?.startOffset ?? measuredStartOffset ?? 0\n const effectiveContainerHeight = containerHeight ?? listScrollCtx?.containerHeight\n\n const startOffsetRef = useRef(effectiveStartOffset)\n const containerHeightRef = useRef(effectiveContainerHeight)\n const lastReportedHeightRef = useRef<number>(0)\n startOffsetRef.current = effectiveStartOffset\n containerHeightRef.current = effectiveContainerHeight\n\n // type=nested 时显式开启 scrollElement 模式;否则始终用 default(自有 ScrollView)\n const useScrollElementMode =\n flowType === 'nested' && !!(effectiveScrollElement && isH5)\n if (flowType === 'nested' && !effectiveScrollElement && isH5) {\n // eslint-disable-next-line no-console\n console.warn('[WaterFlow] type=nested 但无 scrollElement(props 或 Context),回退为 default')\n }\n const defaultId = useId().replace(/:/g, '')\n /**\n * 初始化数据模型\n */\n const root = useMemo(() => {\n return new Root({\n id: id ?? defaultId,\n cacheCount,\n upperThresholdCount,\n lowerThresholdCount,\n skipContainerMeasure: useScrollElementMode,\n })\n }, [id, cacheCount, upperThresholdCount, lowerThresholdCount, useScrollElementMode])\n const isScrolling$ = useObservedAttr(root, 'isScrolling')\n const scrollHeight$ = useObservedAttr(root, 'scrollHeight')\n const renderRange$ = useObservedAttr(root, 'renderRange')\n const refEventOrig = useRef<BaseEventOrig>()\n\n /**\n * 滚动事件\n */\n const handleScroll = useMemoizedFn((ev: BaseEventOrig<ScrollViewProps.onScrollDetail>) => {\n refEventOrig.current = ev\n root.sections.forEach((section) => section.getNodeRenderRange())\n const { scrollTop } = ev.detail\n // 确定滚动方向\n const scrollDirection: ScrollDirection = root.getState().scrollOffset < scrollTop ? 'forward' : 'backward'\n // 设置滚动信息,包括方向和偏移量\n root.setStateBatch({\n scrollDirection: scrollDirection,\n scrollOffset: scrollTop,\n isScrolling: true,\n })\n })\n\n const sections = useMemo(() => {\n const [start, end] = renderRange$\n return Children.map(children, (child: ReactElement<PropsWithChildren<_FlowSectionProps>>, order) => {\n if (Object.is(child, null)) {\n return null\n }\n const sectionProps = child.props\n const sectionId = sectionProps.id || `section-${order}`\n const childCount = Children.count(sectionProps.children)\n let section = root.findSection(sectionId)\n if (section) {\n const originalCount = section.count\n if (childCount > originalCount) {\n section.pushNodes(childCount - originalCount)\n }\n } else {\n section = new Section(root, {\n id: sectionId,\n order,\n col: sectionProps.column ?? 1,\n rowGap: sectionProps.rowGap || 0,\n columnGap: sectionProps.columnGap || 0,\n count: Children.count(sectionProps.children),\n })\n }\n\n return cloneElement(child, { section, key: `${props.id}-${order}` })\n })?.slice(start, end + 1)\n }, [renderRange$[0], renderRange$[1], children, root, props.id])\n\n const scrollTo = useMemoizedFn((scrollOffset = 0) => {\n scrollOffset = Math.max(0, scrollOffset)\n if (root.getState().scrollOffset === scrollOffset) return\n // scrollElement 模式下需操作外部容器,且需加上 startOffset\n if (useScrollElementMode && effectiveScrollElement?.current && isH5) {\n const el = effectiveScrollElement.current\n const scrollTarget = scrollOffset + (startOffsetRef.current ?? 0)\n el.scrollTo({ top: scrollTarget })\n root.setStateBatch({ scrollOffset, isScrolling: true })\n root.sections.forEach((s) => s.getNodeRenderRange())\n return\n }\n getScrollViewContextNode(`#${root.id}`).then((node: any) => {\n node.scrollTo({\n animated: true,\n duration: 300,\n top: scrollOffset,\n })\n })\n })\n\n const resetScrolling = useMemoizedFn(() => {\n root.setStateIn('isScrolling', false)\n })\n\n const debouncedResetScrolling = debounce(resetScrolling)\n\n useEffect(() => {\n debouncedResetScrolling()\n }, [isScrolling$])\n\n /**\n * 处理滚动阈值\n */\n useEffect(() => {\n const disposers = [\n root.sub(\n RootEvents.ReachUpperThreshold,\n debounce(() => {\n onScrollToUpper?.(refEventOrig.current!)\n })\n ),\n root.sub(\n RootEvents.ReachLowerThreshold,\n debounce(() => {\n onScrollToLower?.(refEventOrig.current!)\n })\n ),\n ]\n return () => {\n disposers.forEach((disposer) => {\n disposer()\n })\n }\n }, [onScrollToUpper, onScrollToLower])\n\n /**\n * 处理 scrollIntoView\n * 竞态:快速切换目标时,取消前一次滚动,避免后发先至\n */\n useEffect(() => {\n let cancelled = false\n handleScrollIntoView()\n async function handleScrollIntoView() {\n if (!scrollIntoView) return\n const targetNode = root.findNode(scrollIntoView)\n if (!targetNode) {\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n return\n }\n const targetSection = targetNode.section\n const doScroll = () => {\n if (cancelled) return\n scrollTo(targetNode.getState().scrollTop)\n if (cancelled) return\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n }\n if (!targetSection.getState().layouted) {\n const order = targetSection.order\n root.setStateIn('renderRange', [\n Math.min(renderRange$[0], order),\n Math.max(renderRange$[1], order),\n ])\n nextTick(async () => {\n await targetNode.section.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n })\n return\n }\n await targetSection.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n }\n return () => { cancelled = true }\n }, [scrollIntoView, renderRange$[0], renderRange$[1], onScrollIntoViewComplete])\n\n // 任务 3.3:scrollElement 模式下监听外部滚动,更新 root.scrollOffset\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n const el = effectiveScrollElement.current\n if (!el) return\n\n const handler = () => {\n const scrollTop = el.scrollTop\n const offset = scrollTop - (startOffsetRef.current ?? 0)\n const effectiveOffset = Math.max(0, offset)\n const scrollDirection: ScrollDirection = root.getState().scrollOffset < effectiveOffset ? 'forward' : 'backward'\n\n root.sections.forEach((section) => section.getNodeRenderRange())\n root.setStateBatch({\n scrollDirection,\n scrollOffset: effectiveOffset,\n isScrolling: true,\n })\n }\n\n // 同步初始位置\n handler()\n el.addEventListener('scroll', handler, { passive: true })\n return () => el.removeEventListener('scroll', handler)\n }, [useScrollElementMode, effectiveScrollElement, root])\n\n // 任务 4.2:scrollHeight 变化时回调,便于 List 动高联动(props 优先,其次从 Context 获取)\n // 防抖上报:Root 多源触发 updateScrollHeight 可能产生多轮不同值;等 150ms 无新值时上报当前值(视为布局收敛结果)\n const reportHeight = onScrollHeightChange ?? listScrollCtx?.reportNestedHeightChange\n useEffect(() => {\n if (!reportHeight || scrollHeight$ <= 0) return\n const timer = setTimeout(() => {\n if (Math.abs(lastReportedHeightRef.current - scrollHeight$) < 1) return\n lastReportedHeightRef.current = scrollHeight$\n reportHeight(scrollHeight$)\n }, 150)\n return () => clearTimeout(timer)\n }, [scrollHeight$, reportHeight])\n\n // 任务 3.4:scrollElement 模式下 containerSize 从 containerHeight / scrollElement 获取\n // ResizeObserver 监听 scrollElement 尺寸变化;containerHeight prop 变化时也需同步(如 List 内嵌时父传子)\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n const el = effectiveScrollElement.current\n if (!el || typeof ResizeObserver === 'undefined') return\n\n const update = () => {\n const height = containerHeightRef.current ?? el.clientHeight\n const width = el.clientWidth\n if (height > 0 && width > 0) {\n root.setStateIn('containerSize', { width, height })\n }\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [useScrollElementMode, effectiveScrollElement, root, effectiveContainerHeight])\n\n // 任务 3.2:scrollElement 模式下不渲染 ScrollView,只渲染内容 View\n // 内容高度必须为 scrollHeight,否则父 scrollElement 无法正确滚动;显式写 height 覆盖 style 中的 height\n if (useScrollElementMode) {\n return createElement(\n View,\n {\n ref: contentWrapperRef as any,\n id: root.id,\n style: {\n ...style,\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n className,\n },\n sections\n )\n }\n\n return createElement(\n ScrollView,\n {\n id: root.id,\n style: {\n WebkitOverflowScrolling: 'touch',\n overflow: 'auto',\n ...style,\n },\n className,\n scrollY: true,\n onScroll: handleScroll,\n ...rest,\n },\n createElement(\n View,\n {\n id: 'waterflow-root',\n style: {\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n },\n sections\n )\n )\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"water-flow.js","sources":["../../../src/components/water-flow/water-flow.ts"],"sourcesContent":["import { BaseEventOrig, ScrollView, ScrollViewProps, View } from '@tarojs/components'\nimport { type ScrollElementContextValue, ScrollElementContext } from '@tarojs/components-react'\nimport { nextTick } from '@tarojs/taro'\nimport {\n Children,\n cloneElement,\n createElement,\n PropsWithChildren,\n ReactElement,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react'\n\nimport { debounce, getScrollViewContextNode } from '../../utils'\nimport { useMeasureStartOffset } from '../list/hooks/useMeasureStartOffset'\nimport { useScrollParentAutoFind } from '../list/hooks/useScrollParentAutoFind'\nimport { _FlowSectionProps } from './flow-section'\nimport { Root, RootEvents } from './root'\nimport { Section } from './section'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { getSysInfo, isH5 } from './utils'\n\nimport type { ScrollDirection, WaterFlowProps } from './interface'\n\ngetSysInfo()\n\nexport function WaterFlow({ children, ...props }: PropsWithChildren<WaterFlowProps>) {\n const {\n id,\n style = {},\n className,\n cacheCount = 1,\n onScrollToUpper,\n onScrollToLower,\n upperThresholdCount,\n lowerThresholdCount,\n scrollIntoView,\n nestedScroll,\n scrollElement,\n startOffset,\n containerHeight,\n onScrollHeightChange,\n onScrollIntoViewComplete,\n ...rest\n } = props\n // 与 plato 对齐:nestedScroll=true 为嵌套模式,不配置则为 default\n const flowType = nestedScroll === true ? 'nested' : 'default'\n // 任务 4.1:从 ScrollElementContext 获取(List/ScrollView 内嵌时统一提供)\n const scrollElementCtx = useContext(ScrollElementContext) as ScrollElementContextValue | null\n const contentWrapperRef = useRef<HTMLDivElement>(null)\n const needAutoFind =\n flowType === 'nested' &&\n !scrollElement &&\n !scrollElementCtx?.scrollRef &&\n isH5\n const { scrollParentRef: autoFoundRef, status: autoFindStatus } = useScrollParentAutoFind(\n contentWrapperRef,\n { enabled: !!needAutoFind, isHorizontal: false }\n )\n const effectiveScrollElement =\n scrollElement ??\n scrollElementCtx?.scrollRef ??\n (needAutoFind && autoFindStatus === 'found' ? autoFoundRef : null)\n // 当 Context 的 startOffset 为 0 时也需测量:ScrollView 默认传 0,上方有固定内容时需自动测量\n const ctxStart = scrollElementCtx?.startOffset\n const hasExplicitStartOffset = ctxStart != null && ctxStart > 0\n const needMeasureStartOffset =\n flowType === 'nested' &&\n effectiveScrollElement &&\n isH5 &&\n startOffset == null &&\n !hasExplicitStartOffset\n const measuredStartOffset = useMeasureStartOffset(\n effectiveScrollElement ?? { current: null },\n contentWrapperRef,\n { enabled: !!needMeasureStartOffset, isHorizontal: false }\n )\n // 当 Context 传 0 或未传时用测量值兜底\n const effectiveStartOffset =\n startOffset ??\n (ctxStart != null && ctxStart > 0 ? ctxStart : null) ??\n measuredStartOffset ??\n 0\n const effectiveContainerHeight = containerHeight ?? scrollElementCtx?.containerHeight\n\n const startOffsetRef = useRef(effectiveStartOffset)\n const containerHeightRef = useRef(effectiveContainerHeight)\n const lastReportedHeightRef = useRef<number>(0)\n startOffsetRef.current = effectiveStartOffset\n containerHeightRef.current = effectiveContainerHeight\n\n // nestedScroll 时显式开启 scrollElement 模式;否则始终用 default(自有 ScrollView)\n const useScrollElementMode =\n flowType === 'nested' && !!(effectiveScrollElement && isH5)\n if (flowType === 'nested' && !effectiveScrollElement && isH5 && autoFindStatus === 'not-found') {\n // eslint-disable-next-line no-console\n console.warn('[WaterFlow] nestedScroll 模式但无 scrollElement(props/Context/自动查找),回退为 default,将渲染自有 ScrollView')\n }\n const defaultId = useId().replace(/:/g, '')\n /**\n * 初始化数据模型\n */\n const root = useMemo(() => {\n return new Root({\n id: id ?? defaultId,\n cacheCount,\n upperThresholdCount,\n lowerThresholdCount,\n skipContainerMeasure: useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending'),\n })\n }, [id, cacheCount, upperThresholdCount, lowerThresholdCount, useScrollElementMode, needAutoFind, autoFindStatus])\n const isScrolling$ = useObservedAttr(root, 'isScrolling')\n const scrollHeight$ = useObservedAttr(root, 'scrollHeight')\n const renderRange$ = useObservedAttr(root, 'renderRange')\n const refEventOrig = useRef<BaseEventOrig>()\n\n /**\n * 滚动事件\n */\n const handleScroll = useMemoizedFn((ev: BaseEventOrig<ScrollViewProps.onScrollDetail>) => {\n refEventOrig.current = ev\n root.sections.forEach((section) => section.getNodeRenderRange())\n const { scrollTop } = ev.detail\n // 确定滚动方向\n const scrollDirection: ScrollDirection = root.getState().scrollOffset < scrollTop ? 'forward' : 'backward'\n // 设置滚动信息,包括方向和偏移量\n root.setStateBatch({\n scrollDirection: scrollDirection,\n scrollOffset: scrollTop,\n isScrolling: true,\n })\n })\n\n const sections = useMemo(() => {\n const [start, end] = renderRange$\n return Children.map(children, (child: ReactElement<PropsWithChildren<_FlowSectionProps>>, order) => {\n if (Object.is(child, null)) {\n return null\n }\n const sectionProps = child.props\n const sectionId = sectionProps.id || `section-${order}`\n const childCount = Children.count(sectionProps.children)\n let section = root.findSection(sectionId)\n if (section) {\n const originalCount = section.count\n if (childCount > originalCount) {\n section.pushNodes(childCount - originalCount)\n }\n } else {\n section = new Section(root, {\n id: sectionId,\n order,\n col: sectionProps.column ?? 1,\n rowGap: sectionProps.rowGap || 0,\n columnGap: sectionProps.columnGap || 0,\n count: Children.count(sectionProps.children),\n })\n }\n\n return cloneElement(child, { section, key: `${props.id}-${order}` })\n })?.slice(start, end + 1)\n }, [renderRange$[0], renderRange$[1], children, root, props.id])\n\n const scrollTo = useMemoizedFn((scrollOffset = 0) => {\n scrollOffset = Math.max(0, scrollOffset)\n if (root.getState().scrollOffset === scrollOffset) return\n // scrollElement 模式下需操作外部容器,且需加上 startOffset\n if (useScrollElementMode && effectiveScrollElement?.current && isH5) {\n const el = effectiveScrollElement.current\n const scrollTarget = scrollOffset + (startOffsetRef.current ?? 0)\n el.scrollTo({ top: scrollTarget })\n root.setStateBatch({ scrollOffset, isScrolling: true })\n root.sections.forEach((s) => s.getNodeRenderRange())\n return\n }\n getScrollViewContextNode(`#${root.id}`).then((node: any) => {\n node.scrollTo({\n animated: true,\n duration: 300,\n top: scrollOffset,\n })\n })\n })\n\n const resetScrolling = useMemoizedFn(() => {\n root.setStateIn('isScrolling', false)\n })\n\n const debouncedResetScrolling = debounce(resetScrolling)\n\n useEffect(() => {\n debouncedResetScrolling()\n }, [isScrolling$])\n\n /**\n * 处理滚动阈值\n * root 需入参:autoFind 从 pending→found 时 root 会重建,必须对新 root 重新订阅\n */\n useEffect(() => {\n const disposers = [\n root.sub(\n RootEvents.ReachUpperThreshold,\n debounce(() => {\n onScrollToUpper?.(refEventOrig.current!)\n })\n ),\n root.sub(\n RootEvents.ReachLowerThreshold,\n debounce(() => {\n onScrollToLower?.(refEventOrig.current!)\n })\n ),\n ]\n return () => {\n disposers.forEach((disposer) => {\n disposer()\n })\n }\n }, [root, onScrollToUpper, onScrollToLower])\n\n /**\n * 处理 scrollIntoView\n * 竞态:快速切换目标时,取消前一次滚动,避免后发先至\n */\n useEffect(() => {\n let cancelled = false\n handleScrollIntoView()\n async function handleScrollIntoView() {\n if (!scrollIntoView) return\n const targetNode = root.findNode(scrollIntoView)\n if (!targetNode) {\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n return\n }\n const targetSection = targetNode.section\n const doScroll = () => {\n if (cancelled) return\n scrollTo(targetNode.getState().scrollTop)\n if (cancelled) return\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n }\n if (!targetSection.getState().layouted) {\n const order = targetSection.order\n root.setStateIn('renderRange', [\n Math.min(renderRange$[0], order),\n Math.max(renderRange$[1], order),\n ])\n nextTick(async () => {\n await targetNode.section.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n })\n return\n }\n await targetSection.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n }\n return () => { cancelled = true }\n }, [scrollIntoView, renderRange$[0], renderRange$[1], onScrollIntoViewComplete])\n\n // 任务 3.3:scrollElement 模式下监听外部滚动,更新 root.scrollOffset\n // effectiveStartOffset 变化时(如自动测量完成)需重新同步\n // 内嵌时 scrollRef 可能尚未就绪(父 List 的 useLayoutEffect 晚于子 useEffect),需重试\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n\n let cancelled = false\n let teardown: (() => void) | null = null\n const maxRetries = 20\n\n const tryAttach = (retryCount = 0) => {\n if (cancelled) return\n const target = effectiveScrollElement.current\n if (!target) {\n if (retryCount < maxRetries) {\n requestAnimationFrame(() => tryAttach(retryCount + 1))\n }\n return\n }\n\n const handler = () => {\n const scrollTop = target.scrollTop\n const offset = scrollTop - (startOffsetRef.current ?? 0)\n const effectiveOffset = Math.max(0, offset)\n const prevOffset = root.getState().scrollOffset\n const scrollDirection: ScrollDirection = prevOffset < effectiveOffset ? 'forward' : 'backward'\n\n root.sections.forEach((section) => section.getNodeRenderRange())\n root.setStateBatch({\n scrollDirection,\n scrollOffset: effectiveOffset,\n isScrolling: true,\n })\n }\n\n const initialOffset = Math.max(0, target.scrollTop - (startOffsetRef.current ?? 0))\n root.setStateBatch({ scrollOffset: initialOffset, isScrolling: true })\n root.sections.forEach((s) => s.getNodeRenderRange())\n target.addEventListener('scroll', handler, { passive: true })\n teardown = () => target.removeEventListener('scroll', handler)\n }\n\n tryAttach()\n return () => {\n cancelled = true\n teardown?.()\n }\n }, [useScrollElementMode, effectiveScrollElement, root, effectiveStartOffset])\n\n // 任务 4.2:scrollHeight 变化时回调,便于 List 动高联动(props 优先,其次从 Context 获取)\n // 防抖上报:Root 多源触发 updateScrollHeight 可能产生多轮不同值;等 150ms 无新值时上报当前值(视为布局收敛结果)\n const reportHeight = onScrollHeightChange ?? scrollElementCtx?.reportNestedHeightChange\n useEffect(() => {\n if (!reportHeight || scrollHeight$ <= 0) return\n const timer = setTimeout(() => {\n if (Math.abs(lastReportedHeightRef.current - scrollHeight$) < 1) return\n lastReportedHeightRef.current = scrollHeight$\n reportHeight(scrollHeight$)\n }, 150)\n return () => clearTimeout(timer)\n }, [scrollHeight$, reportHeight])\n\n // 任务 3.4:scrollElement 模式下 containerSize 从 containerHeight / scrollElement 获取\n // ResizeObserver 监听 scrollElement 尺寸变化;containerHeight prop 变化时也需同步(如 List 内嵌时父传子)\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n const el = effectiveScrollElement.current\n if (!el || typeof ResizeObserver === 'undefined') return\n\n const update = () => {\n const height = containerHeightRef.current ?? el.clientHeight\n const width = el.clientWidth\n if (height > 0 && width > 0) {\n root.setStateIn('containerSize', { width, height })\n }\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [useScrollElementMode, effectiveScrollElement, root, effectiveContainerHeight])\n\n // 任务 3.2:scrollElement 模式下不渲染 ScrollView,只渲染内容 View\n // 内容高度必须为 scrollHeight,否则父 scrollElement 无法正确滚动;显式写 height 覆盖 style 中的 height\n // needAutoFind && pending:probe 阶段,渲染 View 以便 hook 能查找父滚动容器\n const renderView =\n useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending')\n if (renderView) {\n return createElement(\n View,\n {\n ref: contentWrapperRef as any,\n id: root.id,\n style: {\n ...style,\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n className,\n },\n sections\n )\n }\n\n return createElement(\n ScrollView,\n {\n id: root.id,\n style: {\n WebkitOverflowScrolling: 'touch',\n overflow: 'auto',\n ...style,\n },\n className,\n scrollY: true,\n onScroll: handleScroll,\n ...rest,\n },\n createElement(\n View,\n {\n id: 'waterflow-root',\n style: {\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n },\n sections\n )\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA4BA,UAAU,EAAE;AAEN,SAAU,SAAS,CAAC,EAAyD,EAAA;;AAAzD,IAAA,IAAA,EAAE,QAAQ,EAA+C,GAAA,EAAA,EAA1C,KAAK,GAAA,MAAA,CAAA,EAAA,EAApB,YAAsB,CAAF;AAC5C,IAAA,MAAM,EACJ,EAAE,EACF,KAAK,GAAG,EAAE,EACV,SAAS,EACT,UAAU,GAAG,CAAC,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EAAA,GAEtB,KAAK,EADJ,IAAI,UACL;;AAjBE,MAAA,CAAA,IAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,0BAAA,CAiBL,CAAQ;;AAET,IAAA,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,GAAG,QAAQ,GAAG,SAAS;;AAE7D,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,CAAqC;AAC7F,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAiB,IAAI,CAAC;AACtD,IAAA,MAAM,YAAY,GAChB,QAAQ,KAAK,QAAQ;AACrB,QAAA,CAAC,aAAa;QACd,EAAC,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,CAAA;AAC5B,QAAA,IAAI;IACN,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,uBAAuB,CACvF,iBAAiB,EACjB,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,CACjD;AACD,IAAA,MAAM,sBAAsB,GAC1B,CAAA,EAAA,GAAA,aAAa,aAAb,aAAa,KAAA,KAAA,CAAA,GAAb,aAAa,GACb,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAhB,gBAAgB,CAAE,SAAS,MAC3B,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,IAAC,YAAY,IAAI,cAAc,KAAK,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC;;IAEpE,MAAM,QAAQ,GAAG,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAhB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,gBAAgB,CAAE,WAAW;IAC9C,MAAM,sBAAsB,GAAG,QAAQ,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC;AAC/D,IAAA,MAAM,sBAAsB,GAC1B,QAAQ,KAAK,QAAQ;QACrB,sBAAsB;QACtB,IAAI;AACJ,QAAA,WAAW,IAAI,IAAI;AACnB,QAAA,CAAC,sBAAsB;AACzB,IAAA,MAAM,mBAAmB,GAAG,qBAAqB,CAC/C,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,KAAA,KAAA,CAAA,GAAtB,sBAAsB,GAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAC3C,iBAAiB,EACjB,EAAE,OAAO,EAAE,CAAC,CAAC,sBAAsB,EAAE,YAAY,EAAE,KAAK,EAAE,CAC3D;;AAED,IAAA,MAAM,oBAAoB,GACxB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,KAAA,CAAA,GAAX,WAAW,IACV,QAAQ,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GACpD,mBAAmB,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GACnB,CAAC;AACH,IAAA,MAAM,wBAAwB,GAAG,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,eAAe,GAAI,gBAAgB,aAAhB,gBAAgB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAhB,gBAAgB,CAAE,eAAe;AAErF,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC3D,IAAA,MAAM,qBAAqB,GAAG,MAAM,CAAS,CAAC,CAAC;AAC/C,IAAA,cAAc,CAAC,OAAO,GAAG,oBAAoB;AAC7C,IAAA,kBAAkB,CAAC,OAAO,GAAG,wBAAwB;;AAGrD,IAAA,MAAM,oBAAoB,GACxB,QAAQ,KAAK,QAAQ,IAAI,CAAC,EAAE,sBAAsB,IAAI,IAAI,CAAC;AAC7D,IAAA,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,sBAAsB,IAAI,IAAI,IAAI,cAAc,KAAK,WAAW,EAAE;;AAE9F,QAAA,OAAO,CAAC,IAAI,CAAC,8FAA8F,CAAC;;IAE9G,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3C;;AAEG;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAK;QACxB,OAAO,IAAI,IAAI,CAAC;AACd,YAAA,EAAE,EAAE,EAAE,KAAA,IAAA,IAAF,EAAE,KAAF,KAAA,CAAA,GAAA,EAAE,GAAI,SAAS;YACnB,UAAU;YACV,mBAAmB;YACnB,mBAAmB;YACnB,oBAAoB,EAAE,oBAAoB,KAAK,CAAC,CAAC,YAAY,IAAI,cAAc,KAAK,SAAS,CAAC;AAC/F,SAAA,CAAC;AACJ,KAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IAClH,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC;IACzD,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC;IAC3D,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC;AACzD,IAAA,MAAM,YAAY,GAAG,MAAM,EAAiB;AAE5C;;AAEG;AACH,IAAA,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,EAAiD,KAAI;AACvF,QAAA,YAAY,CAAC,OAAO,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAChE,QAAA,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;;AAE/B,QAAA,MAAM,eAAe,GAAoB,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU;;QAE1G,IAAI,CAAC,aAAa,CAAC;AACjB,YAAA,eAAe,EAAE,eAAe;AAChC,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAK;;AAC5B,QAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY;AACjC,QAAA,OAAO,CAAA,EAAA,GAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAyD,EAAE,KAAK,KAAI;;YACjG,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AAC1B,gBAAA,OAAO,IAAI;;AAEb,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK;YAChC,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE;YACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;YACxD,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YACzC,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK;AACnC,gBAAA,IAAI,UAAU,GAAG,aAAa,EAAE;AAC9B,oBAAA,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,aAAa,CAAC;;;iBAE1C;AACL,gBAAA,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;AAC1B,oBAAA,EAAE,EAAE,SAAS;oBACb,KAAK;AACL,oBAAA,GAAG,EAAE,CAAA,EAAA,GAAA,YAAY,CAAC,MAAM,mCAAI,CAAC;AAC7B,oBAAA,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC;AAChC,oBAAA,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,CAAC;oBACtC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC7C,iBAAA,CAAC;;AAGJ,YAAA,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAG,EAAA,KAAK,CAAC,EAAE,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,EAAE,CAAC;SACrE,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC;KAC1B,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,YAAY,GAAG,CAAC,KAAI;;QAClD,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,KAAK,YAAY;YAAE;;AAEnD,QAAA,IAAI,oBAAoB,KAAI,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAtB,sBAAsB,CAAE,OAAO,CAAA,IAAI,IAAI,EAAE;AACnE,YAAA,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO;AACzC,YAAA,MAAM,YAAY,GAAG,YAAY,IAAI,CAAA,EAAA,GAAA,cAAc,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC;YACjE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACvD,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACpD;;AAEF,QAAA,wBAAwB,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,KAAI;YACzD,IAAI,CAAC,QAAQ,CAAC;AACZ,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,GAAG,EAAE,YAAY;AAClB,aAAA,CAAC;AACJ,SAAC,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,MAAM,cAAc,GAAG,aAAa,CAAC,MAAK;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC;AACvC,KAAC,CAAC;AAEF,IAAA,MAAM,uBAAuB,GAAG,QAAQ,CAAC,cAAc,CAAC;IAExD,SAAS,CAAC,MAAK;AACb,QAAA,uBAAuB,EAAE;AAC3B,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AAElB;;;AAGG;IACH,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,SAAS,GAAG;YAChB,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,mBAAmB,EAC9B,QAAQ,CAAC,MAAK;gBACZ,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAe,CAAG,YAAY,CAAC,OAAQ,CAAC;AAC1C,aAAC,CAAC,CACH;YACD,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,mBAAmB,EAC9B,QAAQ,CAAC,MAAK;gBACZ,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAe,CAAG,YAAY,CAAC,OAAQ,CAAC;AAC1C,aAAC,CAAC,CACH;SACF;AACD,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AAC7B,gBAAA,QAAQ,EAAE;AACZ,aAAC,CAAC;AACJ,SAAC;KACF,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;AAE5C;;;AAGG;IACH,SAAS,CAAC,MAAK;QACb,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,oBAAoB,EAAE;AACtB,QAAA,eAAe,oBAAoB,GAAA;AACjC,YAAA,IAAI,CAAC,cAAc;gBAAE;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChD,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,QAAQ,CAAC,MAAQ,EAAA,IAAI,CAAC,SAAS;oBAAE,wBAAwB,KAAA,IAAA,IAAxB,wBAAwB,KAAxB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,wBAAwB,EAAI,CAAA,EAAE,CAAC;gBAChE;;AAEF,YAAA,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO;YACxC,MAAM,QAAQ,GAAG,MAAK;AACpB,gBAAA,IAAI,SAAS;oBAAE;gBACf,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;AACzC,gBAAA,IAAI,SAAS;oBAAE;AACf,gBAAA,QAAQ,CAAC,MAAQ,EAAA,IAAI,CAAC,SAAS;oBAAE,wBAAwB,KAAA,IAAA,IAAxB,wBAAwB,KAAxB,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,wBAAwB,EAAI,CAAA,EAAE,CAAC;AAClE,aAAC;YACD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;AACtC,gBAAA,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK;AACjC,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;oBAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAChC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AACjC,iBAAA,CAAC;gBACF,QAAQ,CAAC,YAAW;AAClB,oBAAA,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO;AAC/C,oBAAA,IAAI,SAAS;wBAAE;AACf,oBAAA,QAAQ,EAAE;AACZ,iBAAC,CAAC;gBACF;;AAEF,YAAA,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO;AAC1C,YAAA,IAAI,SAAS;gBAAE;AACf,YAAA,QAAQ,EAAE;;QAEZ,OAAO,MAAQ,EAAA,SAAS,GAAG,IAAI,CAAA,EAAE;AACnC,KAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;;;;IAKhF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC,sBAAsB;YAAE;QAEtD,IAAI,SAAS,GAAG,KAAK;QACrB,IAAI,QAAQ,GAAwB,IAAI;QACxC,MAAM,UAAU,GAAG,EAAE;AAErB,QAAA,MAAM,SAAS,GAAG,CAAC,UAAU,GAAG,CAAC,KAAI;;AACnC,YAAA,IAAI,SAAS;gBAAE;AACf,YAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO;YAC7C,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,IAAI,UAAU,GAAG,UAAU,EAAE;oBAC3B,qBAAqB,CAAC,MAAM,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;;gBAExD;;YAGF,MAAM,OAAO,GAAG,MAAK;;AACnB,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;AAClC,gBAAA,MAAM,MAAM,GAAG,SAAS,IAAI,CAAA,EAAA,GAAA,cAAc,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC;gBACxD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;gBAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY;AAC/C,gBAAA,MAAM,eAAe,GAAoB,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,UAAU;AAE9F,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAChE,IAAI,CAAC,aAAa,CAAC;oBACjB,eAAe;AACf,oBAAA,YAAY,EAAE,eAAe;AAC7B,oBAAA,WAAW,EAAE,IAAI;AAClB,iBAAA,CAAC;AACJ,aAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,MAAA,cAAc,CAAC,OAAO,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAC,CAAC,CAAC;AACnF,YAAA,IAAI,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACtE,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;AACpD,YAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7D,YAAA,QAAQ,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC;AAChE,SAAC;AAED,QAAA,SAAS,EAAE;AACX,QAAA,OAAO,MAAK;YACV,SAAS,GAAG,IAAI;AAChB,YAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,EAAI;AACd,SAAC;KACF,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;;;AAI9E,IAAA,MAAM,YAAY,GAAG,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAApB,KAAA,CAAA,GAAA,oBAAoB,GAAI,gBAAgB,aAAhB,gBAAgB,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAhB,gBAAgB,CAAE,wBAAwB;IACvF,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,aAAa,IAAI,CAAC;YAAE;AACzC,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAK;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC;gBAAE;AACjE,YAAA,qBAAqB,CAAC,OAAO,GAAG,aAAa;YAC7C,YAAY,CAAC,aAAa,CAAC;SAC5B,EAAE,GAAG,CAAC;AACP,QAAA,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC;AAClC,KAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;;;IAIjC,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC,sBAAsB;YAAE;AACtD,QAAA,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO;AACzC,QAAA,IAAI,CAAC,EAAE,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE;QAElD,MAAM,MAAM,GAAG,MAAK;;YAClB,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,kBAAkB,CAAC,OAAO,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,CAAC,YAAY;AAC5D,YAAA,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW;YAC5B,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;gBAC3B,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;;AAEvD,SAAC;AACD,QAAA,MAAM,EAAE;AACR,QAAA,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC;AACrC,QAAA,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACd,QAAA,OAAO,MAAM,EAAE,CAAC,UAAU,EAAE;KAC7B,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;;;;AAKlF,IAAA,MAAM,UAAU,GACd,oBAAoB,KAAK,CAAC,CAAC,YAAY,IAAI,cAAc,KAAK,SAAS,CAAC;IAC1E,IAAI,UAAU,EAAE;QACd,OAAO,aAAa,CAClB,IAAI,EACJ;AACE,YAAA,GAAG,EAAE,iBAAwB;YAC7B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACA,KAAK,CAAA,EAAA,EACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,EAC9C,CAAA;YACD,SAAS;SACV,EACD,QAAQ,CACT;;AAGH,IAAA,OAAO,aAAa,CAClB,UAAU,EAER,MAAA,CAAA,MAAA,CAAA,EAAA,EAAE,EAAE,IAAI,CAAC,EAAE,EACX,KAAK,EACH,MAAA,CAAA,MAAA,CAAA,EAAA,uBAAuB,EAAE,OAAO,EAChC,QAAQ,EAAE,MAAM,EAAA,EACb,KAAK,CAEV,EAAA,SAAS,EACT,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,YAAY,EACnB,EAAA,IAAI,GAET,aAAa,CACX,IAAI,EACJ;AACE,QAAA,EAAE,EAAE,gBAAgB;AACpB,QAAA,KAAK,EAAE;AACL,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,aAAa;YACrB,aAAa,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM;AAC9C,SAAA;KACF,EACD,QAAQ,CACT,CACF;AACH;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './components/index.js';
|
|
2
2
|
import './utils/index.js';
|
|
3
|
-
export {
|
|
3
|
+
export { ScrollElementContext as ListScrollElementContext } from '@tarojs/components-react';
|
|
4
|
+
export { List, accumulate, isShaking } from './components/list/index.js';
|
|
4
5
|
export { ListItem } from './components/list/ListItem.js';
|
|
5
6
|
export { NoMore } from './components/list/NoMore.js';
|
|
6
7
|
export { StickyHeader } from './components/list/StickyHeader.js';
|
|
@@ -15,5 +16,6 @@ export { getRectSize, getRectSizeSync, getScrollViewContextNode } from './utils/
|
|
|
15
16
|
export { defaultItemKey, getOffsetForIndexAndAlignment } from './utils/helper.js';
|
|
16
17
|
export { debounce, omit, throttle } from './utils/lodash.js';
|
|
17
18
|
export { getMiddleNumber, isCosDistributing } from './utils/math.js';
|
|
19
|
+
export { findScrollParent, isScrollableElement } from './utils/scrollParent.js';
|
|
18
20
|
export { cancelTimeout, requestTimeout } from './utils/timer.js';
|
|
19
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -3,5 +3,6 @@ export { getRectSize, getRectSizeSync, getScrollViewContextNode } from './dom.js
|
|
|
3
3
|
export { defaultItemKey, getOffsetForIndexAndAlignment } from './helper.js';
|
|
4
4
|
export { debounce, omit, throttle } from './lodash.js';
|
|
5
5
|
export { getMiddleNumber, isCosDistributing } from './math.js';
|
|
6
|
+
export { findScrollParent, isScrollableElement } from './scrollParent.js';
|
|
6
7
|
export { cancelTimeout, requestTimeout } from './timer.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 查找元素的真实滚动父节点。
|
|
3
|
+
* 用于 nestedScroll 模式下无 props/Context 时自动获取 scrollElement。
|
|
4
|
+
*
|
|
5
|
+
* 策略:
|
|
6
|
+
* 1. 优先命中 Taro ScrollView 类名 .taro-scroll
|
|
7
|
+
* 2. 回退:向上遍历找通用可滚动祖先
|
|
8
|
+
*
|
|
9
|
+
* 严格条件(均需满足):
|
|
10
|
+
* - overflow 为 auto | scroll | overlay
|
|
11
|
+
* - scrollHeight > clientHeight(纵向)或 scrollWidth > clientWidth(横向)
|
|
12
|
+
* - 在 document.body 前停止
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* 判断元素是否可滚动(严格:overflow 可滚动 + 实际有溢出)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isScrollableElement(el: HTMLElement | null, vertical?: boolean): el is HTMLElement;
|
|
18
|
+
/**
|
|
19
|
+
* 从给定元素向上查找最近的滚动父节点。
|
|
20
|
+
* 优先匹配 .taro-scroll,未命中则按通用可滚动条件查找。
|
|
21
|
+
*/
|
|
22
|
+
export declare function findScrollParent(el: HTMLElement | null, vertical?: boolean): HTMLElement | null;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 查找元素的真实滚动父节点。
|
|
3
|
+
* 用于 nestedScroll 模式下无 props/Context 时自动获取 scrollElement。
|
|
4
|
+
*
|
|
5
|
+
* 策略:
|
|
6
|
+
* 1. 优先命中 Taro ScrollView 类名 .taro-scroll
|
|
7
|
+
* 2. 回退:向上遍历找通用可滚动祖先
|
|
8
|
+
*
|
|
9
|
+
* 严格条件(均需满足):
|
|
10
|
+
* - overflow 为 auto | scroll | overlay
|
|
11
|
+
* - scrollHeight > clientHeight(纵向)或 scrollWidth > clientWidth(横向)
|
|
12
|
+
* - 在 document.body 前停止
|
|
13
|
+
*/
|
|
14
|
+
const SCROLLABLE_OVERFLOW = ['auto', 'scroll', 'overlay'];
|
|
15
|
+
/**
|
|
16
|
+
* 判断元素是否可滚动(严格:overflow 可滚动 + 实际有溢出)
|
|
17
|
+
*/
|
|
18
|
+
function isScrollableElement(el, vertical = true) {
|
|
19
|
+
if (!el || el === document.body)
|
|
20
|
+
return false;
|
|
21
|
+
const style = getComputedStyle(el);
|
|
22
|
+
const overflow = vertical ? style.overflowY : style.overflowX;
|
|
23
|
+
if (!SCROLLABLE_OVERFLOW.includes(overflow))
|
|
24
|
+
return false;
|
|
25
|
+
const hasOverflow = vertical
|
|
26
|
+
? el.scrollHeight > el.clientHeight
|
|
27
|
+
: el.scrollWidth > el.clientWidth;
|
|
28
|
+
return hasOverflow;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 从给定元素向上查找最近的滚动父节点。
|
|
32
|
+
* 优先匹配 .taro-scroll,未命中则按通用可滚动条件查找。
|
|
33
|
+
*/
|
|
34
|
+
function findScrollParent(el, vertical = true) {
|
|
35
|
+
var _a;
|
|
36
|
+
if (!el)
|
|
37
|
+
return null;
|
|
38
|
+
// 1. 优先:Taro ScrollView 的 div(.taro-scroll)
|
|
39
|
+
const taroScroll = (_a = el.closest) === null || _a === void 0 ? void 0 : _a.call(el, '.taro-scroll');
|
|
40
|
+
if (taroScroll && taroScroll !== document.body && isScrollableElement(taroScroll, vertical)) {
|
|
41
|
+
return taroScroll;
|
|
42
|
+
}
|
|
43
|
+
// 2. 回退:通用可滚动祖先
|
|
44
|
+
let parent = el.parentElement;
|
|
45
|
+
while (parent !== null && parent !== document.body) {
|
|
46
|
+
if (isScrollableElement(parent, vertical))
|
|
47
|
+
return parent;
|
|
48
|
+
const next = parent.parentElement;
|
|
49
|
+
parent = next;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { findScrollParent, isScrollableElement };
|
|
55
|
+
//# sourceMappingURL=scrollParent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollParent.js","sources":["../../src/utils/scrollParent.ts"],"sourcesContent":["/**\n * 查找元素的真实滚动父节点。\n * 用于 nestedScroll 模式下无 props/Context 时自动获取 scrollElement。\n *\n * 策略:\n * 1. 优先命中 Taro ScrollView 类名 .taro-scroll\n * 2. 回退:向上遍历找通用可滚动祖先\n *\n * 严格条件(均需满足):\n * - overflow 为 auto | scroll | overlay\n * - scrollHeight > clientHeight(纵向)或 scrollWidth > clientWidth(横向)\n * - 在 document.body 前停止\n */\n\nconst SCROLLABLE_OVERFLOW = ['auto', 'scroll', 'overlay'] as const\n\n/**\n * 判断元素是否可滚动(严格:overflow 可滚动 + 实际有溢出)\n */\nexport function isScrollableElement(\n el: HTMLElement | null,\n vertical = true\n): el is HTMLElement {\n if (!el || el === document.body) return false\n const style = getComputedStyle(el)\n const overflow = vertical ? style.overflowY : style.overflowX\n if (!SCROLLABLE_OVERFLOW.includes(overflow as any)) return false\n const hasOverflow = vertical\n ? el.scrollHeight > el.clientHeight\n : el.scrollWidth > el.clientWidth\n return hasOverflow\n}\n\n/**\n * 从给定元素向上查找最近的滚动父节点。\n * 优先匹配 .taro-scroll,未命中则按通用可滚动条件查找。\n */\nexport function findScrollParent(\n el: HTMLElement | null,\n vertical = true\n): HTMLElement | null {\n if (!el) return null\n\n // 1. 优先:Taro ScrollView 的 div(.taro-scroll)\n const taroScroll = el.closest?.('.taro-scroll')\n if (taroScroll && taroScroll !== document.body && isScrollableElement(taroScroll as HTMLElement, vertical)) {\n return taroScroll as HTMLElement\n }\n\n // 2. 回退:通用可滚动祖先\n let parent: HTMLElement | null = el.parentElement\n while (parent !== null && parent !== document.body) {\n if (isScrollableElement(parent, vertical)) return parent\n const next = parent.parentElement\n parent = next\n }\n return null\n}\n\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;AAYG;AAEH,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU;AAElE;;AAEG;SACa,mBAAmB,CACjC,EAAsB,EACtB,QAAQ,GAAG,IAAI,EAAA;AAEf,IAAA,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI;AAAE,QAAA,OAAO,KAAK;AAC7C,IAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;AAClC,IAAA,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAC7D,IAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAe,CAAC;AAAE,QAAA,OAAO,KAAK;IAChE,MAAM,WAAW,GAAG;AAClB,UAAE,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC;UACrB,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW;AACnC,IAAA,OAAO,WAAW;AACpB;AAEA;;;AAGG;SACa,gBAAgB,CAC9B,EAAsB,EACtB,QAAQ,GAAG,IAAI,EAAA;;AAEf,IAAA,IAAI,CAAC,EAAE;AAAE,QAAA,OAAO,IAAI;;IAGpB,MAAM,UAAU,GAAG,CAAA,EAAA,GAAA,EAAE,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,cAAc,CAAC;AAC/C,IAAA,IAAI,UAAU,IAAI,UAAU,KAAK,QAAQ,CAAC,IAAI,IAAI,mBAAmB,CAAC,UAAyB,EAAE,QAAQ,CAAC,EAAE;AAC1G,QAAA,OAAO,UAAyB;;;AAIlC,IAAA,IAAI,MAAM,GAAuB,EAAE,CAAC,aAAa;IACjD,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,EAAE;AAClD,QAAA,IAAI,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAE,YAAA,OAAO,MAAM;AACxD,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa;QACjC,MAAM,GAAG,IAAI;;AAEf,IAAA,OAAO,IAAI;AACb;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tarojs/components-advanced",
|
|
3
|
-
"version": "4.1.12-beta.
|
|
3
|
+
"version": "4.1.12-beta.9",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "O2Team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"csstype": "^3.1.1",
|
|
21
21
|
"memoize-one": "^6.0.0",
|
|
22
22
|
"tslib": "^2.6.2",
|
|
23
|
-
"@tarojs/components": "4.1.12-beta.
|
|
24
|
-
"@tarojs/components
|
|
23
|
+
"@tarojs/components-react": "4.1.12-beta.9",
|
|
24
|
+
"@tarojs/components": "4.1.12-beta.9"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"vue": "3.2.47",
|
|
28
|
-
"@tarojs/
|
|
29
|
-
"@tarojs/
|
|
30
|
-
"@tarojs/taro": "4.1.12-beta.
|
|
28
|
+
"@tarojs/shared": "4.1.12-beta.9",
|
|
29
|
+
"@tarojs/runtime": "4.1.12-beta.9",
|
|
30
|
+
"@tarojs/taro": "4.1.12-beta.9"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"react": ">=18",
|
|
34
|
-
"@tarojs/
|
|
35
|
-
"@tarojs/taro": "~4.1.12-beta.
|
|
36
|
-
"@tarojs/
|
|
34
|
+
"@tarojs/runtime": "~4.1.12-beta.9",
|
|
35
|
+
"@tarojs/taro": "~4.1.12-beta.9",
|
|
36
|
+
"@tarojs/shared": "~4.1.12-beta.9"
|
|
37
37
|
},
|
|
38
38
|
"peerDependenciesMeta": {
|
|
39
39
|
"react": {
|