@weasel-js/guides 1.11.1 → 1.12.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 CHANGED
@@ -761,9 +761,9 @@ function distanceReadout(opts = {}) {
761
761
  MODIFIERS.map((m) => [m, m === modifier ? held : "optional"])
762
762
  );
763
763
  const bindings = [
764
- { spec: { kind: "hover", mods: mods(true) }, actionId: action.id, opts: { params: { show: true } } },
765
- { spec: { kind: "hover", mods: mods(false) }, actionId: action.id, opts: { params: { show: false } } },
766
- { spec: { kind: "hover", motion: "leave" }, actionId: action.id, opts: { params: { show: false } } }
764
+ { spec: { kind: "hover", mods: mods(true) }, actionId: action.id, opts: { id: `${id}.show`, params: { show: true } } },
765
+ { spec: { kind: "hover", mods: mods(false) }, actionId: action.id, opts: { id: `${id}.hide`, params: { show: false } } },
766
+ { spec: { kind: "hover", motion: "leave" }, actionId: action.id, opts: { id: `${id}.leave`, params: { show: false } } }
767
767
  ];
768
768
  return {
769
769
  id,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/pointToGridCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/grid/scopedPitch.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/spacing.ts","../src/guides/alignment/sceneBounds.ts","../src/strategies/onPlane.ts","../src/sources/lines.ts","../src/sources/grid.ts","../src/sources/guides.ts","../src/guides/alignment/match.ts","../src/sources/targets.ts","../src/sources/alignment.ts","../src/sources/spacing.ts","../src/spacingHints/distance.ts","../src/spacingHints/distanceReadout.ts","../src/spacingHints/preset.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":["resolveAxes","useState","useLatest","useCallback","span","EPS","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","nodeGates","lo","hi","mid","cross","at","pack","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","import { resolveAxes, type PlaneUnits, type PlaneValue } from '@weasel-js/core';\n\n/**\n * The integer cell `{col, row}` that contains `point`. Pair with\n * `createCellHighlightLayer` (its `getCell` callback) to draw a snap-target\n * preview that uses the same spacing as `gridSnapSource`.\n */\nexport function pointToGridCell(\n point: { x: number; y: number },\n spacing: PlaneValue,\n unitSystem?: PlaneUnits,\n origin: { x: number; y: number } = { x: 0, y: 0 },\n): { col: number; row: number } {\n const s = resolveAxes(spacing, unitSystem);\n return {\n col: Math.floor((point.x - origin.x) / s.x),\n row: Math.floor((point.y - origin.y) / s.y),\n };\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 './pointToGridCell';\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 viewportWorldRect,\n type Dims,\n type View,\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 /**\n * The area to cover, in world units, read every paint with that paint's\n * view and canvas size. Lines start at its own `x`/`y`. Omitted, the grid\n * covers whatever the canvas shows, with its lines on world multiples of\n * `spacing` so they stay put as the view pans.\n */\n bounds?: (view: View, dims: Dims) => { 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/** Closest, in CSS pixels, a line family is drawn; denser ones are left out. */\nconst MIN_SCREEN_SPACING = 4;\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, dims) => {\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveAxes(opts.spacing, opts.unitSystem);\n const b = opts.bounds\n ? opts.bounds(view, dims)\n : onLattice(viewportWorldRect(view, dims), spacing, accentEvery && accentEvery > 0 ? accentEvery : 1);\n // Written so a non-finite extent, which a zero view scale gives, fails it too.\n if (!(b.width > 0 && b.height > 0 && Number.isFinite(b.width) && Number.isFinite(b.height))) return [];\n\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 // One family of parallel lines `step` apart, leaving out every\n // `skipEvery`th (the ones a coarser family draws), and none at all once\n // they would sit closer than MIN_SCREEN_SPACING on screen.\n const family = (axis: 'x' | 'y', step: number, skipEvery: number, s: CommandStroke): void => {\n if (!(step * Math.abs(view.scale[axis]) >= MIN_SCREEN_SPACING)) return;\n const [from, to] = axis === 'x' ? [x0, x1] : [y0, y1];\n for (let k = 0; from + k * step <= to + 1e-9; k++) {\n if (skipEvery > 0 && k % skipEvery === 0) continue;\n const at = from + k * step;\n if (axis === 'x') pushSegment(at, y0, at, y1, s);\n else pushSegment(x0, at, x1, at, s);\n }\n };\n\n const accentOn = accentEvery !== undefined && accentEvery > 0;\n for (const axis of ['x', 'y'] as const) {\n // Sub-lines first so cell lines paint on top, accents last of all.\n if (subdivisions && subdivisions > 1) family(axis, spacing[axis] / subdivisions, subdivisions, sub);\n }\n for (const axis of ['x', 'y'] as const) family(axis, spacing[axis], accentOn ? accentEvery : 0, line);\n if (accentOn) {\n for (const axis of ['x', 'y'] as const) family(axis, spacing[axis] * accentEvery, 0, accent);\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n\n/**\n * Grow `r` outward to whole periods of the lattice, so the first line drawn\n * sits on a world multiple of the pitch, and of the accent pitch for accents.\n */\nfunction onLattice(\n r: { x: number; y: number; width: number; height: number },\n spacing: { x: number; y: number },\n accentEvery: number,\n): { x: number; y: number; width: number; height: number } {\n const px = spacing.x * accentEvery;\n const py = spacing.y * accentEvery;\n const x = Math.floor(r.x / px) * px;\n const y = Math.floor(r.y / py) * py;\n return {\n x,\n y,\n width: Math.ceil((r.x + r.width) / px) * px - x,\n height: Math.ceil((r.y + r.height) / py) * py - y,\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 { resolveScoped, type PerAxis, type PlaneValue, type UnitScope } from '@weasel-js/core';\n\n/** How a grid reads the unit scopes a scene's containers declare\n * (`ContainerNode.units`). */\nexport interface GridScopes {\n /** The scene's outermost scope, as `sceneUnitScopes` is handed it. The grid's\n * `spacing` is read in its system, in place of `unitSystem`. */\n root: UnitScope;\n /** The pitch inside a container's scope, written in that scope's units.\n * Default: the grid's `spacing`, read there, so a bare 10 is ten of its\n * base units. */\n spacing?: (scope: UnitScope) => PlaneValue;\n}\n\ntype Axial = Exclude<PlaneValue, PerAxis<unknown>>;\n\n/** A length in `chain`'s innermost units, in world units. A pitch is a span,\n * so a unit that disagrees about zero moves it nowhere. */\nfunction span(v: Axial, chain: readonly UnitScope[]): number {\n const zero = typeof v === 'number' ? 0 : { ...v, value: 0 };\n return resolveScoped(v, chain) - resolveScoped(zero, chain);\n}\n\n/**\n * A grid's pitch on each axis, in world units, where `chain` (outermost\n * first, rooted at `scopes.root`) encloses it: `spacing` in the root, and\n * `scopes.spacing` of the innermost scope inside a container's.\n */\nexport function scopedGridPitch(spacing: PlaneValue, scopes: GridScopes, chain: readonly UnitScope[]): PerAxis<number> {\n const inner = chain.length > 1 ? chain[chain.length - 1]! : null;\n const v = inner && scopes.spacing ? scopes.spacing(inner) : spacing;\n const on = (axis: 'x' | 'y'): number => {\n const a = typeof v === 'object' && 'x' in v ? v[axis] : v;\n try {\n return span(a, chain);\n } catch (e) {\n throw new Error(`${axis} axis: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n return { x: on('x'), y: on('y') };\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 `guideSnapSource` 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 `guideSnapSource` (snap source) 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 `guideSnapSource` (snap source) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport { measuredSegmentCommands, tickedSegment, type DrawCommand, type RenderLayer, type CommandStroke } from '@weasel-js/core';\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, such as\n * `matchSpacing`'s. */\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';\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(...measuredSegmentCommands(x0, y0, x1, y1, ticks, gapStroke, format?.(g.max - g.min) ?? null, gapColor));\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 `opts.poseDescriptor`, so a rotated sibling advertises\n * its ink edges rather than its stored box.\n * The moving selection is measured with its stroke (`drawnBoundsOf`), so\n * pass each sibling's `drawnAABBOf` box as its target for the two to agree.\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 { 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 measureGapSpans(targets, axis).map((m) => m.gap);\n}\n\n/** A measured gap, and the stretch of the other axis its two boxes share. */\nexport interface MeasuredGap { gap: SpacingGap; span: [number, number] }\n\n/** `measureGaps`, keeping each gap's shared span: what `referenceGaps`\n * filters. Quadratic in `targets`, so a caller matching every frame keeps\n * the result while the targets stand still. */\nexport function measureGapSpans(targets: readonly Bounds[], axis: Axis): MeasuredGap[] {\n const out: MeasuredGap[] = [];\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\n/** A placement on one axis: the move that gives an equal gap of `size`. */\nexport interface SpacingOffer { delta: number; size: number }\n\n/** Every equal-spacing placement on one axis, unfiltered by reach: each\n * reference gap reproduced beside a neighbor, and centering between the two\n * neighbors. */\nexport function spacingOffers(\n b: Bounds,\n axis: Axis,\n edge: SpacingEdge,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n): SpacingOffer[] {\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 const out: SpacingOffer[] = [];\n const offer = (delta: number, gap: number): void => {\n if (gap > EPS) out.push({ 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 out;\n}\n\n/** The nearest equal-spacing placement on one axis within `tol`, 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): SpacingOffer | null {\n let best: SpacingOffer | null = null;\n for (const o of spacingOffers(b, axis, edge, targets, refs)) {\n if (Math.abs(o.delta) > tol) continue;\n if (best === null || Math.abs(o.delta) < Math.abs(best.delta)) best = o;\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. */\nexport function equalGaps(\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 // Only a box overlapping the gap-wide margins beside b can bound or block\n // one of b's own gaps, so the quadratic measure runs on those alone.\n const near = targets.filter((t) => hi(t, axis) > lo(b, axis) - size - EPS && lo(t, axis) < hi(b, axis) + size + EPS);\n const own = measureGaps([...near, 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/** The measured gaps a box at `bounds` can reproduce: all but those it\n * stands inside. */\nexport function referenceGaps(bounds: Bounds, measured: readonly MeasuredGap[]): SpacingGap[] {\n return measured.filter((m) => !hitsStrip(m.gap, bounds, m.span)).map((m) => m.gap);\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 refsX = referenceGaps(bounds, measureGapSpans(targets, 'x'));\n const refsY = referenceGaps(bounds, measureGapSpans(targets, '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 ? [] : equalGaps(final, 'x', x.size, targets, refsX),\n gapsY: y === null ? [] : equalGaps(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 {\n AUTO_POSE_DESCRIPTOR,\n type Bounds,\n type NodeId,\n nodeGates,\n type PoseDescriptor,\n type Scene,\n scenePoseFrame,\n unionAABB,\n visualBoundsViaDescriptor,\n} from '@weasel-js/core';\n\n\n/** Options shared by the scene readers below. */\nexport interface SceneBoundsOptions {\n /** How to read a pose's box. Pass the canvas's, so these agree with what it\n * draws. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<unknown>;\n}\n\n/** The world box each id is drawn in, rotation included, skipping ids the\n * scene no longer holds. Read through the scene's composition. */\nexport function worldBoundsOf(\n scene: Scene<unknown, string, unknown>,\n ids: Iterable<NodeId>,\n opts: SceneBoundsOptions = {},\n): Bounds[] {\n const d = opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR;\n const frame = scenePoseFrame(scene);\n const out: Bounds[] = [];\n for (const id of ids) {\n if (scene.get(id) === undefined) continue;\n out.push(visualBoundsViaDescriptor(frame.world(id), d));\n }\n return out;\n}\n\n/** The union of `ids`' world boxes, or null when none is in the scene. */\nexport function worldUnionOf(\n scene: Scene<unknown, string, unknown>,\n ids: Iterable<NodeId>,\n opts: SceneBoundsOptions = {},\n): Bounds | null {\n const boxes = worldBoundsOf(scene, ids, opts);\n return boxes.length === 0 ? null : unionAABB(boxes);\n}\n\n/** Every node sharing a parent with one of `ids`, outside the set, and not\n * hidden (`nodeGates`). */\nexport function siblingIds(scene: Scene<unknown, string, unknown>, ids: readonly NodeId[]): NodeId[] {\n const moving = new Set(ids);\n const gates = nodeGates(scene);\n const parents = new Set<NodeId | null>();\n for (const id of ids) {\n const node = scene.get(id);\n if (node !== undefined) parents.add(node.parent);\n }\n const siblings: NodeId[] = [];\n for (const parent of parents) {\n for (const id of parent === null ? scene.roots : scene.childrenOf(parent)) {\n const node = scene.get(id);\n if (moving.has(id) || node === undefined || gates.hidden(id)) continue;\n siblings.push(id);\n }\n }\n return siblings;\n}\n\n/**\n * The world boxes of `ids`' siblings ({@link siblingIds}). What an\n * equal-spacing snap measures gaps between while `ids` move.\n */\nexport function siblingBounds(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n opts: SceneBoundsOptions = {},\n): Bounds[] {\n return worldBoundsOf(scene, siblingIds(scene, ids), opts);\n}\n","import type { GestureContext } from '@weasel-js/core';\nimport type { Guide } from '../guides/types';\n\n/** A gesture's `plane`: how the camera's world maps into the world its poses are in. */\ntype Plane = GestureContext<unknown>['plane'];\ntype Axis = 'x' | 'y';\n\n/** Where a guide the camera draws lies along its own axis in the world a gesture's poses are in. */\nexport function guideOffsetOn(g: Guide, plane: Plane): number {\n return plane ? g.offset * plane.scale[g.axis] + plane.offset[g.axis] : g.offset;\n}\n\n/** `value` on `axis` moved to the nearest line of the camera's grid, in the world a gesture's poses are in. */\nexport function roundToGridOn(value: number, axis: Axis, spacing: number, plane: Plane): number {\n if (!plane) return Math.round(value / spacing) * spacing;\n const camera = (value - plane.offset[axis]) / plane.scale[axis];\n return Math.round(camera / spacing) * spacing * plane.scale[axis] + plane.offset[axis];\n}\n","import type { Locus, SnapCollect } from '@weasel-js/core';\n\ntype Point = { x: number; y: number };\ntype Axis = 'x' | 'y';\n\n/** The line `axis = offset` as a locus, through `near` on the other axis. */\nexport function axisLine(axis: Axis, offset: number, near: Point): Locus {\n return axis === 'x'\n ? { at: { x: offset, y: near.y }, dirs: [{ x: 0, y: 1 }] }\n : { at: { x: near.x, y: offset }, dirs: [{ x: 1, y: 0 }] };\n}\n\n/** How far the resolved move `delta` carries a probe from where `q` saw it. */\nexport function landedShift(q: Pick<SnapCollect, 'delta0'>, delta: Point): Point {\n return { x: delta.x - q.delta0.x, y: delta.y - q.delta0.y };\n}\n","import {\n asNodeId, resolveAxes, sceneSharedUnitScopes, sceneUnitScopes,\n type PerAxis, type PlaneMap, type PlaneUnits, type PlaneValue, type SnapCollect, type SnapSource,\n} from '@weasel-js/core';\nimport { scopedGridPitch, type GridScopes } from '../grid/scopedPitch';\nimport { roundToGridOn } from '../strategies/onPlane';\nimport { axisLine } from './lines';\n\ntype Point = { x: number; y: number };\n\n/** Options for `gridSnapSource`. */\nexport interface GridSnapSourceOptions {\n /** The grid's pitch, or one per axis, in `unitSystem`'s units. */\n spacing: PlaneValue;\n /** A point the lattice passes through. Default `(0, 0)`. */\n origin?: Point;\n unitSystem?: PlaneUnits;\n /** Read the unit scope the subject sits in: a node inside a millimeter\n * sub-assembly snaps on that scope's pitch. The subject's scope is the one\n * all its nodes share; for a gesture with none, the scope of the\n * container it draws into (`SnapCollect.parent`), else the root. */\n scopes?: GridScopes;\n}\n\n/**\n * A grid as snap targets: for each origin or pointer probe, the grid line on\n * either side of it on each axis. Its reach is unlimited and it is a\n * fallback, so it holds every axis no target claims and never displaces one.\n * Its lines are the camera's, carried into the plane a gesture runs in.\n */\nexport function gridSnapSource(opts: GridSnapSourceOptions): SnapSource {\n const { scopes } = opts;\n const rootPitch = scopes ? scopedGridPitch(opts.spacing, scopes, [scopes.root]) : resolveAxes(opts.spacing, opts.unitSystem);\n const pitchFor = (q: SnapCollect): PerAxis<number> => {\n if (!scopes || !q.scene) return rootPitch;\n if (q.ids?.length) return scopedGridPitch(opts.spacing, scopes, sceneSharedUnitScopes(q.scene, q.ids.map(asNodeId), scopes.root));\n if (q.parent === undefined) return rootPitch;\n return scopedGridPitch(opts.spacing, scopes, sceneUnitScopes(q.scene, asNodeId(q.parent), scopes.root, { inclusive: true }));\n };\n const o = opts.origin ?? { x: 0, y: 0 };\n const lines = (v: number, axis: 'x' | 'y', pitch: PerAxis<number>, plane: PlaneMap | null): [number, number] => {\n const s = plane ? plane.scale[axis] : 1;\n const near = roundToGridOn(v - o[axis] * s, axis, pitch[axis], plane) + o[axis] * s;\n const step = pitch[axis] * s;\n return [near, near + (v >= near ? step : -step)];\n };\n return {\n id: 'grid',\n tier: 'fallback',\n reachPx: Infinity,\n roles: ['origin', 'pointer'],\n *collect(q) {\n const pitch = pitchFor(q);\n for (const p of q.probes) {\n for (const axis of ['x', 'y'] as const) {\n for (const at of lines(p.at[axis], axis, pitch, q.plane ?? null)) yield { probe: p.id, locus: axisLine(axis, at, p.at) };\n }\n }\n },\n };\n}\n","import type { SnapSource } from '@weasel-js/core';\nimport type { Guide } from '../guides/types';\nimport { guideOffsetOn } from '../strategies/onPlane';\nimport { axisLine } from './lines';\n\n/**\n * Ruler guides as snap targets: each guide within reach of an origin or\n * pointer probe is a line it may land on. Reads `getGuides` every frame, so\n * a guide added mid-drag counts at once.\n */\nexport function guideSnapSource(getGuides: () => readonly Guide[]): SnapSource {\n return {\n id: 'guides',\n roles: ['origin', 'pointer'],\n *collect(q) {\n const guides = getGuides();\n if (guides.length === 0) return;\n const reach = q.reachWorld(q.reachPx);\n for (const p of q.probes) {\n for (const g of guides) {\n const offset = guideOffsetOn(g, q.plane ?? null);\n if (Math.abs(p.at[g.axis] - offset) > reach) continue;\n yield { probe: p.id, locus: axisLine(g.axis, offset, p.at) };\n }\n }\n },\n };\n}\n","import type { Guide } from '../types';\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 { nodeGates, type Bounds, type NodeId, type Scene, type SceneNode, type SnapCollect } from '@weasel-js/core';\nimport { siblingIds } from '../guides/alignment/sceneBounds';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\nfunction visibleRoots(scene: AnyScene): readonly NodeId[] {\n const gates = nodeGates(scene);\n return scene.roots.filter((id) => !gates.hidden(id));\n}\n\n/** Which nodes may be targets; one that fails offers no lines or gaps. */\nexport type TargetFilter = (node: SceneNode<unknown, string, unknown>) => boolean;\n\n/** The nodes a gesture's subject lines up with: its siblings when it has\n * ids, the scene's visible top-level nodes for a point gesture. */\nfunction targetIds(scene: AnyScene, exclude: readonly string[], filter?: TargetFilter): readonly NodeId[] {\n const ids = exclude.length > 0\n ? siblingIds(scene, exclude as readonly NodeId[])\n : visibleRoots(scene);\n if (!filter) return ids;\n return ids.filter((id) => {\n const node = scene.get(id);\n return node !== undefined && filter(node);\n });\n}\n\n/** The target nodes' boxes, measured as the session measures its subject;\n * none from a host that measures no boxes. */\nexport function targetBoxes(q: SnapCollect, scene: AnyScene, filter?: TargetFilter): Bounds[] {\n const drawn = q.drawnBox;\n return drawn ? targetIds(scene, q.exclude, filter).flatMap((id) => drawn(id) ?? []) : [];\n}\n\n/**\n * `derive` over the query's target boxes, kept while the scene's version and\n * the excluded ids stand still: a drag asks every frame, and nothing it\n * reads changes until it commits.\n */\nexport function cachedPerScene<T>(\n derive: (boxes: readonly Bounds[]) => T, filter?: TargetFilter,\n): (q: SnapCollect) => T | null {\n let key: { scene: AnyScene; version: number; exclude: string } | null = null;\n let value: T | null = null;\n return (q) => {\n const scene = q.scene;\n if (!scene) return null;\n const version = scene.getVersion();\n const exclude = q.exclude.join('\\n');\n if (key === null || key.scene !== scene || key.version !== version || key.exclude !== exclude) {\n value = derive(targetBoxes(q, scene, filter));\n key = { scene, version, exclude };\n }\n return value;\n };\n}\n","import type { Bounds, SnapCollect, SnapEdges, SnapMark, SnapProbeAt, SnapSource } from '@weasel-js/core';\nimport { applyEdges } from '../guides/alignment/spacing';\nimport { deriveAlignmentGuides } from '../guides/alignment/derive';\nimport { stretchSpan } from '../guides/alignment/match';\nimport type { Guide } from '../guides/types';\nimport { axisLine, landedShift } from './lines';\nimport { cachedPerScene, type TargetFilter } from './targets';\n\ntype Point = { x: number; y: number };\ntype Axis = 'x' | 'y';\n\n/** Options for `alignmentSnapSource`. */\nexport interface AlignmentSnapSourceOptions {\n /** A page box whose edges and center are lines too, in the camera's world. */\n page?: Bounds | (() => Bounds | null | undefined);\n /** The lines to align to, in place of the edges and centers of the\n * subject's siblings (of the scene's top-level nodes, for a point gesture). */\n getCandidates?: () => readonly Guide[];\n /** Which nodes offer lines. Narrows the default siblings; not `getCandidates`. */\n filter?: TargetFilter;\n /** The color of the lines it marks. Default: the readout layer's. */\n color?: string;\n /** Overrides the canvas's reach for these targets, in screen px. */\n reachPx?: number;\n}\n\n/** Each axis's lines, sorted by offset, so a probe finds the ones in reach\n * without walking the rest. */\ninterface LineIndex { x: readonly Guide[]; y: readonly Guide[] }\n\nfunction indexLines(lines: readonly Guide[]): LineIndex {\n const sorted = [...lines].sort((a, b) => a.offset - b.offset);\n return { x: sorted.filter((g) => g.axis === 'x'), y: sorted.filter((g) => g.axis === 'y') };\n}\n\nfunction* inReach(lines: readonly Guide[], v: number, reach: number): Generator<Guide> {\n let lo = 0;\n let hi = lines.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (lines[mid].offset < v - reach) lo = mid + 1;\n else hi = mid;\n }\n for (let i = lo; i < lines.length && lines[i].offset <= v + reach; i++) yield lines[i];\n}\n\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The line `g` drawn from the box (or point) a probe landed in to the\n * farthest sibling that shares it. */\nfunction lineMark(g: Guide, extent: [number, number], color: string | undefined): SnapMark {\n const span = stretchSpan(g, extent[0], extent[1])?.span ?? { min: extent[0], max: extent[1] };\n const ends = g.axis === 'x'\n ? { from: { x: g.offset, y: span.min }, to: { x: g.offset, y: span.max } }\n : { from: { x: span.min, y: g.offset }, to: { x: span.max, y: g.offset } };\n return { kind: 'line', ...ends, ...(color === undefined ? {} : { color }) };\n}\n\n/**\n * The edges and centers of the subject's siblings, and optionally a page, as\n * snap targets: each is a line a box or pointer probe may land on. A move's\n * left, center and right (top, center, bottom) all try every line, as Figma's\n * smart guides do. When the result meets a line, its mark runs from the\n * subject's box to the farthest sibling on that line.\n */\nexport function alignmentSnapSource(opts: AlignmentSnapSourceOptions = {}): SnapSource {\n const page = () => (typeof opts.page === 'function' ? opts.page() : opts.page) ?? undefined;\n const fromScene = cachedPerScene((boxes) => indexLines(deriveAlignmentGuides(boxes)), opts.filter);\n const linesFor = (q: SnapCollect): LineIndex[] => {\n const pageBox = page();\n const own = opts.getCandidates ? indexLines(opts.getCandidates()) : fromScene(q);\n return [...(own ? [own] : []), ...(pageBox ? [indexLines(deriveAlignmentGuides([], { page: pageBox }))] : [])];\n };\n return {\n id: 'alignment',\n ...(opts.reachPx === undefined ? {} : { reachPx: opts.reachPx }),\n roles: ['box', 'pointer'],\n *collect(q) {\n const indexes = linesFor(q);\n if (indexes.length === 0) return;\n const reach = q.reachWorld(q.reachPx);\n const box = q.box ?? null;\n // A resize offers its dragged corner as pointer and as box; the box's\n // probes are the ones whose marks span it.\n const probes = q.probes.some((p) => p.role === 'box') ? q.probes.filter((p) => p.role === 'box') : q.probes;\n for (const p of probes) {\n for (const axis of ['x', 'y'] as const) {\n for (const index of indexes) {\n for (const g of inReach(index[axis], p.at[axis], reach)) {\n yield {\n probe: p.id,\n locus: axisLine(axis, g.offset, p.at),\n mark: (delta: Point) => lineMark(g, extentAcross(p, box, axis, landedShift(q, delta), q.edges), opts.color),\n };\n }\n }\n }\n }\n },\n };\n}\n\n/** Where the landed probe's box (its own point, for a pointer) spans the axis\n * across `axis`. */\nfunction extentAcross(\n p: SnapProbeAt, box: Bounds | null, axis: Axis, shift: Point, edges: SnapEdges = { x: 'both', y: 'both' },\n): [number, number] {\n const c = cross(axis);\n if (p.role !== 'box' || box === null) return [p.at[c] + shift[c], p.at[c] + shift[c]];\n const landed = applyEdges(box, shift.x, shift.y, edges);\n const lo = c === 'x' ? landed.x : landed.y;\n return [lo, lo + (c === 'x' ? landed.width : landed.height)];\n}\n","import type { Bounds, SnapEdges, SnapMark, SnapSource } from '@weasel-js/core';\nimport {\n applyEdges, equalGaps, measureGapSpans, referenceGaps, spacingOffers, type MeasuredGap,\n} from '../guides/alignment/spacing';\nimport type { SpacingGap } from '../guides/types';\nimport { axisLine, landedShift } from './lines';\nimport { cachedPerScene, type TargetFilter } from './targets';\n\ntype Point = { x: number; y: number };\n\n/** Options for `spacingSnapSource`. */\nexport interface SpacingSnapSourceOptions {\n /** The boxes to measure gaps between, in place of the subject's siblings. */\n getTargets?: () => readonly Bounds[];\n /** Which nodes offer gaps. Narrows the default siblings; not `getTargets`. */\n filter?: TargetFilter;\n /** The color of the gaps it marks. Default: the readout layer's. */\n color?: string;\n /** Overrides the canvas's reach for these targets, in screen px. */\n reachPx?: number;\n}\n\ninterface Measured { boxes: readonly Bounds[]; x: readonly MeasuredGap[]; y: readonly MeasuredGap[] }\n\nconst measureAll = (boxes: readonly Bounds[]): Measured =>\n ({ boxes, x: measureGapSpans(boxes, 'x'), y: measureGapSpans(boxes, 'y') });\n\nfunction gapMark(g: SpacingGap, color: string | undefined): SnapMark {\n const ends = g.axis === 'x'\n ? { from: { x: g.min, y: g.at }, to: { x: g.max, y: g.at } }\n : { from: { x: g.at, y: g.min }, to: { x: g.at, y: g.max } };\n return { kind: 'gap', ...ends, value: g.max - g.min, ...(color === undefined ? {} : { color }) };\n}\n\n/**\n * Equal spacing as snap targets, Figma's: on each axis, the positions of the\n * subject's box that make its gap to a neighbor equal one already between\n * two siblings, or center it between its two neighbors. A resize moves only\n * the edges it drags. When the result meets one, it marks every gap of that\n * size, the box's own included.\n */\nexport function spacingSnapSource(opts: SpacingSnapSourceOptions = {}): SnapSource {\n const fromScene = cachedPerScene(measureAll, opts.filter);\n return {\n id: 'spacing',\n ...(opts.reachPx === undefined ? {} : { reachPx: opts.reachPx }),\n roles: ['box'],\n gestures: ['move', 'resize'],\n *collect(q) {\n const box = q.box;\n const probe = q.probes.find((p) => p.role === 'box');\n const measured = opts.getTargets ? measureAll(opts.getTargets()) : fromScene(q);\n if (!box || !probe || !measured) return;\n const reach = q.reachWorld(q.reachPx);\n const edges: SnapEdges = q.edges ?? { x: 'both', y: 'both' };\n for (const axis of ['x', 'y'] as const) {\n const edge = edges[axis];\n if (edge === null) continue;\n const refs = referenceGaps(box, measured[axis]);\n const seen = new Set<string>();\n for (const o of spacingOffers(box, axis, edge, measured.boxes, refs)) {\n const key = `${o.delta.toFixed(6)}:${o.size.toFixed(6)}`;\n if (Math.abs(o.delta) > reach || seen.has(key)) continue;\n seen.add(key);\n yield {\n probe: probe.id,\n locus: axisLine(axis, probe.at[axis] + o.delta, probe.at),\n mark: (delta: Point) => {\n const shift = landedShift(q, delta);\n const landed = applyEdges(box, shift.x, shift.y, edges);\n return equalGaps(landed, axis, o.size, measured.boxes, refs).map((g) => gapMark(g, opts.color));\n },\n };\n }\n }\n },\n };\n}\n","import type { Bounds } from '@weasel-js/core';\nimport type { Guide, SpacingGap } from '../guides/types';\n\ntype Axis = 'x' | 'y';\n\nconst EPS = 1e-6;\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 mid = (b: Bounds, a: Axis): number => (lo(b, a) + hi(b, a)) / 2;\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The distances `measureDistances` found, ready for `createGuidesLayer`:\n * `gaps` as its `getGaps`, `leaders` as its `getGuides`. */\nexport interface DistanceReadout {\n /** One measured distance per gap, labeled with its length when drawn. */\n gaps: SpacingGap[];\n /** Where a gap runs past the target, the line from the gap's end along the\n * target's edge to the target, so the number reads as reaching it. */\n leaders: Guide[];\n}\n\n/**\n * The distances between two boxes, on each axis where they separate: for\n * `from` left of `to`, the gap from `from`'s right edge to `to`'s left. A gap\n * is drawn through the range the boxes share on the other axis, or through\n * `from`'s center when they share none, with a leader to `to`. When one box\n * holds the other on an axis and they overlap on the other, the inner box's\n * distances to the outer's two edges on that axis instead. An axis where the\n * boxes partly overlap, or meet flush, has no distance.\n */\nexport function measureDistances(from: Bounds, to: Bounds): DistanceReadout {\n const out: DistanceReadout = { gaps: [], leaders: [] };\n for (const axis of ['x', 'y'] as const) measureAxis(from, to, axis, out);\n return out;\n}\n\nfunction measureAxis(from: Bounds, to: Bounds, axis: Axis, out: DistanceReadout): void {\n const c = cross(axis);\n const sharedMin = Math.max(lo(from, c), lo(to, c));\n const sharedMax = Math.min(hi(from, c), hi(to, c));\n const shares = sharedMax - sharedMin > EPS;\n const push = (min: number, max: number, at: number): void => {\n if (max - min > EPS) out.gaps.push({ axis, min, max, at });\n };\n\n const before = hi(from, axis) <= lo(to, axis) + EPS;\n const after = hi(to, axis) <= lo(from, axis) + EPS;\n if (before || after) {\n const [min, max] = before ? [hi(from, axis), lo(to, axis)] : [hi(to, axis), lo(from, axis)];\n if (max - min <= EPS) return;\n const at = shares ? (sharedMin + sharedMax) / 2 : mid(from, c);\n push(min, max, at);\n if (!shares) {\n const edge = before ? lo(to, axis) : hi(to, axis);\n const span = at < lo(to, c) ? { min: at, max: lo(to, c) } : { min: hi(to, c), max: at };\n out.leaders.push({ id: `distance:${axis}`, axis, offset: edge, span });\n }\n return;\n }\n if (!shares) return;\n const [inner, outer] = lo(from, axis) >= lo(to, axis) - EPS && hi(from, axis) <= hi(to, axis) + EPS\n ? [from, to]\n : lo(to, axis) >= lo(from, axis) - EPS && hi(to, axis) <= hi(from, axis) + EPS\n ? [to, from]\n : [null, null];\n if (inner === null || outer === null) return;\n const at = mid(inner, c);\n push(lo(outer, axis), lo(inner, axis), at);\n push(hi(inner, axis), hi(outer, axis), at);\n}\n","import type { Action, GestureBinding, ModSpec, NodeId, Scene, SnapMark, SnapOutcomeStore, SurfaceContribution } from '@weasel-js/core';\nimport { measureDistances, type DistanceReadout } from './distance';\nimport { worldBoundsOf, worldUnionOf } from '../guides/alignment/sceneBounds';\n\n\n/** Options for `distanceReadout`. */\nexport interface DistanceReadoutOptions {\n /** The key held to show the readout. Default `'alt'`. */\n modifier?: 'alt' | 'ctrl' | 'meta' | 'shift';\n /** The color of the marks it writes. Default: the readout layer's. */\n color?: string;\n /** Contribution id, and the prefix of its action's. Default `'distanceReadout'`. */\n id?: string;\n}\n\n/** The readout as snap marks: a `distance` per gap, a `line` per leader. */\nfunction marksOf(r: DistanceReadout, color: string | undefined): SnapMark[] {\n const c = color === undefined ? {} : { color };\n return [\n ...r.gaps.map((g): SnapMark => g.axis === 'x'\n ? { kind: 'distance', from: { x: g.min, y: g.at }, to: { x: g.max, y: g.at }, value: g.max - g.min, ...c }\n : { kind: 'distance', from: { x: g.at, y: g.min }, to: { x: g.at, y: g.max }, value: g.max - g.min, ...c }),\n ...r.leaders.flatMap((l): SnapMark[] => {\n if (l.span === undefined) return [];\n return [l.axis === 'x'\n ? { kind: 'line', from: { x: l.offset, y: l.span.min }, to: { x: l.offset, y: l.span.max }, ...c }\n : { kind: 'line', from: { x: l.span.min, y: l.offset }, to: { x: l.span.max, y: l.offset }, ...c }];\n }),\n ];\n}\n\n/** What `distanceReadout` returns: a surface contribution, plus a read of\n * what it is showing. */\nexport interface DistanceReadoutContribution extends SurfaceContribution {\n /** The distances on screen now; empty while hidden. */\n read(): DistanceReadout;\n}\n\nconst EMPTY: DistanceReadout = { gaps: [], leaders: [] };\nconst MODIFIERS: readonly NonNullable<DistanceReadoutOptions['modifier']>[] = ['alt', 'ctrl', 'meta', 'shift'];\n\n/** The ids and every node under them: what the pick under the pointer skips. */\nfunction subtreeOf(scene: Scene<unknown, string, unknown>, ids: readonly NodeId[]): Set<NodeId> {\n const out = new Set<NodeId>();\n const stack = [...ids];\n while (stack.length > 0) {\n const id = stack.pop()!;\n if (out.has(id)) continue;\n out.add(id);\n stack.push(...scene.childrenOf(id));\n }\n return out;\n}\n\n/**\n * Distance readouts on hover: while `modifier` is held over a shape, the\n * distances from the selection's box to that shape's, on each axis where they\n * separate, measured by `measureDistances` and drawn as labeled gaps. Pass it\n * in `<SceneCanvas ambient>`. It runs on `hover` bindings, so it claims no\n * input, and it reads the canvas's `selection`, `scene`, `nodeAtPoint`,\n * `poseDescriptor`, and `snapReadout` deps. A press hides it.\n */\nexport function distanceReadout(opts: DistanceReadoutOptions = {}): DistanceReadoutContribution {\n const id = opts.id ?? 'distanceReadout';\n const modifier = opts.modifier ?? 'alt';\n let shown: DistanceReadout = EMPTY;\n let store: SnapOutcomeStore | null = null;\n const show = (next: DistanceReadout): void => {\n if (next === shown || (next.gaps.length === 0 && shown.gaps.length === 0)) return;\n shown = next;\n store?.set(marksOf(next, opts.color));\n };\n\n const action: Action = {\n id: `${id}.measure`,\n label: 'Measure distance to the shape under the pointer',\n requires: ['selection', 'scene', 'nodeAtPoint', 'poseDescriptor', 'snapReadout'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { show?: boolean; worldX?: number; worldY?: number } | undefined;\n const { selection, scene, nodeAtPoint, poseDescriptor, snapReadout } = deps;\n if (snapReadout !== undefined) store = snapReadout.store;\n const ids = selection?.get() ?? [];\n if (p?.show !== true || p.worldX === undefined || p.worldY === undefined\n || scene === undefined || nodeAtPoint === undefined || ids.length === 0) {\n show(EMPTY);\n return;\n }\n const hit = nodeAtPoint({ x: p.worldX, y: p.worldY }, subtreeOf(scene, ids));\n const from = worldUnionOf(scene, ids, { poseDescriptor });\n const [to] = hit === null ? [] : worldBoundsOf(scene, [hit], { poseDescriptor });\n show(from === null || to === undefined ? EMPTY : measureDistances(from, to));\n },\n },\n };\n\n const mods = (held: boolean): ModSpec => Object.fromEntries(\n MODIFIERS.map((m) => [m, m === modifier ? held : 'optional']),\n );\n const bindings: GestureBinding[] = [\n { spec: { kind: 'hover', mods: mods(true) }, actionId: action.id, opts: { params: { show: true } } },\n { spec: { kind: 'hover', mods: mods(false) }, actionId: action.id, opts: { params: { show: false } } },\n { spec: { kind: 'hover', motion: 'leave' }, actionId: action.id, opts: { params: { show: false } } },\n ];\n\n return {\n id,\n eligibility: { always: true },\n actions: [action],\n bindings,\n attach: (api) => {\n const el = api.element;\n const hide = (): void => show(EMPTY);\n el?.addEventListener('pointerdown', hide, true);\n return () => {\n el?.removeEventListener('pointerdown', hide, true);\n show(EMPTY);\n store = null;\n };\n },\n read: () => shown,\n };\n}\n","import type { FeaturePreset, SnapSource, SurfaceContribution } from '@weasel-js/core';\nimport type { TargetFilter } from '../sources/targets';\nimport { alignmentSnapSource } from '../sources/alignment';\nimport { spacingSnapSource } from '../sources/spacing';\nimport { distanceReadout, type DistanceReadoutOptions } from './distanceReadout';\n\n/** Options for `createSpacingHintsPreset`. */\nexport interface SpacingHintsOptions {\n /** Preset id. Default `'spacingHints'`. */\n id?: string;\n /** Snap a move so its gap to a neighbor equals one already between its\n * siblings, and mark the equal gaps. Default true. */\n spacing?: boolean;\n /** Snap to the siblings' edges and centers too, and mark the line met.\n * Default false. */\n align?: boolean;\n /** Snap distance in screen px. Default the canvas's reach. */\n tolerance?: number;\n /** Which nodes the snap sources take as siblings to line up or space against. */\n filter?: TargetFilter;\n /** The Alt-hover distance readout, configured, or `false` for none. Default\n * on, with the preset's `color`. */\n readout?: false | Omit<DistanceReadoutOptions, 'color'>;\n /** The color of the marks and the readout. */\n color?: string;\n}\n\n/**\n * Spacing hints as one `<SceneCanvas features>` preset: snap sources for\n * equal spacing between siblings and, if asked, alignment to their edges\n * and centers, whose marks the canvas's snap readout draws; and holding Alt\n * over a shape measures its distance from the selection.\n */\nexport function createSpacingHintsPreset(opts: SpacingHintsOptions = {}): FeaturePreset {\n const id = opts.id ?? 'spacingHints';\n const color = opts.color === undefined ? {} : { color: opts.color };\n const own = {\n ...color,\n ...(opts.filter === undefined ? {} : { filter: opts.filter }),\n ...(opts.tolerance === undefined ? {} : { reachPx: opts.tolerance }),\n };\n const snapSources: SnapSource[] = [\n ...((opts.spacing ?? true) ? [spacingSnapSource(own)] : []),\n ...((opts.align ?? false) ? [alignmentSnapSource(own)] : []),\n ];\n const contributions: SurfaceContribution[] = [];\n if (opts.readout !== false) contributions.push(distanceReadout({ ...opts.readout, ...color }));\n return { id, snapSources, contributions };\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"]}
1
+ {"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/pointToGridCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/grid/scopedPitch.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/spacing.ts","../src/guides/alignment/sceneBounds.ts","../src/strategies/onPlane.ts","../src/sources/lines.ts","../src/sources/grid.ts","../src/sources/guides.ts","../src/guides/alignment/match.ts","../src/sources/targets.ts","../src/sources/alignment.ts","../src/sources/spacing.ts","../src/spacingHints/distance.ts","../src/spacingHints/distanceReadout.ts","../src/spacingHints/preset.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":["resolveAxes","useState","useLatest","useCallback","span","EPS","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","nodeGates","lo","hi","mid","cross","at","pack","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","import { resolveAxes, type PlaneUnits, type PlaneValue } from '@weasel-js/core';\n\n/**\n * The integer cell `{col, row}` that contains `point`. Pair with\n * `createCellHighlightLayer` (its `getCell` callback) to draw a snap-target\n * preview that uses the same spacing as `gridSnapSource`.\n */\nexport function pointToGridCell(\n point: { x: number; y: number },\n spacing: PlaneValue,\n unitSystem?: PlaneUnits,\n origin: { x: number; y: number } = { x: 0, y: 0 },\n): { col: number; row: number } {\n const s = resolveAxes(spacing, unitSystem);\n return {\n col: Math.floor((point.x - origin.x) / s.x),\n row: Math.floor((point.y - origin.y) / s.y),\n };\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 './pointToGridCell';\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 viewportWorldRect,\n type Dims,\n type View,\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 /**\n * The area to cover, in world units, read every paint with that paint's\n * view and canvas size. Lines start at its own `x`/`y`. Omitted, the grid\n * covers whatever the canvas shows, with its lines on world multiples of\n * `spacing` so they stay put as the view pans.\n */\n bounds?: (view: View, dims: Dims) => { 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/** Closest, in CSS pixels, a line family is drawn; denser ones are left out. */\nconst MIN_SCREEN_SPACING = 4;\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, dims) => {\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveAxes(opts.spacing, opts.unitSystem);\n const b = opts.bounds\n ? opts.bounds(view, dims)\n : onLattice(viewportWorldRect(view, dims), spacing, accentEvery && accentEvery > 0 ? accentEvery : 1);\n // Written so a non-finite extent, which a zero view scale gives, fails it too.\n if (!(b.width > 0 && b.height > 0 && Number.isFinite(b.width) && Number.isFinite(b.height))) return [];\n\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 // One family of parallel lines `step` apart, leaving out every\n // `skipEvery`th (the ones a coarser family draws), and none at all once\n // they would sit closer than MIN_SCREEN_SPACING on screen.\n const family = (axis: 'x' | 'y', step: number, skipEvery: number, s: CommandStroke): void => {\n if (!(step * Math.abs(view.scale[axis]) >= MIN_SCREEN_SPACING)) return;\n const [from, to] = axis === 'x' ? [x0, x1] : [y0, y1];\n for (let k = 0; from + k * step <= to + 1e-9; k++) {\n if (skipEvery > 0 && k % skipEvery === 0) continue;\n const at = from + k * step;\n if (axis === 'x') pushSegment(at, y0, at, y1, s);\n else pushSegment(x0, at, x1, at, s);\n }\n };\n\n const accentOn = accentEvery !== undefined && accentEvery > 0;\n for (const axis of ['x', 'y'] as const) {\n // Sub-lines first so cell lines paint on top, accents last of all.\n if (subdivisions && subdivisions > 1) family(axis, spacing[axis] / subdivisions, subdivisions, sub);\n }\n for (const axis of ['x', 'y'] as const) family(axis, spacing[axis], accentOn ? accentEvery : 0, line);\n if (accentOn) {\n for (const axis of ['x', 'y'] as const) family(axis, spacing[axis] * accentEvery, 0, accent);\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n\n/**\n * Grow `r` outward to whole periods of the lattice, so the first line drawn\n * sits on a world multiple of the pitch, and of the accent pitch for accents.\n */\nfunction onLattice(\n r: { x: number; y: number; width: number; height: number },\n spacing: { x: number; y: number },\n accentEvery: number,\n): { x: number; y: number; width: number; height: number } {\n const px = spacing.x * accentEvery;\n const py = spacing.y * accentEvery;\n const x = Math.floor(r.x / px) * px;\n const y = Math.floor(r.y / py) * py;\n return {\n x,\n y,\n width: Math.ceil((r.x + r.width) / px) * px - x,\n height: Math.ceil((r.y + r.height) / py) * py - y,\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 { resolveScoped, type PerAxis, type PlaneValue, type UnitScope } from '@weasel-js/core';\n\n/** How a grid reads the unit scopes a scene's containers declare\n * (`ContainerNode.units`). */\nexport interface GridScopes {\n /** The scene's outermost scope, as `sceneUnitScopes` is handed it. The grid's\n * `spacing` is read in its system, in place of `unitSystem`. */\n root: UnitScope;\n /** The pitch inside a container's scope, written in that scope's units.\n * Default: the grid's `spacing`, read there, so a bare 10 is ten of its\n * base units. */\n spacing?: (scope: UnitScope) => PlaneValue;\n}\n\ntype Axial = Exclude<PlaneValue, PerAxis<unknown>>;\n\n/** A length in `chain`'s innermost units, in world units. A pitch is a span,\n * so a unit that disagrees about zero moves it nowhere. */\nfunction span(v: Axial, chain: readonly UnitScope[]): number {\n const zero = typeof v === 'number' ? 0 : { ...v, value: 0 };\n return resolveScoped(v, chain) - resolveScoped(zero, chain);\n}\n\n/**\n * A grid's pitch on each axis, in world units, where `chain` (outermost\n * first, rooted at `scopes.root`) encloses it: `spacing` in the root, and\n * `scopes.spacing` of the innermost scope inside a container's.\n */\nexport function scopedGridPitch(spacing: PlaneValue, scopes: GridScopes, chain: readonly UnitScope[]): PerAxis<number> {\n const inner = chain.length > 1 ? chain[chain.length - 1]! : null;\n const v = inner && scopes.spacing ? scopes.spacing(inner) : spacing;\n const on = (axis: 'x' | 'y'): number => {\n const a = typeof v === 'object' && 'x' in v ? v[axis] : v;\n try {\n return span(a, chain);\n } catch (e) {\n throw new Error(`${axis} axis: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n return { x: on('x'), y: on('y') };\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 `guideSnapSource` 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 `guideSnapSource` (snap source) 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 `guideSnapSource` (snap source) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport { measuredSegmentCommands, tickedSegment, type DrawCommand, type RenderLayer, type CommandStroke } from '@weasel-js/core';\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, such as\n * `matchSpacing`'s. */\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';\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(...measuredSegmentCommands(x0, y0, x1, y1, ticks, gapStroke, format?.(g.max - g.min) ?? null, gapColor));\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 `opts.poseDescriptor`, so a rotated sibling advertises\n * its ink edges rather than its stored box.\n * The moving selection is measured with its stroke (`drawnBoundsOf`), so\n * pass each sibling's `drawnAABBOf` box as its target for the two to agree.\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 { 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 measureGapSpans(targets, axis).map((m) => m.gap);\n}\n\n/** A measured gap, and the stretch of the other axis its two boxes share. */\nexport interface MeasuredGap { gap: SpacingGap; span: [number, number] }\n\n/** `measureGaps`, keeping each gap's shared span: what `referenceGaps`\n * filters. Quadratic in `targets`, so a caller matching every frame keeps\n * the result while the targets stand still. */\nexport function measureGapSpans(targets: readonly Bounds[], axis: Axis): MeasuredGap[] {\n const out: MeasuredGap[] = [];\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\n/** A placement on one axis: the move that gives an equal gap of `size`. */\nexport interface SpacingOffer { delta: number; size: number }\n\n/** Every equal-spacing placement on one axis, unfiltered by reach: each\n * reference gap reproduced beside a neighbor, and centering between the two\n * neighbors. */\nexport function spacingOffers(\n b: Bounds,\n axis: Axis,\n edge: SpacingEdge,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n): SpacingOffer[] {\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 const out: SpacingOffer[] = [];\n const offer = (delta: number, gap: number): void => {\n if (gap > EPS) out.push({ 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 out;\n}\n\n/** The nearest equal-spacing placement on one axis within `tol`, 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): SpacingOffer | null {\n let best: SpacingOffer | null = null;\n for (const o of spacingOffers(b, axis, edge, targets, refs)) {\n if (Math.abs(o.delta) > tol) continue;\n if (best === null || Math.abs(o.delta) < Math.abs(best.delta)) best = o;\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. */\nexport function equalGaps(\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 // Only a box overlapping the gap-wide margins beside b can bound or block\n // one of b's own gaps, so the quadratic measure runs on those alone.\n const near = targets.filter((t) => hi(t, axis) > lo(b, axis) - size - EPS && lo(t, axis) < hi(b, axis) + size + EPS);\n const own = measureGaps([...near, 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/** The measured gaps a box at `bounds` can reproduce: all but those it\n * stands inside. */\nexport function referenceGaps(bounds: Bounds, measured: readonly MeasuredGap[]): SpacingGap[] {\n return measured.filter((m) => !hitsStrip(m.gap, bounds, m.span)).map((m) => m.gap);\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 refsX = referenceGaps(bounds, measureGapSpans(targets, 'x'));\n const refsY = referenceGaps(bounds, measureGapSpans(targets, '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 ? [] : equalGaps(final, 'x', x.size, targets, refsX),\n gapsY: y === null ? [] : equalGaps(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 {\n AUTO_POSE_DESCRIPTOR,\n type Bounds,\n type NodeId,\n nodeGates,\n type PoseDescriptor,\n type Scene,\n scenePoseFrame,\n unionAABB,\n visualBoundsViaDescriptor,\n} from '@weasel-js/core';\n\n\n/** Options shared by the scene readers below. */\nexport interface SceneBoundsOptions {\n /** How to read a pose's box. Pass the canvas's, so these agree with what it\n * draws. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<unknown>;\n}\n\n/** The world box each id is drawn in, rotation included, skipping ids the\n * scene no longer holds. Read through the scene's composition. */\nexport function worldBoundsOf(\n scene: Scene<unknown, string, unknown>,\n ids: Iterable<NodeId>,\n opts: SceneBoundsOptions = {},\n): Bounds[] {\n const d = opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR;\n const frame = scenePoseFrame(scene);\n const out: Bounds[] = [];\n for (const id of ids) {\n if (scene.get(id) === undefined) continue;\n out.push(visualBoundsViaDescriptor(frame.world(id), d));\n }\n return out;\n}\n\n/** The union of `ids`' world boxes, or null when none is in the scene. */\nexport function worldUnionOf(\n scene: Scene<unknown, string, unknown>,\n ids: Iterable<NodeId>,\n opts: SceneBoundsOptions = {},\n): Bounds | null {\n const boxes = worldBoundsOf(scene, ids, opts);\n return boxes.length === 0 ? null : unionAABB(boxes);\n}\n\n/** Every node sharing a parent with one of `ids`, outside the set, and not\n * hidden (`nodeGates`). */\nexport function siblingIds(scene: Scene<unknown, string, unknown>, ids: readonly NodeId[]): NodeId[] {\n const moving = new Set(ids);\n const gates = nodeGates(scene);\n const parents = new Set<NodeId | null>();\n for (const id of ids) {\n const node = scene.get(id);\n if (node !== undefined) parents.add(node.parent);\n }\n const siblings: NodeId[] = [];\n for (const parent of parents) {\n for (const id of parent === null ? scene.roots : scene.childrenOf(parent)) {\n const node = scene.get(id);\n if (moving.has(id) || node === undefined || gates.hidden(id)) continue;\n siblings.push(id);\n }\n }\n return siblings;\n}\n\n/**\n * The world boxes of `ids`' siblings ({@link siblingIds}). What an\n * equal-spacing snap measures gaps between while `ids` move.\n */\nexport function siblingBounds(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n opts: SceneBoundsOptions = {},\n): Bounds[] {\n return worldBoundsOf(scene, siblingIds(scene, ids), opts);\n}\n","import type { GestureContext } from '@weasel-js/core';\nimport type { Guide } from '../guides/types';\n\n/** A gesture's `plane`: how the camera's world maps into the world its poses are in. */\ntype Plane = GestureContext<unknown>['plane'];\ntype Axis = 'x' | 'y';\n\n/** Where a guide the camera draws lies along its own axis in the world a gesture's poses are in. */\nexport function guideOffsetOn(g: Guide, plane: Plane): number {\n return plane ? g.offset * plane.scale[g.axis] + plane.offset[g.axis] : g.offset;\n}\n\n/** `value` on `axis` moved to the nearest line of the camera's grid, in the world a gesture's poses are in. */\nexport function roundToGridOn(value: number, axis: Axis, spacing: number, plane: Plane): number {\n if (!plane) return Math.round(value / spacing) * spacing;\n const camera = (value - plane.offset[axis]) / plane.scale[axis];\n return Math.round(camera / spacing) * spacing * plane.scale[axis] + plane.offset[axis];\n}\n","import type { Locus, SnapCollect } from '@weasel-js/core';\n\ntype Point = { x: number; y: number };\ntype Axis = 'x' | 'y';\n\n/** The line `axis = offset` as a locus, through `near` on the other axis. */\nexport function axisLine(axis: Axis, offset: number, near: Point): Locus {\n return axis === 'x'\n ? { at: { x: offset, y: near.y }, dirs: [{ x: 0, y: 1 }] }\n : { at: { x: near.x, y: offset }, dirs: [{ x: 1, y: 0 }] };\n}\n\n/** How far the resolved move `delta` carries a probe from where `q` saw it. */\nexport function landedShift(q: Pick<SnapCollect, 'delta0'>, delta: Point): Point {\n return { x: delta.x - q.delta0.x, y: delta.y - q.delta0.y };\n}\n","import {\n asNodeId, resolveAxes, sceneSharedUnitScopes, sceneUnitScopes,\n type PerAxis, type PlaneMap, type PlaneUnits, type PlaneValue, type SnapCollect, type SnapSource,\n} from '@weasel-js/core';\nimport { scopedGridPitch, type GridScopes } from '../grid/scopedPitch';\nimport { roundToGridOn } from '../strategies/onPlane';\nimport { axisLine } from './lines';\n\ntype Point = { x: number; y: number };\n\n/** Options for `gridSnapSource`. */\nexport interface GridSnapSourceOptions {\n /** The grid's pitch, or one per axis, in `unitSystem`'s units. */\n spacing: PlaneValue;\n /** A point the lattice passes through. Default `(0, 0)`. */\n origin?: Point;\n unitSystem?: PlaneUnits;\n /** Read the unit scope the subject sits in: a node inside a millimeter\n * sub-assembly snaps on that scope's pitch. The subject's scope is the one\n * all its nodes share; for a gesture with none, the scope of the\n * container it draws into (`SnapCollect.parent`), else the root. */\n scopes?: GridScopes;\n}\n\n/**\n * A grid as snap targets: for each origin or pointer probe, the grid line on\n * either side of it on each axis. Its reach is unlimited and it is a\n * fallback, so it holds every axis no target claims and never displaces one.\n * Its lines are the camera's, carried into the plane a gesture runs in.\n */\nexport function gridSnapSource(opts: GridSnapSourceOptions): SnapSource {\n const { scopes } = opts;\n const rootPitch = scopes ? scopedGridPitch(opts.spacing, scopes, [scopes.root]) : resolveAxes(opts.spacing, opts.unitSystem);\n const pitchFor = (q: SnapCollect): PerAxis<number> => {\n if (!scopes || !q.scene) return rootPitch;\n if (q.ids?.length) return scopedGridPitch(opts.spacing, scopes, sceneSharedUnitScopes(q.scene, q.ids.map(asNodeId), scopes.root));\n if (q.parent === undefined) return rootPitch;\n return scopedGridPitch(opts.spacing, scopes, sceneUnitScopes(q.scene, asNodeId(q.parent), scopes.root, { inclusive: true }));\n };\n const o = opts.origin ?? { x: 0, y: 0 };\n const lines = (v: number, axis: 'x' | 'y', pitch: PerAxis<number>, plane: PlaneMap | null): [number, number] => {\n const s = plane ? plane.scale[axis] : 1;\n const near = roundToGridOn(v - o[axis] * s, axis, pitch[axis], plane) + o[axis] * s;\n const step = pitch[axis] * s;\n return [near, near + (v >= near ? step : -step)];\n };\n return {\n id: 'grid',\n tier: 'fallback',\n reachPx: Infinity,\n roles: ['origin', 'pointer'],\n *collect(q) {\n const pitch = pitchFor(q);\n for (const p of q.probes) {\n for (const axis of ['x', 'y'] as const) {\n for (const at of lines(p.at[axis], axis, pitch, q.plane ?? null)) yield { probe: p.id, locus: axisLine(axis, at, p.at) };\n }\n }\n },\n };\n}\n","import type { SnapSource } from '@weasel-js/core';\nimport type { Guide } from '../guides/types';\nimport { guideOffsetOn } from '../strategies/onPlane';\nimport { axisLine } from './lines';\n\n/**\n * Ruler guides as snap targets: each guide within reach of an origin or\n * pointer probe is a line it may land on. Reads `getGuides` every frame, so\n * a guide added mid-drag counts at once.\n */\nexport function guideSnapSource(getGuides: () => readonly Guide[]): SnapSource {\n return {\n id: 'guides',\n roles: ['origin', 'pointer'],\n *collect(q) {\n const guides = getGuides();\n if (guides.length === 0) return;\n const reach = q.reachWorld(q.reachPx);\n for (const p of q.probes) {\n for (const g of guides) {\n const offset = guideOffsetOn(g, q.plane ?? null);\n if (Math.abs(p.at[g.axis] - offset) > reach) continue;\n yield { probe: p.id, locus: axisLine(g.axis, offset, p.at) };\n }\n }\n },\n };\n}\n","import type { Guide } from '../types';\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 { nodeGates, type Bounds, type NodeId, type Scene, type SceneNode, type SnapCollect } from '@weasel-js/core';\nimport { siblingIds } from '../guides/alignment/sceneBounds';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\nfunction visibleRoots(scene: AnyScene): readonly NodeId[] {\n const gates = nodeGates(scene);\n return scene.roots.filter((id) => !gates.hidden(id));\n}\n\n/** Which nodes may be targets; one that fails offers no lines or gaps. */\nexport type TargetFilter = (node: SceneNode<unknown, string, unknown>) => boolean;\n\n/** The nodes a gesture's subject lines up with: its siblings when it has\n * ids, the scene's visible top-level nodes for a point gesture. */\nfunction targetIds(scene: AnyScene, exclude: readonly string[], filter?: TargetFilter): readonly NodeId[] {\n const ids = exclude.length > 0\n ? siblingIds(scene, exclude as readonly NodeId[])\n : visibleRoots(scene);\n if (!filter) return ids;\n return ids.filter((id) => {\n const node = scene.get(id);\n return node !== undefined && filter(node);\n });\n}\n\n/** The target nodes' boxes, measured as the session measures its subject;\n * none from a host that measures no boxes. */\nexport function targetBoxes(q: SnapCollect, scene: AnyScene, filter?: TargetFilter): Bounds[] {\n const drawn = q.drawnBox;\n return drawn ? targetIds(scene, q.exclude, filter).flatMap((id) => drawn(id) ?? []) : [];\n}\n\n/**\n * `derive` over the query's target boxes, kept while the scene's version and\n * the excluded ids stand still: a drag asks every frame, and nothing it\n * reads changes until it commits.\n */\nexport function cachedPerScene<T>(\n derive: (boxes: readonly Bounds[]) => T, filter?: TargetFilter,\n): (q: SnapCollect) => T | null {\n let key: { scene: AnyScene; version: number; exclude: string } | null = null;\n let value: T | null = null;\n return (q) => {\n const scene = q.scene;\n if (!scene) return null;\n const version = scene.getVersion();\n const exclude = q.exclude.join('\\n');\n if (key === null || key.scene !== scene || key.version !== version || key.exclude !== exclude) {\n value = derive(targetBoxes(q, scene, filter));\n key = { scene, version, exclude };\n }\n return value;\n };\n}\n","import type { Bounds, SnapCollect, SnapEdges, SnapMark, SnapProbeAt, SnapSource } from '@weasel-js/core';\nimport { applyEdges } from '../guides/alignment/spacing';\nimport { deriveAlignmentGuides } from '../guides/alignment/derive';\nimport { stretchSpan } from '../guides/alignment/match';\nimport type { Guide } from '../guides/types';\nimport { axisLine, landedShift } from './lines';\nimport { cachedPerScene, type TargetFilter } from './targets';\n\ntype Point = { x: number; y: number };\ntype Axis = 'x' | 'y';\n\n/** Options for `alignmentSnapSource`. */\nexport interface AlignmentSnapSourceOptions {\n /** A page box whose edges and center are lines too, in the camera's world. */\n page?: Bounds | (() => Bounds | null | undefined);\n /** The lines to align to, in place of the edges and centers of the\n * subject's siblings (of the scene's top-level nodes, for a point gesture). */\n getCandidates?: () => readonly Guide[];\n /** Which nodes offer lines. Narrows the default siblings; not `getCandidates`. */\n filter?: TargetFilter;\n /** The color of the lines it marks. Default: the readout layer's. */\n color?: string;\n /** Overrides the canvas's reach for these targets, in screen px. */\n reachPx?: number;\n}\n\n/** Each axis's lines, sorted by offset, so a probe finds the ones in reach\n * without walking the rest. */\ninterface LineIndex { x: readonly Guide[]; y: readonly Guide[] }\n\nfunction indexLines(lines: readonly Guide[]): LineIndex {\n const sorted = [...lines].sort((a, b) => a.offset - b.offset);\n return { x: sorted.filter((g) => g.axis === 'x'), y: sorted.filter((g) => g.axis === 'y') };\n}\n\nfunction* inReach(lines: readonly Guide[], v: number, reach: number): Generator<Guide> {\n let lo = 0;\n let hi = lines.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (lines[mid].offset < v - reach) lo = mid + 1;\n else hi = mid;\n }\n for (let i = lo; i < lines.length && lines[i].offset <= v + reach; i++) yield lines[i];\n}\n\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The line `g` drawn from the box (or point) a probe landed in to the\n * farthest sibling that shares it. */\nfunction lineMark(g: Guide, extent: [number, number], color: string | undefined): SnapMark {\n const span = stretchSpan(g, extent[0], extent[1])?.span ?? { min: extent[0], max: extent[1] };\n const ends = g.axis === 'x'\n ? { from: { x: g.offset, y: span.min }, to: { x: g.offset, y: span.max } }\n : { from: { x: span.min, y: g.offset }, to: { x: span.max, y: g.offset } };\n return { kind: 'line', ...ends, ...(color === undefined ? {} : { color }) };\n}\n\n/**\n * The edges and centers of the subject's siblings, and optionally a page, as\n * snap targets: each is a line a box or pointer probe may land on. A move's\n * left, center and right (top, center, bottom) all try every line, as Figma's\n * smart guides do. When the result meets a line, its mark runs from the\n * subject's box to the farthest sibling on that line.\n */\nexport function alignmentSnapSource(opts: AlignmentSnapSourceOptions = {}): SnapSource {\n const page = () => (typeof opts.page === 'function' ? opts.page() : opts.page) ?? undefined;\n const fromScene = cachedPerScene((boxes) => indexLines(deriveAlignmentGuides(boxes)), opts.filter);\n const linesFor = (q: SnapCollect): LineIndex[] => {\n const pageBox = page();\n const own = opts.getCandidates ? indexLines(opts.getCandidates()) : fromScene(q);\n return [...(own ? [own] : []), ...(pageBox ? [indexLines(deriveAlignmentGuides([], { page: pageBox }))] : [])];\n };\n return {\n id: 'alignment',\n ...(opts.reachPx === undefined ? {} : { reachPx: opts.reachPx }),\n roles: ['box', 'pointer'],\n *collect(q) {\n const indexes = linesFor(q);\n if (indexes.length === 0) return;\n const reach = q.reachWorld(q.reachPx);\n const box = q.box ?? null;\n // A resize offers its dragged corner as pointer and as box; the box's\n // probes are the ones whose marks span it.\n const probes = q.probes.some((p) => p.role === 'box') ? q.probes.filter((p) => p.role === 'box') : q.probes;\n for (const p of probes) {\n for (const axis of ['x', 'y'] as const) {\n for (const index of indexes) {\n for (const g of inReach(index[axis], p.at[axis], reach)) {\n yield {\n probe: p.id,\n locus: axisLine(axis, g.offset, p.at),\n mark: (delta: Point) => lineMark(g, extentAcross(p, box, axis, landedShift(q, delta), q.edges), opts.color),\n };\n }\n }\n }\n }\n },\n };\n}\n\n/** Where the landed probe's box (its own point, for a pointer) spans the axis\n * across `axis`. */\nfunction extentAcross(\n p: SnapProbeAt, box: Bounds | null, axis: Axis, shift: Point, edges: SnapEdges = { x: 'both', y: 'both' },\n): [number, number] {\n const c = cross(axis);\n if (p.role !== 'box' || box === null) return [p.at[c] + shift[c], p.at[c] + shift[c]];\n const landed = applyEdges(box, shift.x, shift.y, edges);\n const lo = c === 'x' ? landed.x : landed.y;\n return [lo, lo + (c === 'x' ? landed.width : landed.height)];\n}\n","import type { Bounds, SnapEdges, SnapMark, SnapSource } from '@weasel-js/core';\nimport {\n applyEdges, equalGaps, measureGapSpans, referenceGaps, spacingOffers, type MeasuredGap,\n} from '../guides/alignment/spacing';\nimport type { SpacingGap } from '../guides/types';\nimport { axisLine, landedShift } from './lines';\nimport { cachedPerScene, type TargetFilter } from './targets';\n\ntype Point = { x: number; y: number };\n\n/** Options for `spacingSnapSource`. */\nexport interface SpacingSnapSourceOptions {\n /** The boxes to measure gaps between, in place of the subject's siblings. */\n getTargets?: () => readonly Bounds[];\n /** Which nodes offer gaps. Narrows the default siblings; not `getTargets`. */\n filter?: TargetFilter;\n /** The color of the gaps it marks. Default: the readout layer's. */\n color?: string;\n /** Overrides the canvas's reach for these targets, in screen px. */\n reachPx?: number;\n}\n\ninterface Measured { boxes: readonly Bounds[]; x: readonly MeasuredGap[]; y: readonly MeasuredGap[] }\n\nconst measureAll = (boxes: readonly Bounds[]): Measured =>\n ({ boxes, x: measureGapSpans(boxes, 'x'), y: measureGapSpans(boxes, 'y') });\n\nfunction gapMark(g: SpacingGap, color: string | undefined): SnapMark {\n const ends = g.axis === 'x'\n ? { from: { x: g.min, y: g.at }, to: { x: g.max, y: g.at } }\n : { from: { x: g.at, y: g.min }, to: { x: g.at, y: g.max } };\n return { kind: 'gap', ...ends, value: g.max - g.min, ...(color === undefined ? {} : { color }) };\n}\n\n/**\n * Equal spacing as snap targets, Figma's: on each axis, the positions of the\n * subject's box that make its gap to a neighbor equal one already between\n * two siblings, or center it between its two neighbors. A resize moves only\n * the edges it drags. When the result meets one, it marks every gap of that\n * size, the box's own included.\n */\nexport function spacingSnapSource(opts: SpacingSnapSourceOptions = {}): SnapSource {\n const fromScene = cachedPerScene(measureAll, opts.filter);\n return {\n id: 'spacing',\n ...(opts.reachPx === undefined ? {} : { reachPx: opts.reachPx }),\n roles: ['box'],\n gestures: ['move', 'resize'],\n *collect(q) {\n const box = q.box;\n const probe = q.probes.find((p) => p.role === 'box');\n const measured = opts.getTargets ? measureAll(opts.getTargets()) : fromScene(q);\n if (!box || !probe || !measured) return;\n const reach = q.reachWorld(q.reachPx);\n const edges: SnapEdges = q.edges ?? { x: 'both', y: 'both' };\n for (const axis of ['x', 'y'] as const) {\n const edge = edges[axis];\n if (edge === null) continue;\n const refs = referenceGaps(box, measured[axis]);\n const seen = new Set<string>();\n for (const o of spacingOffers(box, axis, edge, measured.boxes, refs)) {\n const key = `${o.delta.toFixed(6)}:${o.size.toFixed(6)}`;\n if (Math.abs(o.delta) > reach || seen.has(key)) continue;\n seen.add(key);\n yield {\n probe: probe.id,\n locus: axisLine(axis, probe.at[axis] + o.delta, probe.at),\n mark: (delta: Point) => {\n const shift = landedShift(q, delta);\n const landed = applyEdges(box, shift.x, shift.y, edges);\n return equalGaps(landed, axis, o.size, measured.boxes, refs).map((g) => gapMark(g, opts.color));\n },\n };\n }\n }\n },\n };\n}\n","import type { Bounds } from '@weasel-js/core';\nimport type { Guide, SpacingGap } from '../guides/types';\n\ntype Axis = 'x' | 'y';\n\nconst EPS = 1e-6;\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 mid = (b: Bounds, a: Axis): number => (lo(b, a) + hi(b, a)) / 2;\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The distances `measureDistances` found, ready for `createGuidesLayer`:\n * `gaps` as its `getGaps`, `leaders` as its `getGuides`. */\nexport interface DistanceReadout {\n /** One measured distance per gap, labeled with its length when drawn. */\n gaps: SpacingGap[];\n /** Where a gap runs past the target, the line from the gap's end along the\n * target's edge to the target, so the number reads as reaching it. */\n leaders: Guide[];\n}\n\n/**\n * The distances between two boxes, on each axis where they separate: for\n * `from` left of `to`, the gap from `from`'s right edge to `to`'s left. A gap\n * is drawn through the range the boxes share on the other axis, or through\n * `from`'s center when they share none, with a leader to `to`. When one box\n * holds the other on an axis and they overlap on the other, the inner box's\n * distances to the outer's two edges on that axis instead. An axis where the\n * boxes partly overlap, or meet flush, has no distance.\n */\nexport function measureDistances(from: Bounds, to: Bounds): DistanceReadout {\n const out: DistanceReadout = { gaps: [], leaders: [] };\n for (const axis of ['x', 'y'] as const) measureAxis(from, to, axis, out);\n return out;\n}\n\nfunction measureAxis(from: Bounds, to: Bounds, axis: Axis, out: DistanceReadout): void {\n const c = cross(axis);\n const sharedMin = Math.max(lo(from, c), lo(to, c));\n const sharedMax = Math.min(hi(from, c), hi(to, c));\n const shares = sharedMax - sharedMin > EPS;\n const push = (min: number, max: number, at: number): void => {\n if (max - min > EPS) out.gaps.push({ axis, min, max, at });\n };\n\n const before = hi(from, axis) <= lo(to, axis) + EPS;\n const after = hi(to, axis) <= lo(from, axis) + EPS;\n if (before || after) {\n const [min, max] = before ? [hi(from, axis), lo(to, axis)] : [hi(to, axis), lo(from, axis)];\n if (max - min <= EPS) return;\n const at = shares ? (sharedMin + sharedMax) / 2 : mid(from, c);\n push(min, max, at);\n if (!shares) {\n const edge = before ? lo(to, axis) : hi(to, axis);\n const span = at < lo(to, c) ? { min: at, max: lo(to, c) } : { min: hi(to, c), max: at };\n out.leaders.push({ id: `distance:${axis}`, axis, offset: edge, span });\n }\n return;\n }\n if (!shares) return;\n const [inner, outer] = lo(from, axis) >= lo(to, axis) - EPS && hi(from, axis) <= hi(to, axis) + EPS\n ? [from, to]\n : lo(to, axis) >= lo(from, axis) - EPS && hi(to, axis) <= hi(from, axis) + EPS\n ? [to, from]\n : [null, null];\n if (inner === null || outer === null) return;\n const at = mid(inner, c);\n push(lo(outer, axis), lo(inner, axis), at);\n push(hi(inner, axis), hi(outer, axis), at);\n}\n","import type { Action, GestureBinding, ModSpec, NodeId, Scene, SnapMark, SnapOutcomeStore, SurfaceContribution } from '@weasel-js/core';\nimport { measureDistances, type DistanceReadout } from './distance';\nimport { worldBoundsOf, worldUnionOf } from '../guides/alignment/sceneBounds';\n\n\n/** Options for `distanceReadout`. */\nexport interface DistanceReadoutOptions {\n /** The key held to show the readout. Default `'alt'`. */\n modifier?: 'alt' | 'ctrl' | 'meta' | 'shift';\n /** The color of the marks it writes. Default: the readout layer's. */\n color?: string;\n /** Contribution id, and the prefix of its action's. Default `'distanceReadout'`. */\n id?: string;\n}\n\n/** The readout as snap marks: a `distance` per gap, a `line` per leader. */\nfunction marksOf(r: DistanceReadout, color: string | undefined): SnapMark[] {\n const c = color === undefined ? {} : { color };\n return [\n ...r.gaps.map((g): SnapMark => g.axis === 'x'\n ? { kind: 'distance', from: { x: g.min, y: g.at }, to: { x: g.max, y: g.at }, value: g.max - g.min, ...c }\n : { kind: 'distance', from: { x: g.at, y: g.min }, to: { x: g.at, y: g.max }, value: g.max - g.min, ...c }),\n ...r.leaders.flatMap((l): SnapMark[] => {\n if (l.span === undefined) return [];\n return [l.axis === 'x'\n ? { kind: 'line', from: { x: l.offset, y: l.span.min }, to: { x: l.offset, y: l.span.max }, ...c }\n : { kind: 'line', from: { x: l.span.min, y: l.offset }, to: { x: l.span.max, y: l.offset }, ...c }];\n }),\n ];\n}\n\n/** What `distanceReadout` returns: a surface contribution, plus a read of\n * what it is showing. */\nexport interface DistanceReadoutContribution extends SurfaceContribution {\n /** The distances on screen now; empty while hidden. */\n read(): DistanceReadout;\n}\n\nconst EMPTY: DistanceReadout = { gaps: [], leaders: [] };\nconst MODIFIERS: readonly NonNullable<DistanceReadoutOptions['modifier']>[] = ['alt', 'ctrl', 'meta', 'shift'];\n\n/** The ids and every node under them: what the pick under the pointer skips. */\nfunction subtreeOf(scene: Scene<unknown, string, unknown>, ids: readonly NodeId[]): Set<NodeId> {\n const out = new Set<NodeId>();\n const stack = [...ids];\n while (stack.length > 0) {\n const id = stack.pop()!;\n if (out.has(id)) continue;\n out.add(id);\n stack.push(...scene.childrenOf(id));\n }\n return out;\n}\n\n/**\n * Distance readouts on hover: while `modifier` is held over a shape, the\n * distances from the selection's box to that shape's, on each axis where they\n * separate, measured by `measureDistances` and drawn as labeled gaps. Pass it\n * in `<SceneCanvas ambient>`. It runs on `hover` bindings, so it claims no\n * input, and it reads the canvas's `selection`, `scene`, `nodeAtPoint`,\n * `poseDescriptor`, and `snapReadout` deps. A press hides it.\n */\nexport function distanceReadout(opts: DistanceReadoutOptions = {}): DistanceReadoutContribution {\n const id = opts.id ?? 'distanceReadout';\n const modifier = opts.modifier ?? 'alt';\n let shown: DistanceReadout = EMPTY;\n let store: SnapOutcomeStore | null = null;\n const show = (next: DistanceReadout): void => {\n if (next === shown || (next.gaps.length === 0 && shown.gaps.length === 0)) return;\n shown = next;\n store?.set(marksOf(next, opts.color));\n };\n\n const action: Action = {\n id: `${id}.measure`,\n label: 'Measure distance to the shape under the pointer',\n requires: ['selection', 'scene', 'nodeAtPoint', 'poseDescriptor', 'snapReadout'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { show?: boolean; worldX?: number; worldY?: number } | undefined;\n const { selection, scene, nodeAtPoint, poseDescriptor, snapReadout } = deps;\n if (snapReadout !== undefined) store = snapReadout.store;\n const ids = selection?.get() ?? [];\n if (p?.show !== true || p.worldX === undefined || p.worldY === undefined\n || scene === undefined || nodeAtPoint === undefined || ids.length === 0) {\n show(EMPTY);\n return;\n }\n const hit = nodeAtPoint({ x: p.worldX, y: p.worldY }, subtreeOf(scene, ids));\n const from = worldUnionOf(scene, ids, { poseDescriptor });\n const [to] = hit === null ? [] : worldBoundsOf(scene, [hit], { poseDescriptor });\n show(from === null || to === undefined ? EMPTY : measureDistances(from, to));\n },\n },\n };\n\n const mods = (held: boolean): ModSpec => Object.fromEntries(\n MODIFIERS.map((m) => [m, m === modifier ? held : 'optional']),\n );\n const bindings: GestureBinding[] = [\n { spec: { kind: 'hover', mods: mods(true) }, actionId: action.id, opts: { id: `${id}.show`, params: { show: true } } },\n { spec: { kind: 'hover', mods: mods(false) }, actionId: action.id, opts: { id: `${id}.hide`, params: { show: false } } },\n { spec: { kind: 'hover', motion: 'leave' }, actionId: action.id, opts: { id: `${id}.leave`, params: { show: false } } },\n ];\n\n return {\n id,\n eligibility: { always: true },\n actions: [action],\n bindings,\n attach: (api) => {\n const el = api.element;\n const hide = (): void => show(EMPTY);\n el?.addEventListener('pointerdown', hide, true);\n return () => {\n el?.removeEventListener('pointerdown', hide, true);\n show(EMPTY);\n store = null;\n };\n },\n read: () => shown,\n };\n}\n","import type { FeaturePreset, SnapSource, SurfaceContribution } from '@weasel-js/core';\nimport type { TargetFilter } from '../sources/targets';\nimport { alignmentSnapSource } from '../sources/alignment';\nimport { spacingSnapSource } from '../sources/spacing';\nimport { distanceReadout, type DistanceReadoutOptions } from './distanceReadout';\n\n/** Options for `createSpacingHintsPreset`. */\nexport interface SpacingHintsOptions {\n /** Preset id. Default `'spacingHints'`. */\n id?: string;\n /** Snap a move so its gap to a neighbor equals one already between its\n * siblings, and mark the equal gaps. Default true. */\n spacing?: boolean;\n /** Snap to the siblings' edges and centers too, and mark the line met.\n * Default false. */\n align?: boolean;\n /** Snap distance in screen px. Default the canvas's reach. */\n tolerance?: number;\n /** Which nodes the snap sources take as siblings to line up or space against. */\n filter?: TargetFilter;\n /** The Alt-hover distance readout, configured, or `false` for none. Default\n * on, with the preset's `color`. */\n readout?: false | Omit<DistanceReadoutOptions, 'color'>;\n /** The color of the marks and the readout. */\n color?: string;\n}\n\n/**\n * Spacing hints as one `<SceneCanvas features>` preset: snap sources for\n * equal spacing between siblings and, if asked, alignment to their edges\n * and centers, whose marks the canvas's snap readout draws; and holding Alt\n * over a shape measures its distance from the selection.\n */\nexport function createSpacingHintsPreset(opts: SpacingHintsOptions = {}): FeaturePreset {\n const id = opts.id ?? 'spacingHints';\n const color = opts.color === undefined ? {} : { color: opts.color };\n const own = {\n ...color,\n ...(opts.filter === undefined ? {} : { filter: opts.filter }),\n ...(opts.tolerance === undefined ? {} : { reachPx: opts.tolerance }),\n };\n const snapSources: SnapSource[] = [\n ...((opts.spacing ?? true) ? [spacingSnapSource(own)] : []),\n ...((opts.align ?? false) ? [alignmentSnapSource(own)] : []),\n ];\n const contributions: SurfaceContribution[] = [];\n if (opts.readout !== false) contributions.push(distanceReadout({ ...opts.readout, ...color }));\n return { id, snapSources, contributions };\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/guides",
3
- "version": "1.11.1",
3
+ "version": "1.12.0",
4
4
  "description": "Placement aids for weasel: grids, ruler guides, snap sources for them and for sibling alignment and spacing, and container layout strategies.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,8 +17,8 @@
17
17
  },
18
18
  "peerDependencies": {
19
19
  "react": ">=18",
20
- "@weasel-js/core": "1.11.1",
21
- "@weasel-js/geom": "1.11.1"
20
+ "@weasel-js/core": "1.12.0",
21
+ "@weasel-js/geom": "1.12.0"
22
22
  },
23
23
  "author": "orochi235",
24
24
  "homepage": "https://orochi235.github.io/weasel/",