@weasel-js/guides 1.7.0 → 1.7.1
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.d.ts +108 -18
- package/dist/index.js +391 -132
- package/dist/index.js.map +1 -1
- package/dist/insert.d.ts +1 -1
- package/dist/move.d.ts +1 -1
- package/dist/resize.d.ts +1 -1
- package/dist/types-DRSPiXfk.d.ts +38 -0
- package/package.json +3 -3
- package/dist/types-D2tTKEU0.d.ts +0 -18
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/match.ts","../src/guides/alignment/behaviors.ts","../src/layout/snaps.ts","../src/layout/strategies/freeform.ts","../src/layout/strategies/tileGrid.ts","../src/layout/strategies/snapPoint.ts"],"names":["resolveUnit","useState","useLatest","useCallback","PATH_M","PATH_L","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","createTransformOp"],"mappings":"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","file":"index.js","sourcesContent":["/** Round `value` to the nearest multiple of `cellSize`. Returns 0 when the result would be -0. */\nexport function roundToCell(value: number, cellSize: number): number {\n return Math.round(value / cellSize) * cellSize || 0;\n}\n","/**\n * Pointer-tracking glue that turns hover position into a grid cell, suitable\n * for dropping straight into `createCellHighlightLayer({ getCell })`. Pairs\n * with `gridSnapStrategy` / `createGridLayer` so the visual hover preview\n * uses the exact same spacing as the snap behavior.\n *\n * Wires three things you'd otherwise glue by hand:\n * 1. pointermove on a target element → client coords\n * 2. client coords → world coords via your `ViewTransform`\n * 3. world coords → integer `{col, row}` via `pointToGridCell`\n *\n * State updates only fire when the cell actually changes (not on every\n * pointer tick). Pass `onChange` to trigger a canvas redraw on each transition.\n */\n\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n useLatest,\n screenToWorld,\n type ViewTransform,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\nimport { pointToGridCell } from '../strategies/grid';\n\n/** Options for `useGridCellHover`. */\nexport interface UseGridCellHoverOptions {\n /** Element to attach pointer listeners to (typically the canvas). */\n ref: RefObject<HTMLElement | null>;\n /** Read the current view transform. Called on every pointermove so it can\n * reflect live pan/zoom without a re-binding step. */\n view: () => ViewTransform;\n /** Cell spacing in world units. Same value you pass to `createGridLayer`\n * and `createCellHighlightLayer`. */\n spacing: UnitValue;\n /** Required if `spacing` is tagged (e.g. `{ value: 1, unit: 'ft' }`). */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Default `(0, 0)`. */\n origin?: { x: number; y: number };\n /** Fires when the hovered cell changes (including to/from `null`). Use it\n * to invalidate your layer renderer. */\n onChange?: (cell: { col: number; row: number } | null) => void;\n /** Disable the listeners without unmounting. Default `true`. */\n enabled?: boolean;\n}\n\n/** Return shape of `useGridCellHover`. */\nexport interface UseGridCellHoverReturn {\n /** Current hovered cell, or `null` when the pointer is outside the element. */\n cell: { col: number; row: number } | null;\n /** Stable callback that returns the current cell — drop straight into\n * `createCellHighlightLayer({ getCell })`. */\n getCell: () => { col: number; row: number } | null;\n}\n\nfunction cellsEqual(\n a: { col: number; row: number } | null,\n b: { col: number; row: number } | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return a.col === b.col && a.row === b.row;\n}\n\n/** Track which grid cell the pointer is over; pairs with `createCellHighlightLayer`. */\nexport function useGridCellHover(opts: UseGridCellHoverOptions): UseGridCellHoverReturn {\n const [cell, setCell] = useState<{ col: number; row: number } | null>(null);\n const cellRef = useRef<{ col: number; row: number } | null>(null);\n const optsRef = useLatest(opts);\n\n const getCell = useCallback(() => cellRef.current, []);\n\n const enabled = opts.enabled ?? true;\n useEffect(() => {\n if (!enabled) return;\n const el = opts.ref.current;\n if (!el) return;\n\n const update = (next: { col: number; row: number } | null) => {\n if (cellsEqual(cellRef.current, next)) return;\n cellRef.current = next;\n setCell(next);\n optsRef.current.onChange?.(next);\n };\n\n const onMove = (e: PointerEvent) => {\n const o = optsRef.current;\n const rect = el.getBoundingClientRect();\n const sx = e.clientX - rect.left;\n const sy = e.clientY - rect.top;\n const [wx, wy] = screenToWorld(sx, sy, o.view());\n update(pointToGridCell({ x: wx, y: wy }, o.spacing, o.unitSystem, o.origin));\n };\n const onLeave = () => update(null);\n\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerleave', onLeave);\n el.addEventListener('pointercancel', onLeave);\n return () => {\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerleave', onLeave);\n el.removeEventListener('pointercancel', onLeave);\n };\n }, [enabled, opts.ref, optsRef]);\n\n return { cell, getCell };\n}\n","/**\n * Grid overlay — a reusable render layer that draws a world-space grid with\n * optional finer subdivisions and accent lines every N cells.\n *\n * The layer renders in world space — the caller is expected to have applied\n * any view transform to the canvas context already. To draw a highlighted\n * cell (snap-target preview), stack `createCellHighlightLayer` alongside\n * this one.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type Stroke,\n resolveStrokeWidth,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n pxExtent,\n} from '@weasel-js/core';\nimport { PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\n\n/** Options for `createGridLayer`. */\nexport interface GridLayerOpts {\n /**\n * Distance between adjacent grid lines (also known as grid pitch),\n * in world (base) units. Accepts a bare number or a tagged\n * `{ value, unit }`. Tagged values require `unitSystem` to be supplied.\n */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Bounds of the area to cover, in world units. */\n bounds: () => { x: number; y: number; width: number; height: number };\n /** Lines every N cells get the accent style. 0/undef = no accent. */\n accentEvery?: number;\n /** Optional finer subdivisions per cell. e.g. 4 -> 4 sub-lines per cell. */\n subdivisions?: number;\n /** Per-band stroke styles. Each is a FillStyle+width (etc.) — see `Stroke`. */\n style?: {\n line?: Stroke;\n accent?: Stroke;\n sub?: Stroke;\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: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.08)' },\n width: 1,\n};\nconst DEFAULT_ACCENT: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.16)' },\n width: 1,\n};\nconst DEFAULT_SUB: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.04)' },\n width: 1,\n};\n\n/** Build a `RenderLayer` that draws a world-space grid with optional accent lines and subdivisions. */\nexport function createGridLayer(opts: GridLayerOpts): RenderLayer<unknown> {\n const line = opts.style?.line ?? DEFAULT_LINE;\n const accent = opts.style?.accent ?? DEFAULT_ACCENT;\n const sub = opts.style?.sub ?? DEFAULT_SUB;\n\n return {\n id: 'grid',\n label: 'Grid',\n draw: (_data, view) => {\n const b = opts.bounds();\n if (b.width <= 0 || b.height <= 0) return [];\n\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const x0 = b.x;\n const y0 = b.y;\n const x1 = b.x + b.width;\n const y1 = b.y + b.height;\n // Every line is axis-aligned, so its width runs along one screen axis\n // and one pixel of it is exactly that axis's extent.\n const px = pxExtent(1, view.scale);\n\n const children: DrawCommand[] = [];\n\n const pushSegment = (sx: number, sy: number, ex: number, ey: number, s: Stroke): void => {\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, ex, ey]),\n fillRule: 'nonzero',\n };\n const across = sx === ex ? px.x : px.y;\n children.push({\n kind: 'path',\n path,\n stroke: { ...s, width: resolveStrokeWidth(s.width ?? 1, 1) * across },\n });\n };\n\n // Sub-lines (drawn first so cell lines paint on top).\n if (subdivisions && subdivisions > 1) {\n const step = spacing / subdivisions;\n for (let x = x0; x <= x1 + 1e-9; x += step) {\n const k = Math.round((x - x0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x, y0, x, y1, sub);\n }\n for (let y = y0; y <= y1 + 1e-9; y += step) {\n const k = Math.round((y - y0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x0, y, x1, y, sub);\n }\n }\n\n // Cell lines (skip ones that will become accents).\n let idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x, y0, x, y1, line);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x0, y, x1, y, line);\n idx++;\n }\n\n // Accent lines on top.\n if (accentEvery && accentEvery > 0) {\n idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n if (idx % accentEvery === 0) pushSegment(x, y0, x, y1, accent);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n if (idx % accentEvery === 0) pushSegment(x0, y, x1, y, accent);\n idx++;\n }\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","/**\n * Cell highlight overlay — a thin render layer that fills a single grid cell\n * (e.g. a snap-target preview). Stack it under or over `createGridLayer` in\n * a layer sequence.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type FillStyle,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\n\n/** Options for `createCellHighlightLayer`. */\nexport interface CellHighlightLayerOpts {\n /** Cell size in world units (matches the grid's `spacing`). */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Defaults to (0,0). */\n origin?: () => { x: number; y: number };\n /** Cell to highlight, or `null` to skip drawing. */\n getCell: () => { col: number; row: number } | null;\n /** FillStyle strategy for the filled cell. Defaults to a soft green. */\n fill?: FillStyle;\n}\n\nconst DEFAULT_FILL: FillStyle = { fill: 'solid', color: 'rgba(127,176,105,0.15)' };\n\n/** Build a `RenderLayer` that fills a single grid cell — typically a snap-target preview. */\nexport function createCellHighlightLayer(opts: CellHighlightLayerOpts): RenderLayer<unknown> {\n const fill = opts.fill ?? DEFAULT_FILL;\n return {\n id: 'cell-highlight',\n label: 'Cell highlight',\n draw: () => {\n const cell = opts.getCell();\n if (!cell) return [];\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const o = opts.origin ? opts.origin() : { x: 0, y: 0 };\n const x = o.x + cell.col * spacing;\n const y = o.y + cell.row * spacing;\n const children: DrawCommand[] = [\n {\n kind: 'path',\n path: { kind: 'rect', x, y, width: spacing, height: spacing },\n fill,\n },\n ];\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useLatest } from '@weasel-js/core';\nimport type { Guide } from './types';\n\n/** Return shape for `useGuides`. */\nexport interface UseGuidesReturn {\n /** Live list (state). Re-renders when guides change. */\n guides: Guide[];\n /** Stable getter; reads the latest list without forcing a re-render.\n * Pass to `guideSnapStrategy` and `createGuidesLayer`. */\n getGuides: () => Guide[];\n /** Add a guide. If a guide with the same id already exists it is replaced. */\n addGuide: (guide: Guide) => void;\n /** Remove a guide by id. No-op when missing. */\n removeGuide: (id: string) => void;\n /** Drop all guides. */\n clearGuides: () => void;\n}\n\n/**\n * In-memory guide storage. Holds a list of horizontal/vertical world-space\n * lines that callers can pass to `guideSnapStrategy` (snap behavior) and\n * `createGuidesLayer` (render layer).\n *\n * v1 is intentionally minimal: no undo integration, no persistence, no\n * batched mutation. Wrap calls in your own history-aware action if you\n * want guide CRUD to be undoable.\n */\nexport function useGuides(initial: Guide[] = []): UseGuidesReturn {\n const [guides, setGuides] = useState<Guide[]>(initial);\n const ref = useLatest(guides);\n\n const getGuides = useCallback(() => ref.current, [ref]);\n\n const addGuide = useCallback((guide: Guide) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === guide.id);\n if (idx === -1) return [...prev, guide];\n const next = prev.slice();\n next[idx] = guide;\n return next;\n });\n }, []);\n\n const removeGuide = useCallback((id: string) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === id);\n if (idx === -1) return prev;\n const next = prev.slice();\n next.splice(idx, 1);\n return next;\n });\n }, []);\n\n const clearGuides = useCallback(() => {\n setGuides((prev) => (prev.length === 0 ? prev : []));\n }, []);\n\n return { guides, getGuides, addGuide, removeGuide, clearGuides };\n}\n","/**\n * Guides overlay — a screen-space render layer that draws each guide as a\n * thin line spanning the full canvas, projecting the guide's world offset\n * through the active view.\n *\n * Guides are not scene objects; they live outside the scene and are managed\n * via `useGuides`. Pair with `guideSnapStrategy` (snap behavior) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport type { DrawCommand, RenderLayer, Stroke } from '@weasel-js/core';\nimport { PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\nimport type { Guide } 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 /** Stroke width in CSS pixels. Default 1. */\n lineWidth?: number;\n /** Stroke color. Default a subtle blue. */\n color?: 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\n/** Build a `RenderLayer` that draws guide lines across the full canvas in\n * screen space, projected from world offsets 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 stroke: Stroke = {\n paint: { fill: 'solid', color },\n width: lineWidth,\n };\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 if (guides.length === 0) return [];\n\n const out: DrawCommand[] = [];\n for (const g of guides) {\n if (g.axis === 'x') {\n // Vertical line at world x = offset → screen x = (offset - view.x) * scale.\n const sx = (g.offset - view.x) * view.scale.x;\n if (sx < -lineWidth || sx > dims.width + lineWidth) continue;\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, 0, sx, dims.height]),\n fillRule: 'nonzero',\n };\n out.push({ kind: 'path', path, stroke });\n } else {\n // Horizontal line at world y = offset → screen y = (offset - view.y) * scale.\n const sy = (g.offset - view.y) * view.scale.y;\n if (sy < -lineWidth || sy > dims.height + lineWidth) continue;\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([0, sy, dims.width, sy]),\n fillRule: 'nonzero',\n };\n out.push({ kind: 'path', path, stroke });\n }\n }\n return out;\n },\n };\n}\n","import type { Guide } from '../types';\nimport type { DeriveAlignmentGuidesOptions } from './types';\nimport {\n type Bounds,\n type PoseDescriptor,\n 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.\n * Poses go through the same descriptor `alignMoveBehavior` matches with, so\n * a rotated sibling advertises its ink edges rather than its stored box. */\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): void => {\n const seen = axis === 'x' ? seenX : seenY;\n const key = Math.round(offset / EPS);\n if (seen.has(key)) return;\n seen.set(key, { id: `align:${axis}:${offset.toFixed(3)}`, axis, offset });\n };\n\n const emit = (b: Bounds): void => {\n if (edges) {\n add('x', b.x);\n add('x', b.x + b.width);\n add('y', b.y);\n add('y', b.y + b.height);\n }\n if (centers) {\n add('x', b.x + b.width / 2);\n add('y', b.y + b.height / 2);\n }\n };\n\n for (const t of targets) emit(visualBoundsViaDescriptor(t, d));\n if (opts.page) emit(opts.page);\n\n return [...seenX.values(), ...seenY.values()];\n}\n","import type { Guide } from '../types';\nimport type {\n AlignAnchor,\n AlignMatchResult,\n} from './types';\nimport type { Bounds } from '@weasel-js/core';\n\n/** Move/insert test all three features per axis. */\nexport const MOVE_ANCHORS: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = {\n x: ['min', 'center', 'max'],\n y: ['min', 'center', 'max'],\n};\n\nfunction featureOffset(b: Bounds, axis: 'x' | 'y', anchor: AlignAnchor): number {\n if (axis === 'x') {\n if (anchor === 'min') return b.x;\n if (anchor === 'center') return b.x + b.width / 2;\n return b.x + b.width;\n }\n if (anchor === 'min') return b.y;\n if (anchor === 'center') return b.y + b.height / 2;\n return b.y + b.height;\n}\n\n/** Best (feature, candidate) match on one axis, within tolerance. */\nfunction bestAxis(\n b: Bounds,\n axis: 'x' | 'y',\n anchors: readonly AlignAnchor[],\n candidates: readonly Guide[],\n worldTolerance: number,\n): { delta: number; guide: Guide | null } {\n let bestAbs = Infinity;\n let bestDelta = 0;\n let bestGuide: Guide | null = null;\n for (const anchor of anchors) {\n const o = featureOffset(b, axis, anchor);\n for (const g of candidates) {\n if (g.axis !== axis) continue;\n const d = g.offset - o;\n const ad = Math.abs(d);\n if (ad <= worldTolerance && ad < bestAbs) {\n bestAbs = ad;\n bestDelta = d;\n bestGuide = g;\n }\n }\n }\n return { delta: bestGuide ? bestDelta : 0, guide: bestGuide };\n}\n\n/**\n * Match a moving box's selected edge/center features against candidate guide\n * lines. Returns the per-axis snap delta and the matched candidate line(s).\n * The two axes resolve independently; on each axis the closest in-tolerance\n * (feature, candidate) pair wins.\n *\n * `worldTolerance` is per axis because a screen-pixel tolerance is not one\n * world distance under non-uniform zoom — and each axis here is matched by a\n * distance along that axis alone, so there is an exact answer rather than an\n * approximation. Pass the same number twice for a world-space tolerance.\n */\nexport function matchAlignment(\n bounds: Bounds,\n candidates: readonly Guide[],\n worldTolerance: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n): AlignMatchResult {\n const x = bestAxis(bounds, 'x', anchors.x, candidates, worldTolerance.x);\n const y = bestAxis(bounds, 'y', anchors.y, candidates, worldTolerance.y);\n return { dx: x.delta, dy: y.delta, activeX: x.guide, activeY: y.guide };\n}\n","import type { Guide } from '../types';\nimport {\n type BoundsConstraint,\n type InsertBehavior,\n type MoveBehavior,\n type ResizeAnchor,\n type Bounds,\n screenTolerance,\n unionBounds,\n type PoseDescriptor,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n fixedCornerOf,\n} from '@weasel-js/core';\nimport type {\n AlignAnchor,\n AlignmentBehaviorBase,\n} from './types';\nimport { MOVE_ANCHORS, matchAlignment } from './match';\n\n/** Options for move and resize — adds the pose descriptor for non-rect poses. */\nexport interface AlignMoveArgs<TPose> extends AlignmentBehaviorBase {\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\nconst activeList = (m: { activeX: Guide | null; activeY: Guide | null }): Guide[] =>\n [m.activeX, m.activeY].filter((g): g is Guide => g !== null);\n\nfunction worldTol(\n base: AlignmentBehaviorBase,\n ctx: Parameters<typeof screenTolerance>[1],\n): { x: number; y: number } {\n return screenTolerance(base.tolerance ?? 6, ctx);\n}\n\n/** Move behavior: snap the dragged selection's union box (edges + center) to\n * candidates, shaping the proposed translate. The gesture applies the\n * transform uniformly to every dragged id, so the selection shifts together\n * and stays rigid. Single-select is the degenerate one-box union. Publishes\n * the matched line(s); clears on miss, end and cancel. */\nexport function alignMoveBehavior<TPose>(args: AlignMoveArgs<TPose>): MoveBehavior<TPose> {\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, transform) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n if (transform.kind !== 'translate') return;\n // Union of every dragged id's visual box at its proposed position.\n const boxes: Bounds[] = [];\n for (const id of ctx.draggedIds) {\n const originPose = ctx.origin.get(id);\n if (originPose === undefined) continue;\n boxes.push(visualBoundsViaDescriptor(\n translatePoseViaDescriptor(originPose, transform.dx, transform.dy, d),\n d,\n ));\n }\n const union = unionBounds(boxes);\n if (union === null) return;\n const m = matchAlignment(union, args.getCandidates(), worldTol(args, ctx), MOVE_ANCHORS);\n if (m.activeX === null && m.activeY === null) { args.setActiveGuides([]); return; }\n args.setActiveGuides(activeList(m));\n return { transform: { kind: 'translate', dx: transform.dx + m.dx, dy: transform.dy + m.dy } };\n },\n onEnd() { args.setActiveGuides([]); },\n onCancel() { args.setActiveGuides([]); },\n };\n}\n\n/** Insert behavior: snap the live `current` point to candidates (treating it\n * as a zero-size box). Publishes the matched line(s). */\nexport function alignInsertBehavior<TPose>(args: AlignmentBehaviorBase): InsertBehavior<TPose> {\n const pointAnchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = { x: ['min'], y: ['min'] };\n return {\n onMove(ctx, { current }) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n const box = { x: current.x, y: current.y, width: 0, height: 0 };\n const m = matchAlignment(box, args.getCandidates(), worldTol(args, ctx), pointAnchors);\n if (m.activeX === null && m.activeY === null) { args.setActiveGuides([]); return; }\n args.setActiveGuides(activeList(m));\n return { current: { x: current.x + m.dx, y: current.y + m.dy } };\n },\n onEnd() { args.setActiveGuides([]); },\n onCancel() { args.setActiveGuides([]); },\n };\n}\n\n/** Resize constraint: snap the corner(s) the drag moves, as drawn, to\n * candidates; the pinned corner stays fixed. On an unrotated pose that is\n * the moving edge(s). On a rotated one the node's own axes set how the\n * corner can travel: a corner handle snaps each world axis, an edge handle\n * slides its edge until the nearer of its two corners meets a line.\n * `poseDescriptor` reads the origin pose's box and rotation, and must match\n * the resize action's. Publishes the matched line(s). */\nexport function alignResizeBehavior<TPose extends Bounds>(\n args: AlignMoveArgs<TPose>,\n): BoundsConstraint<TPose> {\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, { pose, anchor }) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n const origin = ctx.origin.get(ctx.draggedIds[0]);\n const rotation = origin === undefined ? 0 : (d.getRotation?.(origin) ?? 0);\n const m = rotation === 0\n ? matchMovingEdges(pose, anchor, args.getCandidates(), worldTol(args, ctx))\n : matchRotatedCorners(pose, anchor, d.getBounds(origin!), rotation, args.getCandidates(), worldTol(args, ctx));\n if (m === null) { args.setActiveGuides([]); return; }\n\n let { x, y, width, height } = pose;\n if (anchor.x === 'min') width += m.lx;\n else if (anchor.x === 'max') { x += m.lx; width -= m.lx; }\n if (anchor.y === 'min') height += m.ly;\n else if (anchor.y === 'max') { y += m.ly; height -= m.ly; }\n args.setActiveGuides(m.guides);\n return { pose: { ...pose, x, y, width, height } };\n },\n onEnd() { args.setActiveGuides([]); },\n onCancel() { args.setActiveGuides([]); },\n };\n}\n\n/** How far to move the dragged corner in the node's local frame, and the\n * lines that asked for it. */\ninterface CornerShift { lx: number; ly: number; guides: Guide[] }\n\nfunction matchMovingEdges(\n pose: Bounds,\n anchor: ResizeAnchor,\n candidates: readonly Guide[],\n tol: { x: number; y: number },\n): CornerShift | null {\n // A 'min' anchor pins the west/north edge, so the max edge moves.\n const movingX: AlignAnchor[] = anchor.x === 'min' ? ['max'] : anchor.x === 'max' ? ['min'] : [];\n const movingY: AlignAnchor[] = anchor.y === 'min' ? ['max'] : anchor.y === 'max' ? ['min'] : [];\n const m = matchAlignment(pose, candidates, tol, { x: movingX, y: movingY });\n if (m.activeX === null && m.activeY === null) return null;\n return { lx: m.dx, ly: m.dy, guides: activeList(m) };\n}\n\n/** The rotated case. The resize action pins the fixed corner in world after\n * constraints run, so a corner's drawn position is the origin's fixed corner\n * plus the rotated offset to it within `pose`. */\nfunction matchRotatedCorners(\n pose: Bounds,\n anchor: ResizeAnchor,\n originBox: Bounds,\n rotation: number,\n candidates: readonly Guide[],\n tol: { x: number; y: number },\n): CornerShift | null {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const toWorld = (lx: number, ly: number) => ({ x: lx * cos - ly * sin, y: lx * sin + ly * cos });\n const fixedLocal = fixedCornerOf(pose, anchor);\n const f0 = fixedCornerOf(originBox, anchor);\n const pivot = toWorld(f0.x - originBox.x - originBox.width / 2, f0.y - originBox.y - originBox.height / 2);\n const fixedWorld = { x: originBox.x + originBox.width / 2 + pivot.x, y: originBox.y + originBox.height / 2 + pivot.y };\n const drawn = (lx: number, ly: number) => {\n const o = toWorld(lx - fixedLocal.x, ly - fixedLocal.y);\n return { x: fixedWorld.x + o.x, y: fixedWorld.y + o.y };\n };\n const movingEdge = (axis: 'x' | 'y'): number[] => {\n const lo = axis === 'x' ? pose.x : pose.y;\n const hi = lo + (axis === 'x' ? pose.width : pose.height);\n const a = anchor[axis];\n return a === 'min' ? [hi] : a === 'max' ? [lo] : [lo, hi];\n };\n\n if (anchor.x !== 'free' && anchor.y !== 'free') {\n // A corner handle's corner has two degrees of freedom: snap it as a point.\n const c = drawn(movingEdge('x')[0], movingEdge('y')[0]);\n const m = matchAlignment({ x: c.x, y: c.y, width: 0, height: 0 }, candidates, tol, { x: ['min'], y: ['min'] });\n if (m.activeX === null && m.activeY === null) return null;\n const lx = m.dx * cos + m.dy * sin;\n const ly = -m.dx * sin + m.dy * cos;\n return { lx, ly, guides: activeList(m) };\n }\n if (anchor.x === 'free' && anchor.y === 'free') return null;\n\n // An edge handle moves along one local axis, carrying two corners with it.\n const along: 'x' | 'y' = anchor.x === 'free' ? 'y' : 'x';\n const dir = along === 'x' ? toWorld(1, 0) : toWorld(0, 1);\n const edge = movingEdge(along)[0];\n let best: { t: number; guide: Guide } | null = null;\n for (const across of movingEdge(along === 'x' ? 'y' : 'x')) {\n const c = along === 'x' ? drawn(edge, across) : drawn(across, edge);\n for (const g of candidates) {\n const reach = g.axis === 'x' ? dir.x : dir.y;\n if (Math.abs(reach) < 1e-9) continue;\n const t = (g.offset - (g.axis === 'x' ? c.x : c.y)) / reach;\n if (Math.abs(t * dir.x) > tol.x || Math.abs(t * dir.y) > tol.y) continue;\n if (best === null || Math.abs(t) < Math.abs(best.t)) best = { t, guide: g };\n }\n }\n if (best === null) return null;\n return along === 'x'\n ? { lx: best.t, ly: 0, guides: [best.guide] }\n : { lx: 0, ly: best.t, guides: [best.guide] };\n}\n","import type { DropTarget, LayoutSnap } from '@weasel-js/core';\n\nfunction dist2(a: { x: number; y: number }, b: { x: number; y: number }): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n}\n\nfunction nearestOf<TPose>(\n targets: DropTarget<TPose>[],\n pointer: { x: number; y: number },\n): DropTarget<TPose> | null {\n if (targets.length === 0) return null;\n let best = targets[0];\n let bestD = dist2(best.origin, pointer);\n for (let i = 1; i < targets.length; i++) {\n const d = dist2(targets[i].origin, pointer);\n if (d < bestD) {\n bestD = d;\n best = targets[i];\n }\n }\n return best;\n}\n\n/** Snap policy that never picks a target — every drop is rejected, which is\n * what a free-form container wants. */\nexport function none<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: () => null };\n}\n\n/** Snap policy that always picks the target closest to the pointer, however\n * far away it is. */\nexport function nearest<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: (targets, pointer) => nearestOf(targets, pointer) };\n}\n\n/** Snap policy that picks the closest target, but only within `tolerance`\n * world units — beyond that the drop is rejected. */\nexport function nearestWithin<TPose>(opts: { tolerance: number }): LayoutSnap<TPose> {\n const tol2 = opts.tolerance * opts.tolerance;\n return {\n pickTarget(targets, pointer) {\n const got = nearestOf(targets, pointer);\n if (got === null) return null;\n return dist2(got.origin, pointer) <= tol2 ? got : null;\n },\n };\n}\n\nfunction rectContains(\n r: { x: number; y: number; width: number; height: number },\n p: { x: number; y: number },\n): boolean {\n return p.x >= r.x && p.x < r.x + r.width && p.y >= r.y && p.y < r.y + r.height;\n}\n\n/**\n * Region-aware snap. If the pointer falls inside any target's `hitBounds`,\n * that target wins; otherwise falls back to nearest-origin. Useful for\n * strategies whose targets are area-shaped (gutters, drop-zones, gridded\n * cells) rather than point-shaped.\n *\n * Pointer-in-multiple-bounds order: first match in iteration order wins, so\n * strategies should emit narrower/more-specific targets before broader ones\n * (e.g. row-gutter before tray-corner).\n */\nexport function containedThenNearest<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n\ninterface CellMeta {\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nfunction isCellMeta(m: unknown): m is CellMeta {\n return (\n typeof m === 'object' &&\n m !== null &&\n 'cellRect' in m &&\n typeof (m as { cellRect: unknown }).cellRect === 'object'\n );\n}\n\n/**\n * Backwards-compatible cell snap. Prefer `containedThenNearest` for new\n * strategies; this variant remains for `tileGrid` and any caller that puts\n * its cell rect in `meta.cellRect` rather than `hitBounds`.\n */\nexport function cellAt<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n if (isCellMeta(t.meta) && rectContains(t.meta.cellRect, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n","import { createTransformOp, type LayoutSnap, type LayoutStrategy } from '@weasel-js/core';\nimport { none } from '../snaps';\n\n/** Options for `freeform`. */\nexport interface FreeformOptions<TPose> {\n snap?: LayoutSnap<TPose>;\n}\n\n/**\n * Identity layout: each child stays where it's stored, no reflow, no drop\n * targets. `snap` is accepted for API symmetry — overrides take effect only\n * if a caller wires up an external drop-target source, since `getDropTargets`\n * returns empty by default.\n */\nexport function freeform<TPose>(opts: FreeformOptions<TPose> = {}): LayoutStrategy<TPose> {\n const snap = opts.snap ?? none<TPose>();\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets() {\n return [];\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: 'Drop',\n }),\n ];\n },\n };\n}\n","import {\n createTransformOp,\n type Op,\n type ContainerBounds,\n type DropTarget,\n type LayoutChild,\n type LayoutContainer,\n type LayoutDragged,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { cellAt } from '../snaps';\n\ninterface TileMeta {\n col: number;\n row: number;\n cellRect: { x: number; y: number; width: number; height: number };\n}\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 snap?: LayoutSnap<TPose>;\n /** Optional: map a cell rect + the dragged pose to the new pose. Default\n * writes `{ x, y, width, height }` into the dragged pose (assumes\n * `RectPose`). Override for point-only poses or other shapes. The\n * `dragged` argument is the pre-drop pose of the child being placed —\n * use it to preserve fields the cell rect doesn't carry (e.g. rotation,\n * domain metadata). */\n cellToPose?(\n cellRect: { x: number; y: number; width: number; height: number },\n dragged: TPose,\n ): 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\nfunction cellRectAt(\n bounds: ContainerBounds,\n cols: number,\n rows: number,\n gap: number,\n col: number,\n row: number,\n): { x: number; y: number; width: number; height: number } {\n const cw = (bounds.width - gap * (cols - 1)) / cols;\n const ch = (bounds.height - gap * (rows - 1)) / rows;\n return {\n x: bounds.x + col * (cw + gap),\n y: bounds.y + row * (ch + gap),\n width: cw,\n height: ch,\n };\n}\n\n\n/**\n * Layout strategy that arranges children into a fixed grid of cells, one\n * child per cell, and the container holds at most `cols × rows` children.\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 and a full grid rejects it.\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 snap = opts.snap ?? cellAt<TPose>();\n const capacity = cols * rows;\n const cellToPose: (cell: { x: number; y: number; width: number; height: number }, 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\n const centerOf = opts.centerOf ?? defaultCenterOf;\n\n function cellPose(bounds: ContainerBounds, col: number, row: number, basis: TPose): TPose {\n return cellToPose(cellRectAt(bounds, cols, rows, gap, col, row), basis);\n }\n\n /** The cell index (`row * cols + col`) `pose` sits in, or `null` when it\n * sits in a gap or outside the grid. */\n function cellIndexOf(bounds: ContainerBounds, pose: TPose): number | null {\n const p = centerOf(pose);\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const r = cellRectAt(bounds, cols, rows, gap, col, row);\n if (p.x >= r.x && p.x < r.x + r.width && p.y >= r.y && p.y < r.y + r.height) {\n return row * cols + col;\n }\n }\n }\n return null;\n }\n\n /**\n * Compute the swap induced by dragging `dragged` onto `target`, if any.\n * Returns `null` when there is no swap (cross-container drop, empty cell,\n * or null target). The same logic backs both `reflowPoses` (preview) and\n * `commitDrop` (commit) so they cannot disagree.\n */\n function computeSwap(\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n dragged: LayoutDragged<TPose>,\n target: DropTarget<TPose> | null,\n ): { occupant: string; from: TPose; newPose: TPose } | null {\n if (target === null) return null;\n if (dragged.sourceContainerId !== container.id) return null;\n const meta = target.meta as TileMeta;\n const idx = meta.row * cols + meta.col;\n const occupant = children.find(\n (c) => c.id !== dragged.id && cellIndexOf(container.bounds, c.pose) === idx,\n );\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 = cellIndexOf(container.bounds, self ? self.pose : dragged.originPose);\n if (fromIdx === null || fromIdx === idx) return null;\n const oldCellRect = cellRectAt(\n container.bounds, cols, rows, gap, fromIdx % cols, Math.floor(fromIdx / cols),\n );\n return { occupant: occupant.id, from: occupant.pose, newPose: cellToPose(oldCellRect, occupant.pose) };\n }\n\n return {\n snap,\n\n childPoses(container, children) {\n const out = new Map<string, TPose>();\n // Order by the cell each child already sits in, so a reflow compacts\n // the survivors rather than re-sorting them — an earlier swap among\n // them has to outlive a sibling leaving the grid. Children sitting in\n // no cell (a gap, or outside the container) sort last; ties break by\n // id so an arrangement with no cells yet is still deterministic.\n const ordered = children\n .map((c) => ({ c, cell: cellIndexOf(container.bounds, 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 for (let i = 0; i < ordered.length && i < capacity; i++) {\n const col = i % cols;\n const row = Math.floor(i / cols);\n // Use each child's own pose as the basis so non-rect fields survive\n // the cellToPose mapping.\n out.set(ordered[i].c.id, cellPose(container.bounds, col, row, ordered[i].c.pose));\n }\n return out;\n },\n\n getDropTargets(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 if (dragged.sourceContainerId !== container.id) {\n for (const c of children) {\n if (c.id === dragged.id) continue;\n const idx = cellIndexOf(container.bounds, c.pose);\n if (idx !== null) occupied.add(idx);\n }\n }\n const out: DropTarget<TPose>[] = [];\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n if (occupied.has(row * cols + col)) continue;\n const cellRect = cellRectAt(container.bounds, cols, rows, gap, col, row);\n out.push({\n pose: cellToPose(cellRect, dragged.pose),\n origin: { x: cellRect.x + cellRect.width / 2, y: cellRect.y + cellRect.height / 2 },\n meta: { col, row, cellRect } satisfies TileMeta,\n });\n }\n }\n return out;\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}\n","import {\n type Vec2,\n createTransformOp,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { nearestWithin } from '../snaps';\n\n/** Which points within a container a child can snap to. */\nexport type SnapPattern = 'corners' | 'edges' | 'center' | 'grid';\n\n/** Options for `snapPoint`. */\nexport interface SnapPointOptions<TPose> {\n pattern: SnapPattern;\n /** Spacing for the 'grid' pattern, in world units. Default 50. */\n gridSpacing?: number;\n /** Tolerance for the default snap policy (nearestWithin). Default Infinity. */\n tolerance?: number;\n snap?: LayoutSnap<TPose>;\n}\n\nfunction buildPoints(\n bounds: { x: number; y: number; width: number; height: number },\n pattern: SnapPattern,\n gridSpacing: number,\n): Vec2[] {\n switch (pattern) {\n case 'corners':\n return [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ];\n case 'edges':\n return [\n { x: bounds.x + bounds.width / 2, y: bounds.y },\n { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height },\n { x: bounds.x, y: bounds.y + bounds.height / 2 },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height / 2 },\n ];\n case 'center':\n return [{ x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 }];\n case 'grid': {\n const out: Vec2[] = [];\n const cols = Math.floor(bounds.width / gridSpacing);\n const rows = Math.floor(bounds.height / gridSpacing);\n for (let j = 0; j <= rows; j++) {\n for (let i = 0; i <= cols; i++) {\n out.push({ x: bounds.x + i * gridSpacing, y: bounds.y + j * gridSpacing });\n }\n }\n return out;\n }\n }\n}\n\n/** Layout strategy that leaves children where they are but offers a fixed set\n * of points — corners, edge midpoints, center, or a grid — for a dragged\n * child to land on. */\nexport function snapPoint<TPose extends Vec2>(\n opts: SnapPointOptions<TPose>,\n): LayoutStrategy<TPose> {\n const gridSpacing = opts.gridSpacing ?? 50;\n const tolerance = opts.tolerance ?? Infinity;\n const snap = opts.snap ?? nearestWithin<TPose>({ tolerance });\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets(container, _children, dragged) {\n const points = buildPoints(container.bounds, opts.pattern, gridSpacing);\n return points.map((p) => ({\n // Anchor the dragged child's top-left at the snap point.\n pose: { ...dragged.pose, x: p.x, y: p.y } as TPose,\n origin: p,\n }));\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n const to = target === null ? dragged.pose : target.pose;\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to,\n label: 'Snap drop',\n }),\n ];\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/grid/roundToCell.ts","../src/grid/useGridCellHover.ts","../src/grid/layer.ts","../src/grid/cellHighlight.ts","../src/guides/useGuides.ts","../src/guides/layer.ts","../src/guides/alignment/derive.ts","../src/guides/alignment/match.ts","../src/guides/alignment/spacing.ts","../src/guides/alignment/behaviors.ts","../src/layout/snaps.ts","../src/layout/strategies/freeform.ts","../src/layout/strategies/tileGrid.ts","../src/layout/strategies/snapPoint.ts"],"names":["resolveUnit","useState","useLatest","useCallback","PATH_M","PATH_L","EPS","bestAxis","AUTO_POSE_DESCRIPTOR","visualBoundsViaDescriptor","lo","hi","across","createTransformOp"],"mappings":"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","file":"index.js","sourcesContent":["/** Round `value` to the nearest multiple of `cellSize`. Returns 0 when the result would be -0. */\nexport function roundToCell(value: number, cellSize: number): number {\n return Math.round(value / cellSize) * cellSize || 0;\n}\n","/**\n * Pointer-tracking glue that turns hover position into a grid cell, suitable\n * for dropping straight into `createCellHighlightLayer({ getCell })`. Pairs\n * with `gridSnapStrategy` / `createGridLayer` so the visual hover preview\n * uses the exact same spacing as the snap behavior.\n *\n * Wires three things you'd otherwise glue by hand:\n * 1. pointermove on a target element → client coords\n * 2. client coords → world coords via your `ViewTransform`\n * 3. world coords → integer `{col, row}` via `pointToGridCell`\n *\n * State updates only fire when the cell actually changes (not on every\n * pointer tick). Pass `onChange` to trigger a canvas redraw on each transition.\n */\n\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n useLatest,\n screenToWorld,\n type ViewTransform,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\nimport { pointToGridCell } from '../strategies/grid';\n\n/** Options for `useGridCellHover`. */\nexport interface UseGridCellHoverOptions {\n /** Element to attach pointer listeners to (typically the canvas). */\n ref: RefObject<HTMLElement | null>;\n /** Read the current view transform. Called on every pointermove so it can\n * reflect live pan/zoom without a re-binding step. */\n view: () => ViewTransform;\n /** Cell spacing in world units. Same value you pass to `createGridLayer`\n * and `createCellHighlightLayer`. */\n spacing: UnitValue;\n /** Required if `spacing` is tagged (e.g. `{ value: 1, unit: 'ft' }`). */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Default `(0, 0)`. */\n origin?: { x: number; y: number };\n /** Fires when the hovered cell changes (including to/from `null`). Use it\n * to invalidate your layer renderer. */\n onChange?: (cell: { col: number; row: number } | null) => void;\n /** Disable the listeners without unmounting. Default `true`. */\n enabled?: boolean;\n}\n\n/** Return shape of `useGridCellHover`. */\nexport interface UseGridCellHoverReturn {\n /** Current hovered cell, or `null` when the pointer is outside the element. */\n cell: { col: number; row: number } | null;\n /** Stable callback that returns the current cell — drop straight into\n * `createCellHighlightLayer({ getCell })`. */\n getCell: () => { col: number; row: number } | null;\n}\n\nfunction cellsEqual(\n a: { col: number; row: number } | null,\n b: { col: number; row: number } | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return a.col === b.col && a.row === b.row;\n}\n\n/** Track which grid cell the pointer is over; pairs with `createCellHighlightLayer`. */\nexport function useGridCellHover(opts: UseGridCellHoverOptions): UseGridCellHoverReturn {\n const [cell, setCell] = useState<{ col: number; row: number } | null>(null);\n const cellRef = useRef<{ col: number; row: number } | null>(null);\n const optsRef = useLatest(opts);\n\n const getCell = useCallback(() => cellRef.current, []);\n\n const enabled = opts.enabled ?? true;\n useEffect(() => {\n if (!enabled) return;\n const el = opts.ref.current;\n if (!el) return;\n\n const update = (next: { col: number; row: number } | null) => {\n if (cellsEqual(cellRef.current, next)) return;\n cellRef.current = next;\n setCell(next);\n optsRef.current.onChange?.(next);\n };\n\n const onMove = (e: PointerEvent) => {\n const o = optsRef.current;\n const rect = el.getBoundingClientRect();\n const sx = e.clientX - rect.left;\n const sy = e.clientY - rect.top;\n const [wx, wy] = screenToWorld(sx, sy, o.view());\n update(pointToGridCell({ x: wx, y: wy }, o.spacing, o.unitSystem, o.origin));\n };\n const onLeave = () => update(null);\n\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerleave', onLeave);\n el.addEventListener('pointercancel', onLeave);\n return () => {\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerleave', onLeave);\n el.removeEventListener('pointercancel', onLeave);\n };\n }, [enabled, opts.ref, optsRef]);\n\n return { cell, getCell };\n}\n","/**\n * Grid overlay — a reusable render layer that draws a world-space grid with\n * optional finer subdivisions and accent lines every N cells.\n *\n * The layer renders in world space — the caller is expected to have applied\n * any view transform to the canvas context already. To draw a highlighted\n * cell (snap-target preview), stack `createCellHighlightLayer` alongside\n * this one.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type Stroke,\n resolveStrokeWidth,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n pxExtent,\n} from '@weasel-js/core';\nimport { PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\n\n/** Options for `createGridLayer`. */\nexport interface GridLayerOpts {\n /**\n * Distance between adjacent grid lines (also known as grid pitch),\n * in world (base) units. Accepts a bare number or a tagged\n * `{ value, unit }`. Tagged values require `unitSystem` to be supplied.\n */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Bounds of the area to cover, in world units. */\n bounds: () => { x: number; y: number; width: number; height: number };\n /** Lines every N cells get the accent style. 0/undef = no accent. */\n accentEvery?: number;\n /** Optional finer subdivisions per cell. e.g. 4 -> 4 sub-lines per cell. */\n subdivisions?: number;\n /** Per-band stroke styles. Each is a FillStyle+width (etc.) — see `Stroke`. */\n style?: {\n line?: Stroke;\n accent?: Stroke;\n sub?: Stroke;\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: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.08)' },\n width: 1,\n};\nconst DEFAULT_ACCENT: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.16)' },\n width: 1,\n};\nconst DEFAULT_SUB: Stroke = {\n paint: { fill: 'solid', color: 'rgba(255, 255, 255, 0.04)' },\n width: 1,\n};\n\n/** Build a `RenderLayer` that draws a world-space grid with optional accent lines and subdivisions. */\nexport function createGridLayer(opts: GridLayerOpts): RenderLayer<unknown> {\n const line = opts.style?.line ?? DEFAULT_LINE;\n const accent = opts.style?.accent ?? DEFAULT_ACCENT;\n const sub = opts.style?.sub ?? DEFAULT_SUB;\n\n return {\n id: 'grid',\n label: 'Grid',\n draw: (_data, view) => {\n const b = opts.bounds();\n if (b.width <= 0 || b.height <= 0) return [];\n\n const { accentEvery, subdivisions } = opts;\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const x0 = b.x;\n const y0 = b.y;\n const x1 = b.x + b.width;\n const y1 = b.y + b.height;\n // Every line is axis-aligned, so its width runs along one screen axis\n // and one pixel of it is exactly that axis's extent.\n const px = pxExtent(1, view.scale);\n\n const children: DrawCommand[] = [];\n\n const pushSegment = (sx: number, sy: number, ex: number, ey: number, s: Stroke): void => {\n const path: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, ex, ey]),\n fillRule: 'nonzero',\n };\n const across = sx === ex ? px.x : px.y;\n children.push({\n kind: 'path',\n path,\n stroke: { ...s, width: resolveStrokeWidth(s.width ?? 1, 1) * across },\n });\n };\n\n // Sub-lines (drawn first so cell lines paint on top).\n if (subdivisions && subdivisions > 1) {\n const step = spacing / subdivisions;\n for (let x = x0; x <= x1 + 1e-9; x += step) {\n const k = Math.round((x - x0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x, y0, x, y1, sub);\n }\n for (let y = y0; y <= y1 + 1e-9; y += step) {\n const k = Math.round((y - y0) / step);\n if (k % subdivisions === 0) continue;\n pushSegment(x0, y, x1, y, sub);\n }\n }\n\n // Cell lines (skip ones that will become accents).\n let idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x, y0, x, y1, line);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n const isAccent = !!accentEvery && accentEvery > 0 && idx % accentEvery === 0;\n if (!isAccent) pushSegment(x0, y, x1, y, line);\n idx++;\n }\n\n // Accent lines on top.\n if (accentEvery && accentEvery > 0) {\n idx = 0;\n for (let x = x0; x <= x1 + 1e-9; x += spacing) {\n if (idx % accentEvery === 0) pushSegment(x, y0, x, y1, accent);\n idx++;\n }\n idx = 0;\n for (let y = y0; y <= y1 + 1e-9; y += spacing) {\n if (idx % accentEvery === 0) pushSegment(x0, y, x1, y, accent);\n idx++;\n }\n }\n\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","/**\n * Cell highlight overlay — a thin render layer that fills a single grid cell\n * (e.g. a snap-target preview). Stack it under or over `createGridLayer` in\n * a layer sequence.\n */\n\nimport {\n type DrawCommand,\n type RenderLayer,\n type FillStyle,\n resolveUnit,\n type UnitSystem,\n type UnitValue,\n} from '@weasel-js/core';\n\n/** Options for `createCellHighlightLayer`. */\nexport interface CellHighlightLayerOpts {\n /** Cell size in world units (matches the grid's `spacing`). */\n spacing: UnitValue;\n /** Optional unit system for resolving tagged `spacing` values. */\n unitSystem?: UnitSystem;\n /** Origin the cell grid is anchored to, in world units. Defaults to (0,0). */\n origin?: () => { x: number; y: number };\n /** Cell to highlight, or `null` to skip drawing. */\n getCell: () => { col: number; row: number } | null;\n /** FillStyle strategy for the filled cell. Defaults to a soft green. */\n fill?: FillStyle;\n}\n\nconst DEFAULT_FILL: FillStyle = { fill: 'solid', color: 'rgba(127,176,105,0.15)' };\n\n/** Build a `RenderLayer` that fills a single grid cell — typically a snap-target preview. */\nexport function createCellHighlightLayer(opts: CellHighlightLayerOpts): RenderLayer<unknown> {\n const fill = opts.fill ?? DEFAULT_FILL;\n return {\n id: 'cell-highlight',\n label: 'Cell highlight',\n draw: () => {\n const cell = opts.getCell();\n if (!cell) return [];\n const spacing = resolveUnit(opts.spacing, opts.unitSystem);\n const o = opts.origin ? opts.origin() : { x: 0, y: 0 };\n const x = o.x + cell.col * spacing;\n const y = o.y + cell.row * spacing;\n const children: DrawCommand[] = [\n {\n kind: 'path',\n path: { kind: 'rect', x, y, width: spacing, height: spacing },\n fill,\n },\n ];\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useLatest } from '@weasel-js/core';\nimport type { Guide } from './types';\n\n/** Return shape for `useGuides`. */\nexport interface UseGuidesReturn {\n /** Live list (state). Re-renders when guides change. */\n guides: Guide[];\n /** Stable getter; reads the latest list without forcing a re-render.\n * Pass to `guideSnapStrategy` and `createGuidesLayer`. */\n getGuides: () => Guide[];\n /** Add a guide. If a guide with the same id already exists it is replaced. */\n addGuide: (guide: Guide) => void;\n /** Remove a guide by id. No-op when missing. */\n removeGuide: (id: string) => void;\n /** Drop all guides. */\n clearGuides: () => void;\n}\n\n/**\n * In-memory guide storage. Holds a list of horizontal/vertical world-space\n * lines that callers can pass to `guideSnapStrategy` (snap behavior) and\n * `createGuidesLayer` (render layer).\n *\n * v1 is intentionally minimal: no undo integration, no persistence, no\n * batched mutation. Wrap calls in your own history-aware action if you\n * want guide CRUD to be undoable.\n */\nexport function useGuides(initial: Guide[] = []): UseGuidesReturn {\n const [guides, setGuides] = useState<Guide[]>(initial);\n const ref = useLatest(guides);\n\n const getGuides = useCallback(() => ref.current, [ref]);\n\n const addGuide = useCallback((guide: Guide) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === guide.id);\n if (idx === -1) return [...prev, guide];\n const next = prev.slice();\n next[idx] = guide;\n return next;\n });\n }, []);\n\n const removeGuide = useCallback((id: string) => {\n setGuides((prev) => {\n const idx = prev.findIndex((g) => g.id === id);\n if (idx === -1) return prev;\n const next = prev.slice();\n next.splice(idx, 1);\n return next;\n });\n }, []);\n\n const clearGuides = useCallback(() => {\n setGuides((prev) => (prev.length === 0 ? prev : []));\n }, []);\n\n return { guides, getGuides, addGuide, removeGuide, clearGuides };\n}\n","/**\n * Guides overlay — a screen-space render layer that draws each guide as a\n * thin line, projecting the guide's world offset through the active view.\n * A guide with a `span` draws as a segment over that span with a tick at each\n * end; one without spans the full canvas. It also draws equal-spacing gaps\n * (`SpacingGap`) as ticked segments labeled with their size.\n *\n * Guides are not scene objects; they live outside the scene and are managed\n * via `useGuides`. Pair with `guideSnapStrategy` (snap behavior) to keep\n * the visual guide and the snap target in lockstep.\n */\n\nimport { textCommandFromRuns, type DrawCommand, type RenderLayer, type Stroke } from '@weasel-js/core';\nimport { PATH_L, PATH_M, rectPath, type PolygonPath } from '@weasel-js/geom';\nimport type { Guide, SpacingGap } from './types';\n\n/** Options for `createGuidesLayer`. */\nexport interface GuidesLayerOpts {\n /** Stable getter for the live guide list — typically `useGuides().getGuides`. */\n getGuides: () => readonly Guide[];\n /** Stable getter for the equal-spacing gaps to draw — typically what an\n * alignment behavior's `setActiveGaps` last published. */\n getGaps?: () => readonly SpacingGap[];\n /** `'span'` (default) draws a guide that carries a `span` as a segment over\n * it; `'full'` draws every guide across the whole canvas. */\n extent?: 'span' | 'full';\n /** Length in CSS px of the tick across each end of a segment. 0 for none.\n * Default 6. */\n ticks?: number;\n /** Label each gap with its size: `true` (default) prints it rounded to a\n * whole world unit, a function formats it, `false` omits the label. */\n gapLabels?: boolean | ((size: number) => string);\n /** Stroke width in CSS pixels. Default 1. */\n lineWidth?: number;\n /** Stroke color, and the gap labels' fill. Default a subtle blue. */\n color?: string;\n /** Gap marker color. Default `color`. */\n gapColor?: string;\n /** Optional dash pattern (CSS px). Currently unused — reserved for future\n * parity with chrome that supports dashes. */\n dash?: number[];\n /** Override the layer id. Useful if a consumer needs more than one\n * guides-layer (e.g. user-guides vs. system-guides). */\n id?: string;\n /** Override the layer label. */\n label?: string;\n}\n\nconst DEFAULT_COLOR = '#3aa0ff';\nconst LABEL_FONT = { fontSize: 10 };\n// No text measurer in a layer: a 10px digit advances about 6px.\nconst LABEL_CHAR_W = 6;\nconst LABEL_H = 14;\nconst LABEL_PAD_X = 4;\n\n/** A straight segment from (x0, y0) to (x1, y1), with a tick of length `t`\n * across each end. Screen px. */\nfunction tickedSegment(x0: number, y0: number, x1: number, y1: number, t: number): PolygonPath {\n const h = t / 2;\n const vertical = x0 === x1;\n const ends = t <= 0 ? [] : vertical\n ? [x0 - h, y0, x0 + h, y0, x1 - h, y1, x1 + h, y1]\n : [x0, y0 - h, x0, y0 + h, x1, y1 - h, x1, y1 + h];\n const coords = [x0, y0, x1, y1, ...ends];\n const commands: number[] = [];\n for (let i = 0; i < coords.length; i += 4) commands.push(PATH_M, PATH_L);\n return {\n kind: 'polygon',\n commands: new Uint8Array(commands),\n coords: new Float32Array(coords),\n fillRule: 'nonzero',\n };\n}\n\n/** Build a `RenderLayer` that draws guide lines and spacing gaps in screen\n * space, projected from world coordinates via the active view. */\nexport function createGuidesLayer(opts: GuidesLayerOpts): RenderLayer<unknown> {\n const lineWidth = opts.lineWidth ?? 1;\n const color = opts.color ?? DEFAULT_COLOR;\n const gapColor = opts.gapColor ?? color;\n const ticks = opts.ticks ?? 6;\n const spanned = (opts.extent ?? 'span') === 'span';\n const format = opts.gapLabels === false ? null\n : typeof opts.gapLabels === 'function' ? opts.gapLabels\n : (n: number) => String(Math.round(n));\n const stroke: Stroke = { paint: { fill: 'solid', color }, width: lineWidth };\n const gapStroke: Stroke = { paint: { fill: 'solid', color: gapColor }, width: lineWidth };\n\n return {\n id: opts.id ?? 'guides',\n label: opts.label ?? 'Guides',\n space: 'screen',\n draw: (_data, view, dims) => {\n const guides = opts.getGuides();\n const gaps = opts.getGaps?.() ?? [];\n if (guides.length === 0 && gaps.length === 0) return [];\n const sx = (x: number) => (x - view.x) * view.scale.x;\n const sy = (y: number) => (y - view.y) * view.scale.y;\n\n const out: DrawCommand[] = [];\n for (const g of guides) {\n const span = spanned ? g.span : undefined;\n if (g.axis === 'x') {\n const x = sx(g.offset);\n if (x < -lineWidth || x > dims.width + lineWidth) continue;\n const path = span\n ? tickedSegment(x, sy(span.min), x, sy(span.max), ticks)\n : tickedSegment(x, 0, x, dims.height, 0);\n out.push({ kind: 'path', path, stroke });\n } else {\n const y = sy(g.offset);\n if (y < -lineWidth || y > dims.height + lineWidth) continue;\n const path = span\n ? tickedSegment(sx(span.min), y, sx(span.max), y, ticks)\n : tickedSegment(0, y, dims.width, y, 0);\n out.push({ kind: 'path', path, stroke });\n }\n }\n\n for (const g of gaps) {\n const [x0, y0, x1, y1] = g.axis === 'x'\n ? [sx(g.min), sy(g.at), sx(g.max), sy(g.at)]\n : [sx(g.at), sy(g.min), sx(g.at), sy(g.max)];\n out.push({ kind: 'path', path: tickedSegment(x0, y0, x1, y1, ticks), stroke: gapStroke });\n if (format === null) continue;\n const text = format(g.max - g.min);\n const w = text.length * LABEL_CHAR_W + LABEL_PAD_X * 2;\n const left = (x0 + x1) / 2 - w / 2;\n const top = (y0 + y1) / 2 - LABEL_H / 2;\n out.push({ kind: 'path', path: rectPath(left, top, w, LABEL_H), fill: { fill: 'solid', color: gapColor } });\n out.push(textCommandFromRuns(\n left + LABEL_PAD_X,\n top + 2,\n [{ text, fill: { fill: 'solid', color: '#fff' } }],\n LABEL_FONT,\n ));\n }\n return out;\n },\n };\n}\n","import type { Guide } from '../types';\nimport type { DeriveAlignmentGuidesOptions } from './types';\nimport {\n type Bounds,\n type PoseDescriptor,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n} from '@weasel-js/core';\n\nconst EPS = 1e-3;\n\n/** Derive candidate alignment lines from a set of sibling poses plus an\n * optional page box. Each box contributes up to 3 guides per axis: the two\n * edges and the center. Overlapping offsets collapse to one candidate, whose\n * `span` covers every box that produced it.\n * Poses go through the same descriptor `alignMoveBehavior` matches with, so\n * a rotated sibling advertises its ink edges rather than its stored box. */\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 for (const t of targets) emit(visualBoundsViaDescriptor(t, d));\n if (opts.page) emit(opts.page);\n\n return [...seenX.values(), ...seenY.values()];\n}\n","import type { Guide } from '../types';\nimport type {\n AlignAnchor,\n AlignMatchResult,\n} from './types';\nimport type { Bounds } from '@weasel-js/core';\n\n/** Move/insert test all three features per axis. */\nexport const MOVE_ANCHORS: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = {\n x: ['min', 'center', 'max'],\n y: ['min', 'center', 'max'],\n};\n\nfunction featureOffset(b: Bounds, axis: 'x' | 'y', anchor: AlignAnchor): number {\n if (axis === 'x') {\n if (anchor === 'min') return b.x;\n if (anchor === 'center') return b.x + b.width / 2;\n return b.x + b.width;\n }\n if (anchor === 'min') return b.y;\n if (anchor === 'center') return b.y + b.height / 2;\n return b.y + b.height;\n}\n\n/** Best (feature, candidate) match on one axis, within tolerance. */\nfunction bestAxis(\n b: Bounds,\n axis: 'x' | 'y',\n anchors: readonly AlignAnchor[],\n candidates: readonly Guide[],\n worldTolerance: number,\n): { delta: number; guide: Guide | null } {\n let bestAbs = Infinity;\n let bestDelta = 0;\n let bestGuide: Guide | null = null;\n for (const anchor of anchors) {\n const o = featureOffset(b, axis, anchor);\n for (const g of candidates) {\n if (g.axis !== axis) continue;\n const d = g.offset - o;\n const ad = Math.abs(d);\n if (ad <= worldTolerance && ad < bestAbs) {\n bestAbs = ad;\n bestDelta = d;\n bestGuide = g;\n }\n }\n }\n return { delta: bestGuide ? bestDelta : 0, guide: bestGuide };\n}\n\n/**\n * Match a moving box's selected edge/center features against candidate guide\n * lines. Returns the per-axis snap delta and the matched candidate line(s).\n * The two axes resolve independently; on each axis the closest in-tolerance\n * (feature, candidate) pair wins. A matched guide that carries a `span` comes\n * back with it stretched to cover the snapped box, so the drawn segment runs\n * from the aligned siblings to the box being dragged.\n *\n * `worldTolerance` is per axis because a screen-pixel tolerance is not one\n * world distance under non-uniform zoom — and each axis here is matched by a\n * distance along that axis alone, so there is an exact answer rather than an\n * approximation. Pass the same number twice for a world-space tolerance.\n */\nexport function matchAlignment(\n bounds: Bounds,\n candidates: readonly Guide[],\n worldTolerance: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n): AlignMatchResult {\n const x = bestAxis(bounds, 'x', anchors.x, candidates, worldTolerance.x);\n const y = bestAxis(bounds, 'y', anchors.y, candidates, worldTolerance.y);\n const top = bounds.y + y.delta;\n const left = bounds.x + x.delta;\n return {\n dx: x.delta,\n dy: y.delta,\n activeX: stretchSpan(x.guide, top, top + bounds.height),\n activeY: stretchSpan(y.guide, left, left + bounds.width),\n };\n}\n\n/** A matched guide whose span also covers the snapped box. */\nexport function stretchSpan(g: Guide | null, min: number, max: number): Guide | null {\n if (g === null || g.span === undefined) return g;\n return { ...g, span: { min: Math.min(g.span.min, min), max: Math.max(g.span.max, max) } };\n}\n","import type { Bounds } from '@weasel-js/core';\nimport type { SpacingGap } from '../types';\nimport type { SpacingEdge, SpacingMatchResult } from './types';\n\nconst EPS = 1e-6;\ntype Axis = 'x' | 'y';\n\nconst lo = (b: Bounds, a: Axis): number => (a === 'x' ? b.x : b.y);\nconst hi = (b: Bounds, a: Axis): number => (a === 'x' ? b.x + b.width : b.y + b.height);\nconst cross = (a: Axis): Axis => (a === 'x' ? 'y' : 'x');\n\n/** The shared range of two boxes on `axis`, or null when they share none. */\nfunction overlap(a: Bounds, b: Bounds, axis: Axis): [number, number] | null {\n const min = Math.max(lo(a, axis), lo(b, axis));\n const max = Math.min(hi(a, axis), hi(b, axis));\n return max - min > EPS ? [min, max] : null;\n}\n\nfunction gapBetween(a: Bounds, b: Bounds, axis: Axis): SpacingGap | null {\n const shared = overlap(a, b, cross(axis));\n if (shared === null) return null;\n return { axis, min: hi(a, axis), max: lo(b, axis), at: (shared[0] + shared[1]) / 2 };\n}\n\n/** Whether `b` covers any of the strip a gap marks out. */\nfunction hitsStrip(g: SpacingGap, b: Bounds, span: [number, number]): boolean {\n const c = cross(g.axis);\n return lo(b, g.axis) < g.max - EPS && hi(b, g.axis) > g.min + EPS\n && lo(b, c) < span[1] - EPS && hi(b, c) > span[0] + EPS;\n}\n\n/**\n * The visible gaps between neighboring boxes along `axis`: for `'x'`, each box\n * and the nearest box to its right that shares some of its vertical range, as\n * long as no third box stands in the strip between them. These are the gaps an\n * equal-spacing snap can reproduce.\n */\nexport function measureGaps(targets: readonly Bounds[], axis: Axis): SpacingGap[] {\n return measure(targets, axis).map((m) => m.gap);\n}\n\ninterface Measured { gap: SpacingGap; span: [number, number] }\n\nfunction measure(targets: readonly Bounds[], axis: Axis): Measured[] {\n const out: Measured[] = [];\n for (const a of targets) {\n let next: Bounds | null = null;\n for (const c of targets) {\n if (c === a || lo(c, axis) < hi(a, axis) + EPS) continue;\n if (overlap(a, c, cross(axis)) === null) continue;\n if (next === null || lo(c, axis) < lo(next, axis)) next = c;\n }\n if (next === null) continue;\n const gap = gapBetween(a, next, axis)!;\n const span = overlap(a, next, cross(axis))!;\n if (targets.some((t) => t !== a && t !== next && hitsStrip(gap, t, span))) continue;\n out.push({ gap, span });\n }\n return out.sort((p, q) => p.gap.min - q.gap.min || p.gap.at - q.gap.at);\n}\n\ninterface AxisHit { delta: number; size: number }\n\n/** The best equal-spacing placement on one axis, or null. */\nfunction bestAxis(\n b: Bounds,\n axis: Axis,\n edge: SpacingEdge,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n tol: number,\n): AxisHit | null {\n const bLo = lo(b, axis);\n const bHi = hi(b, axis);\n const size = bHi - bLo;\n const center = (bLo + bHi) / 2;\n let left: Bounds | null = null;\n let right: Bounds | null = null;\n for (const t of targets) {\n if (overlap(t, b, cross(axis)) === null) continue;\n if (hi(t, axis) <= center && (left === null || hi(t, axis) > hi(left, axis))) left = t;\n if (lo(t, axis) >= center && (right === null || lo(t, axis) < lo(right, axis))) right = t;\n }\n const sizes = refs.map((g) => g.max - g.min);\n\n let best: AxisHit | null = null;\n const offer = (delta: number, gap: number): void => {\n if (gap <= EPS || Math.abs(delta) > tol) return;\n if (best === null || Math.abs(delta) < Math.abs(best.delta)) best = { delta, size: gap };\n };\n\n const L = left === null ? null : hi(left, axis);\n const R = right === null ? null : lo(right, axis);\n if (edge === 'both') {\n for (const g of sizes) {\n if (L !== null && (R === null || L + g + size <= R + EPS)) offer(L + g - bLo, g);\n if (R !== null && (L === null || R - g - size >= L - EPS)) offer(R - g - size - bLo, g);\n }\n if (L !== null && R !== null) {\n const g = (R - L - size) / 2;\n offer(L + g - bLo, g);\n }\n } else if (edge === 'max' && R !== null) {\n const own = L !== null ? [bLo - L] : [];\n for (const g of [...sizes, ...own]) if (R - g > bLo + EPS) offer(R - g - bHi, g);\n } else if (edge === 'min' && L !== null) {\n const own = R !== null ? [R - bHi] : [];\n for (const g of [...sizes, ...own]) if (L + g < bHi - EPS) offer(L + g - bLo, g);\n }\n return best;\n}\n\n/** Every gap of `size` on `axis` once the box sits at `b`: the matching\n * reference gaps, plus the box's own gaps to its two neighbors. */\nfunction markers(\n b: Bounds,\n axis: Axis,\n size: number,\n targets: readonly Bounds[],\n refs: readonly SpacingGap[],\n): SpacingGap[] {\n const eq = (g: SpacingGap) => Math.abs(g.max - g.min - size) < 1e-3;\n const out = refs.filter(eq);\n const own = measureGaps([...targets, b], axis).filter((g) =>\n (Math.abs(g.max - lo(b, axis)) < EPS || Math.abs(g.min - hi(b, axis)) < EPS) && eq(g));\n return [...out, ...own];\n}\n\n/**\n * Match a box against the gaps between `targets`, Figma's \"equal spacing\":\n * on each axis, find where the box's gap to a neighbor equals a gap that\n * already exists between two other boxes, or where it sits centered between\n * its two neighbors. `moving` says which edges move on each axis — `'both'`\n * for a translate, `'min'`/`'max'` for a resize dragging that edge, `null` to\n * leave the axis alone. Default `'both'` on each axis.\n *\n * Targets should exclude the box itself. A reference gap the box now stands\n * inside no longer counts. The returned gaps are every gap equal to the one\n * snapped to, with the box at its snapped position — ready to draw with\n * `createGuidesLayer`'s `getGaps`.\n */\nexport function matchSpacing(\n bounds: Bounds,\n targets: readonly Bounds[],\n worldTolerance: { x: number; y: number },\n moving: { x: SpacingEdge | null; y: SpacingEdge | null } = { x: 'both', y: 'both' },\n): SpacingMatchResult {\n const refsFor = (axis: Axis) => measure(targets, axis)\n .filter((m) => !hitsStrip(m.gap, bounds, m.span))\n .map((m) => m.gap);\n const refsX = refsFor('x');\n const refsY = refsFor('y');\n const x = moving.x === null ? null : bestAxis(bounds, 'x', moving.x, targets, refsX, worldTolerance.x);\n const y = moving.y === null ? null : bestAxis(bounds, 'y', moving.y, targets, refsY, worldTolerance.y);\n const dx = x?.delta ?? 0;\n const dy = y?.delta ?? 0;\n const final = applyEdges(bounds, dx, dy, moving);\n return {\n dx,\n dy,\n gapsX: x === null ? [] : markers(final, 'x', x.size, targets, refsX),\n gapsY: y === null ? [] : markers(final, 'y', y.size, targets, refsY),\n };\n}\n\n/** Move the box's moving edges by the snap deltas. */\nexport function applyEdges(\n b: Bounds,\n dx: number,\n dy: number,\n moving: { x: SpacingEdge | null; y: SpacingEdge | null },\n): Bounds {\n let { x, y, width, height } = b;\n if (moving.x === 'both') x += dx;\n else if (moving.x === 'min') { x += dx; width -= dx; }\n else if (moving.x === 'max') width += dx;\n if (moving.y === 'both') y += dy;\n else if (moving.y === 'min') { y += dy; height -= dy; }\n else if (moving.y === 'max') height += dy;\n return { x, y, width, height };\n}\n","import type { Guide, SpacingGap } from '../types';\nimport {\n type BoundsConstraint,\n type InsertBehavior,\n type MoveBehavior,\n type ResizeAnchor,\n type Bounds,\n screenTolerance,\n unionBounds,\n type PoseDescriptor,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n fixedCornerOf,\n} from '@weasel-js/core';\nimport type {\n AlignAnchor,\n AlignmentBehaviorBase,\n SpacingEdge,\n} from './types';\nimport { MOVE_ANCHORS, matchAlignment, stretchSpan } from './match';\nimport { applyEdges, matchSpacing } from './spacing';\n\n/** Options for move and resize — adds the pose descriptor for non-rect poses. */\nexport interface AlignMoveArgs<TPose> extends AlignmentBehaviorBase {\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\nconst activeList = (m: { activeX: Guide | null; activeY: Guide | null }): Guide[] =>\n [m.activeX, m.activeY].filter((g): g is Guide => g !== null);\n\n/** Tolerance for re-reading what a settled box touches exactly. */\nconst EXACT = { x: 1e-6, y: 1e-6 };\n\ninterface Resolved { dx: number; dy: number; guides: Guide[]; gaps: SpacingGap[] }\n\ntype Edges = { x: SpacingEdge | null; y: SpacingEdge | null };\n\n/** Snap `b` to alignment lines and, when the caller supplies spacing targets,\n * equal gaps; the nearer snap wins on each axis. What is published is read\n * back off the settled box, so a line and a gap that both hold show together\n * and each is drawn where the box ended up, not where it was dragged. */\nfunction resolve(\n b: Bounds,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n anchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] },\n edges: Edges,\n): Resolved | null {\n const candidates = args.getCandidates();\n const m = matchAlignment(b, candidates, tol, anchors);\n const targets = args.getSpacingTargets?.();\n if (targets === undefined) {\n if (m.activeX === null && m.activeY === null) return null;\n return { dx: m.dx, dy: m.dy, guides: activeList(m), gaps: [] };\n }\n const s = matchSpacing(b, targets, tol, edges);\n const pick = (hit: boolean, d: number, spaced: boolean, sd: number): number | null =>\n hit && (!spaced || Math.abs(d) <= Math.abs(sd)) ? d : spaced ? sd : null;\n const dx = pick(m.activeX !== null, m.dx, s.gapsX.length > 0, s.dx);\n const dy = pick(m.activeY !== null, m.dy, s.gapsY.length > 0, s.dy);\n if (dx === null && dy === null) return null;\n const settled = applyEdges(b, dx ?? 0, dy ?? 0, edges);\n const shown = matchSpacing(settled, targets, EXACT, edges);\n return {\n dx: dx ?? 0,\n dy: dy ?? 0,\n guides: activeList(matchAlignment(settled, candidates, EXACT, anchors)),\n gaps: [...shown.gapsX, ...shown.gapsY],\n };\n}\n\nfunction publish(args: AlignmentBehaviorBase, r: Resolved | null): void {\n args.setActiveGuides(r?.guides ?? []);\n args.setActiveGaps?.(r?.gaps ?? []);\n}\n\nfunction worldTol(\n base: AlignmentBehaviorBase,\n ctx: Parameters<typeof screenTolerance>[1],\n): { x: number; y: number } {\n return screenTolerance(base.tolerance ?? 6, ctx);\n}\n\n/** Move behavior: snap the dragged selection's union box (edges + center) to\n * candidates, shaping the proposed translate. The gesture applies the\n * transform uniformly to every dragged id, so the selection shifts together\n * and stays rigid. Single-select is the degenerate one-box union. Publishes\n * the matched line(s); clears on miss, end and cancel. */\nexport function alignMoveBehavior<TPose>(args: AlignMoveArgs<TPose>): MoveBehavior<TPose> {\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, transform) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n if (transform.kind !== 'translate') return;\n // Union of every dragged id's visual box at its proposed position.\n const boxes: Bounds[] = [];\n for (const id of ctx.draggedIds) {\n const originPose = ctx.origin.get(id);\n if (originPose === undefined) continue;\n boxes.push(visualBoundsViaDescriptor(\n translatePoseViaDescriptor(originPose, transform.dx, transform.dy, d),\n d,\n ));\n }\n const union = unionBounds(boxes);\n if (union === null) return;\n const r = resolve(union, args, worldTol(args, ctx), MOVE_ANCHORS, { x: 'both', y: 'both' });\n publish(args, r);\n if (r === null) return;\n return { transform: { kind: 'translate', dx: transform.dx + r.dx, dy: transform.dy + r.dy } };\n },\n onEnd() { publish(args, null); },\n onCancel() { publish(args, null); },\n };\n}\n\n/** Insert behavior: snap the live `current` point to candidates (treating it\n * as a zero-size box). Publishes the matched line(s). */\nexport function alignInsertBehavior<TPose>(args: AlignmentBehaviorBase): InsertBehavior<TPose> {\n const pointAnchors: { x: readonly AlignAnchor[]; y: readonly AlignAnchor[] } = { x: ['min'], y: ['min'] };\n return {\n onMove(ctx, { current }) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { args.setActiveGuides([]); return; }\n const box = { x: current.x, y: current.y, width: 0, height: 0 };\n const m = matchAlignment(box, args.getCandidates(), worldTol(args, ctx), pointAnchors);\n if (m.activeX === null && m.activeY === null) { args.setActiveGuides([]); return; }\n args.setActiveGuides(activeList(m));\n return { current: { x: current.x + m.dx, y: current.y + m.dy } };\n },\n onEnd() { args.setActiveGuides([]); },\n onCancel() { args.setActiveGuides([]); },\n };\n}\n\n/** Resize constraint: snap the corner(s) the drag moves, as drawn, to\n * candidates; the pinned corner stays fixed. On an unrotated pose that is\n * the moving edge(s). On a rotated one the node's own axes set how the\n * corner can travel: a corner handle snaps each world axis, an edge handle\n * slides its edge until the nearer of its two corners meets a line.\n * `poseDescriptor` reads the origin pose's box and rotation, and must match\n * the resize action's. Publishes the matched line(s). */\nexport function alignResizeBehavior<TPose extends Bounds>(\n args: AlignMoveArgs<TPose>,\n): BoundsConstraint<TPose> {\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n return {\n onMove(ctx, { pose, anchor }) {\n if (args.bypassKey && ctx.modifiers[args.bypassKey]) { publish(args, null); return; }\n const origin = ctx.origin.get(ctx.draggedIds[0]);\n const rotation = origin === undefined ? 0 : (d.getRotation?.(origin) ?? 0);\n const m = rotation === 0\n ? matchMovingEdges(pose, anchor, args, worldTol(args, ctx))\n : matchRotatedCorners(pose, anchor, d.getBounds(origin!), rotation, args.getCandidates(), worldTol(args, ctx));\n if (m === null) { publish(args, null); return; }\n\n let { x, y, width, height } = pose;\n if (anchor.x === 'min') width += m.lx;\n else if (anchor.x === 'max') { x += m.lx; width -= m.lx; }\n if (anchor.y === 'min') height += m.ly;\n else if (anchor.y === 'max') { y += m.ly; height -= m.ly; }\n publish(args, { dx: 0, dy: 0, guides: m.guides, gaps: m.gaps });\n return { pose: { ...pose, x, y, width, height } };\n },\n onEnd() { publish(args, null); },\n onCancel() { publish(args, null); },\n };\n}\n\n/** How far to move the dragged corner in the node's local frame, and the\n * lines that asked for it. */\ninterface CornerShift { lx: number; ly: number; guides: Guide[]; gaps: SpacingGap[] }\n\nfunction matchMovingEdges(\n pose: Bounds,\n anchor: ResizeAnchor,\n args: AlignmentBehaviorBase,\n tol: { x: number; y: number },\n): CornerShift | null {\n // A 'min' anchor pins the west/north edge, so the max edge moves.\n const moving = (a: ResizeAnchor['x']): SpacingEdge | null => (a === 'min' ? 'max' : a === 'max' ? 'min' : null);\n const edges = { x: moving(anchor.x), y: moving(anchor.y) };\n const anchors = {\n x: edges.x === null ? [] : [edges.x],\n y: edges.y === null ? [] : [edges.y],\n } as { x: AlignAnchor[]; y: AlignAnchor[] };\n const r = resolve(pose, args, tol, anchors, edges);\n return r === null ? null : { lx: r.dx, ly: r.dy, guides: r.guides, gaps: r.gaps };\n}\n\n/** The rotated case. The resize action pins the fixed corner in world after\n * constraints run, so a corner's drawn position is the origin's fixed corner\n * plus the rotated offset to it within `pose`. */\nfunction matchRotatedCorners(\n pose: Bounds,\n anchor: ResizeAnchor,\n originBox: Bounds,\n rotation: number,\n candidates: readonly Guide[],\n tol: { x: number; y: number },\n): CornerShift | null {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const toWorld = (lx: number, ly: number) => ({ x: lx * cos - ly * sin, y: lx * sin + ly * cos });\n const fixedLocal = fixedCornerOf(pose, anchor);\n const f0 = fixedCornerOf(originBox, anchor);\n const pivot = toWorld(f0.x - originBox.x - originBox.width / 2, f0.y - originBox.y - originBox.height / 2);\n const fixedWorld = { x: originBox.x + originBox.width / 2 + pivot.x, y: originBox.y + originBox.height / 2 + pivot.y };\n const drawn = (lx: number, ly: number) => {\n const o = toWorld(lx - fixedLocal.x, ly - fixedLocal.y);\n return { x: fixedWorld.x + o.x, y: fixedWorld.y + o.y };\n };\n const movingEdge = (axis: 'x' | 'y'): number[] => {\n const lo = axis === 'x' ? pose.x : pose.y;\n const hi = lo + (axis === 'x' ? pose.width : pose.height);\n const a = anchor[axis];\n return a === 'min' ? [hi] : a === 'max' ? [lo] : [lo, hi];\n };\n\n if (anchor.x !== 'free' && anchor.y !== 'free') {\n // A corner handle's corner has two degrees of freedom: snap it as a point.\n const c = drawn(movingEdge('x')[0], movingEdge('y')[0]);\n const m = matchAlignment({ x: c.x, y: c.y, width: 0, height: 0 }, candidates, tol, { x: ['min'], y: ['min'] });\n if (m.activeX === null && m.activeY === null) return null;\n const lx = m.dx * cos + m.dy * sin;\n const ly = -m.dx * sin + m.dy * cos;\n return { lx, ly, guides: activeList(m), gaps: [] };\n }\n if (anchor.x === 'free' && anchor.y === 'free') return null;\n\n // An edge handle moves along one local axis, carrying two corners with it.\n const along: 'x' | 'y' = anchor.x === 'free' ? 'y' : 'x';\n const dir = along === 'x' ? toWorld(1, 0) : toWorld(0, 1);\n const edge = movingEdge(along)[0];\n let best: { t: number; guide: Guide; at: { x: number; y: number } } | null = null;\n for (const across of movingEdge(along === 'x' ? 'y' : 'x')) {\n const c = along === 'x' ? drawn(edge, across) : drawn(across, edge);\n for (const g of candidates) {\n const reach = g.axis === 'x' ? dir.x : dir.y;\n if (Math.abs(reach) < 1e-9) continue;\n const t = (g.offset - (g.axis === 'x' ? c.x : c.y)) / reach;\n if (Math.abs(t * dir.x) > tol.x || Math.abs(t * dir.y) > tol.y) continue;\n if (best === null || Math.abs(t) < Math.abs(best.t)) best = { t, guide: g, at: c };\n }\n }\n if (best === null) return null;\n const across = best.guide.axis === 'x' ? best.at.y + best.t * dir.y : best.at.x + best.t * dir.x;\n const guides = [stretchSpan(best.guide, across, across)!];\n return along === 'x'\n ? { lx: best.t, ly: 0, guides, gaps: [] }\n : { lx: 0, ly: best.t, guides, gaps: [] };\n}\n","import type { DropTarget, LayoutSnap } from '@weasel-js/core';\n\nfunction dist2(a: { x: number; y: number }, b: { x: number; y: number }): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n}\n\nfunction nearestOf<TPose>(\n targets: DropTarget<TPose>[],\n pointer: { x: number; y: number },\n): DropTarget<TPose> | null {\n if (targets.length === 0) return null;\n let best = targets[0];\n let bestD = dist2(best.origin, pointer);\n for (let i = 1; i < targets.length; i++) {\n const d = dist2(targets[i].origin, pointer);\n if (d < bestD) {\n bestD = d;\n best = targets[i];\n }\n }\n return best;\n}\n\n/** Snap policy that never picks a target — every drop is rejected, which is\n * what a free-form container wants. */\nexport function none<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: () => null };\n}\n\n/** Snap policy that always picks the target closest to the pointer, however\n * far away it is. */\nexport function nearest<TPose>(): LayoutSnap<TPose> {\n return { pickTarget: (targets, pointer) => nearestOf(targets, pointer) };\n}\n\n/** Snap policy that picks the closest target, but only within `tolerance`\n * world units — beyond that the drop is rejected. */\nexport function nearestWithin<TPose>(opts: { tolerance: number }): LayoutSnap<TPose> {\n const tol2 = opts.tolerance * opts.tolerance;\n return {\n pickTarget(targets, pointer) {\n const got = nearestOf(targets, pointer);\n if (got === null) return null;\n return dist2(got.origin, pointer) <= tol2 ? got : null;\n },\n };\n}\n\nfunction rectContains(\n r: { x: number; y: number; width: number; height: number },\n p: { x: number; y: number },\n): boolean {\n return p.x >= r.x && p.x < r.x + r.width && p.y >= r.y && p.y < r.y + r.height;\n}\n\n/**\n * Region-aware snap. If the pointer falls inside any target's `hitBounds`,\n * that target wins; otherwise falls back to nearest-origin. Useful for\n * strategies whose targets are area-shaped (gutters, drop-zones, gridded\n * cells) rather than point-shaped.\n *\n * Pointer-in-multiple-bounds order: first match in iteration order wins, so\n * strategies should emit narrower/more-specific targets before broader ones\n * (e.g. row-gutter before tray-corner).\n */\nexport function containedThenNearest<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n\ninterface CellMeta {\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nfunction isCellMeta(m: unknown): m is CellMeta {\n return (\n typeof m === 'object' &&\n m !== null &&\n 'cellRect' in m &&\n typeof (m as { cellRect: unknown }).cellRect === 'object'\n );\n}\n\n/**\n * Backwards-compatible cell snap. Prefer `containedThenNearest` for new\n * strategies; this variant remains for `tileGrid` and any caller that puts\n * its cell rect in `meta.cellRect` rather than `hitBounds`.\n */\nexport function cellAt<TPose>(): LayoutSnap<TPose> {\n return {\n pickTarget(targets, pointer) {\n for (const t of targets) {\n if (t.hitBounds && rectContains(t.hitBounds, pointer)) return t;\n if (isCellMeta(t.meta) && rectContains(t.meta.cellRect, pointer)) return t;\n }\n return nearestOf(targets, pointer);\n },\n };\n}\n","import { createTransformOp, type LayoutSnap, type LayoutStrategy } from '@weasel-js/core';\nimport { none } from '../snaps';\n\n/** Options for `freeform`. */\nexport interface FreeformOptions<TPose> {\n snap?: LayoutSnap<TPose>;\n}\n\n/**\n * Identity layout: each child stays where it's stored, no reflow, no drop\n * targets. `snap` is accepted for API symmetry — overrides take effect only\n * if a caller wires up an external drop-target source, since `getDropTargets`\n * returns empty by default.\n */\nexport function freeform<TPose>(opts: FreeformOptions<TPose> = {}): LayoutStrategy<TPose> {\n const snap = opts.snap ?? none<TPose>();\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets() {\n return [];\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: target?.pose ?? dragged.pose,\n label: 'Drop',\n }),\n ];\n },\n };\n}\n","import {\n createTransformOp,\n type Op,\n type ContainerBounds,\n type DropTarget,\n type LayoutArrival,\n type LayoutChild,\n type LayoutContainer,\n type LayoutDragged,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { cellAt } from '../snaps';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\ninterface TileMeta {\n col: number;\n row: number;\n cellRect: Rect;\n}\n\n/**\n * What a `tileGrid` does with a child past its `cols × rows` cells.\n *\n * - `'reject'` (default) — the grid holds `cols × rows` and refuses more, by\n * any route: a drop finds no free cell, and an insert or reparent that would\n * overfill it is reverted whole.\n * - `'grow'` — the grid adds a line of cells whenever the last one fills\n * (a row, or a column for `flow: 'column'`) and the container grows by its\n * pitch to hold it, and gives the line back when children leave and it\n * empties. `rows` (or `cols`) is the minimum.\n * - `'scroll'` — the container keeps its size, and the extra children take\n * cells past its last visible line, at the same pitch. `contentExtent`\n * reports the region they cover, for a host to scroll over.\n */\nexport type TileGridOverflow = 'reject' | 'grow' | 'scroll';\n\n/** Options for `tileGrid`. */\nexport interface TileGridOptions<TPose> {\n cols: number;\n rows: number;\n /** Gap between cells, in world units. Default 0. */\n gap?: number;\n /** The order cells fill in: along each row (`'row'`, the default) or down\n * each column (`'column'`). It is also the direction an overflowing grid\n * runs on in. */\n flow?: 'row' | 'column';\n /** What happens past `cols × rows` children. Default `'reject'`. */\n overflow?: TileGridOverflow;\n snap?: LayoutSnap<TPose>;\n /** Optional: map a cell rect + the dragged pose to the new pose. Default\n * writes `{ x, y, width, height }` into the dragged pose (assumes\n * `RectPose`). Override for point-only poses or other shapes. The\n * `dragged` argument is the pre-drop pose of the child being placed —\n * use it to preserve fields the cell rect doesn't carry (e.g. rotation,\n * domain metadata). */\n cellToPose?(cellRect: Rect, dragged: TPose): TPose;\n /** Optional: the point that decides which cell a child occupies — a child\n * occupies the cell containing it. Default reads `x`/`y` plus half of\n * `width`/`height` when the pose has them, which is the center of a\n * `RectPose` and the point itself for a point pose. */\n centerOf?(pose: TPose): { x: number; y: number };\n}\n\nfunction defaultCenterOf(pose: unknown): { x: number; y: number } {\n const p = pose as { x?: number; y?: number; width?: number; height?: number };\n return { x: (p.x ?? 0) + (p.width ?? 0) / 2, y: (p.y ?? 0) + (p.height ?? 0) / 2 };\n}\n\n/**\n * Layout strategy that arranges children into a grid of cells, one child per\n * cell. What happens past `cols × rows` children is the `overflow` policy.\n *\n * A child occupies the cell its pose sits in (see `centerOf`). A drag from\n * inside the container swaps with the child in the cell it lands on; a drop\n * from outside is offered only the free cells, so it lands in the nearest\n * free one. A child that joins by an insert or a reparent is placed the same\n * way, in the free cell nearest to where it was put.\n */\nexport function tileGrid<TPose>(\n opts: TileGridOptions<TPose>,\n): LayoutStrategy<TPose> {\n const { cols, rows } = opts;\n const gap = opts.gap ?? 0;\n const byColumn = opts.flow === 'column';\n const overflow = opts.overflow ?? 'reject';\n const snap = opts.snap ?? cellAt<TPose>();\n const capacity = cols * rows;\n /** Cells per line in fill order, and the declared line count. */\n const perLine = byColumn ? rows : cols;\n const minLines = byColumn ? cols : rows;\n const cellToPose: (cell: Rect, dragged: TPose) => TPose =\n opts.cellToPose ?? ((cell, dragged) => {\n // Default: spread the cell rect over the dragged pose. Preserves any\n // extra fields the dragged pose carries.\n return { ...(dragged as object), ...cell } as TPose;\n });\n const centerOf = opts.centerOf ?? defaultCenterOf;\n\n const linesFor = (n: number): number => Math.max(minLines, Math.ceil(n / perLine));\n\n /** The grid over `bounds` while it holds `n` children: its cell pitch, and\n * how many cells it offers before running past the container. A growing\n * grid spreads its lines over the container, which it keeps sized to fit\n * them; the others always lay the declared grid over it. */\n function gridOf(bounds: ContainerBounds, n: number) {\n const lines = overflow === 'grow' ? linesFor(n) : minLines;\n const c = byColumn ? lines : cols;\n const r = byColumn ? rows : lines;\n const cw = (bounds.width - gap * (c - 1)) / c;\n const ch = (bounds.height - gap * (r - 1)) / r;\n\n function rectAt(index: number): Rect {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n const col = byColumn ? line : along;\n const row = byColumn ? along : line;\n return { x: bounds.x + col * (cw + gap), y: bounds.y + row * (ch + gap), width: cw, height: ch };\n }\n\n /** The cell index `pose` sits in, overflow cells past the container\n * included, or `null` in a gap or off the grid. */\n function indexOf(pose: TPose): number | null {\n const p = centerOf(pose);\n const col = Math.floor((p.x - bounds.x) / (cw + gap));\n const row = Math.floor((p.y - bounds.y) / (ch + gap));\n if (col < 0 || row < 0) return null;\n if (p.x - bounds.x - col * (cw + gap) >= cw) return null;\n if (p.y - bounds.y - row * (ch + gap) >= ch) return null;\n if (byColumn ? row >= rows : col >= cols) return null;\n return byColumn ? col * rows + row : row * cols + col;\n }\n\n /** The cells a drop may land in, or an arrival be placed in, with `n`\n * children in the grid: the declared grid when it refuses overflow, and\n * otherwise every whole line the children reach. */\n const cells = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n\n /** The container bounds that hold `lines` lines at this pitch. */\n function boundsFor(lineCount: number): ContainerBounds {\n return byColumn\n ? { ...bounds, width: lineCount * cw + gap * (lineCount - 1) }\n : { ...bounds, height: lineCount * ch + gap * (lineCount - 1) };\n }\n\n return { rectAt, indexOf, cells, boundsFor };\n }\n\n const metaOf = (index: number, cellRect: Rect): TileMeta => {\n const along = index % perLine;\n const line = Math.floor(index / perLine);\n return byColumn\n ? { col: line, row: along, cellRect }\n : { col: along, row: line, cellRect };\n };\n const indexOfMeta = (m: TileMeta): number => (byColumn ? m.col * rows + m.row : m.row * cols + m.col);\n\n /** How many children the grid holds, not counting a drag from outside it. */\n const heldBy = (container: LayoutContainer, children: ReadonlyArray<LayoutChild<TPose>>, dragged?: LayoutDragged<TPose>): number =>\n dragged && dragged.sourceContainerId !== container.id\n ? children.filter((c) => c.id !== dragged.id).length\n : children.length;\n\n /**\n * Compute the swap induced by dragging `dragged` onto `target`, if any.\n * Returns `null` when there is no swap (cross-container drop, empty cell,\n * or null target). The same logic backs both `reflowPoses` (preview) and\n * `commitDrop` (commit) so they cannot disagree.\n */\n function computeSwap(\n container: LayoutContainer,\n children: ReadonlyArray<LayoutChild<TPose>>,\n dragged: LayoutDragged<TPose>,\n target: DropTarget<TPose> | null,\n ): { occupant: string; from: TPose; newPose: TPose } | null {\n if (target === null) return null;\n if (dragged.sourceContainerId !== container.id) return null;\n const grid = gridOf(container.bounds, children.length);\n const idx = indexOfMeta(target.meta as TileMeta);\n const occupant = children.find((c) => c.id !== dragged.id && grid.indexOf(c.pose) === idx);\n if (occupant === undefined) return null;\n // The occupant takes the cell the dragged child is leaving — where the\n // container state says it is now, which an earlier placement of the same\n // drop may have moved it to.\n const self = children.find((c) => c.id === dragged.id);\n const fromIdx = grid.indexOf(self ? self.pose : dragged.originPose);\n if (fromIdx === null || fromIdx === idx) return null;\n return { occupant: occupant.id, from: occupant.pose, newPose: cellToPose(grid.rectAt(fromIdx), occupant.pose) };\n }\n\n /**\n * Every child a cell of `into`, in the order of the cells they sit in on\n * `from`, so a reflow compacts the survivors rather than re-sorting them —\n * an earlier swap among them has to outlive a sibling leaving the grid.\n * Children sitting in no cell (a gap, or off the grid) sort last; ties break\n * by id so an arrangement with no cells yet is still deterministic. Past\n * the declared grid they run on at the same pitch.\n */\n function pack(\n from: ReturnType<typeof gridOf>,\n into: ReturnType<typeof gridOf>,\n children: ReadonlyArray<LayoutChild<TPose>>,\n ): Map<string, TPose> {\n const ordered = children\n .map((c) => ({ c, cell: from.indexOf(c.pose) }))\n .sort((a, b) => {\n if (a.cell !== b.cell) {\n if (a.cell === null) return 1;\n if (b.cell === null) return -1;\n return a.cell - b.cell;\n }\n return a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0;\n });\n const out = new Map<string, TPose>();\n for (let i = 0; i < ordered.length; i++) {\n out.set(ordered[i].c.id, cellToPose(into.rectAt(i), ordered[i].c.pose));\n }\n return out;\n }\n\n return {\n snap,\n\n childPoses(container, children) {\n const grid = gridOf(container.bounds, children.length);\n return pack(grid, grid, children);\n },\n\n getDropTargets(container, children, dragged) {\n const grid = gridOf(container.bounds, heldBy(container, children, dragged));\n // A drag from inside may land on an occupied cell and swap; one from\n // outside has nobody to swap with, so occupied cells are not offered.\n const occupied = new Set<number>();\n const fromOutside = dragged.sourceContainerId !== container.id;\n if (fromOutside) {\n for (const c of children) {\n if (c.id === dragged.id) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) occupied.add(idx);\n }\n }\n const offered: number[] = [];\n for (let i = 0; i < grid.cells; i++) if (!occupied.has(i)) offered.push(i);\n // A grid that takes overflow always has room for one more.\n if (fromOutside && offered.length === 0 && overflow !== 'reject') offered.push(grid.cells);\n return offered.map((i) => {\n const cellRect = grid.rectAt(i);\n return {\n pose: cellToPose(cellRect, dragged.pose),\n origin: { x: cellRect.x + cellRect.width / 2, y: cellRect.y + cellRect.height / 2 },\n meta: metaOf(i, cellRect) satisfies TileMeta,\n };\n });\n },\n\n reflowPoses(container, children, dragged, target) {\n const out = new Map<string, TPose>();\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n out.set(swap.occupant, swap.newPose);\n }\n return out;\n },\n\n commitDrop(container, children, dragged, target) {\n const ops: Op[] = [];\n\n let droppedPose: TPose;\n if (target === null) {\n droppedPose = dragged.pose;\n } else {\n const meta = target.meta as TileMeta;\n droppedPose = cellToPose(meta.cellRect, dragged.pose);\n const swap = computeSwap(container, children, dragged, target);\n if (swap !== null) {\n ops.push(\n createTransformOp<TPose>({\n id: swap.occupant,\n from: swap.from,\n to: swap.newPose,\n label: 'Tile swap',\n }),\n );\n }\n }\n ops.push(\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to: droppedPose,\n label: 'Tile drop',\n }),\n );\n return ops;\n },\n\n arrive(container, children, arrivals): LayoutArrival<TPose> | null {\n const n = children.length;\n if (overflow === 'reject' && n > capacity) return null;\n // The grid as it stood before these joined: its pitch is the one the\n // arrivals are placed at, and a growing grid extends by it.\n const grid = gridOf(container.bounds, n - arrivals.size);\n const slots = overflow === 'reject' ? capacity : linesFor(n) * perLine;\n const taken = new Set<number>();\n for (const c of children) {\n if (arrivals.has(c.id)) continue;\n const idx = grid.indexOf(c.pose);\n if (idx !== null) taken.add(idx);\n }\n const poses = new Map<string, TPose>();\n for (const c of children) {\n if (!arrivals.has(c.id)) continue;\n const own = grid.indexOf(c.pose);\n let idx: number;\n if (own !== null && own < slots && !taken.has(own)) {\n idx = own;\n } else {\n const at = centerOf(c.pose);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < slots; i++) {\n if (taken.has(i)) continue;\n const r = grid.rectAt(i);\n const dx = r.x + r.width / 2 - at.x;\n const dy = r.y + r.height / 2 - at.y;\n const d = dx * dx + dy * dy;\n if (d < bestD) { bestD = d; best = i; }\n }\n if (best < 0) return null;\n idx = best;\n }\n taken.add(idx);\n poses.set(c.id, cellToPose(grid.rectAt(idx), c.pose));\n }\n if (overflow !== 'grow') return { poses };\n const lines = linesFor(n);\n if (lines === linesFor(n - arrivals.size)) return { poses };\n return { poses, bounds: grid.boundsFor(lines) };\n },\n\n depart(container, children, departed): LayoutArrival<TPose> {\n const n = children.length;\n // The grid as it stood with the departed still in it: a grown grid\n // gives back whole lines at that pitch, down to its declared count.\n const before = gridOf(container.bounds, n + departed.size);\n const lines = linesFor(n);\n if (overflow !== 'grow' || lines === linesFor(n + departed.size)) {\n return { poses: pack(before, before, children) };\n }\n const bounds = before.boundsFor(lines);\n return { poses: pack(before, gridOf(bounds, n), children), bounds };\n },\n\n contentExtent(container, children) {\n const grid = gridOf(container.bounds, children.length);\n const lines = Math.ceil(children.length / perLine);\n if (lines <= minLines) return container.bounds;\n const reach = grid.boundsFor(lines);\n return overflow === 'grow'\n ? container.bounds\n : { ...reach, width: Math.max(reach.width, container.bounds.width), height: Math.max(reach.height, container.bounds.height) };\n },\n };\n}\n","import {\n type Vec2,\n createTransformOp,\n type LayoutSnap,\n type LayoutStrategy,\n} from '@weasel-js/core';\nimport { nearestWithin } from '../snaps';\n\n/** Which points within a container a child can snap to. */\nexport type SnapPattern = 'corners' | 'edges' | 'center' | 'grid';\n\n/** Options for `snapPoint`. */\nexport interface SnapPointOptions<TPose> {\n pattern: SnapPattern;\n /** Spacing for the 'grid' pattern, in world units. Default 50. */\n gridSpacing?: number;\n /** Tolerance for the default snap policy (nearestWithin). Default Infinity. */\n tolerance?: number;\n snap?: LayoutSnap<TPose>;\n}\n\nfunction buildPoints(\n bounds: { x: number; y: number; width: number; height: number },\n pattern: SnapPattern,\n gridSpacing: number,\n): Vec2[] {\n switch (pattern) {\n case 'corners':\n return [\n { x: bounds.x, y: bounds.y },\n { x: bounds.x + bounds.width, y: bounds.y },\n { x: bounds.x, y: bounds.y + bounds.height },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height },\n ];\n case 'edges':\n return [\n { x: bounds.x + bounds.width / 2, y: bounds.y },\n { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height },\n { x: bounds.x, y: bounds.y + bounds.height / 2 },\n { x: bounds.x + bounds.width, y: bounds.y + bounds.height / 2 },\n ];\n case 'center':\n return [{ x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 }];\n case 'grid': {\n const out: Vec2[] = [];\n const cols = Math.floor(bounds.width / gridSpacing);\n const rows = Math.floor(bounds.height / gridSpacing);\n for (let j = 0; j <= rows; j++) {\n for (let i = 0; i <= cols; i++) {\n out.push({ x: bounds.x + i * gridSpacing, y: bounds.y + j * gridSpacing });\n }\n }\n return out;\n }\n }\n}\n\n/** Layout strategy that leaves children where they are but offers a fixed set\n * of points — corners, edge midpoints, center, or a grid — for a dragged\n * child to land on. */\nexport function snapPoint<TPose extends Vec2>(\n opts: SnapPointOptions<TPose>,\n): LayoutStrategy<TPose> {\n const gridSpacing = opts.gridSpacing ?? 50;\n const tolerance = opts.tolerance ?? Infinity;\n const snap = opts.snap ?? nearestWithin<TPose>({ tolerance });\n\n return {\n snap,\n\n childPoses(_container, children) {\n const out = new Map<string, TPose>();\n for (const c of children) out.set(c.id, c.pose);\n return out;\n },\n\n getDropTargets(container, _children, dragged) {\n const points = buildPoints(container.bounds, opts.pattern, gridSpacing);\n return points.map((p) => ({\n // Anchor the dragged child's top-left at the snap point.\n pose: { ...dragged.pose, x: p.x, y: p.y } as TPose,\n origin: p,\n }));\n },\n\n reflowPoses() {\n return new Map();\n },\n\n commitDrop(_container, _children, dragged, target) {\n const to = target === null ? dragged.pose : target.pose;\n return [\n createTransformOp<TPose>({\n id: dragged.id,\n from: dragged.originPose,\n to,\n label: 'Snap drop',\n }),\n ];\n },\n };\n}\n"]}
|
package/dist/insert.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModifierState, InsertBehavior } from '@weasel-js/core';
|
|
2
|
-
import { G as Guide } from './types-
|
|
2
|
+
import { G as Guide } from './types-DRSPiXfk.js';
|
|
3
3
|
|
|
4
4
|
type ModKey$1 = keyof ModifierState;
|
|
5
5
|
/** Insert behavior that rounds the insertion point to a grid, so a shape
|
package/dist/move.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModifierState, MoveBehavior, OriginProjection } from '@weasel-js/core';
|
|
2
|
-
import { G as Guide } from './types-
|
|
2
|
+
import { G as Guide } from './types-DRSPiXfk.js';
|
|
3
3
|
|
|
4
4
|
type ModKey$1 = keyof ModifierState;
|
|
5
5
|
/** Move behavior that snaps the dragged pose's origin to a grid. Hold
|
package/dist/resize.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Bounds, ModifierState, BoundsConstraint } from '@weasel-js/core';
|
|
2
|
-
import { G as Guide } from './types-
|
|
2
|
+
import { G as Guide } from './types-DRSPiXfk.js';
|
|
3
3
|
export { p as pointSnapToGrid } from './pointSnapToGrid-BaVEjV23.js';
|
|
4
4
|
|
|
5
5
|
type ModKey$1 = keyof ModifierState;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guide — a horizontal or vertical world-space line used as a snap target
|
|
3
|
+
* and an optional rendered overlay.
|
|
4
|
+
*
|
|
5
|
+
* `axis === 'x'` means a vertical line at world `x = offset` (snaps the X
|
|
6
|
+
* coordinate); `axis === 'y'` means a horizontal line at world `y = offset`
|
|
7
|
+
* (snaps the Y coordinate). This matches "the X axis snaps along X."
|
|
8
|
+
*/
|
|
9
|
+
interface Guide {
|
|
10
|
+
/** Stable, caller-supplied id. Used by removeGuide and as a render key. */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Which world axis this guide constrains. */
|
|
13
|
+
axis: 'x' | 'y';
|
|
14
|
+
/** World-space offset along the constrained axis. */
|
|
15
|
+
offset: number;
|
|
16
|
+
/** The stretch of the line worth drawing, in world units on the other
|
|
17
|
+
* axis: an `'x'` guide's y range. Derived alignment guides carry the
|
|
18
|
+
* extent of the boxes that produced them. Absent, the line has no extent
|
|
19
|
+
* of its own and `createGuidesLayer` draws it across the canvas. */
|
|
20
|
+
span?: {
|
|
21
|
+
min: number;
|
|
22
|
+
max: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* SpacingGap — one measured gap between two boxes, drawn as an equal-spacing
|
|
27
|
+
* marker. `axis === 'x'` is a horizontal gap from world `x = min` to
|
|
28
|
+
* `x = max`, drawn at `y = at`; `axis === 'y'` is the vertical counterpart.
|
|
29
|
+
*/
|
|
30
|
+
interface SpacingGap {
|
|
31
|
+
axis: 'x' | 'y';
|
|
32
|
+
min: number;
|
|
33
|
+
max: number;
|
|
34
|
+
/** World position on the other axis the marker is drawn at. */
|
|
35
|
+
at: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type { Guide as G, SpacingGap as S };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weasel-js/guides",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Placement aids for weasel: grids, alignment guides, snapping to them, and container layout strategies, built on core's snap and behavior seams.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"react": ">=18",
|
|
32
|
-
"@weasel-js/core": "1.7.
|
|
33
|
-
"@weasel-js/geom": "1.7.
|
|
32
|
+
"@weasel-js/core": "1.7.1",
|
|
33
|
+
"@weasel-js/geom": "1.7.1"
|
|
34
34
|
},
|
|
35
35
|
"author": "orochi235",
|
|
36
36
|
"homepage": "https://orochi235.github.io/weasel/",
|
package/dist/types-D2tTKEU0.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Guide — a horizontal or vertical world-space line used as a snap target
|
|
3
|
-
* and an optional rendered overlay.
|
|
4
|
-
*
|
|
5
|
-
* `axis === 'x'` means a vertical line at world `x = offset` (snaps the X
|
|
6
|
-
* coordinate); `axis === 'y'` means a horizontal line at world `y = offset`
|
|
7
|
-
* (snaps the Y coordinate). This matches "the X axis snaps along X."
|
|
8
|
-
*/
|
|
9
|
-
interface Guide {
|
|
10
|
-
/** Stable, caller-supplied id. Used by removeGuide and as a render key. */
|
|
11
|
-
id: string;
|
|
12
|
-
/** Which world axis this guide constrains. */
|
|
13
|
-
axis: 'x' | 'y';
|
|
14
|
-
/** World-space offset along the constrained axis. */
|
|
15
|
-
offset: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type { Guide as G };
|