@weasel-js/guides 1.9.4 → 1.10.0

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/match.ts","../src/guides/alignment/spacing.ts","../src/guides/alignment/plane.ts","../src/guides/alignment/behaviors.ts","../src/layout/snaps.ts","../src/layout/strategies/freeform.ts","../src/layout/strategies/tileGrid.ts","../src/layout/strategies/snapPoint.ts"],"names":["across","resolveUnit","useState","useLatest","useCallback","PATH_M","PATH_L","EPS","bestAxis","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","lo","hi","into","createTransformOp"],"mappings":"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","file":"index.js","sourcesContent":["/** Round `value` to the nearest multiple of `cellSize`. Returns 0 when the result would be -0. */\nexport function roundToCell(value: number, cellSize: number): number {\n return Math.round(value / cellSize) * cellSize || 0;\n}\n","/**\n * Pointer-tracking glue that turns hover position into a grid cell, suitable\n * for dropping straight into `createCellHighlightLayer({ getCell })`. Pairs\n * with `gridSnapStrategy` / `createGridLayer` so the visual hover preview\n * uses the exact same spacing as the snap behavior.\n *\n * Wires three things you'd otherwise glue by hand:\n * 1. pointermove on a target element → client coords\n * 2. client coords → world coords via your `ViewTransform`\n * 3. world coords → integer `{col, row}` via `pointToGridCell`\n *\n * State updates only fire when the cell actually changes (not on every\n * pointer tick). Pass `onChange` to trigger a canvas redraw on each transition.\n */\n\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n useLatest,\n screenToWorld,\n type ViewTransform,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\nimport { pointToGridCell } from '../strategies/grid';\n\n/** Options for `useGridCellHover`. */\nexport interface UseGridCellHoverOptions {\n /** Element to attach pointer listeners to (typically the canvas). */\n ref: RefObject<HTMLElement | null>;\n /** Read the current view transform. Called on every pointermove so it can\n * reflect live pan/zoom without a re-binding step. */\n view: () => ViewTransform;\n /** Cell spacing in world units. Same value you pass to `createGridLayer`\n * and `createCellHighlightLayer`. */\n spacing: UnitValue;\n /** Required if `spacing` is tagged (e.g. `{ value: 1, unit: 'ft' }`). */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Default `(0, 0)`. */\n origin?: { x: number; y: number };\n /** Fires when the hovered cell changes (including to/from `null`). Use it\n * to invalidate your layer renderer. */\n onChange?: (cell: { col: number; row: number } | null) => void;\n /** Disable the listeners without unmounting. Default `true`. */\n enabled?: boolean;\n}\n\n/** Return shape of `useGridCellHover`. */\nexport interface UseGridCellHoverReturn {\n /** Current hovered cell, or `null` when the pointer is outside the element. */\n cell: { col: number; row: number } | null;\n /** Stable callback that returns the current cell — drop straight into\n * `createCellHighlightLayer({ getCell })`. */\n getCell: () => { col: number; row: number } | null;\n}\n\nfunction cellsEqual(\n a: { col: number; row: number } | null,\n b: { col: number; row: number } | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return a.col === b.col && a.row === b.row;\n}\n\n/** Track which grid cell the pointer is over; pairs with `createCellHighlightLayer`. */\nexport function useGridCellHover(opts: UseGridCellHoverOptions): UseGridCellHoverReturn {\n const [cell, setCell] = useState<{ col: number; row: number } | null>(null);\n const cellRef = useRef<{ col: number; row: number } | null>(null);\n const optsRef = useLatest(opts);\n\n const getCell = useCallback(() => cellRef.current, []);\n\n const enabled = opts.enabled ?? true;\n useEffect(() => {\n if (!enabled) return;\n const el = opts.ref.current;\n if (!el) return;\n\n const update = (next: { col: number; row: number } | null) => {\n if (cellsEqual(cellRef.current, next)) return;\n cellRef.current = next;\n setCell(next);\n optsRef.current.onChange?.(next);\n };\n\n const onMove = (e: PointerEvent) => {\n const o = optsRef.current;\n const rect = el.getBoundingClientRect();\n const sx = e.clientX - rect.left;\n const sy = e.clientY - rect.top;\n const [wx, wy] = screenToWorld(sx, sy, o.view());\n update(pointToGridCell({ x: wx, y: wy }, o.spacing, o.unitSystem, o.origin));\n };\n const onLeave = () => update(null);\n\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerleave', onLeave);\n el.addEventListener('pointercancel', onLeave);\n return () => {\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerleave', onLeave);\n el.removeEventListener('pointercancel', onLeave);\n };\n }, [enabled, opts.ref, optsRef]);\n\n return { cell, getCell };\n}\n","/**\n * Grid overlay — a reusable render layer that draws a world-space grid with\n * optional finer subdivisions and accent lines every N cells.\n *\n * The layer renders in world space — the caller is expected to have applied\n * any view transform to the canvas context already. To draw a highlighted\n * cell (snap-target preview), stack `createCellHighlightLayer` alongside\n * this one.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type CommandStroke,\n resolveStrokeWidth,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n pxExtent,\n} from '@weasel-js/core';\nimport { PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\n\n/** Options for `createGridLayer`. */\nexport interface GridLayerOpts {\n /**\n * Distance between adjacent grid lines (also known as grid pitch),\n * in world (base) units. Accepts a bare number or a tagged\n * `{ value, unit }`. Tagged values require `unitSystem` to be supplied.\n */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Bounds of the area to cover, in world units. */\n bounds: () => { x: number; y: number; width: number; height: number };\n /** Lines every N cells get the accent style. 0/undef = no accent. */\n accentEvery?: number;\n /** Optional finer subdivisions per cell. e.g. 4 -> 4 sub-lines per cell. */\n subdivisions?: number;\n /** Per-band stroke styles. Each is a FillStyle+width (etc.) — see `Stroke`. */\n style?: {\n line?: CommandStroke;\n accent?: CommandStroke;\n sub?: CommandStroke;\n };\n}\n\n// Defaults express weight via opacity rather than a fixed dark color so the\n// grid reads correctly against any background fill (kit demos use a neutral\n// gray; consumer apps may use cream / dark / themed surfaces). Override\n// per-canvas via `style.{line,accent,sub}.paint` if a hard color is needed.\nconst DEFAULT_LINE: CommandStroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.08)' },\n width: 1,\n};\nconst DEFAULT_ACCENT: CommandStroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.16)' },\n width: 1,\n};\nconst DEFAULT_SUB: CommandStroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.04)' },\n width: 1,\n};\n\n/** Build a `RenderLayer` that draws a world-space grid with optional accent lines and subdivisions. */\nexport function createGridLayer(opts: GridLayerOpts): RenderLayer<unknown> {\n const line = opts.style?.line ?? DEFAULT_LINE;\n const accent = opts.style?.accent ?? DEFAULT_ACCENT;\n const sub = opts.style?.sub ?? DEFAULT_SUB;\n\n return {\n id: 'grid',\n label: 'Grid',\n draw: (_data, view) => {\n const b = opts.bounds();\n if (b.width <= 0 || b.height <= 0) return [];\n\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const x0 = b.x;\n const y0 = b.y;\n const x1 = b.x + b.width;\n const y1 = b.y + b.height;\n // Every line is axis-aligned, so its width runs along one screen axis\n // and one pixel of it is exactly that axis's extent.\n const px = pxExtent(1, view.scale);\n\n const children: DrawCommand[] = [];\n\n const pushSegment = (sx: number, sy: number, ex: number, ey: number, s: CommandStroke): void => {\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, ex, ey]),\n fillRule: 'nonzero',\n };\n const across = sx === ex ? px.x : px.y;\n children.push({\n kind: 'path',\n path,\n stroke: { ...s, width: resolveStrokeWidth(s.width ?? 1, 1) * across },\n });\n };\n\n // Sub-lines (drawn first so cell lines paint on top).\n if (subdivisions && subdivisions > 1) {\n const step = spacing / subdivisions;\n for (let x = x0; x <= x1 + 1e-9; x += step) {\n const k = Math.round((x - x0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x, y0, x, y1, sub);\n }\n for (let y = y0; y <= y1 + 1e-9; y += step) {\n const k = Math.round((y - y0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x0, y, x1, y, sub);\n }\n }\n\n // Cell lines (skip ones that will become accents).\n let idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x, y0, x, y1, line);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x0, y, x1, y, line);\n idx++;\n }\n\n // Accent lines on top.\n if (accentEvery && accentEvery > 0) {\n idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n if (idx % accentEvery === 0) pushSegment(x, y0, x, y1, accent);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n if (idx % accentEvery === 0) pushSegment(x0, y, x1, y, accent);\n idx++;\n }\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","/**\n * Cell highlight overlay — a thin render layer that fills a single grid cell\n * (e.g. a snap-target preview). Stack it under or over `createGridLayer` in\n * a layer sequence.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type CommandFill,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\n\n/** Options for `createCellHighlightLayer`. */\nexport interface CellHighlightLayerOpts {\n /** Cell size in world units (matches the grid's `spacing`). */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Defaults to (0,0). */\n origin?: () => { x: number; y: number };\n /** Cell to highlight, or `null` to skip drawing. */\n getCell: () => { col: number; row: number } | null;\n /** FillStyle strategy for the filled cell. Defaults to a soft green. */\n fill?: CommandFill;\n}\n\nconst DEFAULT_FILL: CommandFill = { fill: 'solid', color: 'rgba(127,176,105,0.15)' };\n\n/** Build a `RenderLayer` that fills a single grid cell — typically a snap-target preview. */\nexport function createCellHighlightLayer(opts: CellHighlightLayerOpts): RenderLayer<unknown> {\n const fill = opts.fill ?? DEFAULT_FILL;\n return {\n id: 'cell-highlight',\n label: 'Cell highlight',\n draw: () => {\n const cell = opts.getCell();\n if (!cell) return [];\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const o = opts.origin ? opts.origin() : { x: 0, y: 0 };\n const x = o.x + cell.col * spacing;\n const y = o.y + cell.row * spacing;\n const children: DrawCommand[] = [\n {\n kind: 'path',\n path: { kind: 'rect', x, y, width: spacing, height: spacing },\n fill,\n },\n ];\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useLatest } from '@weasel-js/core';\nimport type { Guide } from './types';\n\n/** Return shape for `useGuides`. */\nexport interface UseGuidesReturn {\n /** Live list (state). Re-renders when guides change. */\n guides: Guide[];\n /** Stable getter; reads the latest list without forcing a re-render.\n * Pass to `guideSnapStrategy` and `createGuidesLayer`. */\n getGuides: () => Guide[];\n /** Add a guide. If a guide with the same id already exists it is replaced. */\n addGuide: (guide: Guide) => void;\n /** Remove a guide by id. No-op when missing. */\n removeGuide: (id: string) => void;\n /** Drop all guides. */\n clearGuides: () => void;\n}\n\n/**\n * In-memory guide storage. Holds a list of horizontal/vertical world-space\n * lines that callers can pass to `guideSnapStrategy` (snap behavior) and\n * `createGuidesLayer` (render layer).\n *\n * v1 is intentionally minimal: no undo integration, no persistence, no\n * batched mutation. Wrap calls in your own history-aware action if you\n * want guide CRUD to be undoable.\n */\nexport function useGuides(initial: Guide[] = []): UseGuidesReturn {\n const [guides, setGuides] = useState<Guide[]>(initial);\n const ref = useLatest(guides);\n\n const getGuides = useCallback(() => ref.current, [ref]);\n\n const addGuide = useCallback((guide: Guide) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === guide.id);\n if (idx === -1) return [...prev, guide];\n const next = prev.slice();\n next[idx] = guide;\n return next;\n });\n }, []);\n\n const removeGuide = useCallback((id: string) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === id);\n if (idx === -1) return prev;\n const next = prev.slice();\n next.splice(idx, 1);\n return next;\n });\n }, []);\n\n const clearGuides = useCallback(() => {\n setGuides((prev) => (prev.length === 0 ? prev : []));\n }, []);\n\n return { guides, getGuides, addGuide, removeGuide, clearGuides };\n}\n","/**\n * Guides overlay — a screen-space render layer that draws each guide as a\n * thin line, projecting the guide's world offset through the active view.\n * A guide with a `span` draws as a segment over that span with a tick at each\n * end; one without spans the full canvas. It also draws equal-spacing gaps\n * (`SpacingGap`) as ticked segments labeled with their size.\n *\n * Guides are not scene objects; they live outside the scene and are managed\n * via `useGuides`. Pair with `guideSnapStrategy` (snap behavior) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport { textCommandFromRuns, type DrawCommand, type RenderLayer, type CommandStroke } from '@weasel-js/core';\nimport { PATH_L, PATH_M, rectPath, type PolygonPath } from '@weasel-js/geom';\nimport type { Guide, SpacingGap } from './types';\n\n/** Options for `createGuidesLayer`. */\nexport interface GuidesLayerOpts {\n /** Stable getter for the live guide list — typically `useGuides().getGuides`. */\n getGuides: () => readonly Guide[];\n /** Stable getter for the equal-spacing gaps to draw — typically what an\n * alignment behavior's `setActiveGaps` last published. */\n getGaps?: () => readonly SpacingGap[];\n /** `'span'` (default) draws a guide that carries a `span` as a segment over\n * it; `'full'` draws every guide across the whole canvas. */\n extent?: 'span' | 'full';\n /** Length in CSS px of the tick across each end of a segment. 0 for none.\n * Default 6. */\n ticks?: number;\n /** Label each gap with its size: `true` (default) prints it rounded to a\n * whole world unit, a function formats it, `false` omits the label. */\n gapLabels?: boolean | ((size: number) => string);\n /** Stroke width in CSS pixels. Default 1. */\n lineWidth?: number;\n /** Stroke color, and the gap labels' fill. Default a subtle blue. */\n color?: string;\n /** Gap marker color. Default `color`. */\n gapColor?: string;\n /** Optional dash pattern (CSS px). Currently unused — reserved for future\n * parity with chrome that supports dashes. */\n dash?: number[];\n /** Override the layer id. Useful if a consumer needs more than one\n * guides-layer (e.g. user-guides vs. system-guides). */\n id?: string;\n /** Override the layer label. */\n label?: string;\n}\n\nconst DEFAULT_COLOR = '#3aa0ff';\nconst LABEL_FONT = { fontSize: 10 };\n// No text measurer in a layer: a 10px digit advances about 6px.\nconst LABEL_CHAR_W = 6;\nconst LABEL_H = 14;\nconst LABEL_PAD_X = 4;\n\n/** A straight segment from (x0, y0) to (x1, y1), with a tick of length `t`\n * across each end. Screen px. */\nfunction tickedSegment(x0: number, y0: number, x1: number, y1: number, t: number): PolygonPath {\n const h = t / 2;\n const vertical = x0 === x1;\n const ends = t <= 0 ? [] : vertical\n ? [x0 - h, y0, x0 + h, y0, x1 - h, y1, x1 + h, y1]\n : [x0, y0 - h, x0, y0 + h, x1, y1 - h, x1, y1 + h];\n const coords = [x0, y0, x1, y1, ...ends];\n const commands: number[] = [];\n for (let i = 0; i < coords.length; i += 4) commands.push(PATH_M, PATH_L);\n return {\n kind: 'polygon',\n commands: new Uint8Array(commands),\n coords: new Float32Array(coords),\n fillRule: 'nonzero',\n };\n}\n\n/** Build a `RenderLayer` that draws guide lines and spacing gaps in screen\n * space, projected from world coordinates via the active view. */\nexport function createGuidesLayer(opts: GuidesLayerOpts): RenderLayer<unknown> {\n const lineWidth = opts.lineWidth ?? 1;\n const color = opts.color ?? DEFAULT_COLOR;\n const gapColor = opts.gapColor ?? color;\n const ticks = opts.ticks ?? 6;\n const spanned = (opts.extent ?? 'span') === 'span';\n const format = opts.gapLabels === false ? null\n : typeof opts.gapLabels === 'function' ? opts.gapLabels\n : (n: number) => String(Math.round(n));\n const stroke: CommandStroke = { paint: { fill: 'solid', color }, width: lineWidth };\n const gapStroke: CommandStroke = { paint: { fill: 'solid', color: gapColor }, width: lineWidth };\n\n return {\n id: opts.id ?? 'guides',\n label: opts.label ?? 'Guides',\n space: 'screen',\n draw: (_data, view, dims) => {\n const guides = opts.getGuides();\n const gaps = opts.getGaps?.() ?? [];\n if (guides.length === 0 && gaps.length === 0) return [];\n const sx = (x: number) => (x - view.x) * view.scale.x;\n const sy = (y: number) => (y - view.y) * view.scale.y;\n\n const out: DrawCommand[] = [];\n for (const g of guides) {\n const span = spanned ? g.span : undefined;\n if (g.axis === 'x') {\n const x = sx(g.offset);\n if (x < -lineWidth || x > dims.width + lineWidth) continue;\n const path = span\n ? tickedSegment(x, sy(span.min), x, sy(span.max), ticks)\n : tickedSegment(x, 0, x, dims.height, 0);\n out.push({ kind: 'path', path, stroke });\n } else {\n const y = sy(g.offset);\n if (y < -lineWidth || y > dims.height + lineWidth) continue;\n const path = span\n ? tickedSegment(sx(span.min), y, sx(span.max), y, ticks)\n : tickedSegment(0, y, dims.width, y, 0);\n out.push({ kind: 'path', path, stroke });\n }\n }\n\n for (const g of gaps) {\n const [x0, y0, x1, y1] = g.axis === 'x'\n ? [sx(g.min), sy(g.at), sx(g.max), sy(g.at)]\n : [sx(g.at), sy(g.min), sx(g.at), sy(g.max)];\n out.push({ kind: 'path', path: tickedSegment(x0, y0, x1, y1, ticks), stroke: gapStroke });\n if (format === null) continue;\n const text = format(g.max - g.min);\n const w = text.length * LABEL_CHAR_W + LABEL_PAD_X * 2;\n const left = (x0 + x1) / 2 - w / 2;\n const top = (y0 + y1) / 2 - LABEL_H / 2;\n out.push({ kind: 'path', path: rectPath(left, top, w, LABEL_H), fill: { fill: 'solid', color: gapColor } });\n out.push(textCommandFromRuns(\n left + LABEL_PAD_X,\n top + 2,\n [{ text, fill: { fill: 'solid', color: '#fff' } }],\n LABEL_FONT,\n ));\n }\n return out;\n },\n };\n}\n","import type { Guide } from '../types';\nimport type { DeriveAlignmentGuidesOptions } from './types';\nimport {\n type Bounds,\n type PoseDescriptor,\n rectFromPlane,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n} from '@weasel-js/core';\n\nconst EPS = 1e-3;\n\n/** Derive candidate alignment lines from a set of sibling poses plus an\n * optional page box. Each box contributes up to 3 guides per axis: the two\n * edges and the center. Overlapping offsets collapse to one candidate, whose\n * `span` covers every box that produced it.\n * Poses go through the same descriptor `alignMoveBehavior` matches with, so\n * a rotated sibling advertises its ink edges rather than its stored box.\n * The lines are in the camera's world: a sibling on a parallax layer needs\n * `planeOf` to say which plane its pose is in. */\nexport function deriveAlignmentGuides<TPose = Bounds>(\n targets: readonly TPose[],\n opts: DeriveAlignmentGuidesOptions<TPose> = {},\n): Guide[] {\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const edges = opts.edges ?? true;\n const centers = opts.centers ?? true;\n // Dedup per axis: key = rounded offset. First writer wins (stable id).\n const seenX = new Map<number, Guide>();\n const seenY = new Map<number, Guide>();\n\n const add = (axis: 'x' | 'y', offset: number, b: Bounds): void => {\n const seen = axis === 'x' ? seenX : seenY;\n const key = Math.round(offset / EPS);\n const min = axis === 'x' ? b.y : b.x;\n const max = min + (axis === 'x' ? b.height : b.width);\n const prev = seen.get(key);\n if (prev) {\n prev.span = { min: Math.min(prev.span!.min, min), max: Math.max(prev.span!.max, max) };\n return;\n }\n seen.set(key, { id: `align:${axis}:${offset.toFixed(3)}`, axis, offset, span: { min, max } });\n };\n\n const emit = (b: Bounds): void => {\n if (edges) {\n add('x', b.x, b);\n add('x', b.x + b.width, b);\n add('y', b.y, b);\n add('y', b.y + b.height, b);\n }\n if (centers) {\n add('x', b.x + b.width / 2, b);\n add('y', b.y + b.height / 2, b);\n }\n };\n\n targets.forEach((t, i) => {\n const box = visualBoundsViaDescriptor(t, d);\n const plane = opts.planeOf?.(t, i);\n emit(plane ? rectFromPlane(plane, box) : box);\n });\n if (opts.page) emit(opts.page);\n\n return [...seenX.values(), ...seenY.values()];\n}\n","import type { Guide } from '../types';\nimport type {\n AlignAnchor,\n AlignMatchResult,\n} from './types';\nimport type { Bounds } from '@weasel-js/core';\n\n/** Move/insert test all three features per axis. */\nexport const MOVE_ANCHORS: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = {\n x: ['min', 'center', 'max'],\n y: ['min', 'center', 'max'],\n};\n\nfunction featureOffset(b: Bounds, axis: 'x' | 'y', anchor: AlignAnchor): number {\n if (axis === 'x') {\n if (anchor === 'min') return b.x;\n if (anchor === 'center') return b.x + b.width / 2;\n return b.x + b.width;\n }\n if (anchor === 'min') return b.y;\n if (anchor === 'center') return b.y + b.height / 2;\n return b.y + b.height;\n}\n\n/** Best (feature, candidate) match on one axis, within tolerance. */\nfunction bestAxis(\n b: Bounds,\n axis: 'x' | 'y',\n anchors: readonly AlignAnchor[],\n candidates: readonly Guide[],\n worldTolerance: number,\n): { delta: number; guide: Guide | null } {\n let bestAbs = Infinity;\n let bestDelta = 0;\n let bestGuide: Guide | null = null;\n for (const anchor of anchors) {\n const o = featureOffset(b, axis, anchor);\n for (const g of candidates) {\n if (g.axis !== axis) continue;\n const d = g.offset - o;\n const ad = Math.abs(d);\n if (ad <= worldTolerance && ad < bestAbs) {\n bestAbs = ad;\n bestDelta = d;\n bestGuide = g;\n }\n }\n }\n return { delta: bestGuide ? bestDelta : 0, guide: bestGuide };\n}\n\n/**\n * Match a moving box's selected edge/center features against candidate guide\n * lines. Returns the per-axis snap delta and the matched candidate line(s).\n * The two axes resolve independently; on each axis the closest in-tolerance\n * (feature, candidate) pair wins. A matched guide that carries a `span` comes\n * back with it stretched to cover the snapped box, so the drawn segment runs\n * from the aligned siblings to the box being dragged.\n *\n * `worldTolerance` is per axis because a screen-pixel tolerance is not one\n * world distance under non-uniform zoom — and each axis here is matched by a\n * distance along that axis alone, so there is an exact answer rather than an\n * approximation. Pass the same number twice for a world-space tolerance.\n */\nexport function matchAlignment(\n bounds: Bounds,\n candidates: readonly Guide[],\n worldTolerance: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n): AlignMatchResult {\n const x = bestAxis(bounds, 'x', anchors.x, candidates, worldTolerance.x);\n const y = bestAxis(bounds, 'y', anchors.y, candidates, worldTolerance.y);\n const top = bounds.y + y.delta;\n const left = bounds.x + x.delta;\n return {\n dx: x.delta,\n dy: y.delta,\n activeX: stretchSpan(x.guide, top, top + bounds.height),\n activeY: stretchSpan(y.guide, left, left + bounds.width),\n };\n}\n\n/** A matched guide whose span also covers the snapped box. */\nexport function stretchSpan(g: Guide | null, min: number, max: number): Guide | null {\n if (g === null || g.span === undefined) return g;\n return { ...g, span: { min: Math.min(g.span.min, min), max: Math.max(g.span.max, max) } };\n}\n","import type { Bounds } from '@weasel-js/core';\nimport type { SpacingGap } from '../types';\nimport type { SpacingEdge, SpacingMatchResult } from './types';\n\nconst EPS = 1e-6;\ntype Axis = 'x' | 'y';\n\nconst lo = (b: Bounds, a: Axis): number => (a === 'x' ? b.x : b.y);\nconst hi = (b: Bounds, a: Axis): number => (a === 'x' ? b.x + b.width : b.y + b.height);\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The shared range of two boxes on `axis`, or null when they share none. */\nfunction overlap(a: Bounds, b: Bounds, axis: Axis): [number, number] | null {\n const min = Math.max(lo(a, axis), lo(b, axis));\n const max = Math.min(hi(a, axis), hi(b, axis));\n return max - min > EPS ? [min, max] : null;\n}\n\nfunction gapBetween(a: Bounds, b: Bounds, axis: Axis): SpacingGap | null {\n const shared = overlap(a, b, cross(axis));\n if (shared === null) return null;\n return { axis, min: hi(a, axis), max: lo(b, axis), at: (shared[0] + shared[1]) / 2 };\n}\n\n/** Whether `b` covers any of the strip a gap marks out. */\nfunction hitsStrip(g: SpacingGap, b: Bounds, span: [number, number]): boolean {\n const c = cross(g.axis);\n return lo(b, g.axis) < g.max - EPS && hi(b, g.axis) > g.min + EPS\n && lo(b, c) < span[1] - EPS && hi(b, c) > span[0] + EPS;\n}\n\n/**\n * The visible gaps between neighboring boxes along `axis`: for `'x'`, each box\n * and the nearest box to its right that shares some of its vertical range, as\n * long as no third box stands in the strip between them. These are the gaps an\n * equal-spacing snap can reproduce.\n */\nexport function measureGaps(targets: readonly Bounds[], axis: Axis): SpacingGap[] {\n return measure(targets, axis).map((m) => m.gap);\n}\n\ninterface Measured { gap: SpacingGap; span: [number, number] }\n\nfunction measure(targets: readonly Bounds[], axis: Axis): Measured[] {\n const out: Measured[] = [];\n for (const a of targets) {\n let next: Bounds | null = null;\n for (const c of targets) {\n if (c === a || lo(c, axis) < hi(a, axis) + EPS) continue;\n if (overlap(a, c, cross(axis)) === null) continue;\n if (next === null || lo(c, axis) < lo(next, axis)) next = c;\n }\n if (next === null) continue;\n const gap = gapBetween(a, next, axis)!;\n const span = overlap(a, next, cross(axis))!;\n if (targets.some((t) => t !== a && t !== next && hitsStrip(gap, t, span))) continue;\n out.push({ gap, span });\n }\n return out.sort((p, q) => p.gap.min - q.gap.min || p.gap.at - q.gap.at);\n}\n\ninterface AxisHit { delta: number; size: number }\n\n/** The best equal-spacing placement on one axis, or null. */\nfunction bestAxis(\n b: Bounds,\n axis: Axis,\n edge: SpacingEdge,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n tol: number,\n): AxisHit | null {\n const bLo = lo(b, axis);\n const bHi = hi(b, axis);\n const size = bHi - bLo;\n const center = (bLo + bHi) / 2;\n let left: Bounds | null = null;\n let right: Bounds | null = null;\n for (const t of targets) {\n if (overlap(t, b, cross(axis)) === null) continue;\n if (hi(t, axis) <= center && (left === null || hi(t, axis) > hi(left, axis))) left = t;\n if (lo(t, axis) >= center && (right === null || lo(t, axis) < lo(right, axis))) right = t;\n }\n const sizes = refs.map((g) => g.max - g.min);\n\n let best: AxisHit | null = null;\n const offer = (delta: number, gap: number): void => {\n if (gap <= EPS || Math.abs(delta) > tol) return;\n if (best === null || Math.abs(delta) < Math.abs(best.delta)) best = { delta, size: gap };\n };\n\n const L = left === null ? null : hi(left, axis);\n const R = right === null ? null : lo(right, axis);\n if (edge === 'both') {\n for (const g of sizes) {\n if (L !== null && (R === null || L + g + size <= R + EPS)) offer(L + g - bLo, g);\n if (R !== null && (L === null || R - g - size >= L - EPS)) offer(R - g - size - bLo, g);\n }\n if (L !== null && R !== null) {\n const g = (R - L - size) / 2;\n offer(L + g - bLo, g);\n }\n } else if (edge === 'max' && R !== null) {\n const own = L !== null ? [bLo - L] : [];\n for (const g of [...sizes, ...own]) if (R - g > bLo + EPS) offer(R - g - bHi, g);\n } else if (edge === 'min' && L !== null) {\n const own = R !== null ? [R - bHi] : [];\n for (const g of [...sizes, ...own]) if (L + g < bHi - EPS) offer(L + g - bLo, g);\n }\n return best;\n}\n\n/** Every gap of `size` on `axis` once the box sits at `b`: the matching\n * reference gaps, plus the box's own gaps to its two neighbors. */\nfunction markers(\n b: Bounds,\n axis: Axis,\n size: number,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n): SpacingGap[] {\n const eq = (g: SpacingGap) => Math.abs(g.max - g.min - size) < 1e-3;\n const out = refs.filter(eq);\n const own = measureGaps([...targets, b], axis).filter((g) =>\n (Math.abs(g.max - lo(b, axis)) < EPS || Math.abs(g.min - hi(b, axis)) < EPS) && eq(g));\n return [...out, ...own];\n}\n\n/**\n * Match a box against the gaps between `targets`, Figma's \"equal spacing\":\n * on each axis, find where the box's gap to a neighbor equals a gap that\n * already exists between two other boxes, or where it sits centered between\n * its two neighbors. `moving` says which edges move on each axis — `'both'`\n * for a translate, `'min'`/`'max'` for a resize dragging that edge, `null` to\n * leave the axis alone. Default `'both'` on each axis.\n *\n * Targets should exclude the box itself. A reference gap the box now stands\n * inside no longer counts. The returned gaps are every gap equal to the one\n * snapped to, with the box at its snapped position — ready to draw with\n * `createGuidesLayer`'s `getGaps`.\n */\nexport function matchSpacing(\n bounds: Bounds,\n targets: readonly Bounds[],\n worldTolerance: { x: number; y: number },\n moving: { x: SpacingEdge | null; y: SpacingEdge | null } = { x: 'both', y: 'both' },\n): SpacingMatchResult {\n const refsFor = (axis: Axis) => measure(targets, axis)\n .filter((m) => !hitsStrip(m.gap, bounds, m.span))\n .map((m) => m.gap);\n const refsX = refsFor('x');\n const refsY = refsFor('y');\n const x = moving.x === null ? null : bestAxis(bounds, 'x', moving.x, targets, refsX, worldTolerance.x);\n const y = moving.y === null ? null : bestAxis(bounds, 'y', moving.y, targets, refsY, worldTolerance.y);\n const dx = x?.delta ?? 0;\n const dy = y?.delta ?? 0;\n const final = applyEdges(bounds, dx, dy, moving);\n return {\n dx,\n dy,\n gapsX: x === null ? [] : markers(final, 'x', x.size, targets, refsX),\n gapsY: y === null ? [] : markers(final, 'y', y.size, targets, refsY),\n };\n}\n\n/** Move the box's moving edges by the snap deltas. */\nexport function applyEdges(\n b: Bounds,\n dx: number,\n dy: number,\n moving: { x: SpacingEdge | null; y: SpacingEdge | null },\n): Bounds {\n let { x, y, width, height } = b;\n if (moving.x === 'both') x += dx;\n else if (moving.x === 'min') { x += dx; width -= dx; }\n else if (moving.x === 'max') width += dx;\n if (moving.y === 'both') y += dy;\n else if (moving.y === 'min') { y += dy; height -= dy; }\n else if (moving.y === 'max') height += dy;\n return { x, y, width, height };\n}\n","import { rectToPlane, type PlaneMap } from '@weasel-js/core';\nimport type { Guide, SpacingGap } from '../types';\nimport { guideOffsetOn } from '../../strategies/onPlane';\nimport type { AlignmentBehaviorBase } from './types';\n\ntype Axis = 'x' | 'y';\nconst across = (axis: Axis): Axis => (axis === 'x' ? 'y' : 'x');\n\nconst into = (m: PlaneMap, axis: Axis, v: number): number => v * m.scale[axis] + m.offset[axis];\nconst outOf = (m: PlaneMap, axis: Axis, v: number): number => (v - m.offset[axis]) / m.scale[axis];\n\n/** `min` and `max` through `map`, put back in order where the axis is flipped. */\nfunction range<R extends { min: number; max: number }>(r: R, map: (v: number) => number): R {\n const a = map(r.min);\n const b = map(r.max);\n return { ...r, min: Math.min(a, b), max: Math.max(a, b) };\n}\n\nfunction guideToPlane(g: Guide, m: PlaneMap): Guide {\n const span = g.span && range(g.span, (v) => into(m, across(g.axis), v));\n return { ...g, offset: guideOffsetOn(g, m), ...(span ? { span } : {}) };\n}\n\nfunction guideFromPlane(g: Guide, m: PlaneMap): Guide {\n const span = g.span && range(g.span, (v) => outOf(m, across(g.axis), v));\n return { ...g, offset: outOf(m, g.axis, g.offset), ...(span ? { span } : {}) };\n}\n\nfunction gapFromPlane(g: SpacingGap, m: PlaneMap): SpacingGap {\n return { ...range(g, (v) => outOf(m, g.axis, v)), at: outOf(m, across(g.axis), g.at) };\n}\n\n/**\n * `args` as a gesture whose poses are in `plane` reads them. A caller's\n * candidate lines and spacing boxes are in the camera's world, and so is what\n * it is told to draw; the matching between runs in the plane, where the poses\n * are. With no plane this is `args` itself.\n */\nexport function alignmentOnPlane<A extends AlignmentBehaviorBase>(args: A, plane: PlaneMap | null | undefined): A {\n if (!plane) return args;\n const spacing = args.getSpacingTargets;\n const setGaps = args.setActiveGaps;\n return {\n ...args,\n getCandidates: () => args.getCandidates().map((g) => guideToPlane(g, plane)),\n setActiveGuides: (guides) => args.setActiveGuides(guides.map((g) => guideFromPlane(g, plane))),\n ...(spacing ? { getSpacingTargets: () => spacing().map((b) => rectToPlane(plane, b)) } : {}),\n ...(setGaps ? { setActiveGaps: (gaps: readonly SpacingGap[]) => setGaps(gaps.map((g) => gapFromPlane(g, plane))) } : {}),\n };\n}\n","import type { Guide, SpacingGap } from '../types';\nimport {\n type BoundsConstraint,\n type InsertBehavior,\n type MoveBehavior,\n type ResizeAnchor,\n type Bounds,\n screenTolerance,\n unionBounds,\n type PoseDescriptor,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n fixedCornerOf,\n} from '@weasel-js/core';\nimport type {\n AlignAnchor,\n AlignmentBehaviorBase,\n SpacingEdge,\n} from './types';\nimport { MOVE_ANCHORS, matchAlignment, stretchSpan } from './match';\nimport { applyEdges, matchSpacing } from './spacing';\nimport { alignmentOnPlane } from './plane';\n\n/** Options for move and resize — adds the pose descriptor for non-rect poses. */\nexport interface AlignMoveArgs<TPose> extends AlignmentBehaviorBase {\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\nconst activeList = (m: { activeX: Guide | null; activeY: Guide | null }): Guide[] =>\n [m.activeX, m.activeY].filter((g): g is Guide => g !== null);\n\n/** Tolerance for re-reading what a settled box touches exactly. */\nconst EXACT = { x: 1e-6, y: 1e-6 };\n\ninterface Resolved { dx: number; dy: number; guides: Guide[]; gaps: SpacingGap[] }\n\ntype Edges = { x: SpacingEdge | null; y: SpacingEdge | null };\n\n/** Snap `b` to alignment lines and, when the caller supplies spacing targets,\n * equal gaps; the nearer snap wins on each axis. What is published is read\n * back off the settled box, so a line and a gap that both hold show together\n * and each is drawn where the box ended up, not where it was dragged. */\nfunction resolve(\n b: Bounds,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n edges: Edges,\n): Resolved | null {\n const candidates = args.getCandidates();\n const m = matchAlignment(b, candidates, tol, anchors);\n const targets = args.getSpacingTargets?.();\n if (targets === undefined) {\n if (m.activeX === null && m.activeY === null) return null;\n return { dx: m.dx, dy: m.dy, guides: activeList(m), gaps: [] };\n }\n const s = matchSpacing(b, targets, tol, edges);\n const pick = (hit: boolean, d: number, spaced: boolean, sd: number): number | null =>\n hit && (!spaced || Math.abs(d) <= Math.abs(sd)) ? d : spaced ? sd : null;\n const dx = pick(m.activeX !== null, m.dx, s.gapsX.length > 0, s.dx);\n const dy = pick(m.activeY !== null, m.dy, s.gapsY.length > 0, s.dy);\n if (dx === null && dy === null) return null;\n const settled = applyEdges(b, dx ?? 0, dy ?? 0, edges);\n const shown = matchSpacing(settled, targets, EXACT, edges);\n return {\n dx: dx ?? 0,\n dy: dy ?? 0,\n guides: activeList(matchAlignment(settled, candidates, EXACT, anchors)),\n gaps: [...shown.gapsX, ...shown.gapsY],\n };\n}\n\nfunction publish(args: AlignmentBehaviorBase, r: Resolved | null): void {\n args.setActiveGuides(r?.guides ?? []);\n args.setActiveGaps?.(r?.gaps ?? []);\n}\n\nfunction worldTol(\n base: AlignmentBehaviorBase,\n ctx: Parameters<typeof screenTolerance>[1],\n): { x: number; y: number } {\n return screenTolerance(base.tolerance ?? 6, ctx);\n}\n\n/** Move behavior: snap the dragged selection's union box (edges + center) to\n * candidates, shaping the proposed translate. The gesture applies the\n * transform uniformly to every dragged id, so the selection shifts together\n * and stays rigid. Single-select is the degenerate one-box union. Publishes\n * the matched line(s); clears on miss, end and cancel. */\nexport function alignMoveBehavior<TPose>(given: AlignMoveArgs<TPose>): MoveBehavior<TPose> {\n const d = (given.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, transform) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n if (transform.kind !== 'translate') return;\n // Union of every dragged id's visual box at its proposed position.\n const boxes: Bounds[] = [];\n for (const id of ctx.draggedIds) {\n const originPose = ctx.origin.get(id);\n if (originPose === undefined) continue;\n boxes.push(visualBoundsViaDescriptor(\n translatePoseViaDescriptor(originPose, transform.dx, transform.dy, d),\n d,\n ));\n }\n const union = unionBounds(boxes);\n if (union === null) return;\n const r = resolve(union, args, worldTol(args, ctx), MOVE_ANCHORS, { x: 'both', y: 'both' });\n publish(args, r);\n if (r === null) return;\n return { transform: { kind: 'translate', dx: transform.dx + r.dx, dy: transform.dy + r.dy } };\n },\n onEnd() { publish(given, null); },\n onCancel() { publish(given, null); },\n };\n}\n\n/** Insert behavior: snap the live `current` point to candidates (treating it\n * as a zero-size box). Publishes the matched line(s). */\nexport function alignInsertBehavior<TPose>(given: AlignmentBehaviorBase): InsertBehavior<TPose> {\n const pointAnchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = { x: ['min'], y: ['min'] };\n return {\n onMove(ctx, { current }) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n const box = { x: current.x, y: current.y, width: 0, height: 0 };\n const m = matchAlignment(box, args.getCandidates(), worldTol(args, ctx), pointAnchors);\n if (m.activeX === null && m.activeY === null) { args.setActiveGuides([]); return; }\n args.setActiveGuides(activeList(m));\n return { current: { x: current.x + m.dx, y: current.y + m.dy } };\n },\n onEnd() { given.setActiveGuides([]); },\n onCancel() { given.setActiveGuides([]); },\n };\n}\n\n/** Resize constraint: snap the corner(s) the drag moves, as drawn, to\n * candidates; the pinned corner stays fixed. On an unrotated pose that is\n * the moving edge(s). On a rotated one the node's own axes set how the\n * corner can travel: a corner handle snaps each world axis, an edge handle\n * slides its edge until the nearer of its two corners meets a line.\n * `poseDescriptor` reads the origin pose's box and rotation, and must match\n * the resize action's. Publishes the matched line(s). */\nexport function alignResizeBehavior<TPose extends Bounds>(\n given: AlignMoveArgs<TPose>,\n): BoundsConstraint<TPose> {\n const d = (given.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, { pose, anchor }) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n const origin = ctx.origin.get(ctx.draggedIds[0]);\n const rotation = origin === undefined ? 0 : (d.getRotation?.(origin) ?? 0);\n const m = rotation === 0\n ? matchMovingEdges(pose, anchor, args, worldTol(args, ctx))\n : matchRotatedCorners(pose, anchor, d.getBounds(origin!), rotation, args.getCandidates(), worldTol(args, ctx));\n if (m === null) { publish(args, null); return; }\n\n let { x, y, width, height } = pose;\n if (anchor.x === 'min') width += m.lx;\n else if (anchor.x === 'max') { x += m.lx; width -= m.lx; }\n if (anchor.y === 'min') height += m.ly;\n else if (anchor.y === 'max') { y += m.ly; height -= m.ly; }\n publish(args, { dx: 0, dy: 0, guides: m.guides, gaps: m.gaps });\n return { pose: { ...pose, x, y, width, height } };\n },\n onEnd() { publish(given, null); },\n onCancel() { publish(given, null); },\n };\n}\n\n/** How far to move the dragged corner in the node's local frame, and the\n * lines that asked for it. */\ninterface CornerShift { lx: number; ly: number; guides: Guide[]; gaps: SpacingGap[] }\n\nfunction matchMovingEdges(\n pose: Bounds,\n anchor: ResizeAnchor,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n): CornerShift | null {\n // A 'min' anchor pins the west/north edge, so the max edge moves.\n const moving = (a: ResizeAnchor['x']): SpacingEdge | null => (a === 'min' ? 'max' : a === 'max' ? 'min' : null);\n const edges = { x: moving(anchor.x), y: moving(anchor.y) };\n const anchors = {\n x: edges.x === null ? [] : [edges.x],\n y: edges.y === null ? [] : [edges.y],\n } as { x: AlignAnchor[]; y: AlignAnchor[] };\n const r = resolve(pose, args, tol, anchors, edges);\n return r === null ? null : { lx: r.dx, ly: r.dy, guides: r.guides, gaps: r.gaps };\n}\n\n/** The rotated case. The resize action pins the fixed corner in world after\n * constraints run, so a corner's drawn position is the origin's fixed corner\n * plus the rotated offset to it within `pose`. */\nfunction matchRotatedCorners(\n pose: Bounds,\n anchor: ResizeAnchor,\n originBox: Bounds,\n rotation: number,\n candidates: readonly Guide[],\n tol: { x: number; y: number },\n): CornerShift | null {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const toWorld = (lx: number, ly: number) => ({ x: lx * cos - ly * sin, y: lx * sin + ly * cos });\n const fixedLocal = fixedCornerOf(pose, anchor);\n const f0 = fixedCornerOf(originBox, anchor);\n const pivot = toWorld(f0.x - originBox.x - originBox.width / 2, f0.y - originBox.y - originBox.height / 2);\n const fixedWorld = { x: originBox.x + originBox.width / 2 + pivot.x, y: originBox.y + originBox.height / 2 + pivot.y };\n const drawn = (lx: number, ly: number) => {\n const o = toWorld(lx - fixedLocal.x, ly - fixedLocal.y);\n return { x: fixedWorld.x + o.x, y: fixedWorld.y + o.y };\n };\n const movingEdge = (axis: 'x' | 'y'): number[] => {\n const lo = axis === 'x' ? pose.x : pose.y;\n const hi = lo + (axis === 'x' ? pose.width : pose.height);\n const a = anchor[axis];\n return a === 'min' ? [hi] : a === 'max' ? [lo] : [lo, hi];\n };\n\n if (anchor.x !== 'free' && anchor.y !== 'free') {\n // A corner handle's corner has two degrees of freedom: snap it as a point.\n const c = drawn(movingEdge('x')[0], movingEdge('y')[0]);\n const m = matchAlignment({ x: c.x, y: c.y, width: 0, height: 0 }, candidates, tol, { x: ['min'], y: ['min'] });\n if (m.activeX === null && m.activeY === null) return null;\n const lx = m.dx * cos + m.dy * sin;\n const ly = -m.dx * sin + m.dy * cos;\n return { lx, ly, guides: activeList(m), gaps: [] };\n }\n if (anchor.x === 'free' && anchor.y === 'free') return null;\n\n // An edge handle moves along one local axis, carrying two corners with it.\n const along: 'x' | 'y' = anchor.x === 'free' ? 'y' : 'x';\n const dir = along === 'x' ? toWorld(1, 0) : toWorld(0, 1);\n const edge = movingEdge(along)[0];\n let best: { t: number; guide: Guide; at: { x: number; y: number } } | null = null;\n for (const across of movingEdge(along === 'x' ? 'y' : 'x')) {\n const c = along === 'x' ? drawn(edge, across) : drawn(across, edge);\n for (const g of candidates) {\n const reach = g.axis === 'x' ? dir.x : dir.y;\n if (Math.abs(reach) < 1e-9) continue;\n const t = (g.offset - (g.axis === 'x' ? c.x : c.y)) / reach;\n if (Math.abs(t * dir.x) > tol.x || Math.abs(t * dir.y) > tol.y) continue;\n if (best === null || Math.abs(t) < Math.abs(best.t)) best = { t, guide: g, at: c };\n }\n }\n if (best === null) return null;\n const across = best.guide.axis === 'x' ? best.at.y + best.t * dir.y : best.at.x + best.t * dir.x;\n const guides = [stretchSpan(best.guide, across, across)!];\n return along === 'x'\n ? { lx: best.t, ly: 0, guides, gaps: [] }\n : { lx: 0, ly: best.t, guides, gaps: [] };\n}\n","import type { DropTarget, LayoutSnap } from '@weasel-js/core';\n\nfunction dist2(a: { x: number; y: number }, b: { x: number; y: number }): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n}\n\nfunction nearestOf<TPose>(\n targets: DropTarget<TPose>[],\n pointer: { x: number; y: number },\n): DropTarget<TPose> | null {\n if (targets.length === 0) return null;\n let best = targets[0];\n let bestD = dist2(best.origin, pointer);\n for (let i = 1; i < targets.length; i++) {\n const d = dist2(targets[i].origin, pointer);\n if (d < bestD) {\n bestD = d;\n best = targets[i];\n }\n }\n return best;\n}\n\n/** Snap policy that never picks a target — every drop is rejected, which is\n * what a free-form container wants. */\nexport function none<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: () => null };\n}\n\n/** Snap policy that always picks the target closest to the pointer, however\n * far away it is. */\nexport function nearest<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: (targets, pointer) => nearestOf(targets, pointer) };\n}\n\n/** Snap policy that picks the closest target, but only within `tolerance`\n * world units — beyond that the drop is rejected. */\nexport function nearestWithin<TPose>(opts: { tolerance: number }): LayoutSnap<TPose> {\n const tol2 = opts.tolerance * opts.tolerance;\n return {\n pickTarget(targets, pointer) {\n const got = nearestOf(targets, pointer);\n if (got === null) return null;\n return dist2(got.origin, pointer) <= tol2 ? got : null;\n },\n };\n}\n\nfunction rectContains(\n r: { x: number; y: number; width: number; height: number },\n p: { x: number; y: number },\n): boolean {\n return p.x >= r.x && p.x < r.x + r.width && p.y >= r.y && p.y < r.y + r.height;\n}\n\n/**\n * Region-aware snap. If the pointer falls inside any target's `hitBounds`,\n * that target wins; otherwise falls back to nearest-origin. Useful for\n * strategies whose targets are area-shaped (gutters, drop-zones, gridded\n * cells) rather than point-shaped.\n *\n * Pointer-in-multiple-bounds order: first match in iteration order wins, so\n * strategies should emit narrower/more-specific targets before broader ones\n * (e.g. row-gutter before tray-corner).\n */\nexport function containedThenNearest<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n\ninterface CellMeta {\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nfunction isCellMeta(m: unknown): m is CellMeta {\n return (\n typeof m === 'object' &&\n m !== null &&\n 'cellRect' in m &&\n typeof (m as { cellRect: unknown }).cellRect === 'object'\n );\n}\n\n/**\n * Backwards-compatible cell snap. Prefer `containedThenNearest` for new\n * strategies; this variant remains for `tileGrid` and any caller that puts\n * its cell rect in `meta.cellRect` rather than `hitBounds`.\n */\nexport function cellAt<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n if (isCellMeta(t.meta) && rectContains(t.meta.cellRect, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n","import { createTransformOp, type LayoutSnap, type LayoutStrategy } from '@weasel-js/core';\nimport { none } from '../snaps';\n\n/** Options for `freeform`. */\nexport interface FreeformOptions<TPose> {\n snap?: LayoutSnap<TPose>;\n}\n\n/**\n * Identity layout: each child stays where it's stored, no reflow, no drop\n * targets. `snap` is accepted for API symmetry — overrides take effect only\n * if a caller wires up an external drop-target source, since `getDropTargets`\n * returns empty by default.\n */\nexport function freeform<TPose>(opts: FreeformOptions<TPose> = {}): LayoutStrategy<TPose> {\n const snap = opts.snap ?? none<TPose>();\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets() {\n return [];\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: 'Drop',\n }),\n ];\n },\n };\n}\n","import {\n createTransformOp,\n type Op,\n type ContainerBounds,\n type DropTarget,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutDragged,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { cellAt } from '../snaps';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\ninterface TileMeta {\n col: number;\n row: number;\n cellRect: Rect;\n}\n\n/**\n * What a `tileGrid` does with a child past its `cols × rows` cells.\n *\n * - `'reject'` (default) — the grid holds `cols × rows` and refuses more, by\n * any route: a drop finds no free cell, and an insert or reparent that would\n * overfill it is reverted whole.\n * - `'grow'` — the grid adds a line of cells whenever the last one fills\n * (a row, or a column for `flow: 'column'`) and the container grows by its\n * pitch to hold it, and gives the line back when children leave and it\n * empties. `rows` (or `cols`) is the minimum.\n * - `'scroll'` — the container keeps its size, and the extra children take\n * cells past its last visible line, at the same pitch. `contentExtent`\n * reports the region they cover, for a host to scroll over.\n */\nexport type TileGridOverflow = 'reject' | 'grow' | 'scroll';\n\n/** Options for `tileGrid`. */\nexport interface TileGridOptions<TPose> {\n cols: number;\n rows: number;\n /** Gap between cells, in world units. Default 0. */\n gap?: number;\n /** The order cells fill in: along each row (`'row'`, the default) or down\n * each column (`'column'`). It is also the direction an overflowing grid\n * runs on in. */\n flow?: 'row' | 'column';\n /** What happens past `cols × rows` children. Default `'reject'`. */\n overflow?: TileGridOverflow;\n snap?: LayoutSnap<TPose>;\n /** Optional: map a cell rect + the dragged pose to the new pose. Default\n * writes `{ x, y, width, height }` into the dragged pose (assumes\n * `RectPose`). Override for point-only poses or other shapes. The\n * `dragged` argument is the pre-drop pose of the child being placed —\n * use it to preserve fields the cell rect doesn't carry (e.g. rotation,\n * domain metadata). */\n cellToPose?(cellRect: Rect, dragged: TPose): TPose;\n /** Optional: the point that decides which cell a child occupies — a child\n * occupies the cell containing it. Default reads `x`/`y` plus half of\n * `width`/`height` when the pose has them, which is the center of a\n * `RectPose` and the point itself for a point pose. */\n centerOf?(pose: TPose): { x: number; y: number };\n}\n\nfunction defaultCenterOf(pose: unknown): { x: number; y: number } {\n const p = pose as { x?: number; y?: number; width?: number; height?: number };\n return { x: (p.x ?? 0) + (p.width ?? 0) / 2, y: (p.y ?? 0) + (p.height ?? 0) / 2 };\n}\n\n/**\n * Layout strategy that arranges children into a grid of cells, one child per\n * cell. What happens past `cols × rows` children is the `overflow` policy.\n *\n * A child occupies the cell its pose sits in (see `centerOf`). A drag from\n * inside the container swaps with the child in the cell it lands on; a drop\n * from outside is offered only the free cells, so it lands in the nearest\n * free one. A child that joins by an insert or a reparent is placed the same\n * way, in the free cell nearest to where it was put.\n */\nexport function tileGrid<TPose>(\n opts: TileGridOptions<TPose>,\n): LayoutStrategy<TPose> {\n const { cols, rows } = opts;\n const gap = opts.gap ?? 0;\n const byColumn = opts.flow === 'column';\n const overflow = opts.overflow ?? 'reject';\n const snap = opts.snap ?? cellAt<TPose>();\n const capacity = cols * rows;\n /** Cells per line in fill order, and the declared line count. */\n const perLine = byColumn ? rows : cols;\n const minLines = byColumn ? cols : rows;\n const cellToPose: (cell: Rect, dragged: TPose) => TPose =\n opts.cellToPose ?? ((cell, dragged) => {\n // Default: spread the cell rect over the dragged pose. Preserves any\n // extra fields the dragged pose carries.\n return { ...(dragged as object), ...cell } as TPose;\n });\n const centerOf = opts.centerOf ?? defaultCenterOf;\n\n const linesFor = (n: number): number => Math.max(minLines, Math.ceil(n / perLine));\n\n /** The grid over `bounds` while it holds `n` children: its cell pitch, and\n * how many cells it offers before running past the container. A growing\n * grid spreads its lines over the container, which it keeps sized to fit\n * them; the others always lay the declared grid over it. */\n function gridOf(bounds: ContainerBounds, n: number) {\n const lines = overflow === 'grow' ? linesFor(n) : minLines;\n const c = byColumn ? lines : cols;\n const r = byColumn ? rows : lines;\n const cw = (bounds.width - gap * (c - 1)) / c;\n const ch = (bounds.height - gap * (r - 1)) / r;\n\n function rectAt(index: number): Rect {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n const col = byColumn ? line : along;\n const row = byColumn ? along : line;\n return { x: bounds.x + col * (cw + gap), y: bounds.y + row * (ch + gap), width: cw, height: ch };\n }\n\n /** The cell index `pose` sits in, overflow cells past the container\n * included, or `null` in a gap or off the grid. */\n function indexOf(pose: TPose): number | null {\n const p = centerOf(pose);\n const col = Math.floor((p.x - bounds.x) / (cw + gap));\n const row = Math.floor((p.y - bounds.y) / (ch + gap));\n if (col < 0 || row < 0) return null;\n if (p.x - bounds.x - col * (cw + gap) >= cw) return null;\n if (p.y - bounds.y - row * (ch + gap) >= ch) return null;\n if (byColumn ? row >= rows : col >= cols) return null;\n return byColumn ? col * rows + row : row * cols + col;\n }\n\n /** The cells a drop may land in, or an arrival be placed in, with `n`\n * children in the grid: the declared grid when it refuses overflow, and\n * otherwise every whole line the children reach. */\n const cells = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n\n /** The container bounds that hold `lines` lines at this pitch. */\n function boundsFor(lineCount: number): ContainerBounds {\n return byColumn\n ? { ...bounds, width: lineCount * cw + gap * (lineCount - 1) }\n : { ...bounds, height: lineCount * ch + gap * (lineCount - 1) };\n }\n\n return { rectAt, indexOf, cells, boundsFor };\n }\n\n const metaOf = (index: number, cellRect: Rect): TileMeta => {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n return byColumn\n ? { col: line, row: along, cellRect }\n : { col: along, row: line, cellRect };\n };\n const indexOfMeta = (m: TileMeta): number => (byColumn ? m.col * rows + m.row : m.row * cols + m.col);\n\n /** How many children the grid holds, not counting a drag from outside it. */\n const heldBy = (container: LayoutContainer, children: ReadonlyArray<LayoutChild<TPose>>, dragged?: LayoutDragged<TPose>): number =>\n dragged && dragged.sourceContainerId !== container.id\n ? children.filter((c) => c.id !== dragged.id).length\n : children.length;\n\n /**\n * Compute the swap induced by dragging `dragged` onto `target`, if any.\n * Returns `null` when there is no swap (cross-container drop, empty cell,\n * or null target). The same logic backs both `reflowPoses` (preview) and\n * `commitDrop` (commit) so they cannot disagree.\n */\n function computeSwap(\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n dragged: LayoutDragged<TPose>,\n target: DropTarget<TPose> | null,\n ): { occupant: string; from: TPose; newPose: TPose } | null {\n if (target === null) return null;\n if (dragged.sourceContainerId !== container.id) return null;\n const grid = gridOf(container.bounds, children.length);\n const idx = indexOfMeta(target.meta as TileMeta);\n const occupant = children.find((c) => c.id !== dragged.id && grid.indexOf(c.pose) === idx);\n if (occupant === undefined) return null;\n // The occupant takes the cell the dragged child is leaving — where the\n // container state says it is now, which an earlier placement of the same\n // drop may have moved it to.\n const self = children.find((c) => c.id === dragged.id);\n const fromIdx = grid.indexOf(self ? self.pose : dragged.originPose);\n if (fromIdx === null || fromIdx === idx) return null;\n return { occupant: occupant.id, from: occupant.pose, newPose: cellToPose(grid.rectAt(fromIdx), occupant.pose) };\n }\n\n /**\n * Every child a cell of `into`, in the order of the cells they sit in on\n * `from`, so a reflow compacts the survivors rather than re-sorting them —\n * an earlier swap among them has to outlive a sibling leaving the grid.\n * Children sitting in no cell (a gap, or off the grid) sort last; ties break\n * by id so an arrangement with no cells yet is still deterministic. Past\n * the declared grid they run on at the same pitch.\n */\n function pack(\n from: ReturnType<typeof gridOf>,\n into: ReturnType<typeof gridOf>,\n children: ReadonlyArray<LayoutChild<TPose>>,\n ): Map<string, TPose> {\n const ordered = children\n .map((c) => ({ c, cell: from.indexOf(c.pose) }))\n .sort((a, b) => {\n if (a.cell !== b.cell) {\n if (a.cell === null) return 1;\n if (b.cell === null) return -1;\n return a.cell - b.cell;\n }\n return a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0;\n });\n const out = new Map<string, TPose>();\n for (let i = 0; i < ordered.length; i++) {\n out.set(ordered[i].c.id, cellToPose(into.rectAt(i), ordered[i].c.pose));\n }\n return out;\n }\n\n return {\n snap,\n\n childPoses(container, children) {\n const grid = gridOf(container.bounds, children.length);\n return pack(grid, grid, children);\n },\n\n getDropTargets(container, children, dragged) {\n const grid = gridOf(container.bounds, heldBy(container, children, dragged));\n // A drag from inside may land on an occupied cell and swap; one from\n // outside has nobody to swap with, so occupied cells are not offered.\n const occupied = new Set<number>();\n const fromOutside = dragged.sourceContainerId !== container.id;\n if (fromOutside) {\n for (const c of children) {\n if (c.id === dragged.id) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) occupied.add(idx);\n }\n }\n const offered: number[] = [];\n for (let i = 0; i < grid.cells; i++) if (!occupied.has(i)) offered.push(i);\n // A grid that takes overflow always has room for one more.\n if (fromOutside && offered.length === 0 && overflow !== 'reject') offered.push(grid.cells);\n return offered.map((i) => {\n const cellRect = grid.rectAt(i);\n return {\n pose: cellToPose(cellRect, dragged.pose),\n origin: { x: cellRect.x + cellRect.width / 2, y: cellRect.y + cellRect.height / 2 },\n meta: metaOf(i, cellRect) satisfies TileMeta,\n };\n });\n },\n\n reflowPoses(container, children, dragged, target) {\n const out = new Map<string, TPose>();\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n out.set(swap.occupant, swap.newPose);\n }\n return out;\n },\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n\n let droppedPose: TPose;\n if (target === null) {\n droppedPose = dragged.pose;\n } else {\n const meta = target.meta as TileMeta;\n droppedPose = cellToPose(meta.cellRect, dragged.pose);\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n ops.push(\n createTransformOp<TPose>({\n id: swap.occupant,\n from: swap.from,\n to: swap.newPose,\n label: 'Tile swap',\n }),\n );\n }\n }\n ops.push(\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: droppedPose,\n label: 'Tile drop',\n }),\n );\n return ops;\n },\n\n arrive(container, children, arrivals): LayoutArrival<TPose> | null {\n const n = children.length;\n if (overflow === 'reject' && n > capacity) return null;\n // The grid as it stood before these joined: its pitch is the one the\n // arrivals are placed at, and a growing grid extends by it.\n const grid = gridOf(container.bounds, n - arrivals.size);\n const slots = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n const taken = new Set<number>();\n for (const c of children) {\n if (arrivals.has(c.id)) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) taken.add(idx);\n }\n const poses = new Map<string, TPose>();\n for (const c of children) {\n if (!arrivals.has(c.id)) continue;\n const own = grid.indexOf(c.pose);\n let idx: number;\n if (own !== null && own < slots && !taken.has(own)) {\n idx = own;\n } else {\n const at = centerOf(c.pose);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < slots; i++) {\n if (taken.has(i)) continue;\n const r = grid.rectAt(i);\n const dx = r.x + r.width / 2 - at.x;\n const dy = r.y + r.height / 2 - at.y;\n const d = dx * dx + dy * dy;\n if (d < bestD) { bestD = d; best = i; }\n }\n if (best < 0) return null;\n idx = best;\n }\n taken.add(idx);\n poses.set(c.id, cellToPose(grid.rectAt(idx), c.pose));\n }\n if (overflow !== 'grow') return { poses };\n const lines = linesFor(n);\n if (lines === linesFor(n - arrivals.size)) return { poses };\n return { poses, bounds: grid.boundsFor(lines) };\n },\n\n depart(container, children, departed): LayoutArrival<TPose> {\n const n = children.length;\n // The grid as it stood with the departed still in it: a grown grid\n // gives back whole lines at that pitch, down to its declared count.\n const before = gridOf(container.bounds, n + departed.size);\n const lines = linesFor(n);\n if (overflow !== 'grow' || lines === linesFor(n + departed.size)) {\n return { poses: pack(before, before, children) };\n }\n const bounds = before.boundsFor(lines);\n return { poses: pack(before, gridOf(bounds, n), children), bounds };\n },\n\n contentExtent(container, children) {\n const grid = gridOf(container.bounds, children.length);\n const lines = Math.ceil(children.length / perLine);\n if (lines <= minLines) return container.bounds;\n const reach = grid.boundsFor(lines);\n return overflow === 'grow'\n ? container.bounds\n : { ...reach, width: Math.max(reach.width, container.bounds.width), height: Math.max(reach.height, container.bounds.height) };\n },\n };\n}\n","import {\n type Vec2,\n createTransformOp,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { nearestWithin } from '../snaps';\n\n/** Which points within a container a child can snap to. */\nexport type SnapPattern = 'corners' | 'edges' | 'center' | 'grid';\n\n/** Options for `snapPoint`. */\nexport interface SnapPointOptions<TPose> {\n pattern: SnapPattern;\n /** Spacing for the 'grid' pattern, in world units. Default 50. */\n gridSpacing?: number;\n /** Tolerance for the default snap policy (nearestWithin). Default Infinity. */\n tolerance?: number;\n snap?: LayoutSnap<TPose>;\n}\n\nfunction buildPoints(\n bounds: { x: number; y: number; width: number; height: number },\n pattern: SnapPattern,\n gridSpacing: number,\n): Vec2[] {\n switch (pattern) {\n case 'corners':\n return [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ];\n case 'edges':\n return [\n { x: bounds.x + bounds.width / 2, y: bounds.y },\n { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height },\n { x: bounds.x, y: bounds.y + bounds.height / 2 },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height / 2 },\n ];\n case 'center':\n return [{ x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 }];\n case 'grid': {\n const out: Vec2[] = [];\n const cols = Math.floor(bounds.width / gridSpacing);\n const rows = Math.floor(bounds.height / gridSpacing);\n for (let j = 0; j <= rows; j++) {\n for (let i = 0; i <= cols; i++) {\n out.push({ x: bounds.x + i * gridSpacing, y: bounds.y + j * gridSpacing });\n }\n }\n return out;\n }\n }\n}\n\n/** Layout strategy that leaves children where they are but offers a fixed set\n * of points — corners, edge midpoints, center, or a grid — for a dragged\n * child to land on. */\nexport function snapPoint<TPose extends Vec2>(\n opts: SnapPointOptions<TPose>,\n): LayoutStrategy<TPose> {\n const gridSpacing = opts.gridSpacing ?? 50;\n const tolerance = opts.tolerance ?? Infinity;\n const snap = opts.snap ?? nearestWithin<TPose>({ tolerance });\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets(container, _children, dragged) {\n const points = buildPoints(container.bounds, opts.pattern, gridSpacing);\n return points.map((p) => ({\n // Anchor the dragged child's top-left at the snap point.\n pose: { ...dragged.pose, x: p.x, y: p.y } as TPose,\n origin: p,\n }));\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n const to = target === null ? dragged.pose : target.pose;\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to,\n label: 'Snap drop',\n }),\n ];\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/match.ts","../src/guides/alignment/spacing.ts","../src/guides/alignment/plane.ts","../src/guides/alignment/behaviors.ts","../src/layout/snaps.ts","../src/layout/perContainer.ts","../src/layout/strategies/freeform.ts","../src/layout/strategies/tileGrid.ts","../src/layout/strategies/snapPoint.ts","../src/layout/strategies/sequence.ts","../src/layout/strategies/slots.ts","../src/layout/strategies/pack.ts","../src/layout/strategies/quadtree.ts","../src/layout/strategies/arrangements.ts"],"names":["across","resolveAxes","useState","useLatest","useCallback","PATH_M","PATH_L","EPS","bestAxis","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","lo","hi","pack","into","createTransformOp","slots","defaultCenterOf","rectOf"],"mappings":"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","file":"index.js","sourcesContent":["/** Round `value` to the nearest multiple of `cellSize`. Returns 0 when the result would be -0. */\nexport function roundToCell(value: number, cellSize: number): number {\n return Math.round(value / cellSize) * cellSize || 0;\n}\n","/**\n * Pointer-tracking glue that turns hover position into a grid cell, suitable\n * for dropping straight into `createCellHighlightLayer({ getCell })`.\n *\n * State updates only fire when the cell actually changes (not on every\n * pointer tick). Pass `onChange` to trigger a canvas redraw on each transition.\n */\n\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n useLatest,\n screenToWorld,\n type ViewTransform,\n type PlaneUnits,\n type PlaneValue,\n} from '@weasel-js/core';\nimport { pointToGridCell } from '../strategies/grid';\n\n/** Options for `useGridCellHover`. */\nexport interface UseGridCellHoverOptions {\n /** Element to attach pointer listeners to (typically the canvas). */\n ref: RefObject<HTMLElement | null>;\n /** Read the current view transform. Called on every pointermove so it can\n * reflect live pan/zoom without a re-binding step. */\n view: () => ViewTransform;\n /** Cell spacing in world units. Same value you pass to `createGridLayer`\n * and `createCellHighlightLayer`. */\n spacing: PlaneValue;\n /** Required if `spacing` is tagged (e.g. `{ value: 1, unit: 'ft' }`). */\n unitSystem?: PlaneUnits;\n /** Origin the cell grid is anchored to, in world units. Default `(0, 0)`. */\n origin?: { x: number; y: number };\n /** Fires when the hovered cell changes (including to/from `null`). Use it\n * to invalidate your layer renderer. */\n onChange?: (cell: { col: number; row: number } | null) => void;\n /** Disable the listeners without unmounting. Default `true`. */\n enabled?: boolean;\n}\n\n/** Return shape of `useGridCellHover`. */\nexport interface UseGridCellHoverReturn {\n /** Current hovered cell, or `null` when the pointer is outside the element. */\n cell: { col: number; row: number } | null;\n /** Stable callback that returns the current cell — drop straight into\n * `createCellHighlightLayer({ getCell })`. */\n getCell: () => { col: number; row: number } | null;\n}\n\nfunction cellsEqual(\n a: { col: number; row: number } | null,\n b: { col: number; row: number } | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return a.col === b.col && a.row === b.row;\n}\n\n/** Track which grid cell the pointer is over; pairs with `createCellHighlightLayer`. */\nexport function useGridCellHover(opts: UseGridCellHoverOptions): UseGridCellHoverReturn {\n const [cell, setCell] = useState<{ col: number; row: number } | null>(null);\n const cellRef = useRef<{ col: number; row: number } | null>(null);\n const optsRef = useLatest(opts);\n\n const getCell = useCallback(() => cellRef.current, []);\n\n const enabled = opts.enabled ?? true;\n useEffect(() => {\n if (!enabled) return;\n const el = opts.ref.current;\n if (!el) return;\n\n const update = (next: { col: number; row: number } | null) => {\n if (cellsEqual(cellRef.current, next)) return;\n cellRef.current = next;\n setCell(next);\n optsRef.current.onChange?.(next);\n };\n\n const onMove = (e: PointerEvent) => {\n const o = optsRef.current;\n const rect = el.getBoundingClientRect();\n const sx = e.clientX - rect.left;\n const sy = e.clientY - rect.top;\n const [wx, wy] = screenToWorld(sx, sy, o.view());\n update(pointToGridCell({ x: wx, y: wy }, o.spacing, o.unitSystem, o.origin));\n };\n const onLeave = () => update(null);\n\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerleave', onLeave);\n el.addEventListener('pointercancel', onLeave);\n return () => {\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerleave', onLeave);\n el.removeEventListener('pointercancel', onLeave);\n };\n }, [enabled, opts.ref, optsRef]);\n\n return { cell, getCell };\n}\n","/**\n * Grid overlay — a reusable render layer that draws a world-space grid with\n * optional finer subdivisions and accent lines every N cells.\n *\n * The layer renders in world space — the caller is expected to have applied\n * any view transform to the canvas context already. To draw a highlighted\n * cell (snap-target preview), stack `createCellHighlightLayer` alongside\n * this one.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type CommandStroke,\n resolveStrokeWidth,\n resolveAxes,\n type PlaneUnits,\n type PlaneValue,\n pxExtent,\n} from '@weasel-js/core';\nimport { PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\n\n/** Options for `createGridLayer`. */\nexport interface GridLayerOpts {\n /**\n * Distance between adjacent grid lines (also known as grid pitch),\n * in world (base) units. Accepts a bare number or a tagged\n * `{ value, unit }`. Tagged values require `unitSystem` to be supplied.\n * Either may be per axis — `{ x, y }`.\n */\n spacing: PlaneValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: PlaneUnits;\n /** Bounds of the area to cover, in world units. */\n bounds: () => { x: number; y: number; width: number; height: number };\n /** Lines every N cells get the accent style. 0/undef = no accent. */\n accentEvery?: number;\n /** Optional finer subdivisions per cell. e.g. 4 -> 4 sub-lines per cell. */\n subdivisions?: number;\n /** Per-band stroke styles. Each is a Paint+width (etc.) — see `Stroke`. */\n style?: {\n line?: CommandStroke;\n accent?: CommandStroke;\n sub?: CommandStroke;\n };\n}\n\n// Defaults express weight via opacity rather than a fixed dark color so the\n// grid reads correctly against any background fill (kit demos use a neutral\n// gray; consumer apps may use cream / dark / themed surfaces). Override\n// per-canvas via `style.{line,accent,sub}.paint` if a hard color is needed.\nconst DEFAULT_LINE: CommandStroke = {\n paint: { kind: 'solid', color: 'rgba(255, 255, 255, 0.08)' },\n width: 1,\n};\nconst DEFAULT_ACCENT: CommandStroke = {\n paint: { kind: 'solid', color: 'rgba(255, 255, 255, 0.16)' },\n width: 1,\n};\nconst DEFAULT_SUB: CommandStroke = {\n paint: { kind: 'solid', color: 'rgba(255, 255, 255, 0.04)' },\n width: 1,\n};\n\n/** Build a `RenderLayer` that draws a world-space grid with optional accent lines and subdivisions. */\nexport function createGridLayer(opts: GridLayerOpts): RenderLayer<unknown> {\n const line = opts.style?.line ?? DEFAULT_LINE;\n const accent = opts.style?.accent ?? DEFAULT_ACCENT;\n const sub = opts.style?.sub ?? DEFAULT_SUB;\n\n return {\n id: 'grid',\n label: 'Grid',\n draw: (_data, view) => {\n const b = opts.bounds();\n if (b.width <= 0 || b.height <= 0) return [];\n\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveAxes(opts.spacing, opts.unitSystem);\n const x0 = b.x;\n const y0 = b.y;\n const x1 = b.x + b.width;\n const y1 = b.y + b.height;\n // Every line is axis-aligned, so its width runs along one screen axis\n // and one pixel of it is exactly that axis's extent.\n const px = pxExtent(1, view.scale);\n\n const children: DrawCommand[] = [];\n\n const pushSegment = (sx: number, sy: number, ex: number, ey: number, s: CommandStroke): void => {\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, ex, ey]),\n fillRule: 'nonzero',\n };\n const across = sx === ex ? px.x : px.y;\n children.push({\n kind: 'path',\n path,\n stroke: { ...s, width: resolveStrokeWidth(s.width ?? 1, 1) * across },\n });\n };\n\n // Sub-lines (drawn first so cell lines paint on top).\n if (subdivisions && subdivisions > 1) {\n const stepX = spacing.x / subdivisions;\n for (let x = x0; x <= x1 + 1e-9; x += stepX) {\n const k = Math.round((x - x0) / stepX);\n if (k % subdivisions === 0) continue;\n pushSegment(x, y0, x, y1, sub);\n }\n const stepY = spacing.y / subdivisions;\n for (let y = y0; y <= y1 + 1e-9; y += stepY) {\n const k = Math.round((y - y0) / stepY);\n if (k % subdivisions === 0) continue;\n pushSegment(x0, y, x1, y, sub);\n }\n }\n\n // Cell lines (skip ones that will become accents).\n let idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing.x) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x, y0, x, y1, line);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing.y) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x0, y, x1, y, line);\n idx++;\n }\n\n // Accent lines on top.\n if (accentEvery && accentEvery > 0) {\n idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing.x) {\n if (idx % accentEvery === 0) pushSegment(x, y0, x, y1, accent);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing.y) {\n if (idx % accentEvery === 0) pushSegment(x0, y, x1, y, accent);\n idx++;\n }\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","/**\n * Cell highlight overlay — a thin render layer that fills a single grid cell\n * (e.g. a snap-target preview). Stack it under or over `createGridLayer` in\n * a layer sequence.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type CommandFill,\n resolveAxes,\n type PlaneUnits,\n type PlaneValue,\n} from '@weasel-js/core';\n\n/** Options for `createCellHighlightLayer`. */\nexport interface CellHighlightLayerOpts {\n /** Cell size in world units (matches the grid's `spacing`). */\n spacing: PlaneValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: PlaneUnits;\n /** Origin the cell grid is anchored to, in world units. Defaults to (0,0). */\n origin?: () => { x: number; y: number };\n /** Cell to highlight, or `null` to skip drawing. */\n getCell: () => { col: number; row: number } | null;\n /** Fill for the highlighted cell. Defaults to a soft green. */\n fill?: CommandFill;\n}\n\nconst DEFAULT_FILL: CommandFill = { paint: { kind: 'solid', color: 'rgba(127,176,105,0.15)' } };\n\n/** Build a `RenderLayer` that fills a single grid cell — typically a snap-target preview. */\nexport function createCellHighlightLayer(opts: CellHighlightLayerOpts): RenderLayer<unknown> {\n const fill = opts.fill ?? DEFAULT_FILL;\n return {\n id: 'cell-highlight',\n label: 'Cell highlight',\n draw: () => {\n const cell = opts.getCell();\n if (!cell) return [];\n const spacing = resolveAxes(opts.spacing, opts.unitSystem);\n const o = opts.origin ? opts.origin() : { x: 0, y: 0 };\n const x = o.x + cell.col * spacing.x;\n const y = o.y + cell.row * spacing.y;\n const children: DrawCommand[] = [\n {\n kind: 'path',\n path: { kind: 'rect', x, y, width: spacing.x, height: spacing.y },\n fill,\n },\n ];\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useLatest } from '@weasel-js/core';\nimport type { Guide } from './types';\n\n/** Return shape for `useGuides`. */\nexport interface UseGuidesReturn {\n /** Live list (state). Re-renders when guides change. */\n guides: Guide[];\n /** Stable getter; reads the latest list without forcing a re-render.\n * Pass to `guideSnapStrategy` and `createGuidesLayer`. */\n getGuides: () => Guide[];\n /** Add a guide. If a guide with the same id already exists it is replaced. */\n addGuide: (guide: Guide) => void;\n /** Remove a guide by id. No-op when missing. */\n removeGuide: (id: string) => void;\n /** Drop all guides. */\n clearGuides: () => void;\n}\n\n/**\n * In-memory guide storage. Holds a list of horizontal/vertical world-space\n * lines that callers can pass to `guideSnapStrategy` (snap behavior) and\n * `createGuidesLayer` (render layer).\n *\n * v1 is intentionally minimal: no undo integration, no persistence, no\n * batched mutation. Wrap calls in your own history-aware action if you\n * want guide CRUD to be undoable.\n */\nexport function useGuides(initial: Guide[] = []): UseGuidesReturn {\n const [guides, setGuides] = useState<Guide[]>(initial);\n const ref = useLatest(guides);\n\n const getGuides = useCallback(() => ref.current, [ref]);\n\n const addGuide = useCallback((guide: Guide) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === guide.id);\n if (idx === -1) return [...prev, guide];\n const next = prev.slice();\n next[idx] = guide;\n return next;\n });\n }, []);\n\n const removeGuide = useCallback((id: string) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === id);\n if (idx === -1) return prev;\n const next = prev.slice();\n next.splice(idx, 1);\n return next;\n });\n }, []);\n\n const clearGuides = useCallback(() => {\n setGuides((prev) => (prev.length === 0 ? prev : []));\n }, []);\n\n return { guides, getGuides, addGuide, removeGuide, clearGuides };\n}\n","/**\n * Guides overlay — a screen-space render layer that draws each guide as a\n * thin line, projecting the guide's world offset through the active view.\n * A guide with a `span` draws as a segment over that span with a tick at each\n * end; one without spans the full canvas. It also draws equal-spacing gaps\n * (`SpacingGap`) as ticked segments labeled with their size.\n *\n * Guides are not scene objects; they live outside the scene and are managed\n * via `useGuides`. Pair with `guideSnapStrategy` (snap behavior) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport { textCommandFromRuns, type DrawCommand, type RenderLayer, type CommandStroke } from '@weasel-js/core';\nimport { PATH_L, PATH_M, rectPath, type PolygonPath } from '@weasel-js/geom';\nimport type { Guide, SpacingGap } from './types';\n\n/** Options for `createGuidesLayer`. */\nexport interface GuidesLayerOpts {\n /** Stable getter for the live guide list — typically `useGuides().getGuides`. */\n getGuides: () => readonly Guide[];\n /** Stable getter for the equal-spacing gaps to draw — typically what an\n * alignment behavior's `setActiveGaps` last published. */\n getGaps?: () => readonly SpacingGap[];\n /** `'span'` (default) draws a guide that carries a `span` as a segment over\n * it; `'full'` draws every guide across the whole canvas. */\n extent?: 'span' | 'full';\n /** Length in CSS px of the tick across each end of a segment. 0 for none.\n * Default 6. */\n ticks?: number;\n /** Label each gap with its size: `true` (default) prints it rounded to a\n * whole world unit, a function formats it, `false` omits the label. */\n gapLabels?: boolean | ((size: number) => string);\n /** Stroke width in CSS pixels. Default 1. */\n lineWidth?: number;\n /** Stroke color, and the gap labels' fill. Default a subtle blue. */\n color?: string;\n /** Gap marker color. Default `color`. */\n gapColor?: string;\n /** Optional dash pattern (CSS px). Currently unused — reserved for future\n * parity with chrome that supports dashes. */\n dash?: number[];\n /** Override the layer id. Useful if a consumer needs more than one\n * guides-layer (e.g. user-guides vs. system-guides). */\n id?: string;\n /** Override the layer label. */\n label?: string;\n}\n\nconst DEFAULT_COLOR = '#3aa0ff';\nconst LABEL_FONT = { fontSize: 10 };\n// No text measurer in a layer: a 10px digit advances about 6px.\nconst LABEL_CHAR_W = 6;\nconst LABEL_H = 14;\nconst LABEL_PAD_X = 4;\n\n/** A straight segment from (x0, y0) to (x1, y1), with a tick of length `t`\n * across each end. Screen px. */\nfunction tickedSegment(x0: number, y0: number, x1: number, y1: number, t: number): PolygonPath {\n const h = t / 2;\n const vertical = x0 === x1;\n const ends = t <= 0 ? [] : vertical\n ? [x0 - h, y0, x0 + h, y0, x1 - h, y1, x1 + h, y1]\n : [x0, y0 - h, x0, y0 + h, x1, y1 - h, x1, y1 + h];\n const coords = [x0, y0, x1, y1, ...ends];\n const commands: number[] = [];\n for (let i = 0; i < coords.length; i += 4) commands.push(PATH_M, PATH_L);\n return {\n kind: 'polygon',\n commands: new Uint8Array(commands),\n coords: new Float32Array(coords),\n fillRule: 'nonzero',\n };\n}\n\n/** Build a `RenderLayer` that draws guide lines and spacing gaps in screen\n * space, projected from world coordinates via the active view. */\nexport function createGuidesLayer(opts: GuidesLayerOpts): RenderLayer<unknown> {\n const lineWidth = opts.lineWidth ?? 1;\n const color = opts.color ?? DEFAULT_COLOR;\n const gapColor = opts.gapColor ?? color;\n const ticks = opts.ticks ?? 6;\n const spanned = (opts.extent ?? 'span') === 'span';\n const format = opts.gapLabels === false ? null\n : typeof opts.gapLabels === 'function' ? opts.gapLabels\n : (n: number) => String(Math.round(n));\n const stroke: CommandStroke = { paint: { kind: 'solid', color }, width: lineWidth };\n const gapStroke: CommandStroke = { paint: { kind: 'solid', color: gapColor }, width: lineWidth };\n\n return {\n id: opts.id ?? 'guides',\n label: opts.label ?? 'Guides',\n space: 'screen',\n draw: (_data, view, dims) => {\n const guides = opts.getGuides();\n const gaps = opts.getGaps?.() ?? [];\n if (guides.length === 0 && gaps.length === 0) return [];\n const sx = (x: number) => (x - view.x) * view.scale.x;\n const sy = (y: number) => (y - view.y) * view.scale.y;\n\n const out: DrawCommand[] = [];\n for (const g of guides) {\n const span = spanned ? g.span : undefined;\n if (g.axis === 'x') {\n const x = sx(g.offset);\n if (x < -lineWidth || x > dims.width + lineWidth) continue;\n const path = span\n ? tickedSegment(x, sy(span.min), x, sy(span.max), ticks)\n : tickedSegment(x, 0, x, dims.height, 0);\n out.push({ kind: 'path', path, stroke });\n } else {\n const y = sy(g.offset);\n if (y < -lineWidth || y > dims.height + lineWidth) continue;\n const path = span\n ? tickedSegment(sx(span.min), y, sx(span.max), y, ticks)\n : tickedSegment(0, y, dims.width, y, 0);\n out.push({ kind: 'path', path, stroke });\n }\n }\n\n for (const g of gaps) {\n const [x0, y0, x1, y1] = g.axis === 'x'\n ? [sx(g.min), sy(g.at), sx(g.max), sy(g.at)]\n : [sx(g.at), sy(g.min), sx(g.at), sy(g.max)];\n out.push({ kind: 'path', path: tickedSegment(x0, y0, x1, y1, ticks), stroke: gapStroke });\n if (format === null) continue;\n const text = format(g.max - g.min);\n const w = text.length * LABEL_CHAR_W + LABEL_PAD_X * 2;\n const left = (x0 + x1) / 2 - w / 2;\n const top = (y0 + y1) / 2 - LABEL_H / 2;\n out.push({ kind: 'path', path: rectPath(left, top, w, LABEL_H), fill: { paint: { kind: 'solid', color: gapColor } } });\n out.push(textCommandFromRuns(\n left + LABEL_PAD_X,\n top + 2,\n [{ text, fill: { paint: { kind: 'solid', color: '#fff' } } }],\n LABEL_FONT,\n ));\n }\n return out;\n },\n };\n}\n","import type { Guide } from '../types';\nimport type { DeriveAlignmentGuidesOptions } from './types';\nimport {\n type Bounds,\n type PoseDescriptor,\n rectFromPlane,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n} from '@weasel-js/core';\n\nconst EPS = 1e-3;\n\n/** Derive candidate alignment lines from a set of sibling poses plus an\n * optional page box. Each box contributes up to 3 guides per axis: the two\n * edges and the center. Overlapping offsets collapse to one candidate, whose\n * `span` covers every box that produced it.\n * Poses go through the same descriptor `alignMoveBehavior` matches with, so\n * a rotated sibling advertises its ink edges rather than its stored box.\n * The lines are in the camera's world: a sibling on a parallax layer needs\n * `planeOf` to say which plane its pose is in. */\nexport function deriveAlignmentGuides<TPose = Bounds>(\n targets: readonly TPose[],\n opts: DeriveAlignmentGuidesOptions<TPose> = {},\n): Guide[] {\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const edges = opts.edges ?? true;\n const centers = opts.centers ?? true;\n // Dedup per axis: key = rounded offset. First writer wins (stable id).\n const seenX = new Map<number, Guide>();\n const seenY = new Map<number, Guide>();\n\n const add = (axis: 'x' | 'y', offset: number, b: Bounds): void => {\n const seen = axis === 'x' ? seenX : seenY;\n const key = Math.round(offset / EPS);\n const min = axis === 'x' ? b.y : b.x;\n const max = min + (axis === 'x' ? b.height : b.width);\n const prev = seen.get(key);\n if (prev) {\n prev.span = { min: Math.min(prev.span!.min, min), max: Math.max(prev.span!.max, max) };\n return;\n }\n seen.set(key, { id: `align:${axis}:${offset.toFixed(3)}`, axis, offset, span: { min, max } });\n };\n\n const emit = (b: Bounds): void => {\n if (edges) {\n add('x', b.x, b);\n add('x', b.x + b.width, b);\n add('y', b.y, b);\n add('y', b.y + b.height, b);\n }\n if (centers) {\n add('x', b.x + b.width / 2, b);\n add('y', b.y + b.height / 2, b);\n }\n };\n\n targets.forEach((t, i) => {\n const box = visualBoundsViaDescriptor(t, d);\n const plane = opts.planeOf?.(t, i);\n emit(plane ? rectFromPlane(plane, box) : box);\n });\n if (opts.page) emit(opts.page);\n\n return [...seenX.values(), ...seenY.values()];\n}\n","import type { Guide } from '../types';\nimport type {\n AlignAnchor,\n AlignMatchResult,\n} from './types';\nimport type { Bounds } from '@weasel-js/core';\n\n/** Move/insert test all three features per axis. */\nexport const MOVE_ANCHORS: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = {\n x: ['min', 'center', 'max'],\n y: ['min', 'center', 'max'],\n};\n\nfunction featureOffset(b: Bounds, axis: 'x' | 'y', anchor: AlignAnchor): number {\n if (axis === 'x') {\n if (anchor === 'min') return b.x;\n if (anchor === 'center') return b.x + b.width / 2;\n return b.x + b.width;\n }\n if (anchor === 'min') return b.y;\n if (anchor === 'center') return b.y + b.height / 2;\n return b.y + b.height;\n}\n\n/** Best (feature, candidate) match on one axis, within tolerance. */\nfunction bestAxis(\n b: Bounds,\n axis: 'x' | 'y',\n anchors: readonly AlignAnchor[],\n candidates: readonly Guide[],\n worldTolerance: number,\n): { delta: number; guide: Guide | null } {\n let bestAbs = Infinity;\n let bestDelta = 0;\n let bestGuide: Guide | null = null;\n for (const anchor of anchors) {\n const o = featureOffset(b, axis, anchor);\n for (const g of candidates) {\n if (g.axis !== axis) continue;\n const d = g.offset - o;\n const ad = Math.abs(d);\n if (ad <= worldTolerance && ad < bestAbs) {\n bestAbs = ad;\n bestDelta = d;\n bestGuide = g;\n }\n }\n }\n return { delta: bestGuide ? bestDelta : 0, guide: bestGuide };\n}\n\n/**\n * Match a moving box's selected edge/center features against candidate guide\n * lines. Returns the per-axis snap delta and the matched candidate line(s).\n * The two axes resolve independently; on each axis the closest in-tolerance\n * (feature, candidate) pair wins. A matched guide that carries a `span` comes\n * back with it stretched to cover the snapped box, so the drawn segment runs\n * from the aligned siblings to the box being dragged.\n *\n * `worldTolerance` is per axis because a screen-pixel tolerance is not one\n * world distance under non-uniform zoom. Pass the same number twice for a\n * world-space tolerance.\n */\nexport function matchAlignment(\n bounds: Bounds,\n candidates: readonly Guide[],\n worldTolerance: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n): AlignMatchResult {\n const x = bestAxis(bounds, 'x', anchors.x, candidates, worldTolerance.x);\n const y = bestAxis(bounds, 'y', anchors.y, candidates, worldTolerance.y);\n const top = bounds.y + y.delta;\n const left = bounds.x + x.delta;\n return {\n dx: x.delta,\n dy: y.delta,\n activeX: stretchSpan(x.guide, top, top + bounds.height),\n activeY: stretchSpan(y.guide, left, left + bounds.width),\n };\n}\n\n/** A matched guide whose span also covers the snapped box. */\nexport function stretchSpan(g: Guide | null, min: number, max: number): Guide | null {\n if (g === null || g.span === undefined) return g;\n return { ...g, span: { min: Math.min(g.span.min, min), max: Math.max(g.span.max, max) } };\n}\n","import type { Bounds } from '@weasel-js/core';\nimport type { SpacingGap } from '../types';\nimport type { SpacingEdge, SpacingMatchResult } from './types';\n\nconst EPS = 1e-6;\ntype Axis = 'x' | 'y';\n\nconst lo = (b: Bounds, a: Axis): number => (a === 'x' ? b.x : b.y);\nconst hi = (b: Bounds, a: Axis): number => (a === 'x' ? b.x + b.width : b.y + b.height);\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The shared range of two boxes on `axis`, or null when they share none. */\nfunction overlap(a: Bounds, b: Bounds, axis: Axis): [number, number] | null {\n const min = Math.max(lo(a, axis), lo(b, axis));\n const max = Math.min(hi(a, axis), hi(b, axis));\n return max - min > EPS ? [min, max] : null;\n}\n\nfunction gapBetween(a: Bounds, b: Bounds, axis: Axis): SpacingGap | null {\n const shared = overlap(a, b, cross(axis));\n if (shared === null) return null;\n return { axis, min: hi(a, axis), max: lo(b, axis), at: (shared[0] + shared[1]) / 2 };\n}\n\n/** Whether `b` covers any of the strip a gap marks out. */\nfunction hitsStrip(g: SpacingGap, b: Bounds, span: [number, number]): boolean {\n const c = cross(g.axis);\n return lo(b, g.axis) < g.max - EPS && hi(b, g.axis) > g.min + EPS\n && lo(b, c) < span[1] - EPS && hi(b, c) > span[0] + EPS;\n}\n\n/**\n * The visible gaps between neighboring boxes along `axis`: for `'x'`, each box\n * and the nearest box to its right that shares some of its vertical range, as\n * long as no third box stands in the strip between them. These are the gaps an\n * equal-spacing snap can reproduce.\n */\nexport function measureGaps(targets: readonly Bounds[], axis: 'x' | 'y'): SpacingGap[] {\n return measure(targets, axis).map((m) => m.gap);\n}\n\ninterface Measured { gap: SpacingGap; span: [number, number] }\n\nfunction measure(targets: readonly Bounds[], axis: Axis): Measured[] {\n const out: Measured[] = [];\n for (const a of targets) {\n let next: Bounds | null = null;\n for (const c of targets) {\n if (c === a || lo(c, axis) < hi(a, axis) + EPS) continue;\n if (overlap(a, c, cross(axis)) === null) continue;\n if (next === null || lo(c, axis) < lo(next, axis)) next = c;\n }\n if (next === null) continue;\n const gap = gapBetween(a, next, axis)!;\n const span = overlap(a, next, cross(axis))!;\n if (targets.some((t) => t !== a && t !== next && hitsStrip(gap, t, span))) continue;\n out.push({ gap, span });\n }\n return out.sort((p, q) => p.gap.min - q.gap.min || p.gap.at - q.gap.at);\n}\n\ninterface AxisHit { delta: number; size: number }\n\n/** The best equal-spacing placement on one axis, or null. */\nfunction bestAxis(\n b: Bounds,\n axis: Axis,\n edge: SpacingEdge,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n tol: number,\n): AxisHit | null {\n const bLo = lo(b, axis);\n const bHi = hi(b, axis);\n const size = bHi - bLo;\n const center = (bLo + bHi) / 2;\n let left: Bounds | null = null;\n let right: Bounds | null = null;\n for (const t of targets) {\n if (overlap(t, b, cross(axis)) === null) continue;\n if (hi(t, axis) <= center && (left === null || hi(t, axis) > hi(left, axis))) left = t;\n if (lo(t, axis) >= center && (right === null || lo(t, axis) < lo(right, axis))) right = t;\n }\n const sizes = refs.map((g) => g.max - g.min);\n\n let best: AxisHit | null = null;\n const offer = (delta: number, gap: number): void => {\n if (gap <= EPS || Math.abs(delta) > tol) return;\n if (best === null || Math.abs(delta) < Math.abs(best.delta)) best = { delta, size: gap };\n };\n\n const L = left === null ? null : hi(left, axis);\n const R = right === null ? null : lo(right, axis);\n if (edge === 'both') {\n for (const g of sizes) {\n if (L !== null && (R === null || L + g + size <= R + EPS)) offer(L + g - bLo, g);\n if (R !== null && (L === null || R - g - size >= L - EPS)) offer(R - g - size - bLo, g);\n }\n if (L !== null && R !== null) {\n const g = (R - L - size) / 2;\n offer(L + g - bLo, g);\n }\n } else if (edge === 'max' && R !== null) {\n const own = L !== null ? [bLo - L] : [];\n for (const g of [...sizes, ...own]) if (R - g > bLo + EPS) offer(R - g - bHi, g);\n } else if (edge === 'min' && L !== null) {\n const own = R !== null ? [R - bHi] : [];\n for (const g of [...sizes, ...own]) if (L + g < bHi - EPS) offer(L + g - bLo, g);\n }\n return best;\n}\n\n/** Every gap of `size` on `axis` once the box sits at `b`: the matching\n * reference gaps, plus the box's own gaps to its two neighbors. */\nfunction markers(\n b: Bounds,\n axis: Axis,\n size: number,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n): SpacingGap[] {\n const eq = (g: SpacingGap) => Math.abs(g.max - g.min - size) < 1e-3;\n const out = refs.filter(eq);\n const own = measureGaps([...targets, b], axis).filter((g) =>\n (Math.abs(g.max - lo(b, axis)) < EPS || Math.abs(g.min - hi(b, axis)) < EPS) && eq(g));\n return [...out, ...own];\n}\n\n/**\n * Match a box against the gaps between `targets`, Figma's \"equal spacing\":\n * on each axis, find where the box's gap to a neighbor equals a gap that\n * already exists between two other boxes, or where it sits centered between\n * its two neighbors. `moving` says which edges move on each axis — `'both'`\n * for a translate, `'min'`/`'max'` for a resize dragging that edge, `null` to\n * leave the axis alone. Default `'both'` on each axis.\n *\n * Targets should exclude the box itself. A reference gap the box now stands\n * inside no longer counts. The returned gaps are every gap equal to the one\n * snapped to, with the box at its snapped position — ready to draw with\n * `createGuidesLayer`'s `getGaps`.\n */\nexport function matchSpacing(\n bounds: Bounds,\n targets: readonly Bounds[],\n worldTolerance: { x: number; y: number },\n moving: { x: SpacingEdge | null; y: SpacingEdge | null } = { x: 'both', y: 'both' },\n): SpacingMatchResult {\n const refsFor = (axis: Axis) => measure(targets, axis)\n .filter((m) => !hitsStrip(m.gap, bounds, m.span))\n .map((m) => m.gap);\n const refsX = refsFor('x');\n const refsY = refsFor('y');\n const x = moving.x === null ? null : bestAxis(bounds, 'x', moving.x, targets, refsX, worldTolerance.x);\n const y = moving.y === null ? null : bestAxis(bounds, 'y', moving.y, targets, refsY, worldTolerance.y);\n const dx = x?.delta ?? 0;\n const dy = y?.delta ?? 0;\n const final = applyEdges(bounds, dx, dy, moving);\n return {\n dx,\n dy,\n gapsX: x === null ? [] : markers(final, 'x', x.size, targets, refsX),\n gapsY: y === null ? [] : markers(final, 'y', y.size, targets, refsY),\n };\n}\n\n/** Move the box's moving edges by the snap deltas. */\nexport function applyEdges(\n b: Bounds,\n dx: number,\n dy: number,\n moving: { x: SpacingEdge | null; y: SpacingEdge | null },\n): Bounds {\n let { x, y, width, height } = b;\n if (moving.x === 'both') x += dx;\n else if (moving.x === 'min') { x += dx; width -= dx; }\n else if (moving.x === 'max') width += dx;\n if (moving.y === 'both') y += dy;\n else if (moving.y === 'min') { y += dy; height -= dy; }\n else if (moving.y === 'max') height += dy;\n return { x, y, width, height };\n}\n","import { rectToPlane, type PlaneMap } from '@weasel-js/core';\nimport type { Guide, SpacingGap } from '../types';\nimport { guideOffsetOn } from '../../strategies/onPlane';\nimport type { AlignmentBehaviorBase } from './types';\n\ntype Axis = 'x' | 'y';\nconst across = (axis: Axis): Axis => (axis === 'x' ? 'y' : 'x');\n\nconst into = (m: PlaneMap, axis: Axis, v: number): number => v * m.scale[axis] + m.offset[axis];\nconst outOf = (m: PlaneMap, axis: Axis, v: number): number => (v - m.offset[axis]) / m.scale[axis];\n\n/** `min` and `max` through `map`, put back in order where the axis is flipped. */\nfunction range<R extends { min: number; max: number }>(r: R, map: (v: number) => number): R {\n const a = map(r.min);\n const b = map(r.max);\n return { ...r, min: Math.min(a, b), max: Math.max(a, b) };\n}\n\nfunction guideToPlane(g: Guide, m: PlaneMap): Guide {\n const span = g.span && range(g.span, (v) => into(m, across(g.axis), v));\n return { ...g, offset: guideOffsetOn(g, m), ...(span ? { span } : {}) };\n}\n\nfunction guideFromPlane(g: Guide, m: PlaneMap): Guide {\n const span = g.span && range(g.span, (v) => outOf(m, across(g.axis), v));\n return { ...g, offset: outOf(m, g.axis, g.offset), ...(span ? { span } : {}) };\n}\n\nfunction gapFromPlane(g: SpacingGap, m: PlaneMap): SpacingGap {\n return { ...range(g, (v) => outOf(m, g.axis, v)), at: outOf(m, across(g.axis), g.at) };\n}\n\n/**\n * `args` as a gesture whose poses are in `plane` reads them. A caller's\n * candidate lines and spacing boxes are in the camera's world, and so is what\n * it is told to draw; the matching between runs in the plane, where the poses\n * are. With no plane this is `args` itself.\n */\nexport function alignmentOnPlane<A extends AlignmentBehaviorBase>(args: A, plane: PlaneMap | null | undefined): A {\n if (!plane) return args;\n const spacing = args.getSpacingTargets;\n const setGaps = args.setActiveGaps;\n return {\n ...args,\n getCandidates: () => args.getCandidates().map((g) => guideToPlane(g, plane)),\n setActiveGuides: (guides) => args.setActiveGuides(guides.map((g) => guideFromPlane(g, plane))),\n ...(spacing ? { getSpacingTargets: () => spacing().map((b) => rectToPlane(plane, b)) } : {}),\n ...(setGaps ? { setActiveGaps: (gaps: readonly SpacingGap[]) => setGaps(gaps.map((g) => gapFromPlane(g, plane))) } : {}),\n };\n}\n","import type { Guide, SpacingGap } from '../types';\nimport {\n type BoundsConstraint,\n type InsertBehavior,\n type MoveBehavior,\n type ResizeAnchor,\n type Bounds,\n screenTolerance,\n unionBounds,\n type PoseDescriptor,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n fixedCornerOf,\n} from '@weasel-js/core';\nimport type {\n AlignAnchor,\n AlignmentBehaviorBase,\n SpacingEdge,\n} from './types';\nimport { MOVE_ANCHORS, matchAlignment, stretchSpan } from './match';\nimport { applyEdges, matchSpacing } from './spacing';\nimport { alignmentOnPlane } from './plane';\n\n/** Options for move and resize — adds the pose descriptor for non-rect poses. */\nexport interface AlignMoveArgs<TPose> extends AlignmentBehaviorBase {\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\nconst activeList = (m: { activeX: Guide | null; activeY: Guide | null }): Guide[] =>\n [m.activeX, m.activeY].filter((g): g is Guide => g !== null);\n\n/** Tolerance for re-reading what a settled box touches exactly. */\nconst EXACT = { x: 1e-6, y: 1e-6 };\n\ninterface Resolved { dx: number; dy: number; guides: Guide[]; gaps: SpacingGap[] }\n\ntype Edges = { x: SpacingEdge | null; y: SpacingEdge | null };\n\n/** Snap `b` to alignment lines and, when the caller supplies spacing targets,\n * equal gaps; the nearer snap wins on each axis. What is published is read\n * back off the settled box, so a line and a gap that both hold show together\n * and each is drawn where the box ended up, not where it was dragged. */\nfunction resolve(\n b: Bounds,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n edges: Edges,\n): Resolved | null {\n const candidates = args.getCandidates();\n const m = matchAlignment(b, candidates, tol, anchors);\n const targets = args.getSpacingTargets?.();\n if (targets === undefined) {\n if (m.activeX === null && m.activeY === null) return null;\n return { dx: m.dx, dy: m.dy, guides: activeList(m), gaps: [] };\n }\n const s = matchSpacing(b, targets, tol, edges);\n const pick = (hit: boolean, d: number, spaced: boolean, sd: number): number | null =>\n hit && (!spaced || Math.abs(d) <= Math.abs(sd)) ? d : spaced ? sd : null;\n const dx = pick(m.activeX !== null, m.dx, s.gapsX.length > 0, s.dx);\n const dy = pick(m.activeY !== null, m.dy, s.gapsY.length > 0, s.dy);\n if (dx === null && dy === null) return null;\n const settled = applyEdges(b, dx ?? 0, dy ?? 0, edges);\n const shown = matchSpacing(settled, targets, EXACT, edges);\n return {\n dx: dx ?? 0,\n dy: dy ?? 0,\n guides: activeList(matchAlignment(settled, candidates, EXACT, anchors)),\n gaps: [...shown.gapsX, ...shown.gapsY],\n };\n}\n\nfunction publish(args: AlignmentBehaviorBase, r: Resolved | null): void {\n args.setActiveGuides(r?.guides ?? []);\n args.setActiveGaps?.(r?.gaps ?? []);\n}\n\nfunction worldTol(\n base: AlignmentBehaviorBase,\n ctx: Parameters<typeof screenTolerance>[1],\n): { x: number; y: number } {\n return screenTolerance(base.tolerance ?? 6, ctx);\n}\n\n/** Move behavior: snap the dragged selection's union box (edges + center) to\n * candidates, shaping the proposed translate. The gesture applies the\n * transform uniformly to every dragged id, so the selection shifts together\n * and stays rigid. Single-select is the degenerate one-box union. Publishes\n * the matched line(s); clears on miss, end and cancel. */\nexport function alignMoveBehavior<TPose>(given: AlignMoveArgs<TPose>): MoveBehavior<TPose> {\n const d = (given.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, transform) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n if (transform.kind !== 'translate') return;\n // Union of every dragged id's visual box at its proposed position.\n const boxes: Bounds[] = [];\n for (const id of ctx.draggedIds) {\n const originPose = ctx.origin.get(id);\n if (originPose === undefined) continue;\n boxes.push(visualBoundsViaDescriptor(\n translatePoseViaDescriptor(originPose, transform.dx, transform.dy, d),\n d,\n ));\n }\n const union = unionBounds(boxes);\n if (union === null) return;\n const r = resolve(union, args, worldTol(args, ctx), MOVE_ANCHORS, { x: 'both', y: 'both' });\n publish(args, r);\n if (r === null) return;\n return { transform: { kind: 'translate', dx: transform.dx + r.dx, dy: transform.dy + r.dy } };\n },\n onEnd() { publish(given, null); },\n onCancel() { publish(given, null); },\n };\n}\n\n/** Insert behavior: snap the live `current` point to candidates (treating it\n * as a zero-size box). Publishes the matched line(s). */\nexport function alignInsertBehavior<TPose>(given: AlignmentBehaviorBase): InsertBehavior<TPose> {\n const pointAnchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = { x: ['min'], y: ['min'] };\n return {\n onMove(ctx, { current }) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n const box = { x: current.x, y: current.y, width: 0, height: 0 };\n const m = matchAlignment(box, args.getCandidates(), worldTol(args, ctx), pointAnchors);\n if (m.activeX === null && m.activeY === null) { args.setActiveGuides([]); return; }\n args.setActiveGuides(activeList(m));\n return { current: { x: current.x + m.dx, y: current.y + m.dy } };\n },\n onEnd() { given.setActiveGuides([]); },\n onCancel() { given.setActiveGuides([]); },\n };\n}\n\n/** Resize constraint: snap the corner(s) the drag moves, as drawn, to\n * candidates; the pinned corner stays fixed. On an unrotated pose that is\n * the moving edge(s). On a rotated one the node's own axes set how the\n * corner can travel: a corner handle snaps each world axis, an edge handle\n * slides its edge until the nearer of its two corners meets a line.\n * `poseDescriptor` reads the origin pose's box and rotation, and must match\n * the resize action's. Publishes the matched line(s). */\nexport function alignResizeBehavior<TPose extends Bounds>(\n given: AlignMoveArgs<TPose>,\n): BoundsConstraint<TPose> {\n const d = (given.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, { pose, anchor }) {\n const args = alignmentOnPlane(given, ctx.plane);\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n const origin = ctx.origin.get(ctx.draggedIds[0]);\n const rotation = origin === undefined ? 0 : (d.getRotation?.(origin) ?? 0);\n const m = rotation === 0\n ? matchMovingEdges(pose, anchor, args, worldTol(args, ctx))\n : matchRotatedCorners(pose, anchor, d.getBounds(origin!), rotation, args.getCandidates(), worldTol(args, ctx));\n if (m === null) { publish(args, null); return; }\n\n let { x, y, width, height } = pose;\n if (anchor.x === 'min') width += m.lx;\n else if (anchor.x === 'max') { x += m.lx; width -= m.lx; }\n if (anchor.y === 'min') height += m.ly;\n else if (anchor.y === 'max') { y += m.ly; height -= m.ly; }\n publish(args, { dx: 0, dy: 0, guides: m.guides, gaps: m.gaps });\n return { pose: { ...pose, x, y, width, height } };\n },\n onEnd() { publish(given, null); },\n onCancel() { publish(given, null); },\n };\n}\n\n/** How far to move the dragged corner in the node's local frame, and the\n * lines that asked for it. */\ninterface CornerShift { lx: number; ly: number; guides: Guide[]; gaps: SpacingGap[] }\n\nfunction matchMovingEdges(\n pose: Bounds,\n anchor: ResizeAnchor,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n): CornerShift | null {\n // A 'min' anchor pins the west/north edge, so the max edge moves.\n const moving = (a: ResizeAnchor['x']): SpacingEdge | null => (a === 'min' ? 'max' : a === 'max' ? 'min' : null);\n const edges = { x: moving(anchor.x), y: moving(anchor.y) };\n const anchors = {\n x: edges.x === null ? [] : [edges.x],\n y: edges.y === null ? [] : [edges.y],\n } as { x: AlignAnchor[]; y: AlignAnchor[] };\n const r = resolve(pose, args, tol, anchors, edges);\n return r === null ? null : { lx: r.dx, ly: r.dy, guides: r.guides, gaps: r.gaps };\n}\n\n/** The rotated case. The resize action pins the fixed corner in world after\n * constraints run, so a corner's drawn position is the origin's fixed corner\n * plus the rotated offset to it within `pose`. */\nfunction matchRotatedCorners(\n pose: Bounds,\n anchor: ResizeAnchor,\n originBox: Bounds,\n rotation: number,\n candidates: readonly Guide[],\n tol: { x: number; y: number },\n): CornerShift | null {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const toWorld = (lx: number, ly: number) => ({ x: lx * cos - ly * sin, y: lx * sin + ly * cos });\n const fixedLocal = fixedCornerOf(pose, anchor);\n const f0 = fixedCornerOf(originBox, anchor);\n const pivot = toWorld(f0.x - originBox.x - originBox.width / 2, f0.y - originBox.y - originBox.height / 2);\n const fixedWorld = { x: originBox.x + originBox.width / 2 + pivot.x, y: originBox.y + originBox.height / 2 + pivot.y };\n const drawn = (lx: number, ly: number) => {\n const o = toWorld(lx - fixedLocal.x, ly - fixedLocal.y);\n return { x: fixedWorld.x + o.x, y: fixedWorld.y + o.y };\n };\n const movingEdge = (axis: 'x' | 'y'): number[] => {\n const lo = axis === 'x' ? pose.x : pose.y;\n const hi = lo + (axis === 'x' ? pose.width : pose.height);\n const a = anchor[axis];\n return a === 'min' ? [hi] : a === 'max' ? [lo] : [lo, hi];\n };\n\n if (anchor.x !== 'free' && anchor.y !== 'free') {\n // A corner handle's corner has two degrees of freedom: snap it as a point.\n const c = drawn(movingEdge('x')[0], movingEdge('y')[0]);\n const m = matchAlignment({ x: c.x, y: c.y, width: 0, height: 0 }, candidates, tol, { x: ['min'], y: ['min'] });\n if (m.activeX === null && m.activeY === null) return null;\n const lx = m.dx * cos + m.dy * sin;\n const ly = -m.dx * sin + m.dy * cos;\n return { lx, ly, guides: activeList(m), gaps: [] };\n }\n if (anchor.x === 'free' && anchor.y === 'free') return null;\n\n // An edge handle moves along one local axis, carrying two corners with it.\n const along: 'x' | 'y' = anchor.x === 'free' ? 'y' : 'x';\n const dir = along === 'x' ? toWorld(1, 0) : toWorld(0, 1);\n const edge = movingEdge(along)[0];\n let best: { t: number; guide: Guide; at: { x: number; y: number } } | null = null;\n for (const across of movingEdge(along === 'x' ? 'y' : 'x')) {\n const c = along === 'x' ? drawn(edge, across) : drawn(across, edge);\n for (const g of candidates) {\n const reach = g.axis === 'x' ? dir.x : dir.y;\n if (Math.abs(reach) < 1e-9) continue;\n const t = (g.offset - (g.axis === 'x' ? c.x : c.y)) / reach;\n if (Math.abs(t * dir.x) > tol.x || Math.abs(t * dir.y) > tol.y) continue;\n if (best === null || Math.abs(t) < Math.abs(best.t)) best = { t, guide: g, at: c };\n }\n }\n if (best === null) return null;\n const across = best.guide.axis === 'x' ? best.at.y + best.t * dir.y : best.at.x + best.t * dir.x;\n const guides = [stretchSpan(best.guide, across, across)!];\n return along === 'x'\n ? { lx: best.t, ly: 0, guides, gaps: [] }\n : { lx: 0, ly: best.t, guides, gaps: [] };\n}\n","import type { DropTarget, LayoutSnap } from '@weasel-js/core';\n\nfunction dist2(a: { x: number; y: number }, b: { x: number; y: number }): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n}\n\nfunction nearestOf<TPose>(\n targets: DropTarget<TPose>[],\n pointer: { x: number; y: number },\n): DropTarget<TPose> | null {\n if (targets.length === 0) return null;\n let best = targets[0];\n let bestD = dist2(best.origin, pointer);\n for (let i = 1; i < targets.length; i++) {\n const d = dist2(targets[i].origin, pointer);\n if (d < bestD) {\n bestD = d;\n best = targets[i];\n }\n }\n return best;\n}\n\n/** Snap policy that never picks a target — every drop is rejected, which is\n * what a free-form container wants. */\nexport function none<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: () => null };\n}\n\n/** Snap policy that always picks the target closest to the pointer, however\n * far away it is. */\nexport function nearest<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: (targets, pointer) => nearestOf(targets, pointer) };\n}\n\n/** Snap policy that picks the closest target, but only within `tolerance`\n * world units — beyond that the drop is rejected. */\nexport function nearestWithin<TPose>(opts: { tolerance: number }): LayoutSnap<TPose> {\n const tol2 = opts.tolerance * opts.tolerance;\n return {\n pickTarget(targets, pointer) {\n const got = nearestOf(targets, pointer);\n if (got === null) return null;\n return dist2(got.origin, pointer) <= tol2 ? got : null;\n },\n };\n}\n\nfunction rectContains(\n r: { x: number; y: number; width: number; height: number },\n p: { x: number; y: number },\n): boolean {\n return p.x >= r.x && p.x < r.x + r.width && p.y >= r.y && p.y < r.y + r.height;\n}\n\n/**\n * Region-aware snap. If the pointer falls inside any target's `hitBounds`,\n * that target wins; otherwise falls back to nearest-origin. Useful for\n * strategies whose targets are area-shaped (gutters, drop-zones, gridded\n * cells) rather than point-shaped.\n *\n * Pointer-in-multiple-bounds order: first match in iteration order wins, so\n * strategies should emit narrower/more-specific targets before broader ones\n * (e.g. row-gutter before tray-corner).\n */\nexport function containedThenNearest<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n\ninterface CellMeta {\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nfunction isCellMeta(m: unknown): m is CellMeta {\n return (\n typeof m === 'object' &&\n m !== null &&\n 'cellRect' in m &&\n typeof (m as { cellRect: unknown }).cellRect === 'object'\n );\n}\n\n/**\n * Backwards-compatible cell snap. Prefer `containedThenNearest` for new\n * strategies; this variant remains for `tileGrid` and any caller that puts\n * its cell rect in `meta.cellRect` rather than `hitBounds`.\n */\nexport function cellAt<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n if (isCellMeta(t.meta) && rectContains(t.meta.cellRect, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n","import type { LayoutContainer, LayoutSnap, LayoutStrategy } from '@weasel-js/core';\n\n/** Options for `perContainer`. */\nexport interface PerContainerOptions<TPose> {\n /** The snap every container shares: a strategy's `snap` is read with no\n * container in hand, so it cannot come from the one the factory builds. */\n snap: LayoutSnap<TPose>;\n /** Shared for the same reason. Absent, a container's body is its bounds. */\n contains?: LayoutStrategy<TPose>['contains'];\n /** How many containers' strategies to keep. Past it, the one used longest\n * ago is dropped and built again when next asked for. Default 256. */\n max?: number;\n}\n\n/** A strategy `perContainer` built, and the way to drop one container's state. */\nexport type PerContainerStrategy<TPose> = LayoutStrategy<TPose> & {\n /** Drop what was built for `containerId`: for a container that is gone, or\n * whose cached state no longer describes it. */\n forget(containerId: string): void;\n};\n\n/**\n * A layout strategy that keeps state, as one strategy value: `factory` runs\n * once for each container the layout is asked about, and what it returns\n * serves that container from then on, closing over whatever it caches — a\n * spatial index, the last arrangement, a solver's warm start.\n *\n * Declare the result on as many containers as you like. A method the built\n * strategy leaves out behaves as its absence would.\n */\nexport function perContainer<TPose>(\n factory: (container: LayoutContainer) => LayoutStrategy<TPose>,\n opts: PerContainerOptions<TPose>,\n): PerContainerStrategy<TPose> {\n const max = opts.max ?? 256;\n const built = new Map<string, LayoutStrategy<TPose>>();\n\n const of = (container: LayoutContainer): LayoutStrategy<TPose> => {\n let strategy = built.get(container.id);\n if (strategy) built.delete(container.id);\n else strategy = factory(container);\n // Re-inserted on every use, so the map's first key is the one used longest ago.\n built.set(container.id, strategy);\n if (built.size > max) built.delete(built.keys().next().value!);\n return strategy;\n };\n\n return {\n snap: opts.snap,\n contains: opts.contains,\n forget: (containerId) => void built.delete(containerId),\n\n childPoses: (container, children) => of(container).childPoses(container, children),\n getDropTargets: (container, children, dragged) => of(container).getDropTargets(container, children, dragged),\n reflowPoses: (container, children, dragged, target) =>\n of(container).reflowPoses(container, children, dragged, target),\n commitDrop: (container, children, dragged, target) =>\n of(container).commitDrop(container, children, dragged, target),\n\n dropRegion: (container) => of(container).dropRegion?.(container) ?? null,\n acceptsDrop: (container, dragged) => of(container).acceptsDrop?.(container, dragged) ?? true,\n arrive(container, children, arrivals) {\n const s = of(container);\n return s.arrive ? s.arrive(container, children, arrivals) : { poses: s.childPoses(container, children) };\n },\n depart(container, children, departed) {\n const s = of(container);\n return s.depart ? s.depart(container, children, departed) : { poses: s.childPoses(container, children) };\n },\n contentExtent: (container, children) =>\n of(container).contentExtent?.(container, children) ?? container.bounds,\n releaseDrop: (container, children, dragged) =>\n of(container).releaseDrop?.(container, children, dragged) ?? null,\n };\n}\n","import { createTransformOp, type LayoutSnap, type LayoutStrategy } from '@weasel-js/core';\nimport { none } from '../snaps';\n\n/** Options for `freeform`. */\nexport interface FreeformOptions<TPose> {\n snap?: LayoutSnap<TPose>;\n}\n\n/**\n * Identity layout: each child stays where it's stored, no reflow, no drop\n * targets. `snap` is accepted for API symmetry — overrides take effect only\n * if a caller wires up an external drop-target source, since `getDropTargets`\n * returns empty by default.\n */\nexport function freeform<TPose>(opts: FreeformOptions<TPose> = {}): LayoutStrategy<TPose> {\n const snap = opts.snap ?? none<TPose>();\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets() {\n return [];\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: 'Drop',\n }),\n ];\n },\n };\n}\n","import {\n createTransformOp,\n type Op,\n type ContainerBounds,\n type DropTarget,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutDragged,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport type { Rect } from '@weasel-js/geom';\nimport { cellAt } from '../snaps';\n\ninterface TileMeta {\n col: number;\n row: number;\n cellRect: Rect;\n}\n\n/**\n * What a `tileGrid` does with a child past its `cols × rows` cells.\n *\n * - `'reject'` (default) — the grid holds `cols × rows` and refuses more, by\n * any route: a drop finds no free cell, and an insert or reparent that would\n * overfill it is reverted whole.\n * - `'grow'` — the grid adds a line of cells whenever the last one fills\n * (a row, or a column for `flow: 'column'`) and the container grows by its\n * pitch to hold it, and gives the line back when children leave and it\n * empties. `rows` (or `cols`) is the minimum.\n * - `'scroll'` — the container keeps its size, and the extra children take\n * cells past its last visible line, at the same pitch. `contentExtent`\n * reports the region they cover, for a host to scroll over.\n */\nexport type TileGridOverflow = 'reject' | 'grow' | 'scroll';\n\n/** Options for `tileGrid`. */\nexport interface TileGridOptions<TPose> {\n cols: number;\n rows: number;\n /** Gap between cells, in world units. Default 0. */\n gap?: number;\n /** The order cells fill in: along each row (`'row'`, the default) or down\n * each column (`'column'`). It is also the direction an overflowing grid\n * runs on in. */\n flow?: 'row' | 'column';\n /** What happens past `cols × rows` children. Default `'reject'`. */\n overflow?: TileGridOverflow;\n snap?: LayoutSnap<TPose>;\n /** Optional: map a cell rect + the dragged pose to the new pose. Default\n * writes `{ x, y, width, height }` into the dragged pose (assumes\n * `RectPose`). `dragged` is the pre-drop pose of the child being placed —\n * use it to preserve fields the cell rect doesn't carry (e.g. rotation). */\n cellToPose?(cellRect: Rect, dragged: TPose): TPose;\n /** Optional: the point that decides which cell a child occupies — a child\n * occupies the cell containing it. Default reads `x`/`y` plus half of\n * `width`/`height` when the pose has them, which is the center of a\n * `RectPose` and the point itself for a point pose. */\n centerOf?(pose: TPose): { x: number; y: number };\n}\n\nfunction defaultCenterOf(pose: unknown): { x: number; y: number } {\n const p = pose as { x?: number; y?: number; width?: number; height?: number };\n return { x: (p.x ?? 0) + (p.width ?? 0) / 2, y: (p.y ?? 0) + (p.height ?? 0) / 2 };\n}\n\n/**\n * Layout strategy that arranges children into a grid of cells, one child per\n * cell. What happens past `cols × rows` children is the `overflow` policy.\n *\n * A child occupies the cell its pose sits in (see `centerOf`). A drag from\n * inside the container swaps with the child in the cell it lands on; a drop\n * from outside is offered only the free cells, so it lands in the nearest\n * free one. A child that joins by an insert or a reparent is placed the same\n * way, in the free cell nearest to where it was put.\n */\nexport function tileGrid<TPose>(\n opts: TileGridOptions<TPose>,\n): LayoutStrategy<TPose> {\n const { cols, rows } = opts;\n const gap = opts.gap ?? 0;\n const byColumn = opts.flow === 'column';\n const overflow = opts.overflow ?? 'reject';\n const snap = opts.snap ?? cellAt<TPose>();\n const capacity = cols * rows;\n /** Cells per line in fill order, and the declared line count. */\n const perLine = byColumn ? rows : cols;\n const minLines = byColumn ? cols : rows;\n const cellToPose: (cell: Rect, dragged: TPose) => TPose =\n opts.cellToPose ?? ((cell, dragged) => {\n // Default: spread the cell rect over the dragged pose. Preserves any\n // extra fields the dragged pose carries.\n return { ...(dragged as object), ...cell } as TPose;\n });\n const centerOf = opts.centerOf ?? defaultCenterOf;\n\n const linesFor = (n: number): number => Math.max(minLines, Math.ceil(n / perLine));\n\n /** The grid over `bounds` while it holds `n` children: its cell pitch, and\n * how many cells it offers before running past the container. A growing\n * grid spreads its lines over the container, which it keeps sized to fit\n * them; the others always lay the declared grid over it. */\n function gridOf(bounds: ContainerBounds, n: number) {\n const lines = overflow === 'grow' ? linesFor(n) : minLines;\n const c = byColumn ? lines : cols;\n const r = byColumn ? rows : lines;\n const cw = (bounds.width - gap * (c - 1)) / c;\n const ch = (bounds.height - gap * (r - 1)) / r;\n\n function rectAt(index: number): Rect {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n const col = byColumn ? line : along;\n const row = byColumn ? along : line;\n return { x: bounds.x + col * (cw + gap), y: bounds.y + row * (ch + gap), width: cw, height: ch };\n }\n\n /** The cell index `pose` sits in, overflow cells past the container\n * included, or `null` in a gap or off the grid. */\n function indexOf(pose: TPose): number | null {\n const p = centerOf(pose);\n const col = Math.floor((p.x - bounds.x) / (cw + gap));\n const row = Math.floor((p.y - bounds.y) / (ch + gap));\n if (col < 0 || row < 0) return null;\n if (p.x - bounds.x - col * (cw + gap) >= cw) return null;\n if (p.y - bounds.y - row * (ch + gap) >= ch) return null;\n if (byColumn ? row >= rows : col >= cols) return null;\n return byColumn ? col * rows + row : row * cols + col;\n }\n\n /** The cells a drop may land in, or an arrival be placed in, with `n`\n * children in the grid: the declared grid when it refuses overflow, and\n * otherwise every whole line the children reach. */\n const cells = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n\n /** The container bounds that hold `lines` lines at this pitch. */\n function boundsFor(lineCount: number): ContainerBounds {\n return byColumn\n ? { ...bounds, width: lineCount * cw + gap * (lineCount - 1) }\n : { ...bounds, height: lineCount * ch + gap * (lineCount - 1) };\n }\n\n return { rectAt, indexOf, cells, boundsFor };\n }\n\n const metaOf = (index: number, cellRect: Rect): TileMeta => {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n return byColumn\n ? { col: line, row: along, cellRect }\n : { col: along, row: line, cellRect };\n };\n const indexOfMeta = (m: TileMeta): number => (byColumn ? m.col * rows + m.row : m.row * cols + m.col);\n\n /** How many children the grid holds, not counting a drag from outside it. */\n const heldBy = (container: LayoutContainer, children: ReadonlyArray<LayoutChild<TPose>>, dragged?: LayoutDragged<TPose>): number =>\n dragged && dragged.sourceContainerId !== container.id\n ? children.filter((c) => c.id !== dragged.id).length\n : children.length;\n\n /** The swap dragging `dragged` onto `target` causes, or `null`. Preview and\n * commit both use it, so they cannot disagree. */\n function computeSwap(\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n dragged: LayoutDragged<TPose>,\n target: DropTarget<TPose> | null,\n ): { occupant: string; from: TPose; newPose: TPose } | null {\n if (target === null) return null;\n if (dragged.sourceContainerId !== container.id) return null;\n const grid = gridOf(container.bounds, children.length);\n const idx = indexOfMeta(target.meta as TileMeta);\n const occupant = children.find((c) => c.id !== dragged.id && grid.indexOf(c.pose) === idx);\n if (occupant === undefined) return null;\n // The occupant takes the cell the dragged child is leaving — where the\n // container state says it is now, which an earlier placement of the same\n // drop may have moved it to.\n const self = children.find((c) => c.id === dragged.id);\n const fromIdx = grid.indexOf(self ? self.pose : dragged.originPose);\n if (fromIdx === null || fromIdx === idx) return null;\n return { occupant: occupant.id, from: occupant.pose, newPose: cellToPose(grid.rectAt(fromIdx), occupant.pose) };\n }\n\n /**\n * Every child a cell of `into`, in the order of the cells they sit in on\n * `from`, so a reflow compacts the survivors rather than re-sorting them —\n * an earlier swap among them has to outlive a sibling leaving the grid.\n * Children sitting in no cell (a gap, or off the grid) sort last; ties break\n * by id so an arrangement with no cells yet is still deterministic. Past\n * the declared grid they run on at the same pitch.\n */\n function pack(\n from: ReturnType<typeof gridOf>,\n into: ReturnType<typeof gridOf>,\n children: ReadonlyArray<LayoutChild<TPose>>,\n ): Map<string, TPose> {\n const ordered = children\n .map((c) => ({ c, cell: from.indexOf(c.pose) }))\n .sort((a, b) => {\n if (a.cell !== b.cell) {\n if (a.cell === null) return 1;\n if (b.cell === null) return -1;\n return a.cell - b.cell;\n }\n return a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0;\n });\n const out = new Map<string, TPose>();\n for (let i = 0; i < ordered.length; i++) {\n out.set(ordered[i].c.id, cellToPose(into.rectAt(i), ordered[i].c.pose));\n }\n return out;\n }\n\n return {\n snap,\n\n childPoses(container, children) {\n const grid = gridOf(container.bounds, children.length);\n return pack(grid, grid, children);\n },\n\n getDropTargets(container, children, dragged) {\n const grid = gridOf(container.bounds, heldBy(container, children, dragged));\n // A drag from inside may land on an occupied cell and swap; one from\n // outside has nobody to swap with, so occupied cells are not offered.\n const occupied = new Set<number>();\n const fromOutside = dragged.sourceContainerId !== container.id;\n if (fromOutside) {\n for (const c of children) {\n if (c.id === dragged.id) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) occupied.add(idx);\n }\n }\n const offered: number[] = [];\n for (let i = 0; i < grid.cells; i++) if (!occupied.has(i)) offered.push(i);\n // A grid that takes overflow always has room for one more.\n if (fromOutside && offered.length === 0 && overflow !== 'reject') offered.push(grid.cells);\n return offered.map((i) => {\n const cellRect = grid.rectAt(i);\n return {\n pose: cellToPose(cellRect, dragged.pose),\n origin: { x: cellRect.x + cellRect.width / 2, y: cellRect.y + cellRect.height / 2 },\n meta: metaOf(i, cellRect) satisfies TileMeta,\n };\n });\n },\n\n reflowPoses(container, children, dragged, target) {\n const out = new Map<string, TPose>();\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n out.set(swap.occupant, swap.newPose);\n }\n return out;\n },\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n\n let droppedPose: TPose;\n if (target === null) {\n droppedPose = dragged.pose;\n } else {\n const meta = target.meta as TileMeta;\n droppedPose = cellToPose(meta.cellRect, dragged.pose);\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n ops.push(\n createTransformOp<TPose>({\n id: swap.occupant,\n from: swap.from,\n to: swap.newPose,\n label: 'Tile swap',\n }),\n );\n }\n }\n ops.push(\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: droppedPose,\n label: 'Tile drop',\n }),\n );\n return ops;\n },\n\n arrive(container, children, arrivals): LayoutArrival<TPose> | null {\n const n = children.length;\n if (overflow === 'reject' && n > capacity) return null;\n // The grid as it stood before these joined: its pitch is the one the\n // arrivals are placed at, and a growing grid extends by it.\n const grid = gridOf(container.bounds, n - arrivals.size);\n const slots = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n const taken = new Set<number>();\n for (const c of children) {\n if (arrivals.has(c.id)) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) taken.add(idx);\n }\n const poses = new Map<string, TPose>();\n for (const c of children) {\n if (!arrivals.has(c.id)) continue;\n const own = grid.indexOf(c.pose);\n let idx: number;\n if (own !== null && own < slots && !taken.has(own)) {\n idx = own;\n } else {\n const at = centerOf(c.pose);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < slots; i++) {\n if (taken.has(i)) continue;\n const r = grid.rectAt(i);\n const dx = r.x + r.width / 2 - at.x;\n const dy = r.y + r.height / 2 - at.y;\n const d = dx * dx + dy * dy;\n if (d < bestD) { bestD = d; best = i; }\n }\n if (best < 0) return null;\n idx = best;\n }\n taken.add(idx);\n poses.set(c.id, cellToPose(grid.rectAt(idx), c.pose));\n }\n if (overflow !== 'grow') return { poses };\n const lines = linesFor(n);\n if (lines === linesFor(n - arrivals.size)) return { poses };\n return { poses, bounds: grid.boundsFor(lines) };\n },\n\n depart(container, children, departed): LayoutArrival<TPose> {\n const n = children.length;\n // The grid as it stood with the departed still in it: a grown grid\n // gives back whole lines at that pitch, down to its declared count.\n const before = gridOf(container.bounds, n + departed.size);\n const lines = linesFor(n);\n if (overflow !== 'grow' || lines === linesFor(n + departed.size)) {\n return { poses: pack(before, before, children) };\n }\n const bounds = before.boundsFor(lines);\n return { poses: pack(before, gridOf(bounds, n), children), bounds };\n },\n\n contentExtent(container, children) {\n const grid = gridOf(container.bounds, children.length);\n const lines = Math.ceil(children.length / perLine);\n if (lines <= minLines) return container.bounds;\n const reach = grid.boundsFor(lines);\n return overflow === 'grow'\n ? container.bounds\n : { ...reach, width: Math.max(reach.width, container.bounds.width), height: Math.max(reach.height, container.bounds.height) };\n },\n };\n}\n","import {\n type Vec2,\n createTransformOp,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { nearestWithin } from '../snaps';\n\n/** Which points within a container a child can snap to. */\nexport type SnapPattern = 'corners' | 'edges' | 'center' | 'grid';\n\n/** Options for `snapPoint`. */\nexport interface SnapPointOptions<TPose> {\n pattern: SnapPattern;\n /** Spacing for the 'grid' pattern, in world units. Default 50. */\n gridSpacing?: number;\n /** Tolerance for the default snap policy (nearestWithin). Default Infinity. */\n tolerance?: number;\n snap?: LayoutSnap<TPose>;\n}\n\nfunction buildPoints(\n bounds: { x: number; y: number; width: number; height: number },\n pattern: SnapPattern,\n gridSpacing: number,\n): Vec2[] {\n switch (pattern) {\n case 'corners':\n return [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ];\n case 'edges':\n return [\n { x: bounds.x + bounds.width / 2, y: bounds.y },\n { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height },\n { x: bounds.x, y: bounds.y + bounds.height / 2 },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height / 2 },\n ];\n case 'center':\n return [{ x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 }];\n case 'grid': {\n const out: Vec2[] = [];\n const cols = Math.floor(bounds.width / gridSpacing);\n const rows = Math.floor(bounds.height / gridSpacing);\n for (let j = 0; j <= rows; j++) {\n for (let i = 0; i <= cols; i++) {\n out.push({ x: bounds.x + i * gridSpacing, y: bounds.y + j * gridSpacing });\n }\n }\n return out;\n }\n }\n}\n\n/** Layout strategy that leaves children where they are but offers a fixed set\n * of points — corners, edge midpoints, center, or a grid — for a dragged\n * child to land on. */\nexport function snapPoint<TPose extends Vec2>(\n opts: SnapPointOptions<TPose>,\n): LayoutStrategy<TPose> {\n const gridSpacing = opts.gridSpacing ?? 50;\n const tolerance = opts.tolerance ?? Infinity;\n const snap = opts.snap ?? nearestWithin<TPose>({ tolerance });\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets(container, _children, dragged) {\n const points = buildPoints(container.bounds, opts.pattern, gridSpacing);\n return points.map((p) => ({\n // Anchor the dragged child's top-left at the snap point.\n pose: { ...dragged.pose, x: p.x, y: p.y } as TPose,\n origin: p,\n }));\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n const to = target === null ? dragged.pose : target.pose;\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to,\n label: 'Snap drop',\n }),\n ];\n },\n };\n}\n","import {\n createTransformOp,\n type ContainerBounds,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutDragged,\n type LayoutSnap,\n type LayoutStrategy,\n type Op,\n} from '@weasel-js/core';\n\n/** What makes a sequence layout a row of slots or a shelf-packed flow. */\nexport interface Sequencer<TPose> {\n /** `children` in sequence, read off the poses they were given when the\n * container was last arranged for `count` children. */\n order(\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n count: number,\n ): LayoutChild<TPose>[];\n /** A pose for every child of `sequence`, or `null` when the container\n * cannot hold them all. */\n place(container: LayoutContainer, sequence: ReadonlyArray<LayoutChild<TPose>>): Map<string, TPose> | null;\n /** The bounds the container takes to hold `sequence`, for one that sizes\n * itself to its children. */\n resize?(container: LayoutContainer, sequence: ReadonlyArray<LayoutChild<TPose>>): ContainerBounds | undefined;\n centerOf(pose: TPose): { x: number; y: number };\n snap: LayoutSnap<TPose>;\n /** Labels for the two kinds of op a drop writes. */\n labels: { drop: string; shift: string };\n}\n\ninterface IndexMeta {\n index: number;\n}\n\n/** The center of a `RectPose`, and the point itself for a point pose. */\nexport function defaultCenterOf(pose: unknown): { x: number; y: number } {\n const p = pose as { x?: number; y?: number; width?: number; height?: number };\n return { x: (p.x ?? 0) + (p.width ?? 0) / 2, y: (p.y ?? 0) + (p.height ?? 0) / 2 };\n}\n\nconst withAt = <T,>(list: readonly T[], index: number, item: T): T[] => [\n ...list.slice(0, index),\n item,\n ...list.slice(index),\n];\n\n/** The container's sequence without the dragged child, which counted\n * toward the last arrangement only if it came from here. */\nfunction othersOf<TPose>(\n seq: Sequencer<TPose>,\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n dragged: LayoutDragged<TPose>,\n): LayoutChild<TPose>[] {\n const held = children.filter((c) => c.id !== dragged.id);\n const count = held.length + (dragged.sourceContainerId === container.id ? 1 : 0);\n return seq.order(container, held, count);\n}\n\n/** The index that lands `child` nearest where it is now, among those the container can hold. */\nfunction nearestIndex<TPose>(\n seq: Sequencer<TPose>,\n container: LayoutContainer,\n sequence: ReadonlyArray<LayoutChild<TPose>>,\n child: LayoutChild<TPose>,\n): number | null {\n const at = seq.centerOf(child.pose);\n let best: number | null = null;\n let bestD = Infinity;\n for (let i = 0; i <= sequence.length; i++) {\n const pose = seq.place(container, withAt(sequence, i, child))?.get(child.id);\n if (pose === undefined) continue;\n const p = seq.centerOf(pose);\n const d = (p.x - at.x) ** 2 + (p.y - at.y) ** 2;\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n}\n\n/**\n * The behavior every layout that keeps its children in one ordered sequence\n * shares: a drop inserts at an index and shifts the children after it, an\n * arrival goes in at the index that lands it nearest where it was put, and a\n * departure closes the gap. The `Sequencer` says what the order is and where\n * a sequence sits.\n */\nexport function sequenceLayout<TPose>(seq: Sequencer<TPose>): LayoutStrategy<TPose> {\n const { centerOf } = seq;\n\n const moved = (a: TPose, b: TPose): boolean => {\n const p = centerOf(a);\n const q = centerOf(b);\n return p.x !== q.x || p.y !== q.y;\n };\n\n const arranged = (\n container: LayoutContainer,\n sequence: ReadonlyArray<LayoutChild<TPose>>,\n poses: Map<string, TPose>,\n ): LayoutArrival<TPose> => {\n const bounds = seq.resize?.(container, sequence);\n return bounds ? { poses, bounds } : { poses };\n };\n\n /** Where the siblings sit once the dragged child takes the index `target` names. */\n const shifted: LayoutStrategy<TPose>['reflowPoses'] = (container, children, dragged, target) => {\n if (!target) return new Map();\n const others = othersOf(seq, container, children, dragged);\n const self = { id: dragged.id, pose: dragged.pose };\n const poses = seq.place(container, withAt(others, (target.meta as IndexMeta).index, self)) ?? new Map();\n poses.delete(dragged.id);\n return poses;\n };\n\n return {\n snap: seq.snap,\n\n childPoses(container, children) {\n const sequence = seq.order(container, children, children.length);\n return seq.place(container, sequence) ?? new Map(children.map((c) => [c.id, c.pose]));\n },\n\n getDropTargets(container, children, dragged) {\n const others = othersOf(seq, container, children, dragged);\n const self = { id: dragged.id, pose: dragged.pose };\n const targets = [];\n for (let index = 0; index <= others.length; index++) {\n const pose = seq.place(container, withAt(others, index, self))?.get(dragged.id);\n if (pose === undefined) continue;\n targets.push({ pose, origin: centerOf(pose), meta: { index } satisfies IndexMeta });\n }\n return targets;\n },\n\n reflowPoses: shifted,\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n if (target) {\n const poses = shifted(container, children, dragged, target);\n for (const c of children) {\n const to = poses.get(c.id);\n if (to !== undefined && moved(c.pose, to)) {\n ops.push(createTransformOp<TPose>({ id: c.id, from: c.pose, to, label: seq.labels.shift }));\n }\n }\n }\n ops.push(\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: seq.labels.drop,\n }),\n );\n return ops;\n },\n\n arrive(container, children, arrivals) {\n const held = children.filter((c) => !arrivals.has(c.id));\n let sequence = seq.order(container, held, held.length);\n for (const c of children) {\n if (!arrivals.has(c.id)) continue;\n const index = nearestIndex(seq, container, sequence, c);\n if (index === null) return null;\n sequence = withAt(sequence, index, c);\n }\n const poses = seq.place(container, sequence);\n return poses && arranged(container, sequence, poses);\n },\n\n depart(container, children, departed) {\n const sequence = seq.order(container, children, children.length + departed.size);\n const poses = seq.place(container, sequence) ?? new Map<string, TPose>();\n return arranged(container, sequence, poses);\n },\n };\n}\n","import type { LayoutSnap, LayoutStrategy } from '@weasel-js/core';\nimport { nearest } from '../snaps';\nimport type { Arrangement, Slot } from './arrangements';\nimport { defaultCenterOf, sequenceLayout } from './sequence';\n\n/** Options for `slots`. */\nexport interface SlotsOptions<TPose> {\n /** Where the slots are for a given child count: `rowSlots`, `gridSlots`,\n * `ringSlots`, or a function of your own. */\n arrangement: Arrangement;\n /** Which slot a drag means. Default `nearest()`. */\n snap?: LayoutSnap<TPose>;\n /** The pose a child takes in a slot. Default centers the child's own\n * `width`/`height` on the slot and keeps every other field. */\n slotToPose?(slot: Slot, pose: TPose): TPose;\n /** The point that decides which slot a child sits in. Default is the\n * center of a `RectPose`, and the point itself for a point pose. */\n centerOf?(pose: TPose): { x: number; y: number };\n}\n\nfunction defaultSlotToPose<TPose>(slot: Slot, pose: TPose): TPose {\n const { width = 0, height = 0 } = pose as { width?: number; height?: number };\n return { ...(pose as object), x: slot.x - width / 2, y: slot.y - height / 2 } as TPose;\n}\n\nfunction nearestSlot(at: { x: number; y: number }, places: readonly Slot[]): number {\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < places.length; i++) {\n const d = (places[i]!.x - at.x) ** 2 + (places[i]!.y - at.y) ** 2;\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n}\n\n/**\n * Layout strategy that keeps its children in a sequence of slots — a row, a\n * grid, a ring — whose positions depend on how many children there are, so\n * the arrangement re-spaces itself as children come and go.\n *\n * A child's place in the sequence is the slot it sits nearest. Dropping a\n * drag on a slot inserts it there and shifts the children between; a drag\n * from outside is offered one slot more than the container holds. An insert\n * or reparent lands at the slot nearest where the child was put.\n */\nexport function slots<TPose>(opts: SlotsOptions<TPose>): LayoutStrategy<TPose> {\n const { arrangement } = opts;\n const slotToPose = opts.slotToPose ?? defaultSlotToPose;\n const centerOf = opts.centerOf ?? defaultCenterOf;\n\n return sequenceLayout<TPose>({\n snap: opts.snap ?? nearest<TPose>(),\n centerOf,\n labels: { drop: 'Slot drop', shift: 'Slot shift' },\n\n // Ties break by id, so a container nobody has arranged yet still has an order.\n order(container, children, count) {\n const places = arrangement(container.bounds, count);\n return children\n .map((c) => ({ c, slot: nearestSlot(centerOf(c.pose), places) }))\n .sort((a, b) => a.slot - b.slot || (a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0))\n .map((e) => e.c);\n },\n\n place(container, sequence) {\n const places = arrangement(container.bounds, sequence.length);\n if (places.length < sequence.length) return null;\n return new Map(sequence.map((c, i) => [c.id, slotToPose(places[i]!, c.pose)]));\n },\n });\n}\n","import type { Rect } from '@weasel-js/geom';\nimport type { ContainerBounds, LayoutChild, LayoutSnap, LayoutStrategy } from '@weasel-js/core';\nimport { nearest } from '../snaps';\nimport { sequenceLayout } from './sequence';\n\n\n/**\n * What `pack` does when its shelves run past the container's height.\n *\n * - `'reject'` (default) — refuse the child that would not fit, by any route.\n * - `'grow'` — the container's height follows its content, never below\n * `minHeight`.\n * - `'scroll'` — the container keeps its size and the shelves run on below\n * it; `contentExtent` reports the region they cover.\n */\nexport type PackOverflow = 'reject' | 'grow' | 'scroll';\n\n/** Options for `pack`. */\nexport interface PackOptions<TPose> {\n /** Space between neighbors on a shelf and between shelves, in world units. Default 0. */\n gap?: number;\n /** What happens past the container's height. Default `'reject'`. */\n overflow?: PackOverflow;\n /** The least height a `'grow'` container shrinks to. Default 0. */\n minHeight?: number;\n /** Which index a drag means. Default `nearest()`. */\n snap?: LayoutSnap<TPose>;\n /** A child's box. Default reads `x`, `y`, `width`, and `height` off the pose. */\n rectOf?(pose: TPose): Rect;\n /** `pose` with its box's top-left at `at`. Default writes `x` and `y`. */\n moveTo?(pose: TPose, at: { x: number; y: number }): TPose;\n}\n\n/**\n * Layout strategy that packs children of any size onto shelves: left to\n * right at their own sizes, wrapping at the container's width, each shelf as\n * tall as its tallest child. A child wider than the container is refused.\n *\n * The children's order is the order they read in — shelf by shelf, left to\n * right. A drop inserts at the index nearest the pointer and everything after\n * it reflows.\n */\nexport function pack<TPose>(opts: PackOptions<TPose> = {}): LayoutStrategy<TPose> {\n const gap = opts.gap ?? 0;\n const overflow = opts.overflow ?? 'reject';\n const minHeight = opts.minHeight ?? 0;\n const rectOf = opts.rectOf ?? ((pose: TPose) => pose as unknown as Rect);\n const moveTo = opts.moveTo ?? ((pose: TPose, at) => ({ ...(pose as object), ...at }) as TPose);\n\n // Ties break by id, so children nobody has arranged yet still have an order.\n const readingOrder = (children: ReadonlyArray<LayoutChild<TPose>>): LayoutChild<TPose>[] =>\n children\n .map((c) => ({ c, r: rectOf(c.pose) }))\n .sort((a, b) => a.r.y - b.r.y || a.r.x - b.r.x || (a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0))\n .map((e) => e.c);\n\n /** Shelf every child of `sequence`, and the height the shelves reach. Null when one is too wide. */\n function shelve(\n bounds: ContainerBounds,\n sequence: ReadonlyArray<LayoutChild<TPose>>,\n ): { poses: Map<string, TPose>; height: number } | null {\n const poses = new Map<string, TPose>();\n let x = 0;\n let y = 0;\n let shelf = 0;\n for (const c of sequence) {\n const { width, height } = rectOf(c.pose);\n if (width > bounds.width) return null;\n if (x > 0 && x + width > bounds.width) {\n y += shelf + gap;\n x = 0;\n shelf = 0;\n }\n poses.set(c.id, moveTo(c.pose, { x: bounds.x + x, y: bounds.y + y }));\n x += width + gap;\n shelf = Math.max(shelf, height);\n }\n return { poses, height: y + shelf };\n }\n\n const layout = sequenceLayout<TPose>({\n snap: opts.snap ?? nearest<TPose>(),\n labels: { drop: 'Pack drop', shift: 'Pack shift' },\n centerOf(pose) {\n const r = rectOf(pose);\n return { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n },\n\n order: (_container, children) => readingOrder(children),\n\n place(container, sequence) {\n const shelved = shelve(container.bounds, sequence);\n if (!shelved) return null;\n return overflow === 'reject' && shelved.height > container.bounds.height ? null : shelved.poses;\n },\n\n resize(container, sequence) {\n if (overflow !== 'grow') return undefined;\n const height = Math.max(minHeight, shelve(container.bounds, sequence)?.height ?? 0);\n return height === container.bounds.height ? undefined : { ...container.bounds, height };\n },\n });\n\n return {\n ...layout,\n contentExtent(container, children) {\n const reach = shelve(container.bounds, readingOrder(children))?.height ?? 0;\n return { ...container.bounds, height: Math.max(container.bounds.height, reach) };\n },\n };\n}\n","import type { Rect } from '@weasel-js/geom';\nimport {\n createTransformOp,\n type ContainerBounds,\n type LayoutChild,\n type LayoutContainer,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { containedThenNearest } from '../snaps';\nimport { defaultCenterOf } from './sequence';\n\n\n/** Options for `quadtree`. */\nexport interface QuadtreeOptions<TPose> {\n /** How many times the container may be quartered. Default 4, a 16 × 16 grid at its finest. */\n maxDepth?: number;\n /** Which free cell a drag means. Default `containedThenNearest()`. */\n snap?: LayoutSnap<TPose>;\n /** The length a cell's shorter side must reach to hold the child. Default\n * is the larger of the pose's `width` and `height`. */\n sizeOf?(pose: TPose): number;\n /** The pose a child takes in a cell. Default centers the child's own size\n * in the cell and keeps every other field. */\n cellToPose?(cell: Rect, pose: TPose): TPose;\n /** The point that decides which cell a child sits in. Default is the\n * center of a `RectPose`, and the point itself for a point pose. */\n centerOf?(pose: TPose): { x: number; y: number };\n}\n\n/** One cell a child holds: {@link QuadtreeStrategy.cells}. */\nexport interface QuadtreeCell {\n id: string;\n /** How many times the container was quartered to reach the cell. */\n depth: number;\n rect: Rect;\n}\n\n/** A `quadtree` layout, which also reports the cells it has given out. */\nexport interface QuadtreeStrategy<TPose> extends LayoutStrategy<TPose> {\n /** The cell each child holds, largest first: what a debug overlay draws. */\n cells(container: LayoutContainer, children: ReadonlyArray<LayoutChild<TPose>>): QuadtreeCell[];\n}\n\ninterface Cell {\n depth: number;\n col: number;\n row: number;\n}\n\n/** Whether one cell is the other, or holds it. */\nfunction overlaps(a: Cell, b: Cell): boolean {\n const [outer, inner] = a.depth <= b.depth ? [a, b] : [b, a];\n const shift = inner.depth - outer.depth;\n return inner.col >> shift === outer.col && inner.row >> shift === outer.row;\n}\n\nfunction rectOf(bounds: ContainerBounds, cell: Cell): Rect {\n const width = bounds.width / 2 ** cell.depth;\n const height = bounds.height / 2 ** cell.depth;\n return { x: bounds.x + cell.col * width, y: bounds.y + cell.row * height, width, height }\n};\n\n/** The free cell at `depth` nearest `at`: the one holding it, if that is free. */\nfunction freeCell(bounds: ContainerBounds, taken: readonly Cell[], depth: number, at: { x: number; y: number }): Cell | null {\n let best: Cell | null = null;\n let bestD = Infinity;\n for (const cell of freeCells(taken, depth)) {\n const r = rectOf(bounds, cell);\n const d = (r.x + r.width / 2 - at.x) ** 2 + (r.y + r.height / 2 - at.y) ** 2;\n if (d < bestD) {\n bestD = d;\n best = cell;\n }\n }\n return best;\n}\n\nfunction freeCells(taken: readonly Cell[], depth: number): Cell[] {\n const out: Cell[] = [];\n const n = 2 ** depth;\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n const cell = { depth, col, row };\n if (!taken.some((t) => overlaps(t, cell))) out.push(cell);\n }\n }\n return out;\n}\n\nfunction defaultCellToPose<TPose>(cell: Rect, pose: TPose): TPose {\n const { width = 0, height = 0 } = pose as { width?: number; height?: number };\n return {\n ...(pose as object),\n x: cell.x + (cell.width - width) / 2,\n y: cell.y + (cell.height - height) / 2,\n } as TPose;\n}\n\n/**\n * Layout strategy that quarters its container as far as each child needs: a\n * child holds the smallest cell that fits it, so large and small children\n * share one container without a fixed grid. A cell is free while it, the\n * cells it sits inside, and the cells inside it hold nobody.\n *\n * A drag is offered the free cells of its own size. Children never move to\n * make room: a child that finds its cell covered goes to the nearest free\n * one, and an arrival with no free cell of its size is refused.\n */\nexport function quadtree<TPose>(opts: QuadtreeOptions<TPose> = {}): QuadtreeStrategy<TPose> {\n const maxDepth = opts.maxDepth ?? 4;\n const snap = opts.snap ?? containedThenNearest<TPose>();\n const cellToPose = opts.cellToPose ?? defaultCellToPose;\n const centerOf = opts.centerOf ?? defaultCenterOf;\n const sizeOf =\n opts.sizeOf ??\n ((pose: TPose) => {\n const { width = 0, height = 0 } = pose as { width?: number; height?: number };\n return Math.max(width, height);\n });\n\n /** The deepest level whose cells still hold a child of this pose. */\n function depthOf(bounds: ContainerBounds, pose: TPose): number {\n const size = sizeOf(pose);\n const side = Math.min(bounds.width, bounds.height);\n let depth = 0;\n while (depth < maxDepth && side / 2 ** (depth + 1) >= size) depth++;\n return depth;\n }\n\n /** A cell for every child that finds one, larger children first so a small\n * one never takes the corner of a cell a large one needs whole. */\n function assign(bounds: ContainerBounds, children: ReadonlyArray<LayoutChild<TPose>>, held: readonly Cell[] = []) {\n const taken = [...held];\n const cells = new Map<string, Cell>();\n const bySize = children\n .map((c) => ({ c, depth: depthOf(bounds, c.pose) }))\n .sort((a, b) => a.depth - b.depth || (a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0));\n for (const { c, depth } of bySize) {\n const cell = freeCell(bounds, taken, depth, centerOf(c.pose));\n if (!cell) continue;\n taken.push(cell);\n cells.set(c.id, cell);\n }\n return { cells, taken };\n }\n\n return {\n snap,\n\n childPoses(container, children) {\n const { cells } = assign(container.bounds, children);\n return new Map(\n children.map((c) => {\n const cell = cells.get(c.id);\n return [c.id, cell ? cellToPose(rectOf(container.bounds, cell), c.pose) : c.pose];\n }),\n );\n },\n\n getDropTargets(container, children, dragged) {\n const { taken } = assign(container.bounds, children.filter((c) => c.id !== dragged.id));\n return freeCells(taken, depthOf(container.bounds, dragged.pose)).map((cell) => {\n const hitBounds = rectOf(container.bounds, cell);\n return {\n pose: cellToPose(hitBounds, dragged.pose),\n origin: { x: hitBounds.x + hitBounds.width / 2, y: hitBounds.y + hitBounds.height / 2 },\n hitBounds,\n };\n });\n },\n\n reflowPoses: () => new Map(),\n\n commitDrop: (_container, _children, dragged, target) => [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: 'Quadtree drop',\n }),\n ],\n\n arrive(container, children, arrivals) {\n const { taken } = assign(container.bounds, children.filter((c) => !arrivals.has(c.id)));\n const joining = children.filter((c) => arrivals.has(c.id));\n const { cells } = assign(container.bounds, joining, taken);\n if (cells.size < joining.length) return null;\n return {\n poses: new Map(joining.map((c) => [c.id, cellToPose(rectOf(container.bounds, cells.get(c.id)!), c.pose)])),\n };\n },\n\n cells(container, children) {\n const { cells } = assign(container.bounds, children);\n return [...cells]\n .map(([id, cell]) => ({ id, depth: cell.depth, rect: rectOf(container.bounds, cell) }))\n .sort((a, b) => a.depth - b.depth || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n },\n };\n}\n","import type { ContainerBounds } from '@weasel-js/core';\n\n/** One place a child's center goes. */\nexport interface Slot {\n x: number;\n y: number;\n /** The direction the slot faces, in radians, where the arrangement has one\n * — outward from the center on a ring. `slotToPose` decides what to do\n * with it; the default ignores it. */\n angle?: number;\n}\n\n/**\n * Where a container's slots are when it holds `count` children, in fill\n * order. Returning fewer than `count` caps the container: `slots` refuses\n * whatever would not fit.\n */\nexport type Arrangement = (bounds: ContainerBounds, count: number) => Slot[];\n\n/** Options for `rowSlots`. */\nexport interface RowSlotsOptions {\n /** The axis the row runs along. Default `'x'`. */\n axis?: 'x' | 'y';\n /** Distance between neighboring slots, in world units, the row centered in\n * the container. Absent, the slots divide the container's length evenly. */\n pitch?: number;\n}\n\n/** Slots in a line, centered across the container. */\nexport function rowSlots(opts: RowSlotsOptions = {}): Arrangement {\n const alongX = opts.axis !== 'y';\n return (bounds, count) => {\n const length = alongX ? bounds.width : bounds.height;\n const pitch = opts.pitch ?? length / Math.max(count, 1);\n const first = length / 2 - (pitch * (count - 1)) / 2;\n const out: Slot[] = [];\n for (let i = 0; i < count; i++) {\n const along = first + i * pitch;\n out.push(\n alongX\n ? { x: bounds.x + along, y: bounds.y + bounds.height / 2 }\n : { x: bounds.x + bounds.width / 2, y: bounds.y + along },\n );\n }\n return out;\n };\n}\n\n/** Options for `gridSlots`. */\nexport interface GridSlotsOptions {\n cols: number;\n /** Rows the grid has before any child needs one. Default 1. */\n rows?: number;\n}\n\n/** Slots at the centers of a grid that fills row by row, adding a row when the\n * last fills; the rows always divide the container's height. */\nexport function gridSlots(opts: GridSlotsOptions): Arrangement {\n return (bounds, count) => {\n const rows = Math.max(opts.rows ?? 1, Math.ceil(count / opts.cols));\n const cw = bounds.width / opts.cols;\n const ch = bounds.height / rows;\n const out: Slot[] = [];\n for (let i = 0; i < count; i++) {\n out.push({\n x: bounds.x + ((i % opts.cols) + 0.5) * cw,\n y: bounds.y + (Math.floor(i / opts.cols) + 0.5) * ch,\n });\n }\n return out;\n };\n}\n\n/** Options for `ringSlots`. */\nexport interface RingSlotsOptions {\n /** Angle of the first slot, in radians, 0 pointing along +x and positive\n * turning toward +y. Default −π/2: the top, on a y-down canvas. */\n start?: number;\n /** How far round the slots run. Default a full turn, which spaces them\n * evenly; anything less puts a slot on each end of the arc. */\n sweep?: number;\n /** Distance to pull the ring in from the container's edges. Default 0. */\n inset?: number;\n}\n\n/** Slots around the ellipse inscribed in the container, each facing outward. */\nexport function ringSlots(opts: RingSlotsOptions = {}): Arrangement {\n const start = opts.start ?? -Math.PI / 2;\n const sweep = opts.sweep ?? Math.PI * 2;\n const inset = opts.inset ?? 0;\n const closed = Math.abs(sweep) >= Math.PI * 2;\n return (bounds, count) => {\n const rx = bounds.width / 2 - inset;\n const ry = bounds.height / 2 - inset;\n const steps = closed ? count : Math.max(count - 1, 1);\n const out: Slot[] = [];\n for (let i = 0; i < count; i++) {\n const angle = start + (sweep * i) / steps;\n out.push({\n x: bounds.x + bounds.width / 2 + rx * Math.cos(angle),\n y: bounds.y + bounds.height / 2 + ry * Math.sin(angle),\n angle,\n });\n }\n return out;\n };\n}\n"]}