{"version":3,"names":["createMemo","createSignal","untrack","useDialogRootContext","clamp","useIsoLayoutEffect","useDrawerRootContext","resolveSnapPointValue","snapPoint","viewportHeight","rootFontSize","Number","isFinite","trimmed","trim","endsWith","value","parseFloat","findClosestSnapPoint","height","points","closest","closestDistance","Infinity","point","distance","Math","abs","useDrawerSnapPoints","rootCtx","drawer","viewportElement","setViewportHeight","ownedWrite","setRootFontSize","measureViewportHeight","el","doc","ownerDocument","document","html","documentElement","offsetHeight","clientHeight","fontSize","getComputedStyle","ResizeObserver","undefined","resizeObserver","observe","disconnect","resolvedSnapPoints","snapPoints","popupHeight","viewportH","length","maxHeight","min","resolved","map","resolvedHeight","clampedHeight","offset","max","filter","p","Boolean","deduped","seenHeights","i","dup","some","h","push","reverse","resolvedActiveSnapPoint","active","activeSnapPoint","exact","find","Object","is","setActiveSnapPoint","activeSnapPointOffset"],"sources":["use-drawer-snap-points.ts"],"sourcesContent":["/**\n * `useDrawerSnapPoints` — resolves the configured snap points against the\n * measured popup / viewport geometry, derives offsets, and picks the\n * currently-active snap point.\n *\n * 1:1 port of Base UI React's\n * `packages/react/src/drawer/root/useDrawerSnapPoints.ts`. Solid deviations:\n *\n * - React's `useStableCallback` inside `measureViewportHeight` becomes a\n *   plain function — Solid has no render cycle, callbacks close over the\n *   current signals directly.\n * - `useIsoLayoutEffect` uses the split compute/apply form.\n * - Under happy-dom (test env), `offsetHeight` / `ResizeObserver` return 0\n *   / are absent, so `resolvedSnapPoints` is always `[]` and\n *   `activeSnapPointOffset` is `null`. The test suite exercises the\n *   structural contract; a real-browser pass is required for geometry\n *   correctness.\n */\n\nimport { type Accessor, createMemo, createSignal, untrack } from \"solid-js\";\nimport { useDialogRootContext } from \"../../dialog/dialog-root-context\";\nimport { clamp } from \"../../internals/slider-utils/clamp\";\nimport { useIsoLayoutEffect } from \"../../internals/use-iso-layout-effect\";\nimport {\n\ttype DrawerRootSnapPointChangeEventDetails,\n\ttype DrawerSnapPoint,\n\tuseDrawerRootContext,\n} from \"./drawer-root-context\";\n\nexport interface ResolvedDrawerSnapPoint {\n\tvalue: DrawerSnapPoint;\n\theight: number;\n\toffset: number;\n}\n\nfunction resolveSnapPointValue(\n\tsnapPoint: DrawerSnapPoint,\n\tviewportHeight: number,\n\trootFontSize: number,\n): number | null {\n\tif (!Number.isFinite(viewportHeight) || viewportHeight <= 0) return null;\n\n\tif (typeof snapPoint === \"number\") {\n\t\tif (!Number.isFinite(snapPoint)) return null;\n\t\tif (snapPoint <= 1) return clamp(snapPoint, 0, 1) * viewportHeight;\n\t\treturn snapPoint;\n\t}\n\n\tconst trimmed = snapPoint.trim();\n\tif (trimmed.endsWith(\"px\")) {\n\t\tconst value = Number.parseFloat(trimmed);\n\t\treturn Number.isFinite(value) ? value : null;\n\t}\n\tif (trimmed.endsWith(\"rem\")) {\n\t\tconst value = Number.parseFloat(trimmed);\n\t\treturn Number.isFinite(value) ? value * rootFontSize : null;\n\t}\n\treturn null;\n}\n\nfunction findClosestSnapPoint(\n\theight: number,\n\tpoints: ResolvedDrawerSnapPoint[],\n): ResolvedDrawerSnapPoint | null {\n\tlet closest: ResolvedDrawerSnapPoint | null = null;\n\tlet closestDistance = Infinity;\n\tfor (const point of points) {\n\t\tconst distance = Math.abs(point.height - height);\n\t\tif (distance < closestDistance) {\n\t\t\tclosestDistance = distance;\n\t\t\tclosest = point;\n\t\t}\n\t}\n\treturn closest;\n}\n\nexport interface UseDrawerSnapPointsReturn {\n\tsnapPoints: Accessor<DrawerSnapPoint[] | undefined>;\n\tactiveSnapPoint: Accessor<DrawerSnapPoint | null | undefined>;\n\tsetActiveSnapPoint: (\n\t\tsnapPoint: DrawerSnapPoint | null,\n\t\tdetails?: DrawerRootSnapPointChangeEventDetails,\n\t) => void;\n\tpopupHeight: Accessor<number>;\n\tviewportHeight: Accessor<number>;\n\tresolvedSnapPoints: Accessor<ResolvedDrawerSnapPoint[]>;\n\tactiveSnapPointOffset: Accessor<number | null>;\n}\n\nexport function useDrawerSnapPoints(): UseDrawerSnapPointsReturn {\n\tconst rootCtx = useDialogRootContext();\n\tconst drawer = useDrawerRootContext();\n\tconst viewportElement = rootCtx.viewportElement;\n\n\tconst [viewportHeight, setViewportHeight] = createSignal(0, {\n\t\townedWrite: true,\n\t});\n\tconst [rootFontSize, setRootFontSize] = createSignal(16, {\n\t\townedWrite: true,\n\t});\n\n\t// `measureViewportHeight` is invoked from the iso-layout-effect apply\n\t// scope (and from a `ResizeObserver` callback). The `viewportElement()`\n\t// snapshot read is intentional — wrap in `untrack` so it doesn't trip\n\t// `[STRICT_READ_UNTRACKED]` when called synchronously from apply.\n\tconst measureViewportHeight = (): void =>\n\t\tuntrack(() => {\n\t\t\tconst el = viewportElement();\n\t\t\tconst doc = el?.ownerDocument ?? document;\n\t\t\tconst html = doc.documentElement;\n\t\t\tif (el) setViewportHeight(el.offsetHeight);\n\t\t\telse setViewportHeight(html.clientHeight);\n\t\t\tconst fontSize = Number.parseFloat(getComputedStyle(html).fontSize);\n\t\t\tif (Number.isFinite(fontSize)) setRootFontSize(fontSize);\n\t\t});\n\n\tuseIsoLayoutEffect(\n\t\t() => viewportElement(),\n\t\t(el) => {\n\t\t\tmeasureViewportHeight();\n\t\t\tif (!el || typeof ResizeObserver !== \"function\") return undefined;\n\t\t\tconst resizeObserver = new ResizeObserver(measureViewportHeight);\n\t\t\tresizeObserver.observe(el);\n\t\t\treturn () => {\n\t\t\t\tresizeObserver.disconnect();\n\t\t\t};\n\t\t},\n\t);\n\n\tconst resolvedSnapPoints = createMemo<ResolvedDrawerSnapPoint[]>(() => {\n\t\tconst snapPoints = drawer.snapPoints();\n\t\tconst popupHeight = drawer.popupHeight();\n\t\tconst viewportH = viewportHeight();\n\t\tconst fontSize = rootFontSize();\n\t\tif (\n\t\t\t!snapPoints ||\n\t\t\tsnapPoints.length === 0 ||\n\t\t\tviewportH <= 0 ||\n\t\t\tpopupHeight <= 0\n\t\t)\n\t\t\treturn [];\n\n\t\tconst maxHeight = Math.min(popupHeight, viewportH);\n\t\tif (!Number.isFinite(maxHeight) || maxHeight <= 0) return [];\n\n\t\tconst resolved = snapPoints\n\t\t\t.map((value): ResolvedDrawerSnapPoint | null => {\n\t\t\t\tconst resolvedHeight = resolveSnapPointValue(\n\t\t\t\t\tvalue,\n\t\t\t\t\tviewportH,\n\t\t\t\t\tfontSize,\n\t\t\t\t);\n\t\t\t\tif (resolvedHeight === null || !Number.isFinite(resolvedHeight))\n\t\t\t\t\treturn null;\n\t\t\t\tconst clampedHeight = clamp(resolvedHeight, 0, maxHeight);\n\t\t\t\treturn {\n\t\t\t\t\tvalue,\n\t\t\t\t\theight: clampedHeight,\n\t\t\t\t\toffset: Math.max(0, popupHeight - clampedHeight),\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((p): p is ResolvedDrawerSnapPoint => Boolean(p));\n\n\t\tif (resolved.length <= 1) return resolved;\n\n\t\tconst deduped: ResolvedDrawerSnapPoint[] = [];\n\t\tconst seenHeights: number[] = [];\n\t\tfor (let i = resolved.length - 1; i >= 0; i -= 1) {\n\t\t\tconst p = resolved[i];\n\t\t\tif (!p) continue;\n\t\t\tconst dup = seenHeights.some((h) => Math.abs(h - p.height) <= 1);\n\t\t\tif (dup) continue;\n\t\t\tseenHeights.push(p.height);\n\t\t\tdeduped.push(p);\n\t\t}\n\t\tdeduped.reverse();\n\t\treturn deduped;\n\t});\n\n\tconst resolvedActiveSnapPoint = createMemo<\n\t\tResolvedDrawerSnapPoint | undefined\n\t>(() => {\n\t\tconst active = drawer.activeSnapPoint();\n\t\tconst points = resolvedSnapPoints();\n\t\tif (active === undefined) return points[0];\n\t\tif (active === null) return undefined;\n\t\tconst exact = points.find((p) => Object.is(p.value, active));\n\t\tif (exact) return exact;\n\t\tconst popupHeight = drawer.popupHeight();\n\t\tconst viewportH = viewportHeight();\n\t\tconst maxHeight = Math.min(popupHeight, viewportH);\n\t\tconst resolvedHeight = resolveSnapPointValue(\n\t\t\tactive,\n\t\t\tviewportH,\n\t\t\trootFontSize(),\n\t\t);\n\t\tif (resolvedHeight === null || !Number.isFinite(resolvedHeight))\n\t\t\treturn undefined;\n\t\tconst clampedHeight = clamp(resolvedHeight, 0, maxHeight);\n\t\treturn findClosestSnapPoint(clampedHeight, points) ?? undefined;\n\t});\n\n\treturn {\n\t\tsnapPoints: drawer.snapPoints,\n\t\tactiveSnapPoint: drawer.activeSnapPoint,\n\t\tsetActiveSnapPoint: drawer.setActiveSnapPoint,\n\t\tpopupHeight: drawer.popupHeight,\n\t\tviewportHeight,\n\t\tresolvedSnapPoints,\n\t\tactiveSnapPointOffset: () => resolvedActiveSnapPoint()?.offset ?? null,\n\t};\n}\n"],"mappings":"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","ignoreList":[]}