{
  "version": 3,
  "sources": ["../../src/core/SvgElement.ts", "../../src/create/types.ts", "../../src/create/createShape.ts", "../../src/elements/GroupElement.ts", "../../src/core/types.ts", "../../src/elements/shapes/RectElement.ts", "../../src/elements/shapes/CircleElement.ts", "../../src/elements/shapes/EllipseElement.ts", "../../src/elements/shapes/LineElement.ts", "../../src/elements/shapes/PolyShapesElement.ts", "../../src/elements/PathElement.ts", "../../src/elements/TextElement.ts", "../../src/elements/ImageElement.ts", "../../src/elements/UseElement.ts", "../../src/factories/ElementFactory.ts", "../../src/core/SvgContainer.ts", "../../src/core/NodeRegistry.ts", "../../src/core/Transformation.ts", "../../src/index.ts", "../../playground/src/log.ts", "../../playground/src/app-state.ts", "../../src/core/SvgElement.ts", "../../src/create/types.ts", "../../src/create/createShape.ts", "../../src/elements/GroupElement.ts", "../../src/core/types.ts", "../../src/elements/shapes/RectElement.ts", "../../src/elements/shapes/CircleElement.ts", "../../src/elements/shapes/EllipseElement.ts", "../../src/elements/shapes/LineElement.ts", "../../src/elements/shapes/PolyShapesElement.ts", "../../src/elements/PathElement.ts", "../../src/elements/TextElement.ts", "../../src/elements/ImageElement.ts", "../../src/elements/UseElement.ts", "../../src/factories/ElementFactory.ts", "../../src/core/SvgContainer.ts", "../../src/core/NodeRegistry.ts", "../../src/index.ts", "../../node_modules/@preact/signals-core/src/index.ts", "../../src/reactive/readable.ts", "../../src/reactive/bindProperty.ts", "../../src/reactive/scheduleBatch.ts", "../../plugins/svg-highlighter/src/ViewportController.ts", "../../plugins/svg-highlighter/src/SvgHighlighter.ts", "../../playground/src/types.ts", "../../plugins/svg-highlighter/playground/src/lessons/01-navigation.ts", "../../plugins/svg-highlighter/playground/src/lessons/02-modes.ts", "../../plugins/svg-highlighter/playground/src/lessons/03-groups.ts", "../../plugins/svg-highlighter/playground/src/lessons/index.ts", "../../plugins/particles/src/pool/ParticlePool.ts", "../../plugins/particles/src/physics/bounds.ts", "../../plugins/particles/src/physics/integrator.ts", "../../plugins/particles/src/state/ParticleState.ts", "../../plugins/particles/src/ParticleField.ts", "../../plugins/particles/playground/src/lessons/shared.ts", "../../plugins/particles/playground/src/lessons/01-bouncing-balls.ts", "../../plugins/particles/playground/src/lessons/02-create-shards.ts", "../../plugins/particles/playground/src/lessons/03-spawn-init.ts", "../../plugins/particles/playground/src/lessons/04-physics-mechanics.ts", "../../plugins/particles/playground/src/lessons/05-lifecycle.ts", "../../plugins/particles/src/spawn/fromPath.ts", "../../plugins/particles/playground/src/lessons/snowflakes.ts", "../../plugins/particles/playground/src/lessons/06-snowfall.ts", "../../plugins/particles/playground/src/lessons/index.ts", "../../playground/src/lessons/01-basics.ts", "../../playground/src/lessons/02-query.ts", "../../playground/src/lessons/03-manipulate.ts", "../../src/reactive/readable.ts", "../../src/reactive/bindProperty.ts", "../../src/reactive/bindTransform.ts", "../../src/reactive/scheduleBatch.ts", "../../playground/src/lessons/04-transforms.ts", "../../playground/src/lessons/05-sync.ts", "../../playground/src/lessons/06-reactive.ts", "../../playground/src/lessons/07-groups.ts", "../../playground/src/lessons/08-highlight.ts", "../../playground/src/lessons/index.ts", "../../playground/src/lessons/plugins/index.ts", "../../playground/src/main.ts"],
  "sourcesContent": ["import { BoundingBox, HighlightOptions, SvgPrimitiveElement, VisualState } from './types';\n\nexport abstract class SvgElement {\n    protected _htmlNode: SvgPrimitiveElement;\n\n    constructor(htmlNode: SvgPrimitiveElement) {\n        this._htmlNode = htmlNode;\n    }\n\n    get htmlNode(): SvgPrimitiveElement {\n        return this._htmlNode;\n    }\n\n    get id(): string {\n        return this._htmlNode.id || '';\n    }\n\n    set id(value: string) {\n        this._htmlNode.id = value;\n    }\n\n    get x(): number {\n        const x = this._htmlNode.getAttribute('x');\n        return x ? parseFloat(x) : 0;\n    }\n\n    set x(value: number) {\n        this._htmlNode.setAttribute('x', value.toString());\n    }\n\n    get y(): number {\n        const y = this._htmlNode.getAttribute('y');\n        return y ? parseFloat(y) : 0;\n    }\n\n    set y(value: number) {\n        this._htmlNode.setAttribute('y', value.toString());\n    }\n\n    get width(): number {\n        const width = this._htmlNode.getAttribute('width');\n        return width ? parseFloat(width) : 0;\n    }\n\n    set width(value: number) {\n        this._htmlNode.setAttribute('width', value.toString());\n    }\n\n    get height(): number {\n        const height = this._htmlNode.getAttribute('height');\n        return height ? parseFloat(height) : 0;\n    }\n\n    set height(value: number) {\n        this._htmlNode.setAttribute('height', value.toString());\n    }\n\n    get fill(): string | null {\n        return this._htmlNode.getAttribute('fill');\n    }\n\n    set fill(value: string | null) {\n        if (value === null) {\n            this._htmlNode.removeAttribute('fill');\n        } else {\n            this._htmlNode.setAttribute('fill', value);\n        }\n    }\n\n    get stroke(): string | null {\n        return this._htmlNode.getAttribute('stroke');\n    }\n\n    set stroke(value: string | null) {\n        if (value === null) {\n            this._htmlNode.removeAttribute('stroke');\n        } else {\n            this._htmlNode.setAttribute('stroke', value);\n        }\n    }\n\n    get strokeWidth(): number {\n        const strokeWidth = this._htmlNode.getAttribute('stroke-width');\n        return strokeWidth ? parseFloat(strokeWidth) : 1;\n    }\n\n    set strokeWidth(value: number) {\n        this._htmlNode.setAttribute('stroke-width', value.toString());\n    }\n\n    get opacity(): number {\n        const opacity = this._htmlNode.getAttribute('opacity');\n        return opacity ? parseFloat(opacity) : 1;\n    }\n\n    set opacity(value: number) {\n        const str = value.toString();\n        if (this._htmlNode.getAttribute('opacity') === str) {\n            return;\n        }\n        this._htmlNode.setAttribute('opacity', str);\n    }\n\n    get transform(): string | null {\n        return this._htmlNode.getAttribute('transform');\n    }\n\n    set transform(value: string | null) {\n        if (value === null || value === '') {\n            if (!this._htmlNode.hasAttribute('transform')) {\n                return;\n            }\n            this._htmlNode.removeAttribute('transform');\n            return;\n        }\n        if (this._htmlNode.getAttribute('transform') === value) {\n            return;\n        }\n        this._htmlNode.setAttribute('transform', value);\n    }\n\n    get style(): CSSStyleDeclaration {\n        return this._htmlNode.style;\n    }\n\n    moveTo(x: number, y: number): void {\n        this.x = x;\n        this.y = y;\n    }\n\n    resize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n    }\n\n    translate(dx: number, dy: number): void {\n        const currentTransform = this.transform || '';\n        this.transform = `translate(${dx}, ${dy}) ${currentTransform}`.trim();\n    }\n\n    rotate(angle: number, cx = 0, cy = 0): void {\n        const currentTransform = this.transform || '';\n        if (cx === 0 && cy === 0) {\n            this.transform = `rotate(${angle}) ${currentTransform}`.trim();\n        } else {\n            this.transform = `rotate(${angle}, ${cx}, ${cy}) ${currentTransform}`.trim();\n        }\n    }\n\n    scale(sx: number, sy?: number): void {\n        const syValue = sy ?? sx;\n        const currentTransform = this.transform || '';\n        this.transform = `scale(${sx}, ${syValue}) ${currentTransform}`.trim();\n    }\n\n    /** Scale around pivot (cx, cy) \u2014 shape grows in place without origin drift. */\n    scaleAt(sx: number, sy: number, cx: number, cy: number): void {\n        this.translate(-cx, -cy);\n        this.scale(sx, sy);\n        this.translate(cx, cy);\n    }\n\n    captureVisualState(): VisualState {\n        return {\n            fill: this._htmlNode.getAttribute('fill'),\n            stroke: this._htmlNode.getAttribute('stroke'),\n            strokeWidth: this._htmlNode.getAttribute('stroke-width'),\n            opacity: this._htmlNode.getAttribute('opacity'),\n        };\n    }\n\n    applyVisualState(state: VisualState): void {\n        if (state.fill === null) {\n            this._htmlNode.removeAttribute('fill');\n        } else {\n            this._htmlNode.setAttribute('fill', state.fill);\n        }\n\n        if (state.stroke === null) {\n            this._htmlNode.removeAttribute('stroke');\n        } else {\n            this._htmlNode.setAttribute('stroke', state.stroke);\n        }\n\n        if (state.strokeWidth === null) {\n            this._htmlNode.removeAttribute('stroke-width');\n        } else {\n            this._htmlNode.setAttribute('stroke-width', state.strokeWidth);\n        }\n\n        if (state.opacity === null) {\n            this._htmlNode.removeAttribute('opacity');\n        } else {\n            this._htmlNode.setAttribute('opacity', state.opacity);\n        }\n    }\n\n    applyHighlight(options: HighlightOptions): VisualState {\n        const previous = this.captureVisualState();\n\n        if (options.fill !== undefined) {\n            this.fill = options.fill;\n        }\n\n        if (options.stroke !== undefined) {\n            this.stroke = options.stroke;\n        }\n\n        if (options.strokeWidth !== undefined) {\n            this.strokeWidth = options.strokeWidth;\n        } else if (options.strokeWidthBoost !== undefined) {\n            this.strokeWidth = this.strokeWidth + options.strokeWidthBoost;\n        }\n\n        if (options.opacity !== undefined) {\n            this.opacity = options.opacity;\n        }\n\n        return previous;\n    }\n\n    clearHighlight(previousState: VisualState): void {\n        this.applyVisualState(previousState);\n    }\n\n    getBoundingBox(): BoundingBox {\n        const graphicsElement = this._htmlNode as SVGGraphicsElement;\n        if (typeof graphicsElement.getBBox !== 'function') {\n            return { x: 0, y: 0, width: 0, height: 0 };\n        }\n        const bbox = graphicsElement.getBBox();\n        return {\n            x: bbox.x,\n            y: bbox.y,\n            width: bbox.width,\n            height: bbox.height,\n        };\n    }\n\n    remove(): void {\n        this._htmlNode.remove();\n    }\n\n    addClass(className: string): void {\n        this._htmlNode.classList.add(className);\n    }\n\n    removeClass(className: string): void {\n        this._htmlNode.classList.remove(className);\n    }\n\n    hasClass(className: string): boolean {\n        return this._htmlNode.classList.contains(className);\n    }\n\n    toggleClass(className: string): void {\n        this._htmlNode.classList.toggle(className);\n    }\n\n    setAttribute(name: string, value: string): void {\n        this._htmlNode.setAttribute(name, value);\n    }\n\n    getAttribute(name: string): string | null {\n        return this._htmlNode.getAttribute(name);\n    }\n\n    removeAttribute(name: string): void {\n        this._htmlNode.removeAttribute(name);\n    }\n}\n", "import type { CircleElement } from '../elements/shapes/CircleElement';\nimport type { EllipseElement } from '../elements/shapes/EllipseElement';\nimport type { LineElement } from '../elements/shapes/LineElement';\nimport type { PolygonElement, PolylineElement } from '../elements/shapes/PolyShapesElement';\nimport type { RectElement } from '../elements/shapes/RectElement';\nimport type { PathElement } from '../elements/PathElement';\nimport type { GroupElement } from '../elements/GroupElement';\nimport type { Point } from '../core/types';\n\nexport type ShapeKind = 'rect' | 'circle' | 'ellipse' | 'line' | 'polygon' | 'polyline' | 'path';\n\nexport interface CreateShapeBase {\n    id?: string;\n    fill?: string;\n    stroke?: string;\n    strokeWidth?: number;\n    opacity?: number;\n    className?: string;\n    parent?: GroupElement;\n}\n\nexport interface CreateRectOptions extends CreateShapeBase {\n    x?: number;\n    y?: number;\n    width?: number;\n    height?: number;\n    rx?: number;\n    ry?: number;\n}\n\nexport interface CreateCircleOptions extends CreateShapeBase {\n    cx?: number;\n    cy?: number;\n    r?: number;\n}\n\nexport interface CreateEllipseOptions extends CreateShapeBase {\n    cx?: number;\n    cy?: number;\n    rx?: number;\n    ry?: number;\n}\n\nexport interface CreateLineOptions extends CreateShapeBase {\n    x1?: number;\n    y1?: number;\n    x2?: number;\n    y2?: number;\n}\n\nexport type PointsInput = string | Point[] | number[];\n\nexport interface CreatePolygonOptions extends CreateShapeBase {\n    points?: PointsInput;\n}\n\nexport interface CreatePolylineOptions extends CreateShapeBase {\n    points?: PointsInput;\n}\n\nexport interface CreatePathOptions extends CreateShapeBase {\n    d?: string;\n}\n\nexport type CreateOptionsFor<K extends ShapeKind> = K extends 'rect'\n    ? CreateRectOptions\n    : K extends 'circle'\n      ? CreateCircleOptions\n      : K extends 'ellipse'\n        ? CreateEllipseOptions\n        : K extends 'line'\n          ? CreateLineOptions\n          : K extends 'polygon'\n            ? CreatePolygonOptions\n            : K extends 'polyline'\n              ? CreatePolylineOptions\n              : K extends 'path'\n                ? CreatePathOptions\n                : never;\n\nexport type ShardTypeFor<K extends ShapeKind> = K extends 'rect'\n    ? RectElement\n    : K extends 'circle'\n      ? CircleElement\n      : K extends 'ellipse'\n        ? EllipseElement\n        : K extends 'line'\n          ? LineElement\n          : K extends 'polygon'\n            ? PolygonElement\n            : K extends 'polyline'\n              ? PolylineElement\n              : K extends 'path'\n                ? PathElement\n                : never;\n\nexport const SHAPE_KIND_TO_TAG: Record<ShapeKind, string> = {\n    rect: 'rect',\n    circle: 'circle',\n    ellipse: 'ellipse',\n    line: 'line',\n    polygon: 'polygon',\n    polyline: 'polyline',\n    path: 'path',\n};\n", "import type { Point } from '../core/types';\nimport type {\n    CreateCircleOptions,\n    CreateEllipseOptions,\n    CreateLineOptions,\n    CreatePathOptions,\n    CreatePolygonOptions,\n    CreatePolylineOptions,\n    CreateRectOptions,\n    CreateShapeBase,\n    PointsInput,\n    ShapeKind,\n} from './types';\nimport { SHAPE_KIND_TO_TAG } from './types';\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\nexport function formatPoints(points: PointsInput): string {\n    if (typeof points === 'string') {\n        return points;\n    }\n\n    if (Array.isArray(points) && points.length > 0 && typeof points[0] === 'number') {\n        return (points as number[]).join(' ');\n    }\n\n    return (points as Point[]).map((p) => `${p.x},${p.y}`).join(' ');\n}\n\nexport function applyBaseAttrs(node: SVGElement, options: CreateShapeBase): void {\n    if (options.id !== undefined) {\n        node.id = options.id;\n    }\n\n    if (options.fill !== undefined) {\n        node.setAttribute('fill', options.fill);\n    }\n\n    if (options.stroke !== undefined) {\n        node.setAttribute('stroke', options.stroke);\n    }\n\n    if (options.strokeWidth !== undefined) {\n        node.setAttribute('stroke-width', options.strokeWidth.toString());\n    }\n\n    if (options.opacity !== undefined) {\n        node.setAttribute('opacity', options.opacity.toString());\n    }\n\n    if (options.className !== undefined) {\n        node.setAttribute('class', options.className);\n    }\n}\n\nfunction setNumericAttr(node: SVGElement, name: string, value: number | undefined): void {\n    if (value !== undefined) {\n        node.setAttribute(name, value.toString());\n    }\n}\n\nexport function buildShapeNode(kind: ShapeKind, options: CreateShapeBase): SVGElement {\n    const tag = SHAPE_KIND_TO_TAG[kind];\n    const node = document.createElementNS(SVG_NS, tag);\n    applyBaseAttrs(node, options);\n\n    switch (kind) {\n        case 'rect': {\n            const opts = options as CreateRectOptions;\n            setNumericAttr(node, 'x', opts.x);\n            setNumericAttr(node, 'y', opts.y);\n            setNumericAttr(node, 'width', opts.width);\n            setNumericAttr(node, 'height', opts.height);\n            setNumericAttr(node, 'rx', opts.rx);\n            setNumericAttr(node, 'ry', opts.ry);\n            break;\n        }\n        case 'circle': {\n            const opts = options as CreateCircleOptions;\n            setNumericAttr(node, 'cx', opts.cx);\n            setNumericAttr(node, 'cy', opts.cy);\n            setNumericAttr(node, 'r', opts.r);\n            break;\n        }\n        case 'ellipse': {\n            const opts = options as CreateEllipseOptions;\n            setNumericAttr(node, 'cx', opts.cx);\n            setNumericAttr(node, 'cy', opts.cy);\n            setNumericAttr(node, 'rx', opts.rx);\n            setNumericAttr(node, 'ry', opts.ry);\n            break;\n        }\n        case 'line': {\n            const opts = options as CreateLineOptions;\n            setNumericAttr(node, 'x1', opts.x1);\n            setNumericAttr(node, 'y1', opts.y1);\n            setNumericAttr(node, 'x2', opts.x2);\n            setNumericAttr(node, 'y2', opts.y2);\n            break;\n        }\n        case 'polygon': {\n            const opts = options as CreatePolygonOptions;\n            if (opts.points !== undefined) {\n                node.setAttribute('points', formatPoints(opts.points));\n            }\n            break;\n        }\n        case 'polyline': {\n            const opts = options as CreatePolylineOptions;\n            if (opts.points !== undefined) {\n                node.setAttribute('points', formatPoints(opts.points));\n            }\n            break;\n        }\n        case 'path': {\n            const opts = options as CreatePathOptions;\n            if (opts.d !== undefined) {\n                node.setAttribute('d', opts.d);\n            }\n            break;\n        }\n    }\n\n    return node;\n}\n", "import { SvgElement } from '../core/SvgElement';\nimport type { SvgElementUnion } from '../core/types';\n\nexport class GroupElement extends SvgElement {\n    private _children: SvgElementUnion[] = [];\n\n    constructor(htmlNode: SVGGElement) {\n        super(htmlNode);\n    }\n\n    get children(): SvgElementUnion[] {\n        return this._children;\n    }\n\n    /** @internal Populated during parse \u2014 do not call directly */\n    syncChildrenFromParse(children: SvgElementUnion[]): void {\n        this._children = children;\n    }\n\n    addChild(element: SvgElementUnion): void {\n        this._children.push(element);\n        this.htmlNode.appendChild(element.htmlNode);\n    }\n\n    /** Link an already-appended child shard (used by programmatic create). */\n    adoptChild(element: SvgElementUnion): void {\n        if (!this._children.includes(element)) {\n            this._children.push(element);\n        }\n    }\n\n    removeChild(element: SvgElementUnion): void {\n        const index = this._children.indexOf(element);\n        if (index > -1) {\n            this._children.splice(index, 1);\n        }\n        element.htmlNode.remove();\n    }\n}\n", "import type { CircleElement } from '../elements/shapes/CircleElement';\nimport type { EllipseElement } from '../elements/shapes/EllipseElement';\nimport type { LineElement } from '../elements/shapes/LineElement';\nimport type { RectElement } from '../elements/shapes/RectElement';\nimport type { PolygonElement, PolylineElement } from '../elements/shapes/PolyShapesElement';\nimport type { GroupElement } from '../elements/GroupElement';\nimport type { ImageElement } from '../elements/ImageElement';\nimport type { PathElement } from '../elements/PathElement';\nimport type { TextElement } from '../elements/TextElement';\nimport type { UseElement } from '../elements/UseElement';\n\nexport type SvgPrimitiveElement = SVGSVGElement | SVGElement;\n\nexport enum SvgElementType {\n    SVG = 'svg',\n    RECT = 'rect',\n    CIRCLE = 'circle',\n    ELLIPSE = 'ellipse',\n    LINE = 'line',\n    POLYGON = 'polygon',\n    POLYLINE = 'polyline',\n    PATH = 'path',\n    TEXT = 'text',\n    IMAGE = 'image',\n    GROUP = 'g',\n    USE = 'use',\n    DEFS = 'defs',\n    CLIP_PATH = 'clipPath',\n    MASK = 'mask',\n    PATTERN = 'pattern',\n    SYMBOL = 'symbol',\n    MARKER = 'marker',\n}\n\nexport interface SvgElementMap {\n    rect: RectElement[];\n    circle: CircleElement[];\n    ellipse: EllipseElement[];\n    line: LineElement[];\n    polygon: PolygonElement[];\n    polyline: PolylineElement[];\n    path: PathElement[];\n    text: TextElement[];\n    image: ImageElement[];\n    group: GroupElement[];\n    use: UseElement[];\n}\n\nexport type SvgElementTypeKey = keyof SvgElementMap;\n\nexport type SvgElementUnion = SvgElementMap[SvgElementTypeKey][number];\n\nexport interface SvgElementEntry {\n    type: SvgElementTypeKey;\n    element: SvgElementUnion;\n    label: string;\n}\n\nexport interface Point {\n    x: number;\n    y: number;\n}\n\nexport interface Size {\n    width: number;\n    height: number;\n}\n\nexport interface BoundingBox {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n}\n\nexport interface VisualState {\n    fill: string | null;\n    stroke: string | null;\n    strokeWidth: string | null;\n    opacity: string | null;\n}\n\nexport interface HighlightOptions {\n    fill?: string;\n    stroke?: string;\n    strokeWidth?: number;\n    strokeWidthBoost?: number;\n    opacity?: number;\n}\n\nexport const TAG_TO_MAP_KEY: Record<string, SvgElementTypeKey> = {\n    rect: 'rect',\n    circle: 'circle',\n    ellipse: 'ellipse',\n    line: 'line',\n    polygon: 'polygon',\n    polyline: 'polyline',\n    path: 'path',\n    text: 'text',\n    image: 'image',\n    g: 'group',\n    use: 'use',\n};\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class RectElement extends SvgElement {\n    constructor(htmlNode: SVGRectElement) {\n        super(htmlNode);\n    }\n\n    get rx(): number {\n        const rx = this.htmlNode.getAttribute('rx');\n        return rx ? parseFloat(rx) : 0;\n    }\n\n    set rx(value: number) {\n        this.htmlNode.setAttribute('rx', value.toString());\n    }\n\n    get ry(): number {\n        const ry = this.htmlNode.getAttribute('ry');\n        return ry ? parseFloat(ry) : 0;\n    }\n\n    set ry(value: number) {\n        this.htmlNode.setAttribute('ry', value.toString());\n    }\n\n    round(rx: number, ry?: number): void {\n        this.rx = rx;\n        if (ry !== undefined) {\n            this.ry = ry;\n        }\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class CircleElement extends SvgElement {\n    constructor(htmlNode: SVGCircleElement) {\n        super(htmlNode);\n    }\n\n    get cx(): number {\n        const cx = this.htmlNode.getAttribute('cx');\n        return cx ? parseFloat(cx) : 0;\n    }\n\n    set cx(value: number) {\n        const str = value.toString();\n        if (this.htmlNode.getAttribute('cx') === str) {\n            return;\n        }\n        this.htmlNode.setAttribute('cx', str);\n    }\n\n    get cy(): number {\n        const cy = this.htmlNode.getAttribute('cy');\n        return cy ? parseFloat(cy) : 0;\n    }\n\n    set cy(value: number) {\n        const str = value.toString();\n        if (this.htmlNode.getAttribute('cy') === str) {\n            return;\n        }\n        this.htmlNode.setAttribute('cy', str);\n    }\n\n    get r(): number {\n        const r = this.htmlNode.getAttribute('r');\n        return r ? parseFloat(r) : 0;\n    }\n\n    set r(value: number) {\n        this.htmlNode.setAttribute('r', value.toString());\n    }\n\n    get radius(): number {\n        return this.r;\n    }\n\n    set radius(value: number) {\n        this.r = value;\n    }\n\n    moveTo(x: number, y: number): void {\n        this.cx = x;\n        this.cy = y;\n    }\n\n    resize(radius: number): void {\n        this.r = radius;\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class EllipseElement extends SvgElement {\n    constructor(htmlNode: SVGEllipseElement) {\n        super(htmlNode);\n    }\n\n    get cx(): number {\n        const cx = this.htmlNode.getAttribute('cx');\n        return cx ? parseFloat(cx) : 0;\n    }\n\n    set cx(value: number) {\n        this.htmlNode.setAttribute('cx', value.toString());\n    }\n\n    get cy(): number {\n        const cy = this.htmlNode.getAttribute('cy');\n        return cy ? parseFloat(cy) : 0;\n    }\n\n    set cy(value: number) {\n        this.htmlNode.setAttribute('cy', value.toString());\n    }\n\n    get rx(): number {\n        const rx = this.htmlNode.getAttribute('rx');\n        return rx ? parseFloat(rx) : 0;\n    }\n\n    set rx(value: number) {\n        this.htmlNode.setAttribute('rx', value.toString());\n    }\n\n    get ry(): number {\n        const ry = this.htmlNode.getAttribute('ry');\n        return ry ? parseFloat(ry) : 0;\n    }\n\n    set ry(value: number) {\n        this.htmlNode.setAttribute('ry', value.toString());\n    }\n\n    moveTo(x: number, y: number): void {\n        this.cx = x;\n        this.cy = y;\n    }\n\n    resize(radiusX: number, radiusY?: number): void {\n        this.rx = radiusX;\n        if (radiusY !== undefined) {\n            this.ry = radiusY;\n        }\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class LineElement extends SvgElement {\n    constructor(htmlNode: SVGLineElement) {\n        super(htmlNode);\n    }\n\n    get x1(): number {\n        const x1 = this.htmlNode.getAttribute('x1');\n        return x1 ? parseFloat(x1) : 0;\n    }\n\n    set x1(value: number) {\n        this.htmlNode.setAttribute('x1', value.toString());\n    }\n\n    get y1(): number {\n        const y1 = this.htmlNode.getAttribute('y1');\n        return y1 ? parseFloat(y1) : 0;\n    }\n\n    set y1(value: number) {\n        this.htmlNode.setAttribute('y1', value.toString());\n    }\n\n    get x2(): number {\n        const x2 = this.htmlNode.getAttribute('x2');\n        return x2 ? parseFloat(x2) : 0;\n    }\n\n    set x2(value: number) {\n        this.htmlNode.setAttribute('x2', value.toString());\n    }\n\n    get y2(): number {\n        const y2 = this.htmlNode.getAttribute('y2');\n        return y2 ? parseFloat(y2) : 0;\n    }\n\n    set y2(value: number) {\n        this.htmlNode.setAttribute('y2', value.toString());\n    }\n\n    moveTo(x: number, y: number): void {\n        const dx = x - this.x1;\n        const dy = y - this.y1;\n        this.x1 = x;\n        this.y1 = y;\n        this.x2 += dx;\n        this.y2 += dy;\n    }\n\n    resize(length: number): void {\n        const currentLength = Math.sqrt(Math.pow(this.x2 - this.x1, 2) + Math.pow(this.y2 - this.y1, 2));\n        const ratio = currentLength > 0 ? length / currentLength : 1;\n        const centerX = (this.x1 + this.x2) / 2;\n        const centerY = (this.y1 + this.y2) / 2;\n        this.x1 = centerX + (this.x1 - centerX) * ratio;\n        this.y1 = centerY + (this.y1 - centerY) * ratio;\n        this.x2 = centerX + (this.x2 - centerX) * ratio;\n        this.y2 = centerY + (this.y2 - centerY) * ratio;\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class PolygonElement extends SvgElement {\n    constructor(htmlNode: SVGPolygonElement) {\n        super(htmlNode);\n    }\n\n    get points(): string {\n        return this.htmlNode.getAttribute('points') || '';\n    }\n\n    set points(value: string) {\n        this.htmlNode.setAttribute('points', value);\n    }\n\n    get pointsArray(): number[] {\n        const points = this.points\n            .trim()\n            .split(/[\\s,]+/)\n            .map(Number);\n        return points.filter((n) => !isNaN(n));\n    }\n\n    set pointsArray(value: number[]) {\n        this.points = value.join(' ');\n    }\n}\n\nexport class PolylineElement extends SvgElement {\n    constructor(htmlNode: SVGPolylineElement) {\n        super(htmlNode);\n    }\n\n    get points(): string {\n        return this.htmlNode.getAttribute('points') || '';\n    }\n\n    set points(value: string) {\n        this.htmlNode.setAttribute('points', value);\n    }\n\n    get pointsArray(): number[] {\n        const points = this.points\n            .trim()\n            .split(/[\\s,]+/)\n            .map(Number);\n        return points.filter((n) => !isNaN(n));\n    }\n\n    set pointsArray(value: number[]) {\n        this.points = value.join(' ');\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nexport class PathElement extends SvgElement {\n    private _geometry: SVGGeometryElement;\n\n    constructor(htmlNode: SVGPathElement) {\n        super(htmlNode);\n        this._geometry = htmlNode;\n    }\n\n    get d(): string {\n        return this.htmlNode.getAttribute('d') || '';\n    }\n\n    set d(value: string) {\n        this.htmlNode.setAttribute('d', value);\n    }\n\n    get pathLength(): number {\n        return this._geometry.getTotalLength();\n    }\n\n    getPointAtLength(distance: number): DOMPoint {\n        return this._geometry.getPointAtLength(distance);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nexport class TextElement extends SvgElement {\n    constructor(htmlNode: SVGTextElement) {\n        super(htmlNode);\n    }\n\n    get textContentValue(): string {\n        return this.htmlNode.textContent || '';\n    }\n\n    set textContentValue(value: string) {\n        this.htmlNode.textContent = value;\n    }\n\n    get fontSize(): string {\n        return this.htmlNode.getAttribute('font-size') || '16px';\n    }\n\n    set fontSize(value: string) {\n        this.htmlNode.setAttribute('font-size', value);\n    }\n\n    get fontFamily(): string {\n        return this.htmlNode.getAttribute('font-family') || 'sans-serif';\n    }\n\n    set fontFamily(value: string) {\n        this.htmlNode.setAttribute('font-family', value);\n    }\n\n    get fontWeight(): string {\n        return this.htmlNode.getAttribute('font-weight') || 'normal';\n    }\n\n    set fontWeight(value: string) {\n        this.htmlNode.setAttribute('font-weight', value);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nfunction readHref(node: Element): string | null {\n    return node.getAttribute('href') ?? node.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n}\n\nfunction writeHref(node: Element, value: string | null): void {\n    if (value === null) {\n        node.removeAttribute('href');\n        node.removeAttributeNS('http://www.w3.org/1999/xlink', 'href');\n        return;\n    }\n\n    node.setAttribute('href', value);\n}\n\nexport class ImageElement extends SvgElement {\n    constructor(htmlNode: SVGImageElement) {\n        super(htmlNode);\n    }\n\n    get href(): string | null {\n        return readHref(this.htmlNode);\n    }\n\n    set href(value: string | null) {\n        writeHref(this.htmlNode, value);\n    }\n\n    get preserveAspectRatio(): string {\n        return this.htmlNode.getAttribute('preserveAspectRatio') || 'xMidYMid meet';\n    }\n\n    set preserveAspectRatio(value: string) {\n        this.htmlNode.setAttribute('preserveAspectRatio', value);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nfunction readHref(node: Element): string | null {\n    return node.getAttribute('href') ?? node.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n}\n\nfunction writeHref(node: Element, value: string | null): void {\n    if (value === null) {\n        node.removeAttribute('href');\n        node.removeAttributeNS('http://www.w3.org/1999/xlink', 'href');\n        return;\n    }\n\n    node.setAttribute('href', value);\n}\n\nexport class UseElement extends SvgElement {\n    constructor(htmlNode: SVGUseElement) {\n        super(htmlNode);\n    }\n\n    get href(): string | null {\n        return readHref(this.htmlNode);\n    }\n\n    set href(value: string | null) {\n        writeHref(this.htmlNode, value);\n    }\n}\n", "import { NodeRegistry } from '../core/NodeRegistry';\nimport { SvgElementMap, SvgElementType, TAG_TO_MAP_KEY } from '../core/types';\nimport {\n    RectElement,\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PolygonElement,\n    PolylineElement,\n    PathElement,\n    TextElement,\n    ImageElement,\n    GroupElement,\n    UseElement,\n} from '../elements';\n\nexport type ParsedSvgElement =\n    | RectElement\n    | CircleElement\n    | EllipseElement\n    | LineElement\n    | PolygonElement\n    | PolylineElement\n    | PathElement\n    | TextElement\n    | ImageElement\n    | GroupElement\n    | UseElement;\n\nfunction createEmptyMap(): SvgElementMap {\n    return {\n        rect: [],\n        circle: [],\n        ellipse: [],\n        line: [],\n        polygon: [],\n        polyline: [],\n        path: [],\n        text: [],\n        image: [],\n        group: [],\n        use: [],\n    };\n}\n\nexport class ElementFactory {\n    static createElementFromNode(node: Element): ParsedSvgElement | null {\n        const tagName = node.tagName.toLowerCase();\n\n        switch (tagName) {\n            case SvgElementType.RECT:\n                return new RectElement(node as SVGRectElement);\n            case SvgElementType.CIRCLE:\n                return new CircleElement(node as SVGCircleElement);\n            case SvgElementType.ELLIPSE:\n                return new EllipseElement(node as SVGEllipseElement);\n            case SvgElementType.LINE:\n                return new LineElement(node as SVGLineElement);\n            case SvgElementType.POLYGON:\n                return new PolygonElement(node as SVGPolygonElement);\n            case SvgElementType.POLYLINE:\n                return new PolylineElement(node as SVGPolylineElement);\n            case SvgElementType.PATH:\n                return new PathElement(node as SVGPathElement);\n            case SvgElementType.TEXT:\n                return new TextElement(node as SVGTextElement);\n            case SvgElementType.IMAGE:\n                return new ImageElement(node as SVGImageElement);\n            case SvgElementType.GROUP:\n                return new GroupElement(node as SVGGElement);\n            case SvgElementType.USE:\n                return new UseElement(node as SVGUseElement);\n            default:\n                return null;\n        }\n    }\n\n    static parseSvgElement(svgNode: SVGSVGElement, registry: NodeRegistry): SvgElementMap {\n        const elements = createEmptyMap();\n        const descendants = svgNode.querySelectorAll('*');\n\n        descendants.forEach((node) => {\n            const element = registry.getOrCreate(node);\n            if (!element) {\n                return;\n            }\n\n            const mapKey = TAG_TO_MAP_KEY[node.tagName.toLowerCase()];\n            if (mapKey) {\n                elements[mapKey].push(element as never);\n            }\n        });\n\n        this.populateGroupChildren(elements, registry);\n\n        return elements;\n    }\n\n    private static populateGroupChildren(elements: SvgElementMap, registry: NodeRegistry): void {\n        for (const group of elements.group) {\n            const children: ParsedSvgElement[] = [];\n\n            for (const childNode of Array.from(group.htmlNode.children)) {\n                const child = registry.get(childNode);\n                if (child) {\n                    children.push(child);\n                }\n            }\n\n            group.syncChildrenFromParse(children);\n        }\n    }\n}\n", "import {\n    buildShapeNode,\n    type CreateCircleOptions,\n    type CreateEllipseOptions,\n    type CreateLineOptions,\n    type CreateOptionsFor,\n    type CreatePathOptions,\n    type CreatePolygonOptions,\n    type CreatePolylineOptions,\n    type CreateRectOptions,\n    type ShapeKind,\n    type ShardTypeFor,\n} from '../create';\nimport { GroupElement } from '../elements/GroupElement';\nimport type {\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PathElement,\n    PolygonElement,\n    PolylineElement,\n    RectElement,\n} from '../elements';\nimport { ElementFactory } from '../factories/ElementFactory';\nimport { SvgElement } from './SvgElement';\nimport { AutoRefreshOptions, CreateSvgShardsOptions } from './options';\nimport { NodeRegistry } from './NodeRegistry';\nimport { SvgElementEntry, SvgElementMap, SvgElementTypeKey, SvgElementUnion, TAG_TO_MAP_KEY } from './types';\n\nconst TYPE_ORDER: SvgElementTypeKey[] = [\n    'rect',\n    'circle',\n    'ellipse',\n    'line',\n    'polygon',\n    'polyline',\n    'path',\n    'text',\n    'image',\n    'group',\n    'use',\n];\n\nexport class SvgContainer {\n    private _htmlNode: SVGSVGElement;\n    private _elements: SvgElementMap;\n    private _registry: NodeRegistry;\n    private _observer: MutationObserver | null = null;\n    private _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n    private _observeDebounceMs: number;\n    private _onAfterRefresh: (() => void) | null = null;\n\n    constructor(\n        htmlNode: SVGSVGElement,\n        elements: SvgElementMap,\n        registry: NodeRegistry,\n        options?: CreateSvgShardsOptions,\n    ) {\n        this._htmlNode = htmlNode;\n        this._elements = elements;\n        this._registry = registry;\n        this._observeDebounceMs = options?.observeDebounceMs ?? 16;\n\n        if (options?.observe) {\n            this.enableAutoRefresh({ debounceMs: this._observeDebounceMs });\n        }\n    }\n\n    get htmlNode(): SVGSVGElement {\n        return this._htmlNode;\n    }\n\n    get elements(): SvgElementMap {\n        return this._elements;\n    }\n\n    get registry(): NodeRegistry {\n        return this._registry;\n    }\n\n    get width(): number {\n        return this._htmlNode.clientWidth || this._htmlNode.viewBox?.baseVal?.width || 0;\n    }\n\n    get height(): number {\n        return this._htmlNode.clientHeight || this._htmlNode.viewBox?.baseVal?.height || 0;\n    }\n\n    get viewBox(): DOMRectReadOnly {\n        return (\n            this._htmlNode.viewBox?.baseVal ||\n            ({ x: 0, y: 0, width: this.width, height: this.height } as DOMRectReadOnly)\n        );\n    }\n\n    getByType<K extends SvgElementTypeKey>(type: K): SvgElementMap[K] {\n        return this._elements[type];\n    }\n\n    getById(id: string): SvgElement | null {\n        const node = this._htmlNode.getElementById(id);\n        if (!node) {\n            return null;\n        }\n\n        const existing = this.findInMap(node);\n        if (existing) {\n            return existing;\n        }\n\n        return this.wrapAndRegister(node);\n    }\n\n    query(selector: string): SvgElement[] {\n        const nodes = this._htmlNode.querySelectorAll(selector);\n        const results: SvgElement[] = [];\n\n        nodes.forEach((node) => {\n            const shard = this.wrapAndRegister(node);\n            if (shard) {\n                results.push(shard);\n            }\n        });\n\n        return results;\n    }\n\n    queryOne(selector: string): SvgElement | null {\n        const node = this._htmlNode.querySelector(selector);\n        if (!node) {\n            return null;\n        }\n\n        return this.wrapAndRegister(node);\n    }\n\n    getAll(): SvgElementEntry[] {\n        const entries: SvgElementEntry[] = [];\n        const counters: Partial<Record<SvgElementTypeKey, number>> = {};\n\n        for (const type of TYPE_ORDER) {\n            for (const element of this._elements[type]) {\n                const index = (counters[type] ?? 0) + 1;\n                counters[type] = index;\n                const id = element.id;\n                entries.push({\n                    type,\n                    element,\n                    label: id || `${type} #${index}`,\n                });\n            }\n        }\n\n        return entries;\n    }\n\n    refresh(): void {\n        this._elements = ElementFactory.parseSvgElement(this._htmlNode, this._registry);\n        this._onAfterRefresh?.();\n    }\n\n    /** Called after every refresh \u2014 manual or observer-triggered. */\n    onAfterRefresh(callback: (() => void) | null): void {\n        this._onAfterRefresh = callback;\n    }\n\n    enableAutoRefresh(options?: AutoRefreshOptions): void {\n        if (options?.debounceMs !== undefined) {\n            this._observeDebounceMs = options.debounceMs;\n        }\n\n        if (this._observer) {\n            return;\n        }\n\n        this._observer = new MutationObserver(() => {\n            this.scheduleRefresh();\n        });\n\n        this._observer.observe(this._htmlNode, {\n            childList: true,\n            subtree: true,\n            attributes: true,\n        });\n    }\n\n    disableAutoRefresh(): void {\n        if (this._refreshTimer !== null) {\n            clearTimeout(this._refreshTimer);\n            this._refreshTimer = null;\n        }\n\n        this._observer?.disconnect();\n        this._observer = null;\n    }\n\n    createRect(options: CreateRectOptions = {}): RectElement {\n        return this.createShape('rect', options);\n    }\n\n    createCircle(options: CreateCircleOptions = {}): CircleElement {\n        return this.createShape('circle', options);\n    }\n\n    createEllipse(options: CreateEllipseOptions = {}): EllipseElement {\n        return this.createShape('ellipse', options);\n    }\n\n    createLine(options: CreateLineOptions = {}): LineElement {\n        return this.createShape('line', options);\n    }\n\n    createPolygon(options: CreatePolygonOptions = {}): PolygonElement {\n        return this.createShape('polygon', options);\n    }\n\n    createPolyline(options: CreatePolylineOptions = {}): PolylineElement {\n        return this.createShape('polyline', options);\n    }\n\n    createPath(options: CreatePathOptions = {}): PathElement {\n        return this.createShape('path', options);\n    }\n\n    createMany<K extends ShapeKind>(\n        kind: K,\n        count: number,\n        factory: (index: number) => CreateOptionsFor<K>,\n    ): ShardTypeFor<K>[] {\n        if (count < 0) {\n            throw new RangeError('createMany count must be non-negative');\n        }\n\n        if (count === 0) {\n            return [];\n        }\n\n        const first = factory(0);\n        const parentGroup = first.parent;\n        const parentNode = this.resolveParentNode(parentGroup);\n        const fragment = document.createDocumentFragment();\n        const nodes: SVGElement[] = [];\n\n        for (let i = 0; i < count; i++) {\n            const options = factory(i);\n            const node = buildShapeNode(kind, options);\n            fragment.appendChild(node);\n            nodes.push(node);\n        }\n\n        parentNode.appendChild(fragment);\n\n        const shards: ShardTypeFor<K>[] = [];\n        for (const node of nodes) {\n            const shard = this.registerNode(node) as ShardTypeFor<K>;\n            shards.push(shard);\n            if (parentGroup) {\n                parentGroup.adoptChild(shard);\n            }\n        }\n\n        return shards;\n    }\n\n    registerNode(node: Element): SvgElement | null {\n        return this.wrapAndRegister(node);\n    }\n\n    removeShard(shard: SvgElement): void {\n        const mapKey = TAG_TO_MAP_KEY[shard.htmlNode.tagName.toLowerCase()];\n        if (mapKey) {\n            const bucket = this._elements[mapKey];\n            const idx = bucket.indexOf(shard as never);\n            if (idx > -1) {\n                bucket.splice(idx, 1);\n            }\n        }\n\n        const parentNode = shard.htmlNode.parentNode;\n        if (parentNode instanceof Element) {\n            const parentShard = this._registry.get(parentNode);\n            if (parentShard instanceof GroupElement) {\n                parentShard.removeChild(shard as SvgElementUnion);\n                return;\n            }\n        }\n\n        shard.htmlNode.remove();\n    }\n\n    private createShape<K extends ShapeKind>(kind: K, options: CreateOptionsFor<K>): ShardTypeFor<K> {\n        const node = buildShapeNode(kind, options);\n        const parentNode = this.resolveParentNode(options.parent);\n        parentNode.appendChild(node);\n\n        const shard = this.registerNode(node) as ShardTypeFor<K>;\n        if (options.parent) {\n            options.parent.adoptChild(shard);\n        }\n\n        return shard;\n    }\n\n    private resolveParentNode(parent?: GroupElement): SVGElement | SVGSVGElement {\n        return parent?.htmlNode ?? this._htmlNode;\n    }\n\n    private scheduleRefresh(): void {\n        if (this._refreshTimer !== null) {\n            clearTimeout(this._refreshTimer);\n        }\n\n        this._refreshTimer = setTimeout(() => {\n            this._refreshTimer = null;\n            this.refresh();\n        }, this._observeDebounceMs);\n    }\n\n    private findInMap(node: Element): SvgElement | null {\n        for (const type of TYPE_ORDER) {\n            const match = this._elements[type].find((el) => el.htmlNode === node);\n            if (match) {\n                return match;\n            }\n        }\n\n        return null;\n    }\n\n    private wrapAndRegister(node: Element): SvgElement | null {\n        const existing = this.findInMap(node);\n        if (existing) {\n            return existing;\n        }\n\n        const wrapped = this._registry.wrapNode(node);\n        if (!wrapped) {\n            return null;\n        }\n\n        const mapKey = TAG_TO_MAP_KEY[node.tagName.toLowerCase()];\n        if (mapKey) {\n            const bucket = this._elements[mapKey];\n            if (!bucket.includes(wrapped as never)) {\n                bucket.push(wrapped as never);\n            }\n        }\n\n        return wrapped;\n    }\n}\n", "import { ElementFactory, ParsedSvgElement } from '../factories/ElementFactory';\nimport { SvgElementUnion } from './types';\n\nexport class NodeRegistry {\n    private _cache = new WeakMap<Element, SvgElementUnion>();\n\n    get(node: Element): SvgElementUnion | undefined {\n        return this._cache.get(node);\n    }\n\n    wrapNode(node: Element): ParsedSvgElement | null {\n        const cached = this._cache.get(node);\n        if (cached) {\n            return cached;\n        }\n\n        const created = ElementFactory.createElementFromNode(node);\n        if (created) {\n            this._cache.set(node, created);\n        }\n\n        return created;\n    }\n\n    getOrCreate(node: Element): ParsedSvgElement | null {\n        return this.wrapNode(node);\n    }\n}\n", "export class Transformation {\n    private _a: number;\n    private _b: number;\n    private _c: number;\n    private _d: number;\n    private _e: number;\n    private _f: number;\n\n    constructor(a = 1, b = 0, c = 0, d = 1, e = 0, f = 0) {\n        this._a = a;\n        this._b = b;\n        this._c = c;\n        this._d = d;\n        this._e = e;\n        this._f = f;\n    }\n\n    static identity(): Transformation {\n        return new Transformation();\n    }\n\n    get a(): number {\n        return this._a;\n    }\n\n    get b(): number {\n        return this._b;\n    }\n\n    get c(): number {\n        return this._c;\n    }\n\n    get d(): number {\n        return this._d;\n    }\n\n    get e(): number {\n        return this._e;\n    }\n\n    get f(): number {\n        return this._f;\n    }\n\n    translate(tx: number, ty: number): Transformation {\n        return this.multiply(new Transformation(1, 0, 0, 1, tx, ty));\n    }\n\n    rotate(angleDeg: number, cx = 0, cy = 0): Transformation {\n        const rad = (angleDeg * Math.PI) / 180;\n        const cos = Math.cos(rad);\n        const sin = Math.sin(rad);\n\n        const rotation = new Transformation(cos, sin, -sin, cos, 0, 0);\n        const toOrigin = new Transformation(1, 0, 0, 1, -cx, -cy);\n        const fromOrigin = new Transformation(1, 0, 0, 1, cx, cy);\n\n        return this.multiply(fromOrigin.multiply(rotation.multiply(toOrigin)));\n    }\n\n    scale(sx: number, sy?: number): Transformation {\n        const syValue = sy ?? sx;\n        return this.multiply(new Transformation(sx, 0, 0, syValue, 0, 0));\n    }\n\n    scaleAt(sx: number, sy: number, cx: number, cy: number): Transformation {\n        const toOrigin = new Transformation(1, 0, 0, 1, -cx, -cy);\n        const fromOrigin = new Transformation(1, 0, 0, 1, cx, cy);\n        const scaleMatrix = new Transformation(sx, 0, 0, sy, 0, 0);\n\n        return this.multiply(fromOrigin.multiply(scaleMatrix.multiply(toOrigin)));\n    }\n\n    multiply(other: Transformation): Transformation {\n        return new Transformation(\n            this._a * other._a + this._c * other._b,\n            this._b * other._a + this._d * other._b,\n            this._a * other._c + this._c * other._d,\n            this._b * other._c + this._d * other._d,\n            this._a * other._e + this._c * other._f + this._e,\n            this._b * other._e + this._d * other._f + this._f,\n        );\n    }\n\n    toMatrixString(): string {\n        return `matrix(${this._a} ${this._b} ${this._c} ${this._d} ${this._e} ${this._f})`;\n    }\n\n    clone(): Transformation {\n        return new Transformation(this._a, this._b, this._c, this._d, this._e, this._f);\n    }\n}\n", "import { SvgContainer } from './core';\nimport { CreateSvgShardsOptions } from './core/options';\nimport { NodeRegistry } from './core/NodeRegistry';\nimport { ElementFactory } from './factories';\n\nexport class SvgShardsFactory {\n    static fromElement(element: Element, options?: CreateSvgShardsOptions): SvgContainer | null {\n        const svgNode = element.closest('svg');\n        if (!svgNode) {\n            return null;\n        }\n\n        const registry = new NodeRegistry();\n        const elements = ElementFactory.parseSvgElement(svgNode, registry);\n        return new SvgContainer(svgNode, elements, registry, options);\n    }\n}\n\nexport const createSvgShards = SvgShardsFactory;\n\nexport { SvgContainer, SvgElement } from './core';\nexport { NodeRegistry } from './core/NodeRegistry';\nexport { Transformation } from './core/Transformation';\nexport type { CreateSvgShardsOptions, AutoRefreshOptions } from './core/options';\nexport type {\n    BoundingBox,\n    HighlightOptions,\n    Point,\n    Size,\n    SvgElementEntry,\n    SvgElementMap,\n    SvgElementTypeKey,\n    SvgElementUnion,\n    VisualState,\n} from './core/types';\n\nexport {\n    RectElement,\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PolygonElement,\n    PolylineElement,\n    PathElement,\n    TextElement,\n    ImageElement,\n    GroupElement,\n    UseElement,\n} from './elements';\n\nexport type {\n    ShapeKind,\n    CreateShapeBase,\n    CreateRectOptions,\n    CreateCircleOptions,\n    CreateEllipseOptions,\n    CreateLineOptions,\n    CreatePolygonOptions,\n    CreatePolylineOptions,\n    CreatePathOptions,\n    CreateOptionsFor,\n    ShardTypeFor,\n    PointsInput,\n} from './create';\n", "const MAX_LINES = 80;\n\nlet outputEl: HTMLElement | null = null;\n\nexport function initLogPanel(element: HTMLElement): void {\n    outputEl = element;\n}\n\nexport function clearLog(): void {\n    if (outputEl) {\n        outputEl.textContent = '';\n    }\n}\n\nexport function logApi(message: string, detail?: string): void {\n    if (!outputEl) {\n        return;\n    }\n\n    const line = document.createElement('div');\n    line.className = 'log-line';\n\n    const time = document.createElement('span');\n    time.className = 'time';\n    time.textContent = `[${new Date().toLocaleTimeString()}] `;\n\n    const msg = document.createElement('span');\n    msg.className = 'msg';\n    msg.textContent = message;\n\n    line.appendChild(time);\n    line.appendChild(msg);\n\n    if (detail) {\n        const detailSpan = document.createElement('span');\n        detailSpan.className = 'detail';\n        detailSpan.textContent = ` \u2192 ${detail}`;\n        line.appendChild(detailSpan);\n    }\n\n    outputEl.appendChild(line);\n\n    while (outputEl.childElementCount > MAX_LINES) {\n        outputEl.firstElementChild?.remove();\n    }\n\n    outputEl.scrollTop = outputEl.scrollHeight;\n}\n", "import { createSvgShards } from '../../src/index';\nimport type { SvgContainer } from '../../src/core/SvgContainer';\nimport type { PlaygroundHighlightTarget } from './types';\nimport { logApi } from './log';\nimport type { LessonContext } from './types';\n\nconst HIGHLIGHT_CLASS = 'playground-shard-highlight';\n\nlet canvasHost: HTMLElement | null = null;\nlet container: SvgContainer | null = null;\nlet highlightEl: SVGElement | null = null;\n\nconst SCENE_TEMPLATE_ID = 'scene-svg-template';\n\nexport function initAppState(host: HTMLElement): void {\n    canvasHost = host;\n    resetScene();\n}\n\nexport function getContainer(): SvgContainer {\n    if (!container) {\n        throw new Error('SvgContainer not initialized');\n    }\n    return container;\n}\n\nexport function resetScene(): SvgContainer {\n    if (!canvasHost) {\n        throw new Error('Canvas host not initialized');\n    }\n\n    if (container) {\n        container.disableAutoRefresh();\n    }\n\n    const template = document.getElementById(SCENE_TEMPLATE_ID) as HTMLTemplateElement | null;\n    if (!template) {\n        throw new Error('Scene template not found');\n    }\n\n    canvasHost.replaceChildren(template.content.cloneNode(true));\n    const svgNode = canvasHost.querySelector('svg');\n    if (!svgNode) {\n        throw new Error('Scene SVG not found');\n    }\n\n    container = createSvgShards.fromElement(svgNode)!;\n    clearHighlight();\n    logApi('createSvgShards.fromElement(svg)', 'SvgContainer ready');\n    return container;\n}\n\nexport function clearHighlight(): void {\n    highlightEl?.remove();\n    highlightEl = null;\n}\n\nexport function highlightShard(shard: PlaygroundHighlightTarget | null): void {\n    clearHighlight();\n    if (!shard || !canvasHost) {\n        return;\n    }\n\n    const svg = canvasHost.querySelector('svg');\n    if (!svg) {\n        return;\n    }\n\n    try {\n        const bbox = shard.getBoundingBox();\n        const pad = 4;\n        const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n        rect.setAttribute('x', String(bbox.x - pad));\n        rect.setAttribute('y', String(bbox.y - pad));\n        rect.setAttribute('width', String(bbox.width + pad * 2));\n        rect.setAttribute('height', String(bbox.height + pad * 2));\n        rect.setAttribute('fill', 'none');\n        rect.setAttribute('stroke', '#4a90d9');\n        rect.setAttribute('stroke-width', '2');\n        rect.setAttribute('stroke-dasharray', '6 3');\n        rect.setAttribute('pointer-events', 'none');\n        rect.classList.add(HIGHLIGHT_CLASS);\n        svg.appendChild(rect);\n        highlightEl = rect;\n    } catch {\n        // getBBox may fail in edge cases\n    }\n}\n\nexport function createLessonContext(setSnippet: (code: string) => void): LessonContext {\n    return {\n        getContainer,\n        log: logApi,\n        getCanvasHost: () => canvasHost!,\n        resetScene,\n        highlightShard,\n        setSnippet,\n    };\n}\n", "import { BoundingBox, HighlightOptions, SvgPrimitiveElement, VisualState } from './types';\n\nexport abstract class SvgElement {\n    protected _htmlNode: SvgPrimitiveElement;\n\n    constructor(htmlNode: SvgPrimitiveElement) {\n        this._htmlNode = htmlNode;\n    }\n\n    get htmlNode(): SvgPrimitiveElement {\n        return this._htmlNode;\n    }\n\n    get id(): string {\n        return this._htmlNode.id || '';\n    }\n\n    set id(value: string) {\n        this._htmlNode.id = value;\n    }\n\n    get x(): number {\n        const x = this._htmlNode.getAttribute('x');\n        return x ? parseFloat(x) : 0;\n    }\n\n    set x(value: number) {\n        this._htmlNode.setAttribute('x', value.toString());\n    }\n\n    get y(): number {\n        const y = this._htmlNode.getAttribute('y');\n        return y ? parseFloat(y) : 0;\n    }\n\n    set y(value: number) {\n        this._htmlNode.setAttribute('y', value.toString());\n    }\n\n    get width(): number {\n        const width = this._htmlNode.getAttribute('width');\n        return width ? parseFloat(width) : 0;\n    }\n\n    set width(value: number) {\n        this._htmlNode.setAttribute('width', value.toString());\n    }\n\n    get height(): number {\n        const height = this._htmlNode.getAttribute('height');\n        return height ? parseFloat(height) : 0;\n    }\n\n    set height(value: number) {\n        this._htmlNode.setAttribute('height', value.toString());\n    }\n\n    get fill(): string | null {\n        return this._htmlNode.getAttribute('fill');\n    }\n\n    set fill(value: string | null) {\n        if (value === null) {\n            this._htmlNode.removeAttribute('fill');\n        } else {\n            this._htmlNode.setAttribute('fill', value);\n        }\n    }\n\n    get stroke(): string | null {\n        return this._htmlNode.getAttribute('stroke');\n    }\n\n    set stroke(value: string | null) {\n        if (value === null) {\n            this._htmlNode.removeAttribute('stroke');\n        } else {\n            this._htmlNode.setAttribute('stroke', value);\n        }\n    }\n\n    get strokeWidth(): number {\n        const strokeWidth = this._htmlNode.getAttribute('stroke-width');\n        return strokeWidth ? parseFloat(strokeWidth) : 1;\n    }\n\n    set strokeWidth(value: number) {\n        this._htmlNode.setAttribute('stroke-width', value.toString());\n    }\n\n    get opacity(): number {\n        const opacity = this._htmlNode.getAttribute('opacity');\n        return opacity ? parseFloat(opacity) : 1;\n    }\n\n    set opacity(value: number) {\n        const str = value.toString();\n        if (this._htmlNode.getAttribute('opacity') === str) {\n            return;\n        }\n        this._htmlNode.setAttribute('opacity', str);\n    }\n\n    get transform(): string | null {\n        return this._htmlNode.getAttribute('transform');\n    }\n\n    set transform(value: string | null) {\n        if (value === null || value === '') {\n            if (!this._htmlNode.hasAttribute('transform')) {\n                return;\n            }\n            this._htmlNode.removeAttribute('transform');\n            return;\n        }\n        if (this._htmlNode.getAttribute('transform') === value) {\n            return;\n        }\n        this._htmlNode.setAttribute('transform', value);\n    }\n\n    get style(): CSSStyleDeclaration {\n        return this._htmlNode.style;\n    }\n\n    moveTo(x: number, y: number): void {\n        this.x = x;\n        this.y = y;\n    }\n\n    resize(width: number, height: number): void {\n        this.width = width;\n        this.height = height;\n    }\n\n    translate(dx: number, dy: number): void {\n        const currentTransform = this.transform || '';\n        this.transform = `translate(${dx}, ${dy}) ${currentTransform}`.trim();\n    }\n\n    rotate(angle: number, cx = 0, cy = 0): void {\n        const currentTransform = this.transform || '';\n        if (cx === 0 && cy === 0) {\n            this.transform = `rotate(${angle}) ${currentTransform}`.trim();\n        } else {\n            this.transform = `rotate(${angle}, ${cx}, ${cy}) ${currentTransform}`.trim();\n        }\n    }\n\n    scale(sx: number, sy?: number): void {\n        const syValue = sy ?? sx;\n        const currentTransform = this.transform || '';\n        this.transform = `scale(${sx}, ${syValue}) ${currentTransform}`.trim();\n    }\n\n    /** Scale around pivot (cx, cy) \u2014 shape grows in place without origin drift. */\n    scaleAt(sx: number, sy: number, cx: number, cy: number): void {\n        this.translate(-cx, -cy);\n        this.scale(sx, sy);\n        this.translate(cx, cy);\n    }\n\n    captureVisualState(): VisualState {\n        return {\n            fill: this._htmlNode.getAttribute('fill'),\n            stroke: this._htmlNode.getAttribute('stroke'),\n            strokeWidth: this._htmlNode.getAttribute('stroke-width'),\n            opacity: this._htmlNode.getAttribute('opacity'),\n        };\n    }\n\n    applyVisualState(state: VisualState): void {\n        if (state.fill === null) {\n            this._htmlNode.removeAttribute('fill');\n        } else {\n            this._htmlNode.setAttribute('fill', state.fill);\n        }\n\n        if (state.stroke === null) {\n            this._htmlNode.removeAttribute('stroke');\n        } else {\n            this._htmlNode.setAttribute('stroke', state.stroke);\n        }\n\n        if (state.strokeWidth === null) {\n            this._htmlNode.removeAttribute('stroke-width');\n        } else {\n            this._htmlNode.setAttribute('stroke-width', state.strokeWidth);\n        }\n\n        if (state.opacity === null) {\n            this._htmlNode.removeAttribute('opacity');\n        } else {\n            this._htmlNode.setAttribute('opacity', state.opacity);\n        }\n    }\n\n    applyHighlight(options: HighlightOptions): VisualState {\n        const previous = this.captureVisualState();\n\n        if (options.fill !== undefined) {\n            this.fill = options.fill;\n        }\n\n        if (options.stroke !== undefined) {\n            this.stroke = options.stroke;\n        }\n\n        if (options.strokeWidth !== undefined) {\n            this.strokeWidth = options.strokeWidth;\n        } else if (options.strokeWidthBoost !== undefined) {\n            this.strokeWidth = this.strokeWidth + options.strokeWidthBoost;\n        }\n\n        if (options.opacity !== undefined) {\n            this.opacity = options.opacity;\n        }\n\n        return previous;\n    }\n\n    clearHighlight(previousState: VisualState): void {\n        this.applyVisualState(previousState);\n    }\n\n    getBoundingBox(): BoundingBox {\n        const graphicsElement = this._htmlNode as SVGGraphicsElement;\n        if (typeof graphicsElement.getBBox !== 'function') {\n            return { x: 0, y: 0, width: 0, height: 0 };\n        }\n        const bbox = graphicsElement.getBBox();\n        return {\n            x: bbox.x,\n            y: bbox.y,\n            width: bbox.width,\n            height: bbox.height,\n        };\n    }\n\n    remove(): void {\n        this._htmlNode.remove();\n    }\n\n    addClass(className: string): void {\n        this._htmlNode.classList.add(className);\n    }\n\n    removeClass(className: string): void {\n        this._htmlNode.classList.remove(className);\n    }\n\n    hasClass(className: string): boolean {\n        return this._htmlNode.classList.contains(className);\n    }\n\n    toggleClass(className: string): void {\n        this._htmlNode.classList.toggle(className);\n    }\n\n    setAttribute(name: string, value: string): void {\n        this._htmlNode.setAttribute(name, value);\n    }\n\n    getAttribute(name: string): string | null {\n        return this._htmlNode.getAttribute(name);\n    }\n\n    removeAttribute(name: string): void {\n        this._htmlNode.removeAttribute(name);\n    }\n}\n", "import type { CircleElement } from '../elements/shapes/CircleElement';\nimport type { EllipseElement } from '../elements/shapes/EllipseElement';\nimport type { LineElement } from '../elements/shapes/LineElement';\nimport type { PolygonElement, PolylineElement } from '../elements/shapes/PolyShapesElement';\nimport type { RectElement } from '../elements/shapes/RectElement';\nimport type { PathElement } from '../elements/PathElement';\nimport type { GroupElement } from '../elements/GroupElement';\nimport type { Point } from '../core/types';\n\nexport type ShapeKind = 'rect' | 'circle' | 'ellipse' | 'line' | 'polygon' | 'polyline' | 'path';\n\nexport interface CreateShapeBase {\n    id?: string;\n    fill?: string;\n    stroke?: string;\n    strokeWidth?: number;\n    opacity?: number;\n    className?: string;\n    parent?: GroupElement;\n}\n\nexport interface CreateRectOptions extends CreateShapeBase {\n    x?: number;\n    y?: number;\n    width?: number;\n    height?: number;\n    rx?: number;\n    ry?: number;\n}\n\nexport interface CreateCircleOptions extends CreateShapeBase {\n    cx?: number;\n    cy?: number;\n    r?: number;\n}\n\nexport interface CreateEllipseOptions extends CreateShapeBase {\n    cx?: number;\n    cy?: number;\n    rx?: number;\n    ry?: number;\n}\n\nexport interface CreateLineOptions extends CreateShapeBase {\n    x1?: number;\n    y1?: number;\n    x2?: number;\n    y2?: number;\n}\n\nexport type PointsInput = string | Point[] | number[];\n\nexport interface CreatePolygonOptions extends CreateShapeBase {\n    points?: PointsInput;\n}\n\nexport interface CreatePolylineOptions extends CreateShapeBase {\n    points?: PointsInput;\n}\n\nexport interface CreatePathOptions extends CreateShapeBase {\n    d?: string;\n}\n\nexport type CreateOptionsFor<K extends ShapeKind> = K extends 'rect'\n    ? CreateRectOptions\n    : K extends 'circle'\n      ? CreateCircleOptions\n      : K extends 'ellipse'\n        ? CreateEllipseOptions\n        : K extends 'line'\n          ? CreateLineOptions\n          : K extends 'polygon'\n            ? CreatePolygonOptions\n            : K extends 'polyline'\n              ? CreatePolylineOptions\n              : K extends 'path'\n                ? CreatePathOptions\n                : never;\n\nexport type ShardTypeFor<K extends ShapeKind> = K extends 'rect'\n    ? RectElement\n    : K extends 'circle'\n      ? CircleElement\n      : K extends 'ellipse'\n        ? EllipseElement\n        : K extends 'line'\n          ? LineElement\n          : K extends 'polygon'\n            ? PolygonElement\n            : K extends 'polyline'\n              ? PolylineElement\n              : K extends 'path'\n                ? PathElement\n                : never;\n\nexport const SHAPE_KIND_TO_TAG: Record<ShapeKind, string> = {\n    rect: 'rect',\n    circle: 'circle',\n    ellipse: 'ellipse',\n    line: 'line',\n    polygon: 'polygon',\n    polyline: 'polyline',\n    path: 'path',\n};\n", "import type { Point } from '../core/types';\nimport type {\n    CreateCircleOptions,\n    CreateEllipseOptions,\n    CreateLineOptions,\n    CreatePathOptions,\n    CreatePolygonOptions,\n    CreatePolylineOptions,\n    CreateRectOptions,\n    CreateShapeBase,\n    PointsInput,\n    ShapeKind,\n} from './types';\nimport { SHAPE_KIND_TO_TAG } from './types';\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\nexport function formatPoints(points: PointsInput): string {\n    if (typeof points === 'string') {\n        return points;\n    }\n\n    if (Array.isArray(points) && points.length > 0 && typeof points[0] === 'number') {\n        return (points as number[]).join(' ');\n    }\n\n    return (points as Point[]).map((p) => `${p.x},${p.y}`).join(' ');\n}\n\nexport function applyBaseAttrs(node: SVGElement, options: CreateShapeBase): void {\n    if (options.id !== undefined) {\n        node.id = options.id;\n    }\n\n    if (options.fill !== undefined) {\n        node.setAttribute('fill', options.fill);\n    }\n\n    if (options.stroke !== undefined) {\n        node.setAttribute('stroke', options.stroke);\n    }\n\n    if (options.strokeWidth !== undefined) {\n        node.setAttribute('stroke-width', options.strokeWidth.toString());\n    }\n\n    if (options.opacity !== undefined) {\n        node.setAttribute('opacity', options.opacity.toString());\n    }\n\n    if (options.className !== undefined) {\n        node.setAttribute('class', options.className);\n    }\n}\n\nfunction setNumericAttr(node: SVGElement, name: string, value: number | undefined): void {\n    if (value !== undefined) {\n        node.setAttribute(name, value.toString());\n    }\n}\n\nexport function buildShapeNode(kind: ShapeKind, options: CreateShapeBase): SVGElement {\n    const tag = SHAPE_KIND_TO_TAG[kind];\n    const node = document.createElementNS(SVG_NS, tag);\n    applyBaseAttrs(node, options);\n\n    switch (kind) {\n        case 'rect': {\n            const opts = options as CreateRectOptions;\n            setNumericAttr(node, 'x', opts.x);\n            setNumericAttr(node, 'y', opts.y);\n            setNumericAttr(node, 'width', opts.width);\n            setNumericAttr(node, 'height', opts.height);\n            setNumericAttr(node, 'rx', opts.rx);\n            setNumericAttr(node, 'ry', opts.ry);\n            break;\n        }\n        case 'circle': {\n            const opts = options as CreateCircleOptions;\n            setNumericAttr(node, 'cx', opts.cx);\n            setNumericAttr(node, 'cy', opts.cy);\n            setNumericAttr(node, 'r', opts.r);\n            break;\n        }\n        case 'ellipse': {\n            const opts = options as CreateEllipseOptions;\n            setNumericAttr(node, 'cx', opts.cx);\n            setNumericAttr(node, 'cy', opts.cy);\n            setNumericAttr(node, 'rx', opts.rx);\n            setNumericAttr(node, 'ry', opts.ry);\n            break;\n        }\n        case 'line': {\n            const opts = options as CreateLineOptions;\n            setNumericAttr(node, 'x1', opts.x1);\n            setNumericAttr(node, 'y1', opts.y1);\n            setNumericAttr(node, 'x2', opts.x2);\n            setNumericAttr(node, 'y2', opts.y2);\n            break;\n        }\n        case 'polygon': {\n            const opts = options as CreatePolygonOptions;\n            if (opts.points !== undefined) {\n                node.setAttribute('points', formatPoints(opts.points));\n            }\n            break;\n        }\n        case 'polyline': {\n            const opts = options as CreatePolylineOptions;\n            if (opts.points !== undefined) {\n                node.setAttribute('points', formatPoints(opts.points));\n            }\n            break;\n        }\n        case 'path': {\n            const opts = options as CreatePathOptions;\n            if (opts.d !== undefined) {\n                node.setAttribute('d', opts.d);\n            }\n            break;\n        }\n    }\n\n    return node;\n}\n", "import { SvgElement } from '../core/SvgElement';\nimport type { SvgElementUnion } from '../core/types';\n\nexport class GroupElement extends SvgElement {\n    private _children: SvgElementUnion[] = [];\n\n    constructor(htmlNode: SVGGElement) {\n        super(htmlNode);\n    }\n\n    get children(): SvgElementUnion[] {\n        return this._children;\n    }\n\n    /** @internal Populated during parse \u2014 do not call directly */\n    syncChildrenFromParse(children: SvgElementUnion[]): void {\n        this._children = children;\n    }\n\n    addChild(element: SvgElementUnion): void {\n        this._children.push(element);\n        this.htmlNode.appendChild(element.htmlNode);\n    }\n\n    /** Link an already-appended child shard (used by programmatic create). */\n    adoptChild(element: SvgElementUnion): void {\n        if (!this._children.includes(element)) {\n            this._children.push(element);\n        }\n    }\n\n    removeChild(element: SvgElementUnion): void {\n        const index = this._children.indexOf(element);\n        if (index > -1) {\n            this._children.splice(index, 1);\n        }\n        element.htmlNode.remove();\n    }\n}\n", "import type { CircleElement } from '../elements/shapes/CircleElement';\nimport type { EllipseElement } from '../elements/shapes/EllipseElement';\nimport type { LineElement } from '../elements/shapes/LineElement';\nimport type { RectElement } from '../elements/shapes/RectElement';\nimport type { PolygonElement, PolylineElement } from '../elements/shapes/PolyShapesElement';\nimport type { GroupElement } from '../elements/GroupElement';\nimport type { ImageElement } from '../elements/ImageElement';\nimport type { PathElement } from '../elements/PathElement';\nimport type { TextElement } from '../elements/TextElement';\nimport type { UseElement } from '../elements/UseElement';\n\nexport type SvgPrimitiveElement = SVGSVGElement | SVGElement;\n\nexport enum SvgElementType {\n    SVG = 'svg',\n    RECT = 'rect',\n    CIRCLE = 'circle',\n    ELLIPSE = 'ellipse',\n    LINE = 'line',\n    POLYGON = 'polygon',\n    POLYLINE = 'polyline',\n    PATH = 'path',\n    TEXT = 'text',\n    IMAGE = 'image',\n    GROUP = 'g',\n    USE = 'use',\n    DEFS = 'defs',\n    CLIP_PATH = 'clipPath',\n    MASK = 'mask',\n    PATTERN = 'pattern',\n    SYMBOL = 'symbol',\n    MARKER = 'marker',\n}\n\nexport interface SvgElementMap {\n    rect: RectElement[];\n    circle: CircleElement[];\n    ellipse: EllipseElement[];\n    line: LineElement[];\n    polygon: PolygonElement[];\n    polyline: PolylineElement[];\n    path: PathElement[];\n    text: TextElement[];\n    image: ImageElement[];\n    group: GroupElement[];\n    use: UseElement[];\n}\n\nexport type SvgElementTypeKey = keyof SvgElementMap;\n\nexport type SvgElementUnion = SvgElementMap[SvgElementTypeKey][number];\n\nexport interface SvgElementEntry {\n    type: SvgElementTypeKey;\n    element: SvgElementUnion;\n    label: string;\n}\n\nexport interface Point {\n    x: number;\n    y: number;\n}\n\nexport interface Size {\n    width: number;\n    height: number;\n}\n\nexport interface BoundingBox {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n}\n\nexport interface VisualState {\n    fill: string | null;\n    stroke: string | null;\n    strokeWidth: string | null;\n    opacity: string | null;\n}\n\nexport interface HighlightOptions {\n    fill?: string;\n    stroke?: string;\n    strokeWidth?: number;\n    strokeWidthBoost?: number;\n    opacity?: number;\n}\n\nexport const TAG_TO_MAP_KEY: Record<string, SvgElementTypeKey> = {\n    rect: 'rect',\n    circle: 'circle',\n    ellipse: 'ellipse',\n    line: 'line',\n    polygon: 'polygon',\n    polyline: 'polyline',\n    path: 'path',\n    text: 'text',\n    image: 'image',\n    g: 'group',\n    use: 'use',\n};\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class RectElement extends SvgElement {\n    constructor(htmlNode: SVGRectElement) {\n        super(htmlNode);\n    }\n\n    get rx(): number {\n        const rx = this.htmlNode.getAttribute('rx');\n        return rx ? parseFloat(rx) : 0;\n    }\n\n    set rx(value: number) {\n        this.htmlNode.setAttribute('rx', value.toString());\n    }\n\n    get ry(): number {\n        const ry = this.htmlNode.getAttribute('ry');\n        return ry ? parseFloat(ry) : 0;\n    }\n\n    set ry(value: number) {\n        this.htmlNode.setAttribute('ry', value.toString());\n    }\n\n    round(rx: number, ry?: number): void {\n        this.rx = rx;\n        if (ry !== undefined) {\n            this.ry = ry;\n        }\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class CircleElement extends SvgElement {\n    constructor(htmlNode: SVGCircleElement) {\n        super(htmlNode);\n    }\n\n    get cx(): number {\n        const cx = this.htmlNode.getAttribute('cx');\n        return cx ? parseFloat(cx) : 0;\n    }\n\n    set cx(value: number) {\n        const str = value.toString();\n        if (this.htmlNode.getAttribute('cx') === str) {\n            return;\n        }\n        this.htmlNode.setAttribute('cx', str);\n    }\n\n    get cy(): number {\n        const cy = this.htmlNode.getAttribute('cy');\n        return cy ? parseFloat(cy) : 0;\n    }\n\n    set cy(value: number) {\n        const str = value.toString();\n        if (this.htmlNode.getAttribute('cy') === str) {\n            return;\n        }\n        this.htmlNode.setAttribute('cy', str);\n    }\n\n    get r(): number {\n        const r = this.htmlNode.getAttribute('r');\n        return r ? parseFloat(r) : 0;\n    }\n\n    set r(value: number) {\n        this.htmlNode.setAttribute('r', value.toString());\n    }\n\n    get radius(): number {\n        return this.r;\n    }\n\n    set radius(value: number) {\n        this.r = value;\n    }\n\n    moveTo(x: number, y: number): void {\n        this.cx = x;\n        this.cy = y;\n    }\n\n    resize(radius: number): void {\n        this.r = radius;\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class EllipseElement extends SvgElement {\n    constructor(htmlNode: SVGEllipseElement) {\n        super(htmlNode);\n    }\n\n    get cx(): number {\n        const cx = this.htmlNode.getAttribute('cx');\n        return cx ? parseFloat(cx) : 0;\n    }\n\n    set cx(value: number) {\n        this.htmlNode.setAttribute('cx', value.toString());\n    }\n\n    get cy(): number {\n        const cy = this.htmlNode.getAttribute('cy');\n        return cy ? parseFloat(cy) : 0;\n    }\n\n    set cy(value: number) {\n        this.htmlNode.setAttribute('cy', value.toString());\n    }\n\n    get rx(): number {\n        const rx = this.htmlNode.getAttribute('rx');\n        return rx ? parseFloat(rx) : 0;\n    }\n\n    set rx(value: number) {\n        this.htmlNode.setAttribute('rx', value.toString());\n    }\n\n    get ry(): number {\n        const ry = this.htmlNode.getAttribute('ry');\n        return ry ? parseFloat(ry) : 0;\n    }\n\n    set ry(value: number) {\n        this.htmlNode.setAttribute('ry', value.toString());\n    }\n\n    moveTo(x: number, y: number): void {\n        this.cx = x;\n        this.cy = y;\n    }\n\n    resize(radiusX: number, radiusY?: number): void {\n        this.rx = radiusX;\n        if (radiusY !== undefined) {\n            this.ry = radiusY;\n        }\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class LineElement extends SvgElement {\n    constructor(htmlNode: SVGLineElement) {\n        super(htmlNode);\n    }\n\n    get x1(): number {\n        const x1 = this.htmlNode.getAttribute('x1');\n        return x1 ? parseFloat(x1) : 0;\n    }\n\n    set x1(value: number) {\n        this.htmlNode.setAttribute('x1', value.toString());\n    }\n\n    get y1(): number {\n        const y1 = this.htmlNode.getAttribute('y1');\n        return y1 ? parseFloat(y1) : 0;\n    }\n\n    set y1(value: number) {\n        this.htmlNode.setAttribute('y1', value.toString());\n    }\n\n    get x2(): number {\n        const x2 = this.htmlNode.getAttribute('x2');\n        return x2 ? parseFloat(x2) : 0;\n    }\n\n    set x2(value: number) {\n        this.htmlNode.setAttribute('x2', value.toString());\n    }\n\n    get y2(): number {\n        const y2 = this.htmlNode.getAttribute('y2');\n        return y2 ? parseFloat(y2) : 0;\n    }\n\n    set y2(value: number) {\n        this.htmlNode.setAttribute('y2', value.toString());\n    }\n\n    moveTo(x: number, y: number): void {\n        const dx = x - this.x1;\n        const dy = y - this.y1;\n        this.x1 = x;\n        this.y1 = y;\n        this.x2 += dx;\n        this.y2 += dy;\n    }\n\n    resize(length: number): void {\n        const currentLength = Math.sqrt(Math.pow(this.x2 - this.x1, 2) + Math.pow(this.y2 - this.y1, 2));\n        const ratio = currentLength > 0 ? length / currentLength : 1;\n        const centerX = (this.x1 + this.x2) / 2;\n        const centerY = (this.y1 + this.y2) / 2;\n        this.x1 = centerX + (this.x1 - centerX) * ratio;\n        this.y1 = centerY + (this.y1 - centerY) * ratio;\n        this.x2 = centerX + (this.x2 - centerX) * ratio;\n        this.y2 = centerY + (this.y2 - centerY) * ratio;\n    }\n}\n", "import { SvgElement } from '../../core/SvgElement';\n\nexport class PolygonElement extends SvgElement {\n    constructor(htmlNode: SVGPolygonElement) {\n        super(htmlNode);\n    }\n\n    get points(): string {\n        return this.htmlNode.getAttribute('points') || '';\n    }\n\n    set points(value: string) {\n        this.htmlNode.setAttribute('points', value);\n    }\n\n    get pointsArray(): number[] {\n        const points = this.points\n            .trim()\n            .split(/[\\s,]+/)\n            .map(Number);\n        return points.filter((n) => !isNaN(n));\n    }\n\n    set pointsArray(value: number[]) {\n        this.points = value.join(' ');\n    }\n}\n\nexport class PolylineElement extends SvgElement {\n    constructor(htmlNode: SVGPolylineElement) {\n        super(htmlNode);\n    }\n\n    get points(): string {\n        return this.htmlNode.getAttribute('points') || '';\n    }\n\n    set points(value: string) {\n        this.htmlNode.setAttribute('points', value);\n    }\n\n    get pointsArray(): number[] {\n        const points = this.points\n            .trim()\n            .split(/[\\s,]+/)\n            .map(Number);\n        return points.filter((n) => !isNaN(n));\n    }\n\n    set pointsArray(value: number[]) {\n        this.points = value.join(' ');\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nexport class PathElement extends SvgElement {\n    private _geometry: SVGGeometryElement;\n\n    constructor(htmlNode: SVGPathElement) {\n        super(htmlNode);\n        this._geometry = htmlNode;\n    }\n\n    get d(): string {\n        return this.htmlNode.getAttribute('d') || '';\n    }\n\n    set d(value: string) {\n        this.htmlNode.setAttribute('d', value);\n    }\n\n    get pathLength(): number {\n        return this._geometry.getTotalLength();\n    }\n\n    getPointAtLength(distance: number): DOMPoint {\n        return this._geometry.getPointAtLength(distance);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nexport class TextElement extends SvgElement {\n    constructor(htmlNode: SVGTextElement) {\n        super(htmlNode);\n    }\n\n    get textContentValue(): string {\n        return this.htmlNode.textContent || '';\n    }\n\n    set textContentValue(value: string) {\n        this.htmlNode.textContent = value;\n    }\n\n    get fontSize(): string {\n        return this.htmlNode.getAttribute('font-size') || '16px';\n    }\n\n    set fontSize(value: string) {\n        this.htmlNode.setAttribute('font-size', value);\n    }\n\n    get fontFamily(): string {\n        return this.htmlNode.getAttribute('font-family') || 'sans-serif';\n    }\n\n    set fontFamily(value: string) {\n        this.htmlNode.setAttribute('font-family', value);\n    }\n\n    get fontWeight(): string {\n        return this.htmlNode.getAttribute('font-weight') || 'normal';\n    }\n\n    set fontWeight(value: string) {\n        this.htmlNode.setAttribute('font-weight', value);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nfunction readHref(node: Element): string | null {\n    return node.getAttribute('href') ?? node.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n}\n\nfunction writeHref(node: Element, value: string | null): void {\n    if (value === null) {\n        node.removeAttribute('href');\n        node.removeAttributeNS('http://www.w3.org/1999/xlink', 'href');\n        return;\n    }\n\n    node.setAttribute('href', value);\n}\n\nexport class ImageElement extends SvgElement {\n    constructor(htmlNode: SVGImageElement) {\n        super(htmlNode);\n    }\n\n    get href(): string | null {\n        return readHref(this.htmlNode);\n    }\n\n    set href(value: string | null) {\n        writeHref(this.htmlNode, value);\n    }\n\n    get preserveAspectRatio(): string {\n        return this.htmlNode.getAttribute('preserveAspectRatio') || 'xMidYMid meet';\n    }\n\n    set preserveAspectRatio(value: string) {\n        this.htmlNode.setAttribute('preserveAspectRatio', value);\n    }\n}\n", "import { SvgElement } from '../core/SvgElement';\n\nfunction readHref(node: Element): string | null {\n    return node.getAttribute('href') ?? node.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n}\n\nfunction writeHref(node: Element, value: string | null): void {\n    if (value === null) {\n        node.removeAttribute('href');\n        node.removeAttributeNS('http://www.w3.org/1999/xlink', 'href');\n        return;\n    }\n\n    node.setAttribute('href', value);\n}\n\nexport class UseElement extends SvgElement {\n    constructor(htmlNode: SVGUseElement) {\n        super(htmlNode);\n    }\n\n    get href(): string | null {\n        return readHref(this.htmlNode);\n    }\n\n    set href(value: string | null) {\n        writeHref(this.htmlNode, value);\n    }\n}\n", "import { NodeRegistry } from '../core/NodeRegistry';\nimport { SvgElementMap, SvgElementType, TAG_TO_MAP_KEY } from '../core/types';\nimport {\n    RectElement,\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PolygonElement,\n    PolylineElement,\n    PathElement,\n    TextElement,\n    ImageElement,\n    GroupElement,\n    UseElement,\n} from '../elements';\n\nexport type ParsedSvgElement =\n    | RectElement\n    | CircleElement\n    | EllipseElement\n    | LineElement\n    | PolygonElement\n    | PolylineElement\n    | PathElement\n    | TextElement\n    | ImageElement\n    | GroupElement\n    | UseElement;\n\nfunction createEmptyMap(): SvgElementMap {\n    return {\n        rect: [],\n        circle: [],\n        ellipse: [],\n        line: [],\n        polygon: [],\n        polyline: [],\n        path: [],\n        text: [],\n        image: [],\n        group: [],\n        use: [],\n    };\n}\n\nexport class ElementFactory {\n    static createElementFromNode(node: Element): ParsedSvgElement | null {\n        const tagName = node.tagName.toLowerCase();\n\n        switch (tagName) {\n            case SvgElementType.RECT:\n                return new RectElement(node as SVGRectElement);\n            case SvgElementType.CIRCLE:\n                return new CircleElement(node as SVGCircleElement);\n            case SvgElementType.ELLIPSE:\n                return new EllipseElement(node as SVGEllipseElement);\n            case SvgElementType.LINE:\n                return new LineElement(node as SVGLineElement);\n            case SvgElementType.POLYGON:\n                return new PolygonElement(node as SVGPolygonElement);\n            case SvgElementType.POLYLINE:\n                return new PolylineElement(node as SVGPolylineElement);\n            case SvgElementType.PATH:\n                return new PathElement(node as SVGPathElement);\n            case SvgElementType.TEXT:\n                return new TextElement(node as SVGTextElement);\n            case SvgElementType.IMAGE:\n                return new ImageElement(node as SVGImageElement);\n            case SvgElementType.GROUP:\n                return new GroupElement(node as SVGGElement);\n            case SvgElementType.USE:\n                return new UseElement(node as SVGUseElement);\n            default:\n                return null;\n        }\n    }\n\n    static parseSvgElement(svgNode: SVGSVGElement, registry: NodeRegistry): SvgElementMap {\n        const elements = createEmptyMap();\n        const descendants = svgNode.querySelectorAll('*');\n\n        descendants.forEach((node) => {\n            const element = registry.getOrCreate(node);\n            if (!element) {\n                return;\n            }\n\n            const mapKey = TAG_TO_MAP_KEY[node.tagName.toLowerCase()];\n            if (mapKey) {\n                elements[mapKey].push(element as never);\n            }\n        });\n\n        this.populateGroupChildren(elements, registry);\n\n        return elements;\n    }\n\n    private static populateGroupChildren(elements: SvgElementMap, registry: NodeRegistry): void {\n        for (const group of elements.group) {\n            const children: ParsedSvgElement[] = [];\n\n            for (const childNode of Array.from(group.htmlNode.children)) {\n                const child = registry.get(childNode);\n                if (child) {\n                    children.push(child);\n                }\n            }\n\n            group.syncChildrenFromParse(children);\n        }\n    }\n}\n", "import {\n    buildShapeNode,\n    type CreateCircleOptions,\n    type CreateEllipseOptions,\n    type CreateLineOptions,\n    type CreateOptionsFor,\n    type CreatePathOptions,\n    type CreatePolygonOptions,\n    type CreatePolylineOptions,\n    type CreateRectOptions,\n    type ShapeKind,\n    type ShardTypeFor,\n} from '../create';\nimport { GroupElement } from '../elements/GroupElement';\nimport type {\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PathElement,\n    PolygonElement,\n    PolylineElement,\n    RectElement,\n} from '../elements';\nimport { ElementFactory } from '../factories/ElementFactory';\nimport { SvgElement } from './SvgElement';\nimport { AutoRefreshOptions, CreateSvgShardsOptions } from './options';\nimport { NodeRegistry } from './NodeRegistry';\nimport { SvgElementEntry, SvgElementMap, SvgElementTypeKey, SvgElementUnion, TAG_TO_MAP_KEY } from './types';\n\nconst TYPE_ORDER: SvgElementTypeKey[] = [\n    'rect',\n    'circle',\n    'ellipse',\n    'line',\n    'polygon',\n    'polyline',\n    'path',\n    'text',\n    'image',\n    'group',\n    'use',\n];\n\nexport class SvgContainer {\n    private _htmlNode: SVGSVGElement;\n    private _elements: SvgElementMap;\n    private _registry: NodeRegistry;\n    private _observer: MutationObserver | null = null;\n    private _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n    private _observeDebounceMs: number;\n    private _onAfterRefresh: (() => void) | null = null;\n\n    constructor(\n        htmlNode: SVGSVGElement,\n        elements: SvgElementMap,\n        registry: NodeRegistry,\n        options?: CreateSvgShardsOptions,\n    ) {\n        this._htmlNode = htmlNode;\n        this._elements = elements;\n        this._registry = registry;\n        this._observeDebounceMs = options?.observeDebounceMs ?? 16;\n\n        if (options?.observe) {\n            this.enableAutoRefresh({ debounceMs: this._observeDebounceMs });\n        }\n    }\n\n    get htmlNode(): SVGSVGElement {\n        return this._htmlNode;\n    }\n\n    get elements(): SvgElementMap {\n        return this._elements;\n    }\n\n    get registry(): NodeRegistry {\n        return this._registry;\n    }\n\n    get width(): number {\n        return this._htmlNode.clientWidth || this._htmlNode.viewBox?.baseVal?.width || 0;\n    }\n\n    get height(): number {\n        return this._htmlNode.clientHeight || this._htmlNode.viewBox?.baseVal?.height || 0;\n    }\n\n    get viewBox(): DOMRectReadOnly {\n        return (\n            this._htmlNode.viewBox?.baseVal ||\n            ({ x: 0, y: 0, width: this.width, height: this.height } as DOMRectReadOnly)\n        );\n    }\n\n    getByType<K extends SvgElementTypeKey>(type: K): SvgElementMap[K] {\n        return this._elements[type];\n    }\n\n    getById(id: string): SvgElement | null {\n        const node = this._htmlNode.getElementById(id);\n        if (!node) {\n            return null;\n        }\n\n        const existing = this.findInMap(node);\n        if (existing) {\n            return existing;\n        }\n\n        return this.wrapAndRegister(node);\n    }\n\n    query(selector: string): SvgElement[] {\n        const nodes = this._htmlNode.querySelectorAll(selector);\n        const results: SvgElement[] = [];\n\n        nodes.forEach((node) => {\n            const shard = this.wrapAndRegister(node);\n            if (shard) {\n                results.push(shard);\n            }\n        });\n\n        return results;\n    }\n\n    queryOne(selector: string): SvgElement | null {\n        const node = this._htmlNode.querySelector(selector);\n        if (!node) {\n            return null;\n        }\n\n        return this.wrapAndRegister(node);\n    }\n\n    getAll(): SvgElementEntry[] {\n        const entries: SvgElementEntry[] = [];\n        const counters: Partial<Record<SvgElementTypeKey, number>> = {};\n\n        for (const type of TYPE_ORDER) {\n            for (const element of this._elements[type]) {\n                const index = (counters[type] ?? 0) + 1;\n                counters[type] = index;\n                const id = element.id;\n                entries.push({\n                    type,\n                    element,\n                    label: id || `${type} #${index}`,\n                });\n            }\n        }\n\n        return entries;\n    }\n\n    refresh(): void {\n        this._elements = ElementFactory.parseSvgElement(this._htmlNode, this._registry);\n        this._onAfterRefresh?.();\n    }\n\n    /** Called after every refresh \u2014 manual or observer-triggered. */\n    onAfterRefresh(callback: (() => void) | null): void {\n        this._onAfterRefresh = callback;\n    }\n\n    enableAutoRefresh(options?: AutoRefreshOptions): void {\n        if (options?.debounceMs !== undefined) {\n            this._observeDebounceMs = options.debounceMs;\n        }\n\n        if (this._observer) {\n            return;\n        }\n\n        this._observer = new MutationObserver(() => {\n            this.scheduleRefresh();\n        });\n\n        this._observer.observe(this._htmlNode, {\n            childList: true,\n            subtree: true,\n            attributes: true,\n        });\n    }\n\n    disableAutoRefresh(): void {\n        if (this._refreshTimer !== null) {\n            clearTimeout(this._refreshTimer);\n            this._refreshTimer = null;\n        }\n\n        this._observer?.disconnect();\n        this._observer = null;\n    }\n\n    createRect(options: CreateRectOptions = {}): RectElement {\n        return this.createShape('rect', options);\n    }\n\n    createCircle(options: CreateCircleOptions = {}): CircleElement {\n        return this.createShape('circle', options);\n    }\n\n    createEllipse(options: CreateEllipseOptions = {}): EllipseElement {\n        return this.createShape('ellipse', options);\n    }\n\n    createLine(options: CreateLineOptions = {}): LineElement {\n        return this.createShape('line', options);\n    }\n\n    createPolygon(options: CreatePolygonOptions = {}): PolygonElement {\n        return this.createShape('polygon', options);\n    }\n\n    createPolyline(options: CreatePolylineOptions = {}): PolylineElement {\n        return this.createShape('polyline', options);\n    }\n\n    createPath(options: CreatePathOptions = {}): PathElement {\n        return this.createShape('path', options);\n    }\n\n    createMany<K extends ShapeKind>(\n        kind: K,\n        count: number,\n        factory: (index: number) => CreateOptionsFor<K>,\n    ): ShardTypeFor<K>[] {\n        if (count < 0) {\n            throw new RangeError('createMany count must be non-negative');\n        }\n\n        if (count === 0) {\n            return [];\n        }\n\n        const first = factory(0);\n        const parentGroup = first.parent;\n        const parentNode = this.resolveParentNode(parentGroup);\n        const fragment = document.createDocumentFragment();\n        const nodes: SVGElement[] = [];\n\n        for (let i = 0; i < count; i++) {\n            const options = factory(i);\n            const node = buildShapeNode(kind, options);\n            fragment.appendChild(node);\n            nodes.push(node);\n        }\n\n        parentNode.appendChild(fragment);\n\n        const shards: ShardTypeFor<K>[] = [];\n        for (const node of nodes) {\n            const shard = this.registerNode(node) as ShardTypeFor<K>;\n            shards.push(shard);\n            if (parentGroup) {\n                parentGroup.adoptChild(shard);\n            }\n        }\n\n        return shards;\n    }\n\n    registerNode(node: Element): SvgElement | null {\n        return this.wrapAndRegister(node);\n    }\n\n    removeShard(shard: SvgElement): void {\n        const mapKey = TAG_TO_MAP_KEY[shard.htmlNode.tagName.toLowerCase()];\n        if (mapKey) {\n            const bucket = this._elements[mapKey];\n            const idx = bucket.indexOf(shard as never);\n            if (idx > -1) {\n                bucket.splice(idx, 1);\n            }\n        }\n\n        const parentNode = shard.htmlNode.parentNode;\n        if (parentNode instanceof Element) {\n            const parentShard = this._registry.get(parentNode);\n            if (parentShard instanceof GroupElement) {\n                parentShard.removeChild(shard as SvgElementUnion);\n                return;\n            }\n        }\n\n        shard.htmlNode.remove();\n    }\n\n    private createShape<K extends ShapeKind>(kind: K, options: CreateOptionsFor<K>): ShardTypeFor<K> {\n        const node = buildShapeNode(kind, options);\n        const parentNode = this.resolveParentNode(options.parent);\n        parentNode.appendChild(node);\n\n        const shard = this.registerNode(node) as ShardTypeFor<K>;\n        if (options.parent) {\n            options.parent.adoptChild(shard);\n        }\n\n        return shard;\n    }\n\n    private resolveParentNode(parent?: GroupElement): SVGElement | SVGSVGElement {\n        return parent?.htmlNode ?? this._htmlNode;\n    }\n\n    private scheduleRefresh(): void {\n        if (this._refreshTimer !== null) {\n            clearTimeout(this._refreshTimer);\n        }\n\n        this._refreshTimer = setTimeout(() => {\n            this._refreshTimer = null;\n            this.refresh();\n        }, this._observeDebounceMs);\n    }\n\n    private findInMap(node: Element): SvgElement | null {\n        for (const type of TYPE_ORDER) {\n            const match = this._elements[type].find((el) => el.htmlNode === node);\n            if (match) {\n                return match;\n            }\n        }\n\n        return null;\n    }\n\n    private wrapAndRegister(node: Element): SvgElement | null {\n        const existing = this.findInMap(node);\n        if (existing) {\n            return existing;\n        }\n\n        const wrapped = this._registry.wrapNode(node);\n        if (!wrapped) {\n            return null;\n        }\n\n        const mapKey = TAG_TO_MAP_KEY[node.tagName.toLowerCase()];\n        if (mapKey) {\n            const bucket = this._elements[mapKey];\n            if (!bucket.includes(wrapped as never)) {\n                bucket.push(wrapped as never);\n            }\n        }\n\n        return wrapped;\n    }\n}\n", "import { ElementFactory, ParsedSvgElement } from '../factories/ElementFactory';\nimport { SvgElementUnion } from './types';\n\nexport class NodeRegistry {\n    private _cache = new WeakMap<Element, SvgElementUnion>();\n\n    get(node: Element): SvgElementUnion | undefined {\n        return this._cache.get(node);\n    }\n\n    wrapNode(node: Element): ParsedSvgElement | null {\n        const cached = this._cache.get(node);\n        if (cached) {\n            return cached;\n        }\n\n        const created = ElementFactory.createElementFromNode(node);\n        if (created) {\n            this._cache.set(node, created);\n        }\n\n        return created;\n    }\n\n    getOrCreate(node: Element): ParsedSvgElement | null {\n        return this.wrapNode(node);\n    }\n}\n", "import { SvgContainer } from './core';\nimport { CreateSvgShardsOptions } from './core/options';\nimport { NodeRegistry } from './core/NodeRegistry';\nimport { ElementFactory } from './factories';\n\nexport class SvgShardsFactory {\n    static fromElement(element: Element, options?: CreateSvgShardsOptions): SvgContainer | null {\n        const svgNode = element.closest('svg');\n        if (!svgNode) {\n            return null;\n        }\n\n        const registry = new NodeRegistry();\n        const elements = ElementFactory.parseSvgElement(svgNode, registry);\n        return new SvgContainer(svgNode, elements, registry, options);\n    }\n}\n\nexport const createSvgShards = SvgShardsFactory;\n\nexport { SvgContainer, SvgElement } from './core';\nexport { NodeRegistry } from './core/NodeRegistry';\nexport { Transformation } from './core/Transformation';\nexport type { CreateSvgShardsOptions, AutoRefreshOptions } from './core/options';\nexport type {\n    BoundingBox,\n    HighlightOptions,\n    Point,\n    Size,\n    SvgElementEntry,\n    SvgElementMap,\n    SvgElementTypeKey,\n    SvgElementUnion,\n    VisualState,\n} from './core/types';\n\nexport {\n    RectElement,\n    CircleElement,\n    EllipseElement,\n    LineElement,\n    PolygonElement,\n    PolylineElement,\n    PathElement,\n    TextElement,\n    ImageElement,\n    GroupElement,\n    UseElement,\n} from './elements';\n\nexport type {\n    ShapeKind,\n    CreateShapeBase,\n    CreateRectOptions,\n    CreateCircleOptions,\n    CreateEllipseOptions,\n    CreateLineOptions,\n    CreatePolygonOptions,\n    CreatePolylineOptions,\n    CreatePathOptions,\n    CreateOptionsFor,\n    ShardTypeFor,\n    PointsInput,\n} from './create';\n", "// An named symbol/brand for detecting Signal instances even when they weren't\n// created using the same signals library version.\nconst BRAND_SYMBOL = Symbol.for(\"preact-signals\");\n\n// Flags for Computed and Effect.\nconst RUNNING = 1 << 0;\nconst NOTIFIED = 1 << 1;\nconst OUTDATED = 1 << 2;\nconst DISPOSED = 1 << 3;\nconst HAS_ERROR = 1 << 4;\nconst TRACKING = 1 << 5;\n\n// A linked list node used to track dependencies (sources) and dependents (targets).\n// Also used to remember the source's last version number that the target saw.\ntype Node = {\n\t// A source whose value the target depends on.\n\t_source: Signal;\n\t_prevSource?: Node;\n\t_nextSource?: Node;\n\n\t// A target that depends on the source and should be notified when the source changes.\n\t_target: Computed | Effect;\n\t_prevTarget?: Node;\n\t_nextTarget?: Node;\n\n\t// The version number of the source that target has last seen. We use version numbers\n\t// instead of storing the source value, because source values can take arbitrary amount\n\t// of memory, and computeds could hang on to them forever because they're lazily evaluated.\n\t// Use the special value -1 to mark potentially unused but recyclable nodes.\n\t_version: number;\n\n\t// Used to remember & roll back the source's previous `._node` value when entering &\n\t// exiting a new evaluation context.\n\t_rollbackNode?: Node;\n};\n\nfunction startBatch() {\n\tbatchDepth++;\n}\n\nfunction endBatch() {\n\tif (batchDepth > 1) {\n\t\tbatchDepth--;\n\t\treturn;\n\t}\n\n\tlet error: unknown;\n\tlet hasError = false;\n\treconcileBatchSnapshots();\n\n\twhile (batchedEffect !== undefined) {\n\t\tlet effect: Effect | undefined = batchedEffect;\n\t\tbatchedEffect = undefined;\n\n\t\tbatchIteration++;\n\n\t\twhile (effect !== undefined) {\n\t\t\tconst next: Effect | undefined = effect._nextBatchedEffect;\n\t\t\teffect._nextBatchedEffect = undefined;\n\t\t\teffect._flags &= ~NOTIFIED;\n\n\t\t\tif (!(effect._flags & DISPOSED) && needsToRecompute(effect)) {\n\t\t\t\ttry {\n\t\t\t\t\teffect._callback();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\terror = err;\n\t\t\t\t\t\thasError = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\teffect = next;\n\t\t}\n\t}\n\tbatchIteration = 0;\n\tbatchDepth--;\n\n\tif (hasError) {\n\t\tthrow error;\n\t}\n}\n\n/**\n * Combine multiple value updates into one \"commit\" at the end of the provided callback.\n *\n * Batches can be nested and changes are only flushed once the outermost batch callback\n * completes.\n *\n * Accessing a signal that has been modified within a batch will reflect its updated\n * value.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction batch<T>(fn: () => T): T {\n\tif (batchDepth > 0) {\n\t\treturn fn();\n\t}\n\tcurrentBatchSnapshotVersion = ++batchSnapshotVersion;\n\t/*@__INLINE__**/ startBatch();\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\tendBatch();\n\t}\n}\n\n// Currently evaluated computed or effect.\nlet evalContext: Computed | Effect | undefined = undefined;\n\n/**\n * Run a callback function that can access signal values without\n * subscribing to the signal updates.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction untracked<T>(fn: () => T): T {\n\tconst prevContext = evalContext;\n\tevalContext = undefined;\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\tevalContext = prevContext;\n\t}\n}\n\n// Effects collected into a batch.\nlet batchedEffect: Effect | undefined = undefined;\nlet batchDepth = 0;\nlet batchIteration = 0;\n\ntype BatchSnapshot = {\n\t_source: Signal;\n\t_value: unknown;\n\t_version: number;\n\t_next?: BatchSnapshot;\n};\n\nlet batchSnapshotVersion = 0;\nlet currentBatchSnapshotVersion = 0;\nlet batchSnapshots: BatchSnapshot | undefined = undefined;\n\n// A global version number for signals, used for fast-pathing repeated\n// computed.peek()/computed.value calls when nothing has changed globally.\nlet globalVersion = 0;\n\nfunction recordBatchSnapshot(source: Signal) {\n\t// Only capture writes during the user-visible batch callback, not during effect flush.\n\tif (batchDepth === 0 || batchIteration !== 0) {\n\t\treturn;\n\t}\n\n\tif (source._batchSnapshotVersion !== currentBatchSnapshotVersion) {\n\t\tsource._batchSnapshotVersion = currentBatchSnapshotVersion;\n\t\tbatchSnapshots = {\n\t\t\t_source: source,\n\t\t\t_value: source._value,\n\t\t\t_version: source._version,\n\t\t\t_next: batchSnapshots,\n\t\t};\n\t}\n}\n\nfunction reconcileBatchSnapshots() {\n\tlet snapshots = batchSnapshots;\n\tbatchSnapshots = undefined;\n\n\twhile (snapshots !== undefined) {\n\t\tif (snapshots._source._value === snapshots._value) {\n\t\t\tsnapshots._source._version = snapshots._version;\n\t\t}\n\t\tsnapshots = snapshots._next;\n\t}\n}\n\nfunction addDependency(signal: Signal): Node | undefined {\n\tif (evalContext === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet node = signal._node;\n\tif (node === undefined || node._target !== evalContext) {\n\t\t/**\n\t\t * `signal` is a new dependency. Create a new dependency node, and set it\n\t\t * as the tail of the current context's dependency list. e.g:\n\t\t *\n\t\t * { A <-> B       }\n\t\t *         ↑     ↑\n\t\t *        tail  node (new)\n\t\t *               ↓\n\t\t * { A <-> B <-> C }\n\t\t *               ↑\n\t\t *              tail (evalContext._sources)\n\t\t */\n\t\tnode = {\n\t\t\t_version: 0,\n\t\t\t_source: signal,\n\t\t\t_prevSource: evalContext._sources,\n\t\t\t_nextSource: undefined,\n\t\t\t_target: evalContext,\n\t\t\t_prevTarget: undefined,\n\t\t\t_nextTarget: undefined,\n\t\t\t_rollbackNode: node,\n\t\t};\n\n\t\tif (evalContext._sources !== undefined) {\n\t\t\tevalContext._sources._nextSource = node;\n\t\t}\n\t\tevalContext._sources = node;\n\t\tsignal._node = node;\n\n\t\t// Subscribe to change notifications from this dependency if we're in an effect\n\t\t// OR evaluating a computed signal that in turn has subscribers.\n\t\tif (evalContext._flags & TRACKING) {\n\t\t\tsignal._subscribe(node);\n\t\t}\n\t\treturn node;\n\t} else if (node._version === -1) {\n\t\t// `signal` is an existing dependency from a previous evaluation. Reuse it.\n\t\tnode._version = 0;\n\n\t\t/**\n\t\t * If `node` is not already the current tail of the dependency list (i.e.\n\t\t * there is a next node in the list), then make the `node` the new tail. e.g:\n\t\t *\n\t\t * { A <-> B <-> C <-> D }\n\t\t *         ↑           ↑\n\t\t *        node   ┌─── tail (evalContext._sources)\n\t\t *         └─────│─────┐\n\t\t *               ↓     ↓\n\t\t * { A <-> C <-> D <-> B }\n\t\t *                     ↑\n\t\t *                    tail (evalContext._sources)\n\t\t */\n\t\tif (node._nextSource !== undefined) {\n\t\t\tnode._nextSource._prevSource = node._prevSource;\n\n\t\t\tif (node._prevSource !== undefined) {\n\t\t\t\tnode._prevSource._nextSource = node._nextSource;\n\t\t\t}\n\n\t\t\tnode._prevSource = evalContext._sources;\n\t\t\tnode._nextSource = undefined;\n\n\t\t\tevalContext._sources!._nextSource = node;\n\t\t\tevalContext._sources = node;\n\t\t}\n\n\t\t// We can assume that the currently evaluated effect / computed signal is already\n\t\t// subscribed to change notifications from `signal` if needed.\n\t\treturn node;\n\t}\n\treturn undefined;\n}\n\n//#region Signal\n\n/**\n * The base class for plain and computed signals.\n */\n//\n// A function with the same name is defined later, so we need to ignore TypeScript's\n// warning about a redeclared variable.\n//\n// The class is declared here, but later implemented with ES5-style prototypes.\n// This enables better control of the transpiled output size.\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\ndeclare class Signal<T = any> {\n\t/** @internal */\n\t_value: unknown;\n\n\t/**\n\t * @internal\n\t * Version numbers should always be >= 0, because the special value -1 is used\n\t * by Nodes to signify potentially unused but recyclable nodes.\n\t */\n\t_version: number;\n\n\t/** @internal */\n\t_node?: Node;\n\n\t/** @internal */\n\t_targets?: Node;\n\n\t/** @internal */\n\t_batchSnapshotVersion: number;\n\n\tconstructor(value?: T, options?: SignalOptions<T>);\n\n\t/** @internal */\n\t_refresh(): boolean;\n\n\t/** @internal */\n\t_subscribe(node: Node): void;\n\n\t/** @internal */\n\t_unsubscribe(node: Node): void;\n\n\t/** @internal */\n\t_watched?(this: Signal<T>): void;\n\n\t/** @internal */\n\t_unwatched?(this: Signal<T>): void;\n\n\tsubscribe(fn: (value: T) => void): () => void;\n\n\tname?: string;\n\n\tvalueOf(): T;\n\n\ttoString(): string;\n\n\ttoJSON(): T;\n\n\tpeek(): T;\n\n\tbrand: typeof BRAND_SYMBOL;\n\n\tget value(): T;\n\tset value(value: T);\n}\n\nexport interface SignalOptions<T = any> {\n\twatched?: (this: Signal<T>) => void;\n\tunwatched?: (this: Signal<T>) => void;\n\tname?: string;\n}\n\n/** @internal */\n// A class with the same name has already been declared, so we need to ignore\n// TypeScript's warning about a redeclared variable.\n//\n// The previously declared class is implemented here with ES5-style prototypes.\n// This enables better control of the transpiled output size.\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\nfunction Signal(this: Signal, value?: unknown, options?: SignalOptions) {\n\tthis._value = value;\n\tthis._version = 0;\n\tthis._node = undefined;\n\tthis._targets = undefined;\n\tthis._batchSnapshotVersion = 0;\n\tthis._watched = options?.watched;\n\tthis._unwatched = options?.unwatched;\n\tthis.name = options?.name;\n}\n\nSignal.prototype.brand = BRAND_SYMBOL;\n\nSignal.prototype._refresh = function () {\n\treturn true;\n};\n\nSignal.prototype._subscribe = function (node) {\n\tconst targets = this._targets;\n\tif (targets !== node && node._prevTarget === undefined) {\n\t\tnode._nextTarget = targets;\n\t\tthis._targets = node;\n\n\t\tif (targets !== undefined) {\n\t\t\ttargets._prevTarget = node;\n\t\t} else {\n\t\t\tuntracked(() => {\n\t\t\t\tthis._watched?.call(this);\n\t\t\t});\n\t\t}\n\t}\n};\n\nSignal.prototype._unsubscribe = function (node) {\n\t// Only run the unsubscribe step if the signal has any subscribers to begin with.\n\tif (this._targets !== undefined) {\n\t\tconst prev = node._prevTarget;\n\t\tconst next = node._nextTarget;\n\t\tif (prev !== undefined) {\n\t\t\tprev._nextTarget = next;\n\t\t\tnode._prevTarget = undefined;\n\t\t}\n\n\t\tif (next !== undefined) {\n\t\t\tnext._prevTarget = prev;\n\t\t\tnode._nextTarget = undefined;\n\t\t}\n\n\t\tif (node === this._targets) {\n\t\t\tthis._targets = next;\n\t\t\tif (next === undefined) {\n\t\t\t\tuntracked(() => {\n\t\t\t\t\tthis._unwatched?.call(this);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n};\n\nSignal.prototype.subscribe = function (fn) {\n\treturn effect(\n\t\t() => {\n\t\t\tconst value = this.value;\n\t\t\tconst prevContext = evalContext;\n\t\t\tevalContext = undefined;\n\t\t\ttry {\n\t\t\t\tfn(value);\n\t\t\t} finally {\n\t\t\t\tevalContext = prevContext;\n\t\t\t}\n\t\t},\n\t\t{ name: \"sub\" }\n\t);\n};\n\nSignal.prototype.valueOf = function () {\n\treturn this.value;\n};\n\nSignal.prototype.toString = function () {\n\treturn this.value + \"\";\n};\n\nSignal.prototype.toJSON = function () {\n\treturn this.value;\n};\n\nSignal.prototype.peek = function () {\n\treturn untracked(() => this.value);\n};\n\nObject.defineProperty(Signal.prototype, \"value\", {\n\tget(this: Signal) {\n\t\tconst node = addDependency(this);\n\t\tif (node !== undefined) {\n\t\t\tnode._version = this._version;\n\t\t}\n\t\treturn this._value;\n\t},\n\tset(this: Signal, value) {\n\t\tif (value !== this._value) {\n\t\t\tif (batchIteration > 100) {\n\t\t\t\tthrow new Error(\"Cycle detected\");\n\t\t\t}\n\n\t\t\trecordBatchSnapshot(this);\n\t\t\tthis._value = value;\n\t\t\tthis._version++;\n\t\t\tglobalVersion++;\n\n\t\t\t/**@__INLINE__*/ startBatch();\n\t\t\ttry {\n\t\t\t\tfor (\n\t\t\t\t\tlet node = this._targets;\n\t\t\t\t\tnode !== undefined;\n\t\t\t\t\tnode = node._nextTarget\n\t\t\t\t) {\n\t\t\t\t\tnode._target._notify();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tendBatch();\n\t\t\t}\n\t\t}\n\t},\n});\n\n/**\n * Create a new plain signal.\n *\n * @param value The initial value for the signal.\n * @returns A new signal.\n */\nexport function signal<T>(value: T, options?: SignalOptions<T>): Signal<T>;\nexport function signal<T = undefined>(): Signal<T | undefined>;\nexport function signal<T>(value?: T, options?: SignalOptions<T>): Signal<T> {\n\treturn new Signal(value, options);\n}\n\n//#endregion Signal\n\n//#region Computed\n\nfunction needsToRecompute(target: Computed | Effect): boolean {\n\t// Check the dependencies for changed values. The dependency list is already\n\t// in order of use. Therefore if multiple dependencies have changed values, only\n\t// the first used dependency is re-evaluated at this point.\n\tfor (\n\t\tlet node = target._sources;\n\t\tnode !== undefined;\n\t\tnode = node._nextSource\n\t) {\n\t\tif (\n\t\t\t// If the dependency has definitely been updated since its version number\n\t\t\t// was observed, then we need to recompute. This first check is not strictly\n\t\t\t// necessary for correctness, but allows us to skip the refresh call if the\n\t\t\t// dependency has already been updated.\n\t\t\tnode._source._version !== node._version ||\n\t\t\t// Refresh the dependency. If there's something blocking the refresh (e.g. a\n\t\t\t// dependency cycle), then we need to recompute.\n\t\t\t!node._source._refresh() ||\n\t\t\t// If the dependency got a new version after the refresh, then we need to recompute.\n\t\t\tnode._source._version !== node._version\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\t// If none of the dependencies have changed values since last recompute then\n\t// there's no need to recompute.\n\treturn false;\n}\n\nfunction prepareSources(target: Computed | Effect) {\n\t/**\n\t * 1. Mark all current sources as re-usable nodes (version: -1)\n\t * 2. Set a rollback node if the current node is being used in a different context\n\t * 3. Point 'target._sources' to the tail of the doubly-linked list, e.g:\n\t *\n\t *    { undefined <- A <-> B <-> C -> undefined }\n\t *                   ↑           ↑\n\t *                   │           └──────┐\n\t * target._sources = A; (node is head)  │\n\t *                   ↓                  │\n\t * target._sources = C; (node is tail) ─┘\n\t */\n\tfor (\n\t\tlet node = target._sources;\n\t\tnode !== undefined;\n\t\tnode = node._nextSource\n\t) {\n\t\tconst rollbackNode = node._source._node;\n\t\tif (rollbackNode !== undefined) {\n\t\t\tnode._rollbackNode = rollbackNode;\n\t\t}\n\t\tnode._source._node = node;\n\t\tnode._version = -1;\n\n\t\tif (node._nextSource === undefined) {\n\t\t\ttarget._sources = node;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction cleanupSources(target: Computed | Effect) {\n\tlet node = target._sources;\n\tlet head: Node | undefined = undefined;\n\n\t/**\n\t * At this point 'target._sources' points to the tail of the doubly-linked list.\n\t * It contains all existing sources + new sources in order of use.\n\t * Iterate backwards until we find the head node while dropping old dependencies.\n\t */\n\twhile (node !== undefined) {\n\t\tconst prev = node._prevSource;\n\n\t\t/**\n\t\t * The node was not re-used, unsubscribe from its change notifications and remove itself\n\t\t * from the doubly-linked list. e.g:\n\t\t *\n\t\t * { A <-> B <-> C }\n\t\t *         ↓\n\t\t *    { A <-> C }\n\t\t */\n\t\tif (node._version === -1) {\n\t\t\tnode._source._unsubscribe(node);\n\n\t\t\tif (prev !== undefined) {\n\t\t\t\tprev._nextSource = node._nextSource;\n\t\t\t}\n\t\t\tif (node._nextSource !== undefined) {\n\t\t\t\tnode._nextSource._prevSource = prev;\n\t\t\t}\n\t\t} else {\n\t\t\t/**\n\t\t\t * The new head is the last node seen which wasn't removed/unsubscribed\n\t\t\t * from the doubly-linked list. e.g:\n\t\t\t *\n\t\t\t * { A <-> B <-> C }\n\t\t\t *   ↑     ↑     ↑\n\t\t\t *   │     │     └ head = node\n\t\t\t *   │     └ head = node\n\t\t\t *   └ head = node\n\t\t\t */\n\t\t\thead = node;\n\t\t}\n\n\t\tnode._source._node = node._rollbackNode;\n\t\tif (node._rollbackNode !== undefined) {\n\t\t\tnode._rollbackNode = undefined;\n\t\t}\n\n\t\tnode = prev;\n\t}\n\n\ttarget._sources = head;\n}\n\n/**\n * The base class for computed signals.\n */\ndeclare class Computed<T = any> extends Signal<T> {\n\t_fn: () => T;\n\t_sources?: Node;\n\t_globalVersion: number;\n\t_flags: number;\n\n\tconstructor(fn: () => T, options?: SignalOptions<T>);\n\n\t_notify(): void;\n\tget value(): T;\n}\n\n/** @internal */\nfunction Computed(this: Computed, fn: () => unknown, options?: SignalOptions) {\n\tSignal.call(this, undefined);\n\n\tthis._fn = fn;\n\tthis._sources = undefined;\n\tthis._globalVersion = globalVersion - 1;\n\tthis._flags = OUTDATED;\n\tthis._watched = options?.watched;\n\tthis._unwatched = options?.unwatched;\n\tthis.name = options?.name;\n}\n\nComputed.prototype = new Signal() as Computed;\n\nComputed.prototype._refresh = function () {\n\tthis._flags &= ~NOTIFIED;\n\n\tif (this._flags & RUNNING) {\n\t\treturn false;\n\t}\n\n\t// If this computed signal has subscribed to updates from its dependencies\n\t// (TRACKING flag set) and none of them have notified about changes (OUTDATED\n\t// flag not set), then the computed value can't have changed.\n\tif ((this._flags & (OUTDATED | TRACKING)) === TRACKING) {\n\t\treturn true;\n\t}\n\tthis._flags &= ~OUTDATED;\n\n\tif (this._globalVersion === globalVersion) {\n\t\treturn true;\n\t}\n\tthis._globalVersion = globalVersion;\n\n\t// Mark this computed signal running before checking the dependencies for value\n\t// changes, so that the RUNNING flag can be used to notice cyclical dependencies.\n\tthis._flags |= RUNNING;\n\tif (this._version > 0 && !needsToRecompute(this)) {\n\t\tthis._flags &= ~RUNNING;\n\t\treturn true;\n\t}\n\n\tconst prevContext = evalContext;\n\ttry {\n\t\tprepareSources(this);\n\t\tevalContext = this;\n\t\tconst value = this._fn();\n\t\tif (\n\t\t\tthis._flags & HAS_ERROR ||\n\t\t\tthis._value !== value ||\n\t\t\tthis._version === 0\n\t\t) {\n\t\t\tthis._value = value;\n\t\t\tthis._flags &= ~HAS_ERROR;\n\t\t\tthis._version++;\n\t\t}\n\t} catch (err) {\n\t\tthis._value = err;\n\t\tthis._flags |= HAS_ERROR;\n\t\tthis._version++;\n\t}\n\tevalContext = prevContext;\n\tcleanupSources(this);\n\tthis._flags &= ~RUNNING;\n\treturn true;\n};\n\nComputed.prototype._subscribe = function (node) {\n\tif (this._targets === undefined) {\n\t\tthis._flags |= OUTDATED | TRACKING;\n\n\t\t// A computed signal subscribes lazily to its dependencies when it\n\t\t// gets its first subscriber.\n\t\tfor (\n\t\t\tlet node = this._sources;\n\t\t\tnode !== undefined;\n\t\t\tnode = node._nextSource\n\t\t) {\n\t\t\tnode._source._subscribe(node);\n\t\t}\n\t}\n\tSignal.prototype._subscribe.call(this, node);\n};\n\nComputed.prototype._unsubscribe = function (node) {\n\t// Only run the unsubscribe step if the computed signal has any subscribers.\n\tif (this._targets !== undefined) {\n\t\tSignal.prototype._unsubscribe.call(this, node);\n\n\t\t// Computed signal unsubscribes from its dependencies when it loses its last subscriber.\n\t\t// This makes it possible for unreferences subgraphs of computed signals to get garbage collected.\n\t\tif (this._targets === undefined) {\n\t\t\tthis._flags &= ~TRACKING;\n\n\t\t\tfor (\n\t\t\t\tlet node = this._sources;\n\t\t\t\tnode !== undefined;\n\t\t\t\tnode = node._nextSource\n\t\t\t) {\n\t\t\t\tnode._source._unsubscribe(node);\n\t\t\t}\n\t\t}\n\t}\n};\n\nComputed.prototype._notify = function () {\n\tif (!(this._flags & NOTIFIED)) {\n\t\tthis._flags |= OUTDATED | NOTIFIED;\n\n\t\tfor (\n\t\t\tlet node = this._targets;\n\t\t\tnode !== undefined;\n\t\t\tnode = node._nextTarget\n\t\t) {\n\t\t\tnode._target._notify();\n\t\t}\n\t}\n};\n\nObject.defineProperty(Computed.prototype, \"value\", {\n\tget(this: Computed) {\n\t\tif (this._flags & RUNNING) {\n\t\t\tthrow new Error(\"Cycle detected\");\n\t\t}\n\t\tconst node = addDependency(this);\n\t\tthis._refresh();\n\t\tif (node !== undefined) {\n\t\t\tnode._version = this._version;\n\t\t}\n\t\tif (this._flags & HAS_ERROR) {\n\t\t\tthrow this._value;\n\t\t}\n\t\treturn this._value;\n\t},\n});\n\n/**\n * An interface for read-only signals.\n */\ninterface ReadonlySignal<T = any> {\n\treadonly value: T;\n\tpeek(): T;\n\n\tsubscribe(fn: (value: T) => void): () => void;\n\tvalueOf(): T;\n\ttoString(): string;\n\ttoJSON(): T;\n\tbrand: typeof BRAND_SYMBOL;\n}\n\n/**\n * Create a new signal that is computed based on the values of other signals.\n *\n * The returned computed signal is read-only, and its value is automatically\n * updated when any signals accessed from within the callback function change.\n *\n * @param fn The effect callback.\n * @returns A new read-only signal.\n */\nfunction computed<T>(\n\tfn: () => T,\n\toptions?: SignalOptions<T>\n): ReadonlySignal<T> {\n\treturn new Computed(fn, options);\n}\n\n//#endregion Computed\n\n//#region Effect\n\nfunction cleanupEffect(effect: Effect) {\n\tconst cleanup = effect._cleanup;\n\teffect._cleanup = undefined;\n\n\tif (typeof cleanup === \"function\") {\n\t\t/*@__INLINE__**/ startBatch();\n\n\t\t// Run cleanup functions always outside of any context.\n\t\tconst prevContext = evalContext;\n\t\tevalContext = undefined;\n\t\ttry {\n\t\t\tcleanup();\n\t\t} catch (err) {\n\t\t\teffect._flags &= ~RUNNING;\n\t\t\teffect._flags |= DISPOSED;\n\t\t\tdisposeEffect(effect);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tevalContext = prevContext;\n\t\t\tendBatch();\n\t\t}\n\t}\n}\n\nfunction disposeEffect(effect: Effect) {\n\tfor (\n\t\tlet node = effect._sources;\n\t\tnode !== undefined;\n\t\tnode = node._nextSource\n\t) {\n\t\tnode._source._unsubscribe(node);\n\t}\n\teffect._fn = undefined;\n\teffect._sources = undefined;\n\n\tcleanupEffect(effect);\n}\n\nfunction endEffect(this: Effect, prevContext?: Computed | Effect) {\n\tif (evalContext !== this) {\n\t\tthrow new Error(\"Out-of-order effect\");\n\t}\n\tcleanupSources(this);\n\tevalContext = prevContext;\n\n\tthis._flags &= ~RUNNING;\n\tif (this._flags & DISPOSED) {\n\t\tdisposeEffect(this);\n\t}\n\tendBatch();\n}\n\ntype EffectFn =\n\t| ((this: { dispose: () => void }) => void | (() => void))\n\t| (() => void | (() => void));\n\n// Avoid hard-requiring the ESNext.Disposable lib in consuming tsconfigs.\n// When `Symbol.dispose` is available, this becomes a symbol-keyed disposer type.\ntype DisposeSymbol = typeof Symbol extends { readonly dispose: infer TDispose }\n\t? TDispose\n\t: never;\ntype DisposableLike = {\n\t[K in DisposeSymbol & PropertyKey]: () => void;\n};\ntype DisposeFn = (() => void) & DisposableLike;\n\n/**\n * The base class for reactive effects.\n */\ndeclare class Effect {\n\t_fn?: EffectFn;\n\t_cleanup?: () => void;\n\t_sources?: Node;\n\t_nextBatchedEffect?: Effect;\n\t_flags: number;\n\t_debugCallback?: () => void;\n\tname?: string;\n\n\tconstructor(fn: EffectFn, options?: EffectOptions);\n\n\t_callback(): void;\n\t_start(): () => void;\n\t_notify(): void;\n\t_dispose(): void;\n\tdispose(): void;\n}\n\nexport interface EffectOptions {\n\tname?: string;\n}\n\nlet capturedEffects: Effect[] | undefined;\n\n/** @internal */\nfunction Effect(this: Effect, fn: EffectFn, options?: EffectOptions) {\n\tthis._fn = fn;\n\tthis._cleanup = undefined;\n\tthis._sources = undefined;\n\tthis._nextBatchedEffect = undefined;\n\tthis._flags = TRACKING;\n\tthis.name = options?.name;\n\n\tif (capturedEffects) {\n\t\tcapturedEffects.push(this);\n\t}\n}\n\nEffect.prototype._callback = function () {\n\tconst finish = this._start();\n\ttry {\n\t\tif (this._flags & DISPOSED) return;\n\t\tif (this._fn === undefined) return;\n\n\t\tconst cleanup = this._fn();\n\t\tif (typeof cleanup === \"function\") {\n\t\t\tthis._cleanup = cleanup;\n\t\t}\n\t} finally {\n\t\tfinish();\n\t}\n};\n\nEffect.prototype._start = function () {\n\tif (this._flags & RUNNING) {\n\t\tthrow new Error(\"Cycle detected\");\n\t}\n\tthis._flags |= RUNNING;\n\tthis._flags &= ~DISPOSED;\n\tcleanupEffect(this);\n\tprepareSources(this);\n\n\t/*@__INLINE__**/ startBatch();\n\tconst prevContext = evalContext;\n\tevalContext = this;\n\treturn endEffect.bind(this, prevContext);\n};\n\nEffect.prototype._notify = function () {\n\tif (!(this._flags & NOTIFIED)) {\n\t\tthis._flags |= NOTIFIED;\n\t\tthis._nextBatchedEffect = batchedEffect;\n\t\tbatchedEffect = this;\n\t}\n};\n\nEffect.prototype._dispose = function () {\n\tthis._flags |= DISPOSED;\n\n\tif (!(this._flags & RUNNING)) {\n\t\tdisposeEffect(this);\n\t}\n};\n\nEffect.prototype.dispose = function () {\n\tthis._dispose();\n};\n/**\n * Create an effect to run arbitrary code in response to signal changes.\n *\n * An effect tracks which signals are accessed within the given callback\n * function `fn`, and re-runs the callback when those signals change.\n *\n * The callback may return a cleanup function. The cleanup function gets\n * run once, either when the callback is next called or when the effect\n * gets disposed, whichever happens first.\n *\n * @param fn The effect callback.\n * @returns A function for disposing the effect.\n */\nfunction effect(fn: EffectFn, options?: EffectOptions): DisposeFn {\n\tconst effect = new Effect(fn, options);\n\ttry {\n\t\teffect._callback();\n\t} catch (err) {\n\t\teffect._dispose();\n\t\tthrow err;\n\t}\n\t// Return a bound function instead of a wrapper like `() => effect._dispose()`,\n\t// because bound functions seem to be just as fast and take up a lot less memory.\n\tconst dispose = effect._dispose.bind(effect);\n\t(dispose as any)[Symbol.dispose] = dispose;\n\treturn dispose as DisposeFn;\n}\n\n//#endregion Effect\n\n//#region Action\n\nfunction action<TArgs extends unknown[], TReturn>(\n\tfn: (...args: TArgs) => TReturn\n): (...args: TArgs) => TReturn {\n\treturn function actionWrapper(this: unknown, ...args: TArgs) {\n\t\treturn batch(() => untracked(() => fn.apply(this, args)));\n\t};\n}\n\n//#endregion Action\n\n//#region createModel\n\n/** Models should only contain signals, actions, and nested objects containing only signals and actions. */\ntype ValidateModel<TModel> = {\n\t[Key in keyof TModel]: TModel[Key] extends ReadonlySignal<unknown>\n\t\t? TModel[Key]\n\t\t: TModel[Key] extends (...args: any[]) => any\n\t\t\t? TModel[Key]\n\t\t\t: TModel[Key] extends object\n\t\t\t\t? ValidateModel<TModel[Key]>\n\t\t\t\t: `Property ${Key extends string ? `'${Key}' ` : \"\"}is not a Signal, Action, or an object that contains only Signals and Actions.`;\n};\n\nexport type Model<TModel> = ValidateModel<TModel> & DisposableLike;\n\nexport type ModelFactory<TModel, TFactoryArgs extends any[] = []> = (\n\t...args: TFactoryArgs\n) => ValidateModel<TModel>;\nexport type ModelConstructor<TModel, TFactoryArgs extends any[] = []> = new (\n\t...args: TFactoryArgs\n) => Model<TModel>;\n\n/**\n * The public types for ModelConstructor require using `new` to help\n * disambiguate the function passed into `createModel` and the returned\n * constructor function. It is easier to say that `createModel` accepts\n * a factory and returns a class, then to say it accepts a factory and\n * returns a factory. In other words, this example:\n *\n * ```ts\n * const PersonModel = createModel((name: string) => ({ ... }));\n * const person = new PersonModel(\"John\");\n * ```\n *\n * is easier to understand than this example:\n *\n * ```ts\n * const createPerson = createModel((name: string) => ({ ... }));\n * const person = createPerson(\"John\");\n * ```\n *\n * However, internally we implement `createModel` to return a function\n * that can be called without `new` for simplicity. To bridge the gap\n * between the public types and the internal implementation, we define\n * this internal interface that extends the public interface but also\n * allows calling without `new`.\n *\n * This pattern is used by the Preact & React adapters to make instantiating\n * a model or a function that returns a model easier.\n *\n * @internal\n */\ninterface InternalModelConstructor<\n\tTModel,\n\tTFactoryArgs extends any[],\n> extends ModelConstructor<TModel, TFactoryArgs> {\n\t(...args: TFactoryArgs): Model<TModel>;\n}\n\nfunction startCapturingEffects(): () => Effect[] | undefined {\n\tlet prevCapturedEffects = capturedEffects;\n\tcapturedEffects = [];\n\n\treturn function stopCapturingEffects() {\n\t\tlet modelEffects = capturedEffects;\n\t\tif (capturedEffects && prevCapturedEffects) {\n\t\t\tprevCapturedEffects = prevCapturedEffects.concat(capturedEffects);\n\t\t}\n\n\t\tcapturedEffects = prevCapturedEffects;\n\n\t\treturn modelEffects;\n\t};\n}\n\nconst wrapInAction = (value: Record<string, unknown>) => {\n\tfor (const key in value) {\n\t\tconst val = value[key];\n\t\tif (typeof val === \"function\") {\n\t\t\tvalue[key] = action(val as (...args: unknown[]) => unknown);\n\t\t} else if (typeof val === \"object\" && val !== null && !(\"brand\" in val)) {\n\t\t\t// Recursively wrap nested object properties in actions. This allows users to write\n\t\t\t// nested models without worrying about wrapping their functions in `action`.\n\t\t\twrapInAction(val as Record<string, unknown>);\n\t\t}\n\t}\n};\n\nfunction createModel<TModel, TFactoryArgs extends any[] = []>(\n\tmodelFactory: ModelFactory<TModel, TFactoryArgs>\n): ModelConstructor<TModel, TFactoryArgs> {\n\treturn function SignalModel(...args: TFactoryArgs): Model<TModel> {\n\t\tlet modelEffects: Effect[] | undefined;\n\t\tlet model: Model<TModel>;\n\n\t\tconst stopCapturingEffects = startCapturingEffects();\n\t\ttry {\n\t\t\tmodel = modelFactory(...args) as Model<TModel>;\n\t\t} catch (err) {\n\t\t\t// Drop any captured effects on error. Errors from nested models will bubble\n\t\t\t// up here and recursively reset `capturedEffects` to `undefined` preventing\n\t\t\t// any captured effects from leaking\n\t\t\tcapturedEffects = undefined;\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tmodelEffects = stopCapturingEffects();\n\t\t}\n\n\t\twrapInAction(model);\n\n\t\tmodel[Symbol.dispose] = action(function disposeModel() {\n\t\t\tif (modelEffects) {\n\t\t\t\tfor (let i = 0; i < modelEffects.length; i++) {\n\t\t\t\t\tmodelEffects[i].dispose();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmodelEffects = undefined;\n\t\t});\n\n\t\treturn model;\n\t} as InternalModelConstructor<TModel, TFactoryArgs>;\n}\n\n//#endregion createModel\n\nexport {\n\tcomputed,\n\teffect,\n\tbatch,\n\tuntracked,\n\taction,\n\tcreateModel,\n\tSignal,\n\tReadonlySignal,\n\tEffect,\n\tComputed,\n};\n", "import type { Signal } from '@preact/signals-core';\n\nexport interface Readable<T> {\n    readonly value: T;\n}\n\nexport type SignalLike<T> = Signal<T> | Readable<T>;\n\nexport function readSignalValue<T>(source: SignalLike<T>): T {\n    return source.value;\n}\n", "import { effect } from '@preact/signals-core';\nimport { SvgElement } from '../core/SvgElement';\nimport { readSignalValue, SignalLike } from './readable';\n\nexport function bindProperty<T>(shard: SvgElement, key: string, source: SignalLike<T>): () => void {\n    return effect(() => {\n        const value = readSignalValue(source);\n        Reflect.set(shard, key, value);\n    });\n}\n\nexport function bindVisual(\n    shard: SvgElement,\n    sources: {\n        fill?: SignalLike<string | null>;\n        stroke?: SignalLike<string | null>;\n        strokeWidth?: SignalLike<number>;\n        opacity?: SignalLike<number>;\n    },\n): () => void {\n    const disposers: Array<() => void> = [];\n\n    if (sources.fill) {\n        disposers.push(\n            effect(() => {\n                shard.fill = readSignalValue(sources.fill!);\n            }),\n        );\n    }\n\n    if (sources.stroke) {\n        disposers.push(\n            effect(() => {\n                shard.stroke = readSignalValue(sources.stroke!);\n            }),\n        );\n    }\n\n    if (sources.strokeWidth) {\n        disposers.push(\n            effect(() => {\n                shard.strokeWidth = readSignalValue(sources.strokeWidth!);\n            }),\n        );\n    }\n\n    if (sources.opacity) {\n        disposers.push(\n            effect(() => {\n                shard.opacity = readSignalValue(sources.opacity!);\n            }),\n        );\n    }\n\n    return () => {\n        for (const dispose of disposers) {\n            dispose();\n        }\n    };\n}\n", "import { batch } from '@preact/signals-core';\n\nconst pending: Array<() => void> = [];\nlet rafId: number | null = null;\n\nexport function scheduleBatch(fn: () => void): void {\n    pending.push(fn);\n\n    if (rafId !== null) {\n        return;\n    }\n\n    rafId = requestAnimationFrame(() => {\n        rafId = null;\n        const callbacks = pending.splice(0, pending.length);\n\n        batch(() => {\n            for (const callback of callbacks) {\n                callback();\n            }\n        });\n    });\n}\n\nexport function flushScheduledBatches(): void {\n    if (rafId !== null) {\n        cancelAnimationFrame(rafId);\n        rafId = null;\n    }\n\n    const callbacks = pending.splice(0, pending.length);\n    batch(() => {\n        for (const callback of callbacks) {\n            callback();\n        }\n    });\n}\n", "import type { ViewportState } from './types';\n\nexport class ViewportController {\n    private host: HTMLElement;\n    private inner: HTMLElement;\n    private state: ViewportState = { scale: 1, translateX: 0, translateY: 0, rotation: 0 };\n    private isDragging = false;\n    private dragStart = { x: 0, y: 0 };\n    private boundOnWheel: (e: WheelEvent) => void;\n    private boundOnPointerDown: (e: PointerEvent) => void;\n    private boundOnPointerMove: (e: PointerEvent) => void;\n    private boundOnPointerUp: (e: PointerEvent) => void;\n\n    private constructor(host: HTMLElement, inner: HTMLElement) {\n        this.host = host;\n        this.inner = inner;\n\n        this.boundOnWheel = this.onWheel.bind(this);\n        this.boundOnPointerDown = this.onPointerDown.bind(this);\n        this.boundOnPointerMove = this.onPointerMove.bind(this);\n        this.boundOnPointerUp = this.onPointerUp.bind(this);\n\n        this.host.addEventListener('wheel', this.boundOnWheel, { passive: false });\n        this.host.addEventListener('pointerdown', this.boundOnPointerDown);\n        window.addEventListener('pointermove', this.boundOnPointerMove);\n        window.addEventListener('pointerup', this.boundOnPointerUp);\n    }\n\n    static mount(svg: SVGSVGElement, container: string | HTMLElement): ViewportController {\n        const host = typeof container === 'string' ? (document.querySelector(container) as HTMLElement) : container;\n\n        if (!host) {\n            throw new Error('Viewport container not found');\n        }\n\n        host.classList.add('svg-viewport-host');\n        host.innerHTML = '';\n\n        const inner = document.createElement('div');\n        inner.className = 'svg-viewport-inner';\n        host.appendChild(inner);\n\n        inner.appendChild(svg);\n\n        return new ViewportController(host, inner);\n    }\n\n    zoomIn(step = 0.2): void {\n        this.setScale(this.state.scale + step);\n    }\n\n    zoomOut(step = 0.2): void {\n        this.setScale(Math.max(0.2, this.state.scale - step));\n    }\n\n    rotate(step = 90): void {\n        this.state.rotation = (this.state.rotation + step) % 360;\n        this.applyTransform();\n    }\n\n    reset(): void {\n        this.state = { scale: 1, translateX: 0, translateY: 0, rotation: 0 };\n        this.applyTransform();\n    }\n\n    getState(): ViewportState {\n        return { ...this.state };\n    }\n\n    destroy(): void {\n        this.host.removeEventListener('wheel', this.boundOnWheel);\n        this.host.removeEventListener('pointerdown', this.boundOnPointerDown);\n        window.removeEventListener('pointermove', this.boundOnPointerMove);\n        window.removeEventListener('pointerup', this.boundOnPointerUp);\n    }\n\n    private setScale(scale: number): void {\n        this.state.scale = scale;\n        this.applyTransform();\n    }\n\n    private applyTransform(): void {\n        const { scale, translateX, translateY, rotation } = this.state;\n        this.inner.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale}) rotate(${rotation}deg)`;\n    }\n\n    private onWheel(event: WheelEvent): void {\n        event.preventDefault();\n        const delta = event.deltaY > 0 ? -0.1 : 0.1;\n        this.setScale(Math.max(0.2, this.state.scale + delta));\n    }\n\n    private onPointerDown(event: PointerEvent): void {\n        if (event.button !== 0) {\n            return;\n        }\n        this.isDragging = true;\n        this.dragStart = { x: event.clientX - this.state.translateX, y: event.clientY - this.state.translateY };\n        this.host.setPointerCapture(event.pointerId);\n    }\n\n    private onPointerMove(event: PointerEvent): void {\n        if (!this.isDragging) {\n            return;\n        }\n        this.state.translateX = event.clientX - this.dragStart.x;\n        this.state.translateY = event.clientY - this.dragStart.y;\n        this.applyTransform();\n    }\n\n    private onPointerUp(event: PointerEvent): void {\n        this.isDragging = false;\n        this.host.releasePointerCapture(event.pointerId);\n    }\n}\n", "import type { SvgElementUnion } from 'svg-shards';\nimport { createSvgShards } from 'svg-shards';\nimport { bindVisual, computed, signal, type Signal, type SignalLike } from 'svg-shards/reactive';\nimport { ViewportController } from './ViewportController';\nimport type {\n    HighlightMode,\n    HighlighterContainer,\n    HighlighterEntry,\n    HighlighterShard,\n    HighlighterVisualState,\n    SvgHighlighterOptions,\n} from './types';\n\nexport type {\n    SvgHighlighterOptions,\n    HighlightMode,\n    ViewportState,\n    HighlighterContainer,\n    HighlighterEntry,\n    HighlighterShard,\n    HighlighterVisualState,\n} from './types';\n\ninterface ActiveBinding {\n    element: HighlighterShard;\n    originalState: HighlighterVisualState;\n    unbind: () => void;\n}\n\nfunction isSignalLike<T>(value: unknown): value is SignalLike<T> {\n    return typeof value === 'object' && value !== null && 'value' in value;\n}\n\nfunction readSignalValue<T>(source: SignalLike<T>): T {\n    return source.value;\n}\n\nfunction isHighlighterContainer(source: unknown): source is HighlighterContainer {\n    return (\n        typeof source === 'object' &&\n        source !== null &&\n        'getAll' in source &&\n        'htmlNode' in source &&\n        'onAfterRefresh' in source\n    );\n}\n\nfunction asBindableShard(shard: HighlighterShard): SvgElementUnion {\n    return shard as unknown as SvgElementUnion;\n}\n\nfunction parseStrokeWidth(state: HighlighterVisualState, element: HighlighterShard): number {\n    if (state.strokeWidth !== null && state.strokeWidth !== '') {\n        const parsed = Number.parseFloat(state.strokeWidth);\n        if (!Number.isNaN(parsed)) {\n            return parsed;\n        }\n    }\n    return element.strokeWidth;\n}\n\nexport class SvgHighlighter {\n    private container: HighlighterContainer;\n    private entries: HighlighterEntry[];\n    private readonly strokeWidthBoost: number;\n    private readonly highlightColorSig: SignalLike<string>;\n    private readonly highlightModeSig: SignalLike<HighlightMode>;\n    private currentIndex = -1;\n    private activeBindings: ActiveBinding[] = [];\n    private viewport: ViewportController | null = null;\n\n    private constructor(container: HighlighterContainer, options: SvgHighlighterOptions) {\n        this.container = container;\n        this.entries = container.getAll();\n        this.strokeWidthBoost = options.strokeWidthBoost ?? 2;\n        this.highlightColorSig = isSignalLike<string>(options.highlightColor)\n            ? options.highlightColor\n            : signal(options.highlightColor ?? '#ff6600');\n        this.highlightModeSig = isSignalLike<HighlightMode>(options.highlightMode)\n            ? options.highlightMode\n            : signal(options.highlightMode ?? 'fill');\n        if (options.container) {\n            this.viewport = ViewportController.mount(container.htmlNode, options.container);\n        }\n\n        container.onAfterRefresh(() => {\n            this.syncEntries();\n            this.reapplyCurrentHighlight();\n        });\n    }\n\n    static create(source: Element | HighlighterContainer, options: SvgHighlighterOptions = {}): SvgHighlighter | null {\n        if (isHighlighterContainer(source)) {\n            return new SvgHighlighter(source, options);\n        }\n\n        const container = createSvgShards.fromElement(source, {\n            observe: options.observe,\n        });\n        if (!container) {\n            return null;\n        }\n        return new SvgHighlighter(container, options);\n    }\n\n    getElementList(): HighlighterEntry[] {\n        return this.entries;\n    }\n\n    highlight(entry: HighlighterEntry): void {\n        const index = this.entries.indexOf(entry);\n        if (index === this.currentIndex) {\n            this.clearHighlight();\n            return;\n        }\n\n        this.clearHighlight();\n        this.currentIndex = index;\n        if (index >= 0) {\n            this.applyHighlightTargets(this.getHighlightTargets(entry));\n        }\n    }\n\n    highlightByIndex(index: number): void {\n        if (index === this.currentIndex) {\n            this.clearHighlight();\n            return;\n        }\n\n        const entry = this.entries[index];\n        if (entry) {\n            this.highlight(entry);\n        }\n    }\n\n    highlightNext(): void {\n        if (this.entries.length === 0) {\n            return;\n        }\n        const next = this.currentIndex < this.entries.length - 1 ? this.currentIndex + 1 : 0;\n        this.highlightByIndex(next);\n    }\n\n    highlightPrev(): void {\n        if (this.entries.length === 0) {\n            return;\n        }\n        const prev = this.currentIndex > 0 ? this.currentIndex - 1 : this.entries.length - 1;\n        this.highlightByIndex(prev);\n    }\n\n    getCurrentIndex(): number {\n        return this.currentIndex;\n    }\n\n    getHighlightMode(): HighlightMode {\n        return readSignalValue(this.highlightModeSig);\n    }\n\n    setHighlightMode(mode: HighlightMode): void {\n        if (isSignalLike<HighlightMode>(this.highlightModeSig)) {\n            (this.highlightModeSig as Signal<HighlightMode>).value = mode;\n        }\n    }\n\n    clearHighlight(): void {\n        this.restoreHighlighted();\n        this.currentIndex = -1;\n    }\n\n    getViewport(): ViewportController | null {\n        return this.viewport;\n    }\n\n    destroy(): void {\n        this.clearHighlight();\n        this.container.onAfterRefresh(null);\n        this.viewport?.destroy();\n        this.viewport = null;\n    }\n\n    private syncEntries(): void {\n        const prevEntry = this.currentIndex >= 0 ? this.entries[this.currentIndex] : null;\n        const prevId = prevEntry?.element.id ?? null;\n        this.entries = this.container.getAll();\n\n        if (prevId) {\n            this.currentIndex = this.entries.findIndex((entry) => entry.element.id === prevId);\n        } else if (this.currentIndex >= this.entries.length) {\n            this.currentIndex = -1;\n        }\n    }\n\n    private reapplyCurrentHighlight(): void {\n        if (this.currentIndex < 0) {\n            return;\n        }\n\n        const entry = this.entries[this.currentIndex];\n        if (!entry) {\n            this.clearHighlight();\n            return;\n        }\n\n        this.restoreHighlighted();\n        this.applyHighlightTargets(this.getHighlightTargets(entry));\n    }\n\n    private getHighlightTargets(entry: HighlighterEntry): HighlighterShard[] {\n        if (entry.type !== 'group') {\n            return [entry.element];\n        }\n\n        const groupNode = entry.element.htmlNode;\n        return this.entries\n            .filter((candidate) => candidate.type !== 'group' && groupNode.contains(candidate.element.htmlNode))\n            .map((candidate) => candidate.element);\n    }\n\n    private applyHighlightTargets(targets: HighlighterShard[]): void {\n        this.activeBindings = targets.map((element) => {\n            const originalState = element.captureVisualState();\n            const baseStrokeWidth = parseStrokeWidth(originalState, element);\n            const bindable = asBindableShard(element);\n\n            const fill = computed(() => {\n                const mode = readSignalValue(this.highlightModeSig);\n                const color = readSignalValue(this.highlightColorSig);\n                return mode === 'outline' ? 'none' : color;\n            });\n\n            const stroke = computed(() => readSignalValue(this.highlightColorSig));\n\n            const strokeWidth = computed(() => baseStrokeWidth + this.strokeWidthBoost);\n\n            const unbind = bindVisual(bindable, { fill, stroke, strokeWidth });\n\n            return { element, originalState, unbind };\n        });\n    }\n\n    private restoreHighlighted(): void {\n        for (const binding of this.activeBindings) {\n            binding.unbind();\n            binding.element.applyVisualState(binding.originalState);\n        }\n        this.activeBindings = [];\n    }\n}\n", "import type { BoundingBox } from '../../src/core/types';\nimport type { SvgContainer } from '../../src/core/SvgContainer';\nimport type { SvgElement } from '../../src/core/SvgElement';\n\nexport interface PluginLessonGroup {\n    id: string;\n    title: string;\n    lessons: Lesson[];\n}\n\n/** Structural target for canvas outline \u2014 avoids src/dist class mismatch in plugin lessons. */\nexport interface PlaygroundHighlightTarget {\n    getBoundingBox(): BoundingBox;\n    htmlNode: SVGElement;\n}\n\nexport interface LessonContext {\n    getContainer: () => SvgContainer;\n    log: (message: string, detail?: string) => void;\n    getCanvasHost: () => HTMLElement;\n    resetScene: () => SvgContainer;\n    highlightShard: (shard: PlaygroundHighlightTarget | null) => void;\n    setSnippet: (code: string) => void;\n}\n\nexport interface Lesson {\n    id: string;\n    title: string;\n    description: string;\n    apiRefs: string[];\n    snippet: string;\n    mount: (panel: HTMLElement, ctx: LessonContext) => () => void;\n    reset: (ctx: LessonContext) => void;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n    tag: K,\n    props?: Record<string, string>,\n    children?: (Node | string)[],\n): HTMLElementTagNameMap[K] {\n    const node = document.createElement(tag);\n    if (props) {\n        for (const [key, value] of Object.entries(props)) {\n            if (key === 'className') {\n                node.className = value;\n            } else if (key === 'textContent') {\n                node.textContent = value;\n            } else {\n                node.setAttribute(key, value);\n            }\n        }\n    }\n    if (children) {\n        for (const child of children) {\n            node.appendChild(typeof child === 'string' ? document.createTextNode(child) : child);\n        }\n    }\n    return node;\n}\n\nexport function btn(label: string, onClick: () => void, className = 'btn'): HTMLButtonElement {\n    const button = el('button', { type: 'button', className, textContent: label });\n    button.addEventListener('click', onClick);\n    return button;\n}\n\nexport function shardLabel(shard: SvgElement, type?: string): string {\n    const id = shard.id || '(no id)';\n    return type ? `${type}#${id}` : id;\n}\n\nexport function shardTypeName(shard: SvgElement): string {\n    return shard.htmlNode.tagName.toLowerCase();\n}\n", "import { SvgHighlighter } from '../../../src/SvgHighlighter';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\n\nexport const navigationLesson: Lesson = {\n    id: 'highlighter-nav',\n    title: 'Navigation \u2014 highlightByIndex',\n    description:\n        'SvgHighlighter wraps shard navigation: highlight one entry at a time, toggle off by clicking the same index, walk the list with next/prev.',\n    apiRefs: ['SvgHighlighter.create', 'highlightByIndex', 'highlightNext', 'highlightPrev', 'getElementList'],\n    snippet: `const highlighter = SvgHighlighter.create(container, {\n  highlightColor: '#ff6600',\n});\n\nhighlighter.highlightByIndex(0);  // toggle on\nhighlighter.highlightByIndex(0);  // toggle off\nhighlighter.highlightNext();`,\n    mount(panel, ctx) {\n        const highlighter = SvgHighlighter.create(ctx.getContainer(), {\n            highlightColor: '#ff6600',\n            strokeWidthBoost: 2,\n        })!;\n\n        const list = el('ul', { className: 'shard-list' });\n\n        const refreshList = (): void => {\n            list.replaceChildren();\n            const active = highlighter.getCurrentIndex();\n            for (const [index, entry] of highlighter.getElementList().entries()) {\n                const item = el('li', {\n                    className: 'shard-list-item' + (index === active ? ' active' : ''),\n                    textContent: `${entry.type} \u2014 ${entry.label}`,\n                });\n                item.addEventListener('click', () => {\n                    highlighter.highlightByIndex(index);\n                    ctx.highlightShard(entry.element);\n                    ctx.log('highlightByIndex', String(index));\n                    refreshList();\n                });\n                list.appendChild(item);\n            }\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('\u2190 Prev', () => {\n                highlighter.highlightPrev();\n                const index = highlighter.getCurrentIndex();\n                const entry = index >= 0 ? highlighter.getElementList()[index] : null;\n                ctx.highlightShard(entry?.element ?? null);\n                ctx.log('highlightPrev', entry?.label ?? 'none');\n                refreshList();\n            }),\n        );\n        row.appendChild(\n            btn('Next \u2192', () => {\n                highlighter.highlightNext();\n                const index = highlighter.getCurrentIndex();\n                const entry = index >= 0 ? highlighter.getElementList()[index] : null;\n                ctx.highlightShard(entry?.element ?? null);\n                ctx.log('highlightNext', entry?.label ?? 'none');\n                refreshList();\n            }),\n        );\n        row.appendChild(\n            btn('Clear', () => {\n                highlighter.clearHighlight();\n                ctx.highlightShard(null);\n                ctx.log('clearHighlight');\n                refreshList();\n            }),\n        );\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent: 'Click a shard in the list or use Prev/Next. Click the active item again to toggle off.',\n            }),\n        );\n        panel.appendChild(row);\n        panel.appendChild(list);\n        refreshList();\n\n        return () => {\n            highlighter.destroy();\n            ctx.highlightShard(null);\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import { signal } from 'svg-shards/reactive';\nimport { SvgHighlighter } from '../../../src/SvgHighlighter';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\n\nexport const modesLesson: Lesson = {\n    id: 'highlighter-modes',\n    title: 'Modes \u2014 fill & outline',\n    description:\n        'Highlight style is driven by reactive signals internally. Switch fill/outline at runtime or bind highlightColor to a signal \u2014 the active highlight updates without re-capture.',\n    apiRefs: ['setHighlightMode', 'SignalLike highlightColor', 'bindVisual'],\n    snippet: `const color = signal('#ff6600');\nconst highlighter = SvgHighlighter.create(container, {\n  highlightColor: color,\n  highlightMode: 'fill',\n});\n\nhighlighter.highlightByIndex(2);\nhighlighter.setHighlightMode('outline');\ncolor.value = '#4a90d9';  // live update`,\n    mount(panel, ctx) {\n        const color = signal('#ff6600');\n        const highlighter = SvgHighlighter.create(ctx.getContainer(), {\n            highlightColor: color,\n            strokeWidthBoost: 2,\n        })!;\n\n        const colorInput = el('input', { type: 'color', value: '#ff6600' }) as HTMLInputElement;\n        colorInput.addEventListener('input', () => {\n            color.value = colorInput.value;\n            ctx.log('highlightColor signal', color.value);\n        });\n\n        const modeRow = el('div', { className: 'btn-row' });\n        modeRow.appendChild(\n            btn('Fill mode', () => {\n                highlighter.setHighlightMode('fill');\n                ctx.log('setHighlightMode', 'fill');\n            }),\n        );\n        modeRow.appendChild(\n            btn('Outline mode', () => {\n                highlighter.setHighlightMode('outline');\n                ctx.log('setHighlightMode', 'outline');\n            }),\n        );\n\n        const targetRow = el('div', { className: 'btn-row' });\n        for (const id of ['panel', 'sun', 'badge']) {\n            targetRow.appendChild(\n                btn(`Highlight ${id}`, () => {\n                    const index = highlighter.getElementList().findIndex((entry) => entry.element.id === id);\n                    if (index >= 0) {\n                        highlighter.highlightByIndex(index);\n                        ctx.highlightShard(highlighter.getElementList()[index]!.element);\n                        ctx.log('highlightByIndex', id);\n                    }\n                }),\n            );\n        }\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent: 'Pick a shard, then switch mode or drag the color picker \u2014 changes apply reactively.',\n            }),\n        );\n        panel.appendChild(el('label', { className: 'color-field', textContent: 'Color ' }, [colorInput]));\n        panel.appendChild(modeRow);\n        panel.appendChild(targetRow);\n\n        return () => {\n            highlighter.destroy();\n            ctx.highlightShard(null);\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import { SvgHighlighter } from '../../../src/SvgHighlighter';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\n\nexport const groupsLesson: Lesson = {\n    id: 'highlighter-groups',\n    title: 'Groups \u2014 descendant highlight',\n    description:\n        'Selecting a group entry highlights all non-group descendants inside it. Individual shards outside the group stay unchanged.',\n    apiRefs: ['getHighlightTargets (internal)', 'GroupElement', 'highlightByIndex'],\n    snippet: `// scene-group contains moon, trail, badge\nconst idx = entries.findIndex(e => e.type === 'group');\nhighlighter.highlightByIndex(idx);\n// all visual descendants get the highlight binding`,\n    mount(panel, ctx) {\n        const highlighter = SvgHighlighter.create(ctx.getContainer(), {\n            highlightColor: '#805ad5',\n            strokeWidthBoost: 2,\n            highlightMode: 'outline',\n        })!;\n\n        const status = el('p', { className: 'lesson-hint', textContent: 'No group selected.' });\n\n        const highlightGroup = (): void => {\n            const groupEntry = highlighter.getElementList().find((entry) => entry.type === 'group');\n            if (!groupEntry) {\n                return;\n            }\n            const index = highlighter.getElementList().indexOf(groupEntry);\n            highlighter.highlightByIndex(index);\n            ctx.highlightShard(groupEntry.element);\n            status.textContent = `Highlighted ${groupEntry.label}: all visual descendants`;\n            ctx.log('highlight group', groupEntry.label);\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(btn('Highlight scene-group', highlightGroup));\n        row.appendChild(\n            btn('Clear', () => {\n                highlighter.clearHighlight();\n                ctx.highlightShard(null);\n                status.textContent = 'No group selected.';\n                ctx.log('clearHighlight');\n            }),\n        );\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent: 'The group entry expands to all visual children \u2014 try outline mode to see each part.',\n            }),\n        );\n        panel.appendChild(row);\n        panel.appendChild(status);\n\n        return () => {\n            highlighter.destroy();\n            ctx.highlightShard(null);\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import { navigationLesson } from './01-navigation';\nimport { modesLesson } from './02-modes';\nimport { groupsLesson } from './03-groups';\nimport type { Lesson } from '../types';\n\nexport const highlighterLessons: Lesson[] = [navigationLesson, modesLesson, groupsLesson];\n\nexport const defaultLessonId = 'highlighter-nav';\n", "import type { CircleElement, GroupElement, SvgContainer } from 'svg-shards';\nimport type { ParticleInit } from '../types';\nimport type { ParticlePoolOptions } from './types';\n\nconst HIDDEN_OPACITY = 0;\n\nexport class ParticlePool {\n    private _container: SvgContainer;\n    private _parent?: GroupElement;\n    private _maxSize: number;\n    private _shards: CircleElement[] = [];\n\n    constructor(container: SvgContainer, options: ParticlePoolOptions = {}) {\n        this._container = container;\n        this._parent = options.parent;\n        this._maxSize = options.maxSize ?? Number.POSITIVE_INFINITY;\n    }\n\n    get capacity(): number {\n        return this._shards.length;\n    }\n\n    get maxSize(): number {\n        return this._maxSize;\n    }\n\n    acquire(count: number, init: (index: number) => ParticleInit): CircleElement[] {\n        if (count < 0) {\n            throw new RangeError('acquire count must be non-negative');\n        }\n\n        if (count === 0) {\n            this.hideInactive(0);\n            return [];\n        }\n\n        if (count > this._maxSize) {\n            throw new RangeError(`Requested ${count} particles exceeds pool maxSize ${this._maxSize}`);\n        }\n\n        const inits: ParticleInit[] = [];\n        for (let i = 0; i < count; i++) {\n            inits.push(init(i));\n        }\n\n        while (this._shards.length < count) {\n            const index = this._shards.length;\n            const particle = inits[index];\n            const shard = this._container.createCircle({\n                parent: this._parent,\n                cx: particle.cx ?? 0,\n                cy: particle.cy ?? 0,\n                r: particle.r ?? 4,\n                fill: particle.fill,\n                stroke: particle.stroke,\n                strokeWidth: particle.strokeWidth,\n                opacity: particle.opacity ?? 1,\n            });\n            this._shards.push(shard);\n        }\n\n        const active: CircleElement[] = [];\n        for (let i = 0; i < count; i++) {\n            const shard = this._shards[i];\n            this.applyInit(shard, inits[i]);\n            this.showShard(shard);\n            active.push(shard);\n        }\n\n        this.hideInactive(count);\n        return active;\n    }\n\n    release(index: number): void {\n        if (index >= 0 && index < this._shards.length) {\n            this.hideShard(this._shards[index]);\n        }\n    }\n\n    reset(): void {\n        for (const shard of this._shards) {\n            this._container.removeShard(shard);\n        }\n        this._shards = [];\n    }\n\n    private hideInactive(fromIndex: number): void {\n        for (let i = fromIndex; i < this._shards.length; i++) {\n            this.hideShard(this._shards[i]);\n        }\n    }\n\n    private hideShard(shard: CircleElement): void {\n        shard.opacity = HIDDEN_OPACITY;\n    }\n\n    private showShard(shard: CircleElement): void {\n        if (shard.opacity === HIDDEN_OPACITY) {\n            shard.opacity = 1;\n        }\n    }\n\n    private applyInit(shard: CircleElement, particle: ParticleInit): void {\n        if (particle.cx !== undefined) {\n            shard.cx = particle.cx;\n        }\n        if (particle.cy !== undefined) {\n            shard.cy = particle.cy;\n        }\n        if (particle.r !== undefined) {\n            shard.r = particle.r;\n        }\n        if (particle.fill !== undefined) {\n            shard.fill = particle.fill;\n        }\n        if (particle.stroke !== undefined) {\n            shard.stroke = particle.stroke;\n        }\n        if (particle.strokeWidth !== undefined) {\n            shard.strokeWidth = particle.strokeWidth;\n        }\n        if (particle.opacity !== undefined) {\n            shard.opacity = particle.opacity;\n        }\n    }\n}\n", "import type { Bounds } from '../types';\n\nexport interface BounceState {\n    cx: number;\n    cy: number;\n    vx: number;\n    vy: number;\n    r: number;\n}\n\nexport function resolveWallBounce(state: BounceState, bounds: Bounds, restitution: number): BounceState {\n    let { cx, cy, vx, vy } = state;\n    const { r } = state;\n    const { width, height } = bounds;\n\n    if (cx - r < 0) {\n        cx = r;\n        vx = -vx * restitution;\n    } else if (cx + r > width) {\n        cx = width - r;\n        vx = -vx * restitution;\n    }\n\n    if (cy - r < 0) {\n        cy = r;\n        vy = -vy * restitution;\n    } else if (cy + r > height) {\n        cy = height - r;\n        vy = -vy * restitution;\n    }\n\n    return { cx, cy, vx, vy, r };\n}\n\nexport function resolveWallBounceInPlace(\n    index: number,\n    cx: Float32Array,\n    cy: Float32Array,\n    vx: Float32Array,\n    vy: Float32Array,\n    r: Float32Array,\n    bounds: Bounds,\n    restitution: number,\n): void {\n    const resolved = resolveWallBounce(\n        {\n            cx: cx[index],\n            cy: cy[index],\n            vx: vx[index],\n            vy: vy[index],\n            r: r[index],\n        },\n        bounds,\n        restitution,\n    );\n\n    cx[index] = resolved.cx;\n    cy[index] = resolved.cy;\n    vx[index] = resolved.vx;\n    vy[index] = resolved.vy;\n}\n", "import { resolveWallBounceInPlace } from './bounds';\nimport type { Bounds } from '../types';\nimport type { ParticleState } from '../state/ParticleState';\n\nexport interface IntegrateStepOptions {\n    gravity: number;\n    dt: number;\n}\n\nexport function integrateParticle(\n    cx: number,\n    cy: number,\n    vx: number,\n    vy: number,\n    gravity: number,\n    dt: number,\n): { cx: number; cy: number; vx: number; vy: number } {\n    const nextVy = vy + gravity * dt;\n    return {\n        cx: cx + vx * dt,\n        cy: cy + nextVy * dt,\n        vx,\n        vy: nextVy,\n    };\n}\n\nexport function stepParticles(\n    state: ParticleState,\n    bounds: Bounds,\n    options: IntegrateStepOptions & { restitution: number },\n): void {\n    const { gravity, dt, restitution } = options;\n\n    for (let i = 0; i < state.count; i++) {\n        const integrated = integrateParticle(state.cx[i], state.cy[i], state.vx[i], state.vy[i], gravity, dt);\n\n        state.cx[i] = integrated.cx;\n        state.cy[i] = integrated.cy;\n        state.vx[i] = integrated.vx;\n        state.vy[i] = integrated.vy;\n\n        resolveWallBounceInPlace(i, state.cx, state.cy, state.vx, state.vy, state.r, bounds, restitution);\n\n        state.shards[i].cx = state.cx[i];\n        state.shards[i].cy = state.cy[i];\n    }\n}\n", "import type { CircleElement } from 'svg-shards';\n\nexport class ParticleState {\n    count = 0;\n    cx = new Float32Array(0);\n    cy = new Float32Array(0);\n    vx = new Float32Array(0);\n    vy = new Float32Array(0);\n    r = new Float32Array(0);\n    shards: CircleElement[] = [];\n\n    reset(count: number): void {\n        this.count = count;\n        this.cx = new Float32Array(count);\n        this.cy = new Float32Array(count);\n        this.vx = new Float32Array(count);\n        this.vy = new Float32Array(count);\n        this.r = new Float32Array(count);\n        this.shards = [];\n    }\n\n    clear(): void {\n        this.count = 0;\n        this.cx = new Float32Array(0);\n        this.cy = new Float32Array(0);\n        this.vx = new Float32Array(0);\n        this.vy = new Float32Array(0);\n        this.r = new Float32Array(0);\n        this.shards = [];\n    }\n}\n", "import type { SvgContainer } from 'svg-shards';\nimport { scheduleBatch } from 'svg-shards/reactive';\nimport { ParticlePool } from './pool/ParticlePool';\nimport { stepParticles } from './physics/integrator';\nimport { ParticleState } from './state/ParticleState';\nimport type { Bounds, ParticleFieldOptions, ParticleInit } from './types';\n\nconst DEFAULT_RESTITUTION = 0.85;\nconst MAX_DT = 1 / 30;\n\nexport class ParticleField {\n    private _container: SvgContainer;\n    private _pool: ParticlePool;\n    private _state = new ParticleState();\n    private _bounds: Bounds;\n    private _gravity: number;\n    private _restitution: number;\n    private _running = false;\n    private _lastTime: number | null = null;\n\n    constructor(container: SvgContainer, options: ParticleFieldOptions = {}) {\n        this._container = container;\n        this._bounds = options.bounds ?? this.defaultBounds(container);\n        this._gravity = options.gravity ?? 0;\n        this._restitution = options.restitution ?? DEFAULT_RESTITUTION;\n        this._pool = new ParticlePool(container, { parent: options.parent });\n    }\n\n    get count(): number {\n        return this._state.count;\n    }\n\n    get bounds(): Bounds {\n        return this._bounds;\n    }\n\n    set bounds(value: Bounds) {\n        this._bounds = value;\n    }\n\n    get gravity(): number {\n        return this._gravity;\n    }\n\n    set gravity(value: number) {\n        this._gravity = value;\n    }\n\n    get restitution(): number {\n        return this._restitution;\n    }\n\n    set restitution(value: number) {\n        this._restitution = value;\n    }\n\n    spawn(count: number, init: (index: number) => ParticleInit): void {\n        this.stop();\n\n        const inits: ParticleInit[] = [];\n        for (let i = 0; i < count; i++) {\n            inits.push(init(i));\n        }\n\n        const shards = this._pool.acquire(count, (i) => inits[i]);\n\n        this._state.reset(count);\n        this._state.shards = shards;\n\n        for (let i = 0; i < count; i++) {\n            const particle = inits[i];\n            this._state.cx[i] = particle.cx ?? shards[i].cx;\n            this._state.cy[i] = particle.cy ?? shards[i].cy;\n            this._state.vx[i] = particle.vx ?? 0;\n            this._state.vy[i] = particle.vy ?? 0;\n            this._state.r[i] = particle.r ?? shards[i].r;\n        }\n    }\n\n    start(): void {\n        if (this._running || this._state.count === 0) {\n            return;\n        }\n\n        this._running = true;\n        this._lastTime = null;\n        this.scheduleFrame();\n    }\n\n    stop(): void {\n        this._running = false;\n        this._lastTime = null;\n    }\n\n    dispose(): void {\n        this.stop();\n        this._pool.reset();\n        this._state.clear();\n    }\n\n    private scheduleFrame(): void {\n        scheduleBatch(() => {\n            if (!this._running) {\n                return;\n            }\n\n            const now = performance.now();\n            const dt = this._lastTime === null ? 1 / 60 : Math.min((now - this._lastTime) / 1000, MAX_DT);\n            this._lastTime = now;\n\n            stepParticles(this._state, this._bounds, {\n                gravity: this._gravity,\n                dt,\n                restitution: this._restitution,\n            });\n\n            this.scheduleFrame();\n        });\n    }\n\n    private defaultBounds(container: SvgContainer): Bounds {\n        const viewBox = container.viewBox;\n        const width = viewBox.width || container.width || 400;\n        const height = viewBox.height || container.height || 300;\n        return { width, height };\n    }\n}\n", "import { el } from '../types';\nimport type { PlaygroundHighlightTarget } from '../types';\nimport type { SpawnFromPathInit, SpawnPathParent } from '../../../src/spawn/fromPath';\n\n/** Minimal shard \u2014 avoids src/dist svg-shards class mismatch in playground lessons. */\nexport interface ParticlesShard {\n    htmlNode: SVGElement;\n}\n\nexport interface SnowflakeShard extends ParticlesShard {\n    transform: string | null;\n}\n\nexport interface CircleShard extends ParticlesShard, PlaygroundHighlightTarget {\n    r: number;\n    cx: number;\n    cy: number;\n}\n\nexport interface ParticlesGroup extends ParticlesShard, SpawnPathParent {\n    children: ParticlesShard[];\n    removeChild(element: ParticlesShard): void;\n}\n\nexport type ParticlesCreateManyOptions = SpawnFromPathInit & {\n    parent?: ParticlesGroup;\n};\n\n/** Any SvgContainer from createSvgShards satisfies this structurally. */\nexport interface ParticlesContainer {\n    htmlNode: SVGSVGElement;\n    getById(id: string): ParticlesShard | null;\n    registerNode(node: Element): ParticlesShard | null;\n    getByType(type: 'circle'): CircleShard[];\n    createCircle(options: {\n        parent?: ParticlesGroup;\n        cx?: number;\n        cy?: number;\n        r?: number;\n        fill?: string;\n        stroke?: string;\n        strokeWidth?: number;\n    }): CircleShard;\n    createMany(kind: 'circle', count: number, factory: (index: number) => ParticlesCreateManyOptions): CircleShard[];\n    createMany(kind: 'path', count: number, factory: (index: number) => ParticlesCreateManyOptions): ParticlesShard[];\n    removeShard(shard: ParticlesShard): void;\n}\n\n/** Bridge LessonContext SvgContainer \u2192 playground structural type (src/dist safe). */\nexport function toParticlesContainer(container: unknown): ParticlesContainer {\n    return container as ParticlesContainer;\n}\n\nexport const PARTICLE_BOUNDS = { width: 400, height: 300 };\n\nexport interface FpsTracker {\n    element: HTMLSpanElement;\n    setActive: (active: boolean) => void;\n    dispose: () => void;\n}\n\n/** rAF-based FPS readout \u2014 call setActive(false) on pause, true on resume. */\nexport function createFpsTracker(initiallyActive = true): FpsTracker {\n    const element = el('span', { className: 'fps-counter', textContent: 'FPS: \u2014' });\n    let active = initiallyActive;\n    let frameCount = 0;\n    let lastFpsTime = performance.now();\n    let rafId = 0;\n\n    const loop = (): void => {\n        if (!active) {\n            return;\n        }\n\n        frameCount++;\n        const now = performance.now();\n        if (now - lastFpsTime >= 500) {\n            element.textContent = `FPS: ${Math.round((frameCount * 1000) / (now - lastFpsTime))}`;\n            frameCount = 0;\n            lastFpsTime = now;\n        }\n\n        rafId = requestAnimationFrame(loop);\n    };\n\n    const kick = (): void => {\n        cancelAnimationFrame(rafId);\n        frameCount = 0;\n        lastFpsTime = performance.now();\n        rafId = requestAnimationFrame(loop);\n    };\n\n    if (initiallyActive) {\n        kick();\n    }\n\n    return {\n        element,\n        setActive(next: boolean) {\n            active = next;\n            if (next) {\n                kick();\n            } else {\n                cancelAnimationFrame(rafId);\n            }\n        },\n        dispose() {\n            active = false;\n            cancelAnimationFrame(rafId);\n        },\n    };\n}\n\nexport function getParticlesGroup(container: ParticlesContainer): ParticlesGroup | null {\n    return container.getById('particles') as ParticlesGroup | null;\n}\n\nexport function ensureParticlesGroup(container: ParticlesContainer): ParticlesGroup {\n    const existing = getParticlesGroup(container);\n    if (existing) {\n        return existing;\n    }\n\n    const groupNode = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n    groupNode.id = 'particles';\n    container.htmlNode.appendChild(groupNode);\n    return container.registerNode(groupNode) as ParticlesGroup;\n}\n\nexport function clearGroupChildren(group: ParticlesGroup): void {\n    for (const child of [...group.children]) {\n        group.removeChild(child);\n    }\n}\n\nexport function randomHsl(index: number, step = 7): string {\n    return `hsl(${(index * step) % 360}, 80%, 55%)`;\n}\n", "import { ParticleField } from '../../../src/ParticleField';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport { ensureParticlesGroup, PARTICLE_BOUNDS, createFpsTracker } from './shared';\n\nconst BOUNDS = PARTICLE_BOUNDS;\n\nexport const bouncingBallsLesson: Lesson = {\n    id: 'bouncing-balls',\n    title: 'Bouncing balls \u2014 ParticleField',\n    description:\n        'ParticleField spawns circle shards via svg.createMany, simulates velocity + gravity with Euler integration, and bounces off the viewBox walls at 60fps via scheduleBatch.',\n    apiRefs: ['ParticleField', 'spawn', 'start', 'stop', 'svg.createMany', 'scheduleBatch'],\n    snippet: `const field = new ParticleField(svg, {\n  bounds: { width: 400, height: 300 },\n  gravity: 980,\n  restitution: 0.9,\n});\n\nfield.spawn(150, (i) => ({\n  cx: Math.random() * 400,\n  cy: Math.random() * 100,\n  r: 4 + Math.random() * 6,\n  vx: (Math.random() - 0.5) * 200,\n  vy: (Math.random() - 0.5) * 100,\n  fill: \\`hsl(\\${(i * 7) % 360}, 80%, 55%)\\`,\n}));\n\nfield.start();`,\n    mount(panel, ctx) {\n        const container = ctx.getContainer();\n        const group = ensureParticlesGroup(container);\n\n        let field: ParticleField | null = new ParticleField(container, {\n            bounds: BOUNDS,\n            gravity: 980,\n            restitution: 0.9,\n            parent: group,\n        });\n\n        let running = true;\n        let gravity = 980;\n        let restitution = 0.9;\n        const fps = createFpsTracker(true);\n\n        const readout = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('particles: '),\n            el('strong', { textContent: '0' }),\n            document.createTextNode(' \u00B7 gravity '),\n            el('strong', { textContent: '980' }),\n            document.createTextNode(' \u00B7 restitution '),\n            el('strong', { textContent: '0.90' }),\n        ]);\n        const countEl = readout.querySelector('strong:nth-of-type(1)')!;\n        const gravityEl = readout.querySelector('strong:nth-of-type(2)')!;\n        const restitutionEl = readout.querySelector('strong:nth-of-type(3)')!;\n\n        const updateReadout = (): void => {\n            countEl.textContent = String(field?.count ?? 0);\n            gravityEl.textContent = String(gravity);\n            restitutionEl.textContent = restitution.toFixed(2);\n        };\n\n        const spawn = (count: number): void => {\n            field?.dispose();\n            field = new ParticleField(container, {\n                bounds: BOUNDS,\n                gravity,\n                restitution,\n                parent: group,\n            });\n            field.spawn(count, (i) => ({\n                cx: Math.random() * BOUNDS.width,\n                cy: Math.random() * (BOUNDS.height * 0.4),\n                r: 4 + Math.random() * 6,\n                vx: (Math.random() - 0.5) * 200,\n                vy: (Math.random() - 0.5) * 100,\n                fill: `hsl(${(i * 7) % 360}, 80%, 55%)`,\n            }));\n            if (running) {\n                field.start();\n            }\n            ctx.log('field.spawn', String(count));\n            updateReadout();\n        };\n\n        spawn(100);\n        field?.start();\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(btn('Spawn 50', () => spawn(50)));\n        row.appendChild(btn('Spawn 200', () => spawn(200)));\n        row.appendChild(\n            btn('Clear', () => {\n                field?.dispose();\n                field = new ParticleField(container, {\n                    bounds: BOUNDS,\n                    gravity,\n                    restitution,\n                    parent: group,\n                });\n                updateReadout();\n                ctx.log('field.dispose', 'cleared');\n            }),\n        );\n        row.appendChild(\n            btn('Pause', () => {\n                running = false;\n                field?.stop();\n                fps.setActive(false);\n                ctx.log('field.stop');\n            }),\n        );\n        row.appendChild(\n            btn('Resume', () => {\n                running = true;\n                field?.start();\n                fps.setActive(true);\n                ctx.log('field.start');\n            }),\n        );\n\n        const gravityRow = el('div', { className: 'control-row' });\n        gravityRow.appendChild(document.createTextNode('Gravity '));\n        const gravityInput = el('input', { type: 'range', min: '0', max: '2000', value: '980' }) as HTMLInputElement;\n        gravityInput.addEventListener('input', () => {\n            gravity = Number(gravityInput.value);\n            if (field) {\n                field.gravity = gravity;\n            }\n            updateReadout();\n        });\n        gravityRow.appendChild(gravityInput);\n\n        const restitutionRow = el('div', { className: 'control-row' });\n        restitutionRow.appendChild(document.createTextNode('Restitution '));\n        const restitutionInput = el('input', {\n            type: 'range',\n            min: '0',\n            max: '100',\n            value: '90',\n        }) as HTMLInputElement;\n        restitutionInput.addEventListener('input', () => {\n            restitution = Number(restitutionInput.value) / 100;\n            if (field) {\n                field.restitution = restitution;\n            }\n            updateReadout();\n        });\n        restitutionRow.appendChild(restitutionInput);\n\n        panel.appendChild(readout);\n        panel.appendChild(fps.element);\n        panel.appendChild(row);\n        panel.appendChild(gravityRow);\n        panel.appendChild(restitutionRow);\n        updateReadout();\n\n        return () => {\n            running = false;\n            fps.dispose();\n            field?.dispose();\n            field = null;\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'bouncing-balls');\n    },\n};\n", "import type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport {\n    clearGroupChildren,\n    ensureParticlesGroup,\n    PARTICLE_BOUNDS,\n    randomHsl,\n    toParticlesContainer,\n    type CircleShard,\n} from './shared';\n\nexport const createShardsLesson: Lesson = {\n    id: 'particles-create',\n    title: 'Create shards \u2014 createCircle / createMany',\n    description:\n        'Before ParticleField: the core svg-shards API creates DOM nodes and registers shards immediately \u2014 no refresh(). createCircle adds one shard; createMany batch-creates via DocumentFragment.',\n    apiRefs: ['createCircle', 'createMany', 'registerNode', 'GroupElement.adoptChild'],\n    snippet: `const group = svg.getById('particles');\n\nconst dot = svg.createCircle({\n  parent: group,\n  cx: 120, cy: 80, r: 14,\n  fill: '#f60', stroke: '#fff', strokeWidth: 2,\n});\n\nconst batch = svg.createMany('circle', 24, (i) => ({\n  parent: group,\n  cx: 40 + (i % 8) * 42,\n  cy: 160 + Math.floor(i / 8) * 36,\n  r: 6,\n  fill: \\`hsl(\\${(i * 15) % 360}, 75%, 55%)\\`,\n}));`,\n    mount(panel, ctx) {\n        const container = toParticlesContainer(ctx.getContainer());\n        const group = ensureParticlesGroup(container);\n        let created: CircleShard[] = [];\n\n        const readout = el('p', {\n            className: 'lesson-hint',\n            textContent: 'Shards live in #particles group. Count updates without refresh().',\n        });\n        const countEl = el('strong', { textContent: '0' });\n        const stats = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('circles in map: '),\n            countEl,\n            document.createTextNode(' \u00B7 last r: '),\n            el('strong', { id: 'last-r', textContent: '\u2014' }),\n        ]);\n\n        const updateStats = (): void => {\n            countEl.textContent = String(container.getByType('circle').length);\n            const last = created[created.length - 1];\n            const rEl = stats.querySelector('#last-r');\n            if (rEl) {\n                rEl.textContent = last ? String(Math.round(last.r)) : '\u2014';\n            }\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('createCircle', () => {\n                const shard = container.createCircle({\n                    parent: group,\n                    cx: 40 + Math.random() * (PARTICLE_BOUNDS.width - 80),\n                    cy: 40 + Math.random() * (PARTICLE_BOUNDS.height - 80),\n                    r: 6 + Math.random() * 10,\n                    fill: randomHsl(created.length, 23),\n                    stroke: '#fff',\n                    strokeWidth: 1,\n                }) as CircleShard;\n                created.push(shard);\n                ctx.highlightShard(shard);\n                ctx.log('createCircle', `r=${shard.r.toFixed(1)}`);\n                updateStats();\n            }),\n        );\n        row.appendChild(\n            btn('createMany \u00D720', () => {\n                const start = created.length;\n                const batch = container.createMany('circle', 20, (i) => ({\n                    parent: group,\n                    cx: 30 + (i % 10) * 36,\n                    cy: 40 + Math.floor(i / 10) * 40,\n                    r: 5,\n                    fill: randomHsl(start + i, 18),\n                })) as CircleShard[];\n                created = created.concat(batch);\n                ctx.log('createMany', '20 circles');\n                updateStats();\n            }),\n        );\n        row.appendChild(\n            btn('Clear group', () => {\n                clearGroupChildren(group);\n                created = [];\n                ctx.highlightShard(null);\n                ctx.log('clearGroupChildren');\n                updateStats();\n            }),\n        );\n\n        const radiusRow = el('div', { className: 'control-row' });\n        radiusRow.appendChild(document.createTextNode('Resize last '));\n        const radiusInput = el('input', { type: 'range', min: '2', max: '30', value: '10' }) as HTMLInputElement;\n        radiusInput.addEventListener('input', () => {\n            const last = created[created.length - 1];\n            if (!last) {\n                return;\n            }\n            last.r = Number(radiusInput.value);\n            updateStats();\n        });\n        radiusRow.appendChild(radiusInput);\n\n        panel.appendChild(readout);\n        panel.appendChild(stats);\n        panel.appendChild(row);\n        panel.appendChild(radiusRow);\n        updateStats();\n\n        return () => {\n            clearGroupChildren(group);\n            created = [];\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'particles-create');\n    },\n};\n", "import { ParticleField } from '../../../src/ParticleField';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport { ensureParticlesGroup, PARTICLE_BOUNDS, randomHsl, createFpsTracker } from './shared';\n\ntype SpawnPattern = 'random' | 'grid' | 'ring' | 'fountain';\n\nexport const spawnInitLesson: Lesson = {\n    id: 'particles-spawn',\n    title: 'Spawn \u2014 init callback & parent group',\n    description:\n        'field.spawn(count, init) calls your init(i) for each particle. Return cx, cy, r, vx, vy, fill \u2014 ParticleField stores SoA arrays and creates circle shards via createMany. gravity=0 here so you see the spawn layout.',\n    apiRefs: ['ParticleField.spawn', 'ParticleInit', 'parent: GroupElement', 'createMany'],\n    snippet: `field.spawn(60, (i) => ({\n  cx: 200 + Math.cos(i * 0.4) * 80,\n  cy: 150 + Math.sin(i * 0.4) * 50,\n  r: 4,\n  vx: Math.cos(i) * 40,\n  vy: Math.sin(i) * 40,\n  fill: \\`hsl(\\${(i * 6) % 360}, 80%, 55%)\\`,\n}));`,\n    mount(panel, ctx) {\n        const container = ctx.getContainer();\n        const group = ensureParticlesGroup(container);\n\n        let field = new ParticleField(container, {\n            bounds: PARTICLE_BOUNDS,\n            gravity: 0,\n            restitution: 0.85,\n            parent: group,\n        });\n\n        let pattern: SpawnPattern = 'ring';\n        const fps = createFpsTracker(true);\n\n        const readout = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('pattern: '),\n            el('strong', { id: 'pattern-label', textContent: 'ring' }),\n            document.createTextNode(' \u00B7 count: '),\n            el('strong', { id: 'spawn-count', textContent: '0' }),\n        ]);\n\n        const buildInit = (kind: SpawnPattern, count: number) => {\n            switch (kind) {\n                case 'grid':\n                    return (i: number) => ({\n                        cx: 40 + (i % 10) * 34,\n                        cy: 40 + Math.floor(i / 10) * 34,\n                        r: 5,\n                        vx: 0,\n                        vy: 0,\n                        fill: randomHsl(i, 12),\n                    });\n                case 'fountain':\n                    return (i: number) => ({\n                        cx: PARTICLE_BOUNDS.width / 2 + (Math.random() - 0.5) * 20,\n                        cy: PARTICLE_BOUNDS.height - 20,\n                        r: 3 + Math.random() * 4,\n                        vx: (Math.random() - 0.5) * 120,\n                        vy: -(80 + Math.random() * 160),\n                        fill: randomHsl(i, 9),\n                    });\n                case 'random':\n                    return (i: number) => ({\n                        cx: Math.random() * PARTICLE_BOUNDS.width,\n                        cy: Math.random() * PARTICLE_BOUNDS.height,\n                        r: 3 + Math.random() * 7,\n                        vx: (Math.random() - 0.5) * 60,\n                        vy: (Math.random() - 0.5) * 60,\n                        fill: randomHsl(i),\n                    });\n                case 'ring':\n                default:\n                    return (i: number) => {\n                        const angle = (i / count) * Math.PI * 2;\n                        return {\n                            cx: 200 + Math.cos(angle) * 90,\n                            cy: 150 + Math.sin(angle) * 55,\n                            r: 4 + (i % 3),\n                            vx: Math.cos(angle) * 50,\n                            vy: Math.sin(angle) * 50,\n                            fill: randomHsl(i, 6),\n                        };\n                    };\n            }\n        };\n\n        const respawn = (count: number): void => {\n            field.dispose();\n            field = new ParticleField(container, {\n                bounds: PARTICLE_BOUNDS,\n                gravity: 0,\n                restitution: 0.85,\n                parent: group,\n            });\n            field.spawn(count, buildInit(pattern, count));\n            field.start();\n\n            const label = readout.querySelector('#pattern-label');\n            const countLabel = readout.querySelector('#spawn-count');\n            if (label) {\n                label.textContent = pattern;\n            }\n            if (countLabel) {\n                countLabel.textContent = String(field.count);\n            }\n            ctx.log('spawn', `${pattern} \u00D7 ${count}`);\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        for (const kind of ['ring', 'grid', 'random', 'fountain'] as SpawnPattern[]) {\n            row.appendChild(\n                btn(kind, () => {\n                    pattern = kind;\n                    respawn(60);\n                }),\n            );\n        }\n        row.appendChild(btn('\u00D7120', () => respawn(120)));\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent:\n                    'init(i) runs per particle \u2014 use i for angles, grids, or hues. Particles are appended to #particles via parent option.',\n            }),\n        );\n        panel.appendChild(readout);\n        panel.appendChild(fps.element);\n        panel.appendChild(row);\n\n        respawn(60);\n\n        return () => {\n            fps.dispose();\n            field.dispose();\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'particles-spawn');\n    },\n};\n", "import { ParticleField } from '../../../src/ParticleField';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport { ensureParticlesGroup, PARTICLE_BOUNDS, randomHsl, createFpsTracker } from './shared';\n\nexport const physicsMechanicsLesson: Lesson = {\n    id: 'particles-physics',\n    title: 'Physics \u2014 gravity, restitution, bounds',\n    description:\n        'Each frame: v += g\u00B7dt, p += v\u00B7dt, then wall bounce. Restitution e flips velocity and scales by e (e=1 elastic, e\u21920 damped). bounds is the AABB [0,W]\u00D7[0,H] for circle radius r.',\n    apiRefs: ['integrateParticle', 'resolveWallBounce', 'field.gravity', 'field.restitution', 'field.bounds'],\n    snippet: `// Euler step\nvy += gravity * dt;\ncx += vx * dt;\ncy += vy * dt;\n\n// left wall: if cx - r < 0 \u2192 cx = r, vx = -vx * e\nfield.gravity = 980;      // px/s\u00B2\nfield.restitution = 0.92; // e \u2208 [0, 1]\nfield.bounds = { width: 400, height: 300 };`,\n    mount(panel, ctx) {\n        const container = ctx.getContainer();\n        const group = ensureParticlesGroup(container);\n\n        let gravity = 980;\n        let restitution = 0.92;\n\n        let field = new ParticleField(container, {\n            bounds: PARTICLE_BOUNDS,\n            gravity,\n            restitution,\n            parent: group,\n        });\n\n        const fps = createFpsTracker(true);\n\n        const formula = el('pre', {\n            className: 'formula-readout',\n            textContent: 'v_y \u2190 v_y + g\u00B7dt   |   bounce: v \u2190 \u2212v\u00B7e',\n        });\n\n        const readout = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('g = '),\n            el('strong', { id: 'g-val', textContent: '980' }),\n            document.createTextNode(' px/s\u00B2 \u00B7 e = '),\n            el('strong', { id: 'e-val', textContent: '0.92' }),\n        ]);\n\n        const spawnFountain = (): void => {\n            field.dispose();\n            field = new ParticleField(container, {\n                bounds: PARTICLE_BOUNDS,\n                gravity,\n                restitution,\n                parent: group,\n            });\n            field.spawn(80, (i) => ({\n                cx: PARTICLE_BOUNDS.width / 2 + (Math.random() - 0.5) * 16,\n                cy: PARTICLE_BOUNDS.height - 12,\n                r: 3 + Math.random() * 5,\n                vx: (Math.random() - 0.5) * 100,\n                vy: -(120 + Math.random() * 180),\n                fill: randomHsl(i, 11),\n            }));\n            field.start();\n            ctx.log('spawn fountain', `g=${gravity} e=${restitution}`);\n        };\n\n        const syncField = (): void => {\n            field.gravity = gravity;\n            field.restitution = restitution;\n            const gEl = readout.querySelector('#g-val');\n            const eEl = readout.querySelector('#e-val');\n            if (gEl) {\n                gEl.textContent = String(gravity);\n            }\n            if (eEl) {\n                eEl.textContent = restitution.toFixed(2);\n            }\n        };\n\n        const gravityRow = el('div', { className: 'control-row' });\n        gravityRow.appendChild(document.createTextNode('Gravity g '));\n        const gInput = el('input', { type: 'range', min: '0', max: '2400', value: '980' }) as HTMLInputElement;\n        gInput.addEventListener('input', () => {\n            gravity = Number(gInput.value);\n            syncField();\n        });\n        gravityRow.appendChild(gInput);\n\n        const restRow = el('div', { className: 'control-row' });\n        restRow.appendChild(document.createTextNode('Restitution e '));\n        const eInput = el('input', { type: 'range', min: '0', max: '100', value: '92' }) as HTMLInputElement;\n        eInput.addEventListener('input', () => {\n            restitution = Number(eInput.value) / 100;\n            syncField();\n        });\n        restRow.appendChild(eInput);\n\n        const presets = el('div', { className: 'btn-row' });\n        presets.appendChild(\n            btn('Feather (g=200, e=0.95)', () => {\n                gravity = 200;\n                restitution = 0.95;\n                gInput.value = '200';\n                eInput.value = '95';\n                syncField();\n                spawnFountain();\n            }),\n        );\n        presets.appendChild(\n            btn('Heavy (g=1800, e=0.4)', () => {\n                gravity = 1800;\n                restitution = 0.4;\n                gInput.value = '1800';\n                eInput.value = '40';\n                syncField();\n                spawnFountain();\n            }),\n        );\n        presets.appendChild(\n            btn('Zero-G drift', () => {\n                gravity = 0;\n                restitution = 1;\n                gInput.value = '0';\n                eInput.value = '100';\n                syncField();\n                spawnFountain();\n            }),\n        );\n\n        panel.appendChild(formula);\n        panel.appendChild(readout);\n        panel.appendChild(fps.element);\n        panel.appendChild(gravityRow);\n        panel.appendChild(restRow);\n        panel.appendChild(presets);\n\n        spawnFountain();\n\n        return () => {\n            fps.dispose();\n            field.dispose();\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'particles-physics');\n    },\n};\n", "import { ParticleField } from '../../../src/ParticleField';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport { ensureParticlesGroup, PARTICLE_BOUNDS, randomHsl, createFpsTracker } from './shared';\n\nexport const lifecycleLesson: Lesson = {\n    id: 'particles-lifecycle',\n    title: 'Lifecycle \u2014 start / stop / dispose',\n    description:\n        'start() begins the scheduleBatch loop; stop() freezes simulation (shards stay in DOM); dispose() stops, removes all particle nodes, and clears SoA state. Tune gravity while stopped \u2014 values apply on resume.',\n    apiRefs: ['ParticleField.start', 'stop', 'dispose', 'scheduleBatch'],\n    snippet: `field.spawn(40, init);\nfield.start();   // rAF loop via scheduleBatch\n\nfield.stop();    // freeze \u2014 cx/cy unchanged\nfield.gravity = 0;\nfield.start();   // resume with new g\n\nfield.dispose(); // remove DOM + clear state`,\n    mount(panel, ctx) {\n        const container = ctx.getContainer();\n        const group = ensureParticlesGroup(container);\n\n        let field: ParticleField | null = null;\n        let running = false;\n        let gravity = 600;\n        const fps = createFpsTracker(false);\n\n        const stateEl = el('strong', { textContent: 'idle' });\n        const countEl = el('strong', { textContent: '0' });\n        const readout = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('state: '),\n            stateEl,\n            document.createTextNode(' \u00B7 particles: '),\n            countEl,\n            document.createTextNode(' \u00B7 g: '),\n            el('strong', { id: 'life-g', textContent: '600' }),\n        ]);\n\n        const updateReadout = (): void => {\n            stateEl.textContent = running ? 'running' : field ? 'paused' : 'idle';\n            countEl.textContent = String(field?.count ?? 0);\n            const gLabel = readout.querySelector('#life-g');\n            if (gLabel) {\n                gLabel.textContent = String(gravity);\n            }\n        };\n\n        const makeField = (): ParticleField => {\n            return new ParticleField(container, {\n                bounds: PARTICLE_BOUNDS,\n                gravity,\n                restitution: 0.88,\n                parent: group,\n            });\n        };\n\n        const spawn = (): void => {\n            field?.dispose();\n            field = makeField();\n            field.spawn(40, (i) => ({\n                cx: 60 + (i % 8) * 40,\n                cy: 40 + Math.floor(i / 8) * 35,\n                r: 5,\n                vx: (Math.random() - 0.5) * 80,\n                vy: (Math.random() - 0.5) * 40,\n                fill: randomHsl(i, 14),\n            }));\n            running = false;\n            ctx.log('spawn', '40 particles');\n            updateReadout();\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(btn('1. spawn', spawn));\n        row.appendChild(\n            btn('2. start', () => {\n                if (!field || field.count === 0) {\n                    ctx.log('start', 'spawn first');\n                    return;\n                }\n                field.start();\n                running = true;\n                fps.setActive(true);\n                ctx.log('start');\n                updateReadout();\n            }),\n        );\n        row.appendChild(\n            btn('3. stop', () => {\n                field?.stop();\n                running = false;\n                fps.setActive(false);\n                ctx.log('stop');\n                updateReadout();\n            }),\n        );\n        row.appendChild(\n            btn('4. dispose', () => {\n                field?.dispose();\n                field = null;\n                running = false;\n                ctx.log('dispose');\n                updateReadout();\n            }),\n        );\n\n        const gravityRow = el('div', { className: 'control-row' });\n        gravityRow.appendChild(document.createTextNode('Gravity (live while paused) '));\n        const gInput = el('input', { type: 'range', min: '0', max: '1600', value: '600' }) as HTMLInputElement;\n        gInput.addEventListener('input', () => {\n            gravity = Number(gInput.value);\n            if (field) {\n                field.gravity = gravity;\n            }\n            updateReadout();\n        });\n        gravityRow.appendChild(gInput);\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent:\n                    'Walk through numbered steps. Stop, change gravity to 0, then start \u2014 particles float instead of falling.',\n            }),\n        );\n        panel.appendChild(readout);\n        panel.appendChild(fps.element);\n        panel.appendChild(row);\n        panel.appendChild(gravityRow);\n        updateReadout();\n\n        return () => {\n            fps.dispose();\n            field?.dispose();\n            field = null;\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'particles-lifecycle');\n    },\n};\n", "import type { GroupElement, PathElement } from 'svg-shards';\nimport type { ParticleInit } from '../types';\n\nexport interface SpawnFromPathInit extends ParticleInit {\n    d?: string;\n}\n\nexport interface SpawnPathParent {\n    htmlNode: SVGElement;\n}\n\nexport interface SpawnFromPathOptions {\n    parent?: GroupElement | SpawnPathParent;\n    fill?: string;\n    stroke?: string;\n    strokeWidth?: number;\n    opacity?: number;\n}\n\nexport interface SpawnFromPathContainer<TShard = PathElement> {\n    createMany(\n        kind: 'path',\n        count: number,\n        factory: (index: number) => SpawnFromPathInit & { parent?: GroupElement | SpawnPathParent },\n    ): TShard[];\n}\n\nfunction resolvePathD(template: PathElement | string): string {\n    return typeof template === 'string' ? template : template.d;\n}\n\nexport function spawnFromPath<TShard = PathElement>(\n    container: SpawnFromPathContainer<TShard>,\n    template: PathElement | string,\n    count: number,\n    init?: (index: number) => Partial<SpawnFromPathInit>,\n    options: SpawnFromPathOptions = {},\n): TShard[] {\n    const d = resolvePathD(template);\n\n    return container.createMany('path', count, (i) => {\n        const particle = init?.(i) ?? {};\n        return {\n            parent: options.parent,\n            d: particle.d ?? d,\n            fill: particle.fill ?? options.fill,\n            stroke: particle.stroke ?? options.stroke,\n            strokeWidth: particle.strokeWidth ?? options.strokeWidth,\n            opacity: particle.opacity ?? options.opacity,\n        };\n    });\n}\n", "import type { ParticlesContainer } from './shared';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst GRADIENT_COUNT = 8;\n\n/** Six-arm snowflake with side branches \u2014 centered at (0, 0). */\nexport function snowflakePath(size: number, variant: number): string {\n    const s = size;\n    const segments: string[] = [];\n\n    for (let arm = 0; arm < 6; arm++) {\n        const angle = (arm * Math.PI) / 3;\n        const dx = Math.sin(angle) * s;\n        const dy = -Math.cos(angle) * s;\n\n        segments.push(`M 0 0 L ${fmt(dx)} ${fmt(dy)}`);\n\n        const branchT = 0.35 + (variant % 3) * 0.08;\n        const bx = Math.sin(angle) * s * branchT;\n        const by = -Math.cos(angle) * s * branchT;\n        const branchLen = s * (0.14 + (variant % 2) * 0.06);\n        const px = Math.sin(angle + Math.PI / 2) * branchLen;\n        const py = -Math.cos(angle + Math.PI / 2) * branchLen;\n\n        segments.push(`M ${fmt(bx)} ${fmt(by)} L ${fmt(bx + px)} ${fmt(by + py)}`);\n        segments.push(`M ${fmt(bx)} ${fmt(by)} L ${fmt(bx - px)} ${fmt(by - py)}`);\n\n        if (variant % 4 === 0) {\n            const tip = 0.72;\n            const tx = Math.sin(angle) * s * tip;\n            const ty = -Math.cos(angle) * s * tip;\n            const fork = s * 0.08;\n            const fpx = Math.sin(angle + Math.PI / 2) * fork;\n            const fpy = -Math.cos(angle + Math.PI / 2) * fork;\n            segments.push(`M ${fmt(tx)} ${fmt(ty)} L ${fmt(tx + fpx)} ${fmt(ty + fpy)}`);\n            segments.push(`M ${fmt(tx)} ${fmt(ty)} L ${fmt(tx - fpx)} ${fmt(ty - fpy)}`);\n        }\n    }\n\n    return segments.join(' ');\n}\n\nfunction fmt(value: number): string {\n    return value.toFixed(2);\n}\n\nexport function ensureSnowGradients(container: ParticlesContainer): void {\n    if (container.htmlNode.querySelector('#snow-defs')) {\n        return;\n    }\n\n    const defs = document.createElementNS(SVG_NS, 'defs');\n    defs.id = 'snow-defs';\n\n    const palettes = [\n        ['#ffffff', '#eef6ff', '#ffffff00'],\n        ['#fafcff', '#dce8f5', '#ffffff00'],\n        ['#ffffff', '#e8f0fa', '#ffffff00'],\n        ['#f5f9ff', '#c8d8eb', '#ffffff00'],\n        ['#ffffff', '#f0f4f8', '#ffffff00'],\n        ['#f8fbff', '#d4e4f2', '#ffffff00'],\n        ['#ffffff', '#e2ecf7', '#ffffff00'],\n        ['#f6faff', '#b8cce0', '#ffffff00'],\n    ];\n\n    for (let i = 0; i < GRADIENT_COUNT; i++) {\n        const [inner, outer, edge] = palettes[i % palettes.length];\n        const grad = document.createElementNS(SVG_NS, 'radialGradient');\n        grad.id = `snow-grad-${i}`;\n        grad.setAttribute('cx', '0');\n        grad.setAttribute('cy', '0');\n        grad.setAttribute('r', '1');\n        grad.setAttribute('gradientUnits', 'objectBoundingBox');\n\n        appendStop(grad, '0%', inner, '1');\n        appendStop(grad, '55%', outer, String(0.85 - (i % 3) * 0.08));\n        appendStop(grad, '100%', edge, '0');\n\n        defs.appendChild(grad);\n    }\n\n    container.htmlNode.insertBefore(defs, container.htmlNode.firstChild);\n}\n\nfunction appendStop(grad: SVGGradientElement, offset: string, color: string, opacity: string): void {\n    const stop = document.createElementNS(SVG_NS, 'stop');\n    stop.setAttribute('offset', offset);\n    stop.setAttribute('stop-color', color);\n    stop.setAttribute('stop-opacity', opacity);\n    grad.appendChild(stop);\n}\n\nexport function snowGradientFill(index: number): string {\n    return `url(#snow-grad-${index % GRADIENT_COUNT})`;\n}\n\nexport function snowflakeTransform(cx: number, cy: number, rotationDeg: number, scale: number): string {\n    return `translate(${fmt(cx)}, ${fmt(cy)}) rotate(${rotationDeg.toFixed(2)}) scale(${scale.toFixed(3)})`;\n}\n\nexport const SNOWFLAKE_COUNT = 150;\n", "import { scheduleBatch } from 'svg-shards/reactive';\nimport { spawnFromPath } from '../../../src/spawn/fromPath';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport {\n    ensureParticlesGroup,\n    PARTICLE_BOUNDS,\n    createFpsTracker,\n    toParticlesContainer,\n    type SnowflakeShard,\n} from './shared';\nimport {\n    ensureSnowGradients,\n    snowflakePath,\n    snowflakeTransform,\n    snowGradientFill,\n    SNOWFLAKE_COUNT,\n} from './snowflakes';\n\ninterface SnowState {\n    count: number;\n    cx: Float32Array;\n    cy: Float32Array;\n    vx: Float32Array;\n    vy: Float32Array;\n    rot: Float32Array;\n    rotSpeed: Float32Array;\n    scale: Float32Array;\n    swayPhase: Float32Array;\n    swayAmp: Float32Array;\n    shards: SnowflakeShard[];\n}\n\nfunction createSnowState(count: number): SnowState {\n    return {\n        count,\n        cx: new Float32Array(count),\n        cy: new Float32Array(count),\n        vx: new Float32Array(count),\n        vy: new Float32Array(count),\n        rot: new Float32Array(count),\n        rotSpeed: new Float32Array(count),\n        scale: new Float32Array(count),\n        swayPhase: new Float32Array(count),\n        swayAmp: new Float32Array(count),\n        shards: [],\n    };\n}\n\nfunction initSnowflake(state: SnowState, index: number, width: number, height: number, respawnY = true): void {\n    state.cx[index] = Math.random() * width;\n    state.cy[index] = respawnY ? Math.random() * height : -8 - Math.random() * 40;\n    state.vx[index] = (Math.random() - 0.5) * 18;\n    state.vy[index] = 28 + Math.random() * 52;\n    state.rot[index] = Math.random() * 360;\n    state.rotSpeed[index] = (Math.random() - 0.5) * 45;\n    state.scale[index] = 0.35 + Math.random() * 0.55;\n    state.swayPhase[index] = Math.random() * Math.PI * 2;\n    state.swayAmp[index] = 8 + Math.random() * 22;\n}\n\nfunction stepSnowfall(\n    state: SnowState,\n    bounds: { width: number; height: number },\n    step: number,\n    wind: number,\n    time: number,\n): void {\n    const { width, height } = bounds;\n\n    for (let i = 0; i < state.count; i++) {\n        const sway = Math.sin(time * 1.2 + state.swayPhase[i]) * state.swayAmp[i] * step;\n        state.cx[i] += (state.vx[i] + wind + sway) * step;\n        state.cy[i] += state.vy[i] * step;\n        state.rot[i] += state.rotSpeed[i] * step;\n\n        if (state.cy[i] > height + 12) {\n            initSnowflake(state, i, width, height, false);\n            state.cy[i] = -6 - Math.random() * 30;\n        } else if (state.cx[i] < -16) {\n            state.cx[i] = width + 8;\n        } else if (state.cx[i] > width + 16) {\n            state.cx[i] = -8;\n        }\n\n        state.shards[i].transform = snowflakeTransform(state.cx[i], state.cy[i], state.rot[i], state.scale[i]);\n    }\n}\n\nexport const snowfallLesson: Lesson = {\n    id: 'particles-snowfall',\n    title: 'Snowfall \u2014 path snowflakes & gradients',\n    description:\n        'Path snowflakes with radial gradients. Simulation uses real elapsed time (performance.now), so fall speed stays the same at 30 or 120 FPS. Speed slider scales motion without tying it to frame rate.',\n    apiRefs: ['spawnFromPath', 'performance.now', 'dt', 'scheduleBatch', 'snowflakePath'],\n    snippet: `const now = performance.now();\nconst dt = Math.min((now - lastTime) / 1000, 1 / 30);\nconst step = dt * speed;\ntime += step;\nstepSnowfall(state, bounds, step, wind, time);\n\n// speed 1.0 = real-time; 2.0 = twice as fast`,\n    mount(panel, ctx) {\n        const container = toParticlesContainer(ctx.getContainer());\n        const group = ensureParticlesGroup(container);\n        ensureSnowGradients(container);\n\n        let wind = 12;\n        let speed = 1;\n        let running = true;\n        let time = 0;\n        let lastTime: number | null = null;\n        const MAX_DT = 1 / 30;\n        const fps = createFpsTracker(true);\n\n        let state = createSnowState(SNOWFLAKE_COUNT);\n\n        const shards = spawnFromPath(\n            container,\n            snowflakePath(4.5, 0),\n            SNOWFLAKE_COUNT,\n            (i) => ({\n                d: snowflakePath(4.5 + (i % 5) * 0.9, i % 8),\n                fill: snowGradientFill(i),\n                stroke: i % 3 === 0 ? '#f8fbff' : '#dce8f5',\n                strokeWidth: 0.25 + (i % 4) * 0.08,\n                opacity: 0.72 + (i % 6) * 0.045,\n            }),\n            { parent: group },\n        ) as SnowflakeShard[];\n\n        state.shards = shards;\n        for (let i = 0; i < SNOWFLAKE_COUNT; i++) {\n            initSnowflake(state, i, PARTICLE_BOUNDS.width, PARTICLE_BOUNDS.height);\n            shards[i].transform = snowflakeTransform(state.cx[i], state.cy[i], state.rot[i], state.scale[i]);\n        }\n\n        const scheduleFrame = (): void => {\n            scheduleBatch(() => {\n                if (!running) {\n                    return;\n                }\n\n                const now = performance.now();\n                const rawDt = lastTime === null ? 1 / 60 : (now - lastTime) / 1000;\n                lastTime = now;\n                const dt = Math.min(rawDt, MAX_DT);\n                const step = dt * speed;\n\n                time += step;\n                stepSnowfall(state, PARTICLE_BOUNDS, step, wind, time);\n                scheduleFrame();\n            });\n        };\n\n        scheduleFrame();\n\n        const countEl = el('strong', { id: 'snow-count', textContent: String(SNOWFLAKE_COUNT) });\n        const readout = el('div', { className: 'particles-readout' }, [\n            document.createTextNode('snowflakes: '),\n            countEl,\n            document.createTextNode(' \u00B7 wind: '),\n            el('strong', { id: 'snow-wind', textContent: '12' }),\n            document.createTextNode(' \u00B7 speed: '),\n            el('strong', { id: 'snow-speed', textContent: '1.00\u00D7' }),\n        ]);\n\n        const updateCount = (): void => {\n            countEl.textContent = String(state.count);\n        };\n\n        const windRow = el('div', { className: 'control-row' });\n        windRow.appendChild(document.createTextNode('Wind '));\n        const windInput = el('input', { type: 'range', min: '-40', max: '40', value: '12' }) as HTMLInputElement;\n        windInput.addEventListener('input', () => {\n            wind = Number(windInput.value);\n            const label = readout.querySelector('#snow-wind');\n            if (label) {\n                label.textContent = String(wind);\n            }\n        });\n        windRow.appendChild(windInput);\n\n        const speedRow = el('div', { className: 'control-row' });\n        speedRow.appendChild(document.createTextNode('Speed '));\n        const speedInput = el('input', {\n            type: 'range',\n            min: '25',\n            max: '300',\n            value: '100',\n        }) as HTMLInputElement;\n        speedInput.addEventListener('input', () => {\n            speed = Number(speedInput.value) / 100;\n            const label = readout.querySelector('#snow-speed');\n            if (label) {\n                label.textContent = `${speed.toFixed(2)}\u00D7`;\n            }\n        });\n        speedRow.appendChild(speedInput);\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('Pause', () => {\n                running = false;\n                fps.setActive(false);\n                ctx.log('snow', 'pause');\n            }),\n        );\n        row.appendChild(\n            btn('Resume', () => {\n                running = true;\n                lastTime = null;\n                fps.setActive(true);\n                scheduleFrame();\n                ctx.log('snow', 'resume');\n            }),\n        );\n        row.appendChild(\n            btn('Blizzard (+50)', () => {\n                const extra = 50;\n                const start = state.count;\n                const newShards = spawnFromPath(\n                    container,\n                    snowflakePath(4, 0),\n                    extra,\n                    (i) => {\n                        const idx = start + i;\n                        return {\n                            d: snowflakePath(4 + (idx % 4), idx % 7),\n                            fill: snowGradientFill(idx),\n                            stroke: '#eef6ff',\n                            strokeWidth: 0.3,\n                            opacity: 0.8,\n                        };\n                    },\n                    { parent: group },\n                ) as SnowflakeShard[];\n\n                const next = createSnowState(start + extra);\n                for (let i = 0; i < start; i++) {\n                    next.cx[i] = state.cx[i];\n                    next.cy[i] = state.cy[i];\n                    next.vx[i] = state.vx[i];\n                    next.vy[i] = state.vy[i];\n                    next.rot[i] = state.rot[i];\n                    next.rotSpeed[i] = state.rotSpeed[i];\n                    next.scale[i] = state.scale[i];\n                    next.swayPhase[i] = state.swayPhase[i];\n                    next.swayAmp[i] = state.swayAmp[i];\n                    next.shards[i] = state.shards[i];\n                }\n                for (let i = 0; i < extra; i++) {\n                    const idx = start + i;\n                    initSnowflake(next, idx, PARTICLE_BOUNDS.width, PARTICLE_BOUNDS.height);\n                    next.shards[idx] = newShards[i];\n                    newShards[i].transform = snowflakeTransform(\n                        next.cx[idx],\n                        next.cy[idx],\n                        next.rot[idx],\n                        next.scale[idx],\n                    );\n                }\n                state = next;\n                updateCount();\n                ctx.log('snow', `+${extra} flakes \u2192 ${state.count}`);\n            }),\n        );\n\n        panel.appendChild(\n            el('p', {\n                className: 'lesson-hint',\n                textContent:\n                    'dt comes from performance.now \u2014 same fall speed at 30 or 120 FPS. Speed multiplies motion (1\u00D7 = default, 2\u00D7 = twice as fast).',\n            }),\n        );\n        panel.appendChild(readout);\n        panel.appendChild(fps.element);\n        panel.appendChild(windRow);\n        panel.appendChild(speedRow);\n        panel.appendChild(row);\n\n        return () => {\n            running = false;\n            fps.dispose();\n            for (const shard of state.shards) {\n                container.removeShard(shard);\n            }\n            container.htmlNode.querySelector('#snow-defs')?.remove();\n        };\n    },\n    reset(ctx) {\n        ctx.log('reset', 'particles-snowfall');\n    },\n};\n", "import { bouncingBallsLesson } from './01-bouncing-balls';\nimport { createShardsLesson } from './02-create-shards';\nimport { spawnInitLesson } from './03-spawn-init';\nimport { physicsMechanicsLesson } from './04-physics-mechanics';\nimport { lifecycleLesson } from './05-lifecycle';\nimport { snowfallLesson } from './06-snowfall';\n\nexport const particlesLessons = [\n    bouncingBallsLesson,\n    createShardsLesson,\n    spawnInitLesson,\n    physicsMechanicsLesson,\n    lifecycleLesson,\n    snowfallLesson,\n];\n\nexport const defaultLessonId = bouncingBallsLesson.id;\n", "import type { Lesson } from '../types';\nimport { btn, el } from '../types';\n\nexport const basicsLesson: Lesson = {\n    id: 'basics',\n    title: 'Basics \u2014 parse & access',\n    description:\n        'Wrap an existing SVG DOM tree with createSvgShards.fromElement(). The container exposes typed shard arrays via elements and a flat getAll() list with human-readable labels.',\n    apiRefs: ['createSvgShards.fromElement', 'SvgContainer.elements', 'SvgContainer.getAll'],\n    snippet: `const svg = createSvgShards.fromElement(svgElement);\nconsole.log(svg.elements.circle.length);\nsvg.getAll().forEach(e => console.log(e.label, e.type));`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        const counts = el('div', { className: 'control-hint' });\n        const list = el('ul', { className: 'shard-list' });\n\n        const refreshCounts = (): void => {\n            counts.textContent = Object.entries(svg.elements)\n                .filter(([, arr]) => arr.length > 0)\n                .map(([type, arr]) => `${type}: ${arr.length}`)\n                .join(' \u00B7 ');\n        };\n\n        const refreshList = (): void => {\n            list.replaceChildren();\n            for (const entry of svg.getAll()) {\n                const item = el('li', { textContent: `${entry.label} (${entry.type})` });\n                item.addEventListener('click', () => {\n                    list.querySelectorAll('li').forEach((li) => li.classList.remove('selected'));\n                    item.classList.add('selected');\n                    ctx.highlightShard(entry.element);\n                    ctx.log(`getAll() \u2192 select`, `${entry.label} [${entry.type}]`);\n                    ctx.setSnippet(\n                        `const entry = svg.getAll().find(e => e.label === '${entry.label}');\\n// type: ${entry.type}`,\n                    );\n                });\n                list.appendChild(item);\n            }\n        };\n\n        refreshCounts();\n        refreshList();\n\n        panel.appendChild(counts);\n        panel.appendChild(list);\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('Log getAll() labels', () => {\n                const labels = svg\n                    .getAll()\n                    .map((e) => e.label)\n                    .join(', ');\n                ctx.log('getAll()', labels);\n            }),\n        );\n        row.appendChild(\n            btn('Log element counts', () => {\n                refreshCounts();\n                ctx.log('elements map', counts.textContent ?? '');\n            }),\n        );\n        panel.appendChild(row);\n\n        return () => {};\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { Lesson } from '../types';\nimport { btn, el, shardLabel, shardTypeName } from '../types';\n\nexport const queryLesson: Lesson = {\n    id: 'query',\n    title: 'Query \u2014 find shards',\n    description:\n        'Look up shards by id, type, or CSS selector. getById uses getElementById and lazy-wraps nodes. query() returns all matches; queryOne() returns the first.',\n    apiRefs: ['SvgContainer.getById', 'SvgContainer.getByType', 'SvgContainer.query', 'SvgContainer.queryOne'],\n    snippet: `const sun = svg.getById('sun');\nconst accents = svg.query('[data-role=\"accent\"]');\nconst first = svg.queryOne('#panel');`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        const idInput = el('input', { type: 'text', value: 'sun' }) as HTMLInputElement;\n        const selectorInput = el('input', {\n            type: 'text',\n            value: '[data-role=\"accent\"]',\n        }) as HTMLInputElement;\n\n        panel.appendChild(\n            el('div', { className: 'control-group' }, [el('label', { textContent: 'Element id' }), idInput]),\n        );\n        panel.appendChild(\n            el('div', { className: 'control-group' }, [el('label', { textContent: 'CSS selector' }), selectorInput]),\n        );\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('getById', () => {\n                const shard = svg.getById(idInput.value.trim());\n                ctx.highlightShard(shard);\n                ctx.log(`getById('${idInput.value}')`, shard ? shardLabel(shard, shardTypeName(shard)) : 'null');\n            }),\n        );\n        row.appendChild(\n            btn(\"getByType('circle')\", () => {\n                const circles = svg.getByType('circle');\n                ctx.log(\"getByType('circle')\", `${circles.length} shard(s)`);\n                if (circles[0]) {\n                    ctx.highlightShard(circles[0]);\n                }\n            }),\n        );\n        row.appendChild(\n            btn('query', () => {\n                const sel = selectorInput.value.trim();\n                const results = svg.query(sel);\n                ctx.log(`query('${sel}')`, `${results.length} match(es)`);\n                results.forEach((s, i) => ctx.log(`  [${i}]`, shardLabel(s, shardTypeName(s))));\n                ctx.highlightShard(results[0] ?? null);\n            }),\n        );\n        row.appendChild(\n            btn('queryOne', () => {\n                const sel = selectorInput.value.trim();\n                const shard = svg.queryOne(sel);\n                ctx.highlightShard(shard);\n                ctx.log(`queryOne('${sel}')`, shard ? shardLabel(shard, shardTypeName(shard)) : 'null');\n            }),\n        );\n        panel.appendChild(row);\n\n        return () => {};\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { Lesson } from '../types';\nimport { el } from '../types';\nimport type { CircleElement } from '../../../src/elements/shapes/CircleElement';\nimport type { PathElement } from '../../../src/elements/PathElement';\nimport type { RectElement } from '../../../src/elements/shapes/RectElement';\n\nexport const manipulateLesson: Lesson = {\n    id: 'manipulate',\n    title: 'Manipulate \u2014 shard properties',\n    description:\n        'Shard setters write directly to SVG attributes. Each shape exposes typed properties \u2014 circle has cx/cy/r, rect has width/height, path has d.',\n    apiRefs: ['CircleElement.cx', 'RectElement.fill', 'PathElement.d', 'SvgElement.strokeWidth'],\n    snippet: `const sun = svg.getById('sun');\nsun.fill = '#ff6600';\nsun.r = 40;\nsun.cx = 300;`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        let activeTab: 'circle' | 'rect' | 'path' = 'circle';\n\n        const tabs = el('div', { className: 'tabs' });\n        const controls = el('div', { className: 'controls' });\n\n        const makeSlider = (label: string, min: number, max: number, value: number, onInput: (v: number) => void) => {\n            const range = el('input', {\n                type: 'range',\n                min: String(min),\n                max: String(max),\n                value: String(value),\n            }) as HTMLInputElement;\n            const valueLabel = el('span', { className: 'control-hint', textContent: String(value) });\n            range.addEventListener('input', () => {\n                const v = Number(range.value);\n                valueLabel.textContent = String(v);\n                onInput(v);\n            });\n            return el('div', { className: 'control-group' }, [el('label', { textContent: label }), range, valueLabel]);\n        };\n\n        const renderControls = (): void => {\n            controls.replaceChildren();\n            if (activeTab === 'circle') {\n                const sun = svg.getById('sun') as CircleElement | null;\n                if (!sun) return;\n                ctx.highlightShard(sun);\n                controls.appendChild(\n                    makeSlider('sun.cx', 200, 380, sun.cx, (v) => {\n                        sun.cx = v;\n                        ctx.log('sun.cx =', String(v));\n                    }),\n                );\n                controls.appendChild(\n                    makeSlider('sun.cy', 20, 120, sun.cy, (v) => {\n                        sun.cy = v;\n                        ctx.log('sun.cy =', String(v));\n                    }),\n                );\n                controls.appendChild(\n                    makeSlider('sun.r', 10, 50, sun.r, (v) => {\n                        sun.r = v;\n                        ctx.log('sun.r =', String(v));\n                    }),\n                );\n            } else if (activeTab === 'rect') {\n                const panel = svg.getById('panel') as RectElement | null;\n                if (!panel) return;\n                ctx.highlightShard(panel);\n                controls.appendChild(\n                    makeSlider('panel.width', 60, 200, panel.width, (v) => {\n                        panel.width = v;\n                        ctx.log('panel.width =', String(v));\n                    }),\n                );\n                controls.appendChild(\n                    makeSlider('panel.height', 40, 160, panel.height, (v) => {\n                        panel.height = v;\n                        ctx.log('panel.height =', String(v));\n                    }),\n                );\n                controls.appendChild(\n                    makeSlider('strokeWidth', 0, 8, panel.strokeWidth, (v) => {\n                        panel.strokeWidth = v;\n                        ctx.log('panel.strokeWidth =', String(v));\n                    }),\n                );\n            } else {\n                const trail = svg.getById('trail') as PathElement | null;\n                if (!trail) return;\n                ctx.highlightShard(trail);\n                const strokeSlider = makeSlider('trail stroke-width', 1, 10, trail.strokeWidth, (v) => {\n                    trail.strokeWidth = v;\n                    ctx.log('trail.strokeWidth =', String(v));\n                });\n                controls.appendChild(strokeSlider);\n                const hint = el('p', {\n                    className: 'control-hint',\n                    textContent: 'Path d attribute can be edited programmatically via trail.d',\n                });\n                controls.appendChild(hint);\n            }\n        };\n\n        for (const tab of [\n            { id: 'circle' as const, label: 'Circle' },\n            { id: 'rect' as const, label: 'Rect' },\n            { id: 'path' as const, label: 'Path' },\n        ]) {\n            const button = el('button', { type: 'button', className: 'tab', textContent: tab.label });\n            if (tab.id === activeTab) button.classList.add('active');\n            button.addEventListener('click', () => {\n                activeTab = tab.id;\n                tabs.querySelectorAll('.tab').forEach((t) => t.classList.remove('active'));\n                button.classList.add('active');\n                renderControls();\n            });\n            tabs.appendChild(button);\n        }\n\n        panel.appendChild(tabs);\n        panel.appendChild(controls);\n        renderControls();\n\n        return () => {};\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { Signal } from '@preact/signals-core';\n\nexport interface Readable<T> {\n    readonly value: T;\n}\n\nexport type SignalLike<T> = Signal<T> | Readable<T>;\n\nexport function readSignalValue<T>(source: SignalLike<T>): T {\n    return source.value;\n}\n", "import { effect } from '@preact/signals-core';\nimport { SvgElement } from '../core/SvgElement';\nimport { readSignalValue, SignalLike } from './readable';\n\nexport function bindProperty<T>(shard: SvgElement, key: string, source: SignalLike<T>): () => void {\n    return effect(() => {\n        const value = readSignalValue(source);\n        Reflect.set(shard, key, value);\n    });\n}\n\nexport function bindVisual(\n    shard: SvgElement,\n    sources: {\n        fill?: SignalLike<string | null>;\n        stroke?: SignalLike<string | null>;\n        strokeWidth?: SignalLike<number>;\n        opacity?: SignalLike<number>;\n    },\n): () => void {\n    const disposers: Array<() => void> = [];\n\n    if (sources.fill) {\n        disposers.push(\n            effect(() => {\n                shard.fill = readSignalValue(sources.fill!);\n            }),\n        );\n    }\n\n    if (sources.stroke) {\n        disposers.push(\n            effect(() => {\n                shard.stroke = readSignalValue(sources.stroke!);\n            }),\n        );\n    }\n\n    if (sources.strokeWidth) {\n        disposers.push(\n            effect(() => {\n                shard.strokeWidth = readSignalValue(sources.strokeWidth!);\n            }),\n        );\n    }\n\n    if (sources.opacity) {\n        disposers.push(\n            effect(() => {\n                shard.opacity = readSignalValue(sources.opacity!);\n            }),\n        );\n    }\n\n    return () => {\n        for (const dispose of disposers) {\n            dispose();\n        }\n    };\n}\n", "import { effect } from '@preact/signals-core';\nimport { SvgElement } from '../core/SvgElement';\nimport { Transformation } from '../core/Transformation';\nimport { readSignalValue, SignalLike } from './readable';\n\nexport function bindTransform(shard: SvgElement, source: SignalLike<Transformation>): () => void {\n    return effect(() => {\n        const matrix = readSignalValue(source);\n        shard.transform = matrix.toMatrixString();\n    });\n}\n", "import { batch } from '@preact/signals-core';\n\nconst pending: Array<() => void> = [];\nlet rafId: number | null = null;\n\nexport function scheduleBatch(fn: () => void): void {\n    pending.push(fn);\n\n    if (rafId !== null) {\n        return;\n    }\n\n    rafId = requestAnimationFrame(() => {\n        rafId = null;\n        const callbacks = pending.splice(0, pending.length);\n\n        batch(() => {\n            for (const callback of callbacks) {\n                callback();\n            }\n        });\n    });\n}\n\nexport function flushScheduledBatches(): void {\n    if (rafId !== null) {\n        cancelAnimationFrame(rafId);\n        rafId = null;\n    }\n\n    const callbacks = pending.splice(0, pending.length);\n    batch(() => {\n        for (const callback of callbacks) {\n            callback();\n        }\n    });\n}\n", "import { signal } from '../../../src/reactive';\nimport { Transformation } from '../../../src/core/Transformation';\nimport { bindTransform } from '../../../src/reactive/bindTransform';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport type { RectElement } from '../../../src/elements/shapes/RectElement';\n\nfunction rectCenter(rect: RectElement): { x: number; y: number } {\n    return {\n        x: rect.x + rect.width / 2,\n        y: rect.y + rect.height / 2,\n    };\n}\n\nfunction mountSizingTable(parent: HTMLElement): void {\n    const table = el('table', { className: 'sizing-table' });\n    const thead = el('thead');\n    const headRow = el('tr');\n    for (const label of ['Approach', 'API', 'Drift?']) {\n        headRow.appendChild(el('th', { textContent: label }));\n    }\n    thead.appendChild(headRow);\n    table.appendChild(thead);\n\n    const tbody = el('tbody');\n    const rows: Array<[string, string, string]> = [\n        ['Resize attrs', 'panel.width = 144', 'No \u2014 top-left fixed'],\n        ['scale transform', 'panel.scale(1.2)', 'Yes \u2014 from (0,0)'],\n        ['scaleAt pivot', 'panel.scaleAt(1.2, 1.2, cx, cy)', 'No \u2014 grows in place'],\n        ['Matrix + bind', 'Transformation.scaleAt(...) + bindTransform', 'Composable pivot'],\n    ];\n    for (const [approach, api, drift] of rows) {\n        const row = el('tr');\n        row.appendChild(el('td', { textContent: approach }));\n        row.appendChild(el('td', { textContent: api }));\n        row.appendChild(el('td', { textContent: drift }));\n        tbody.appendChild(row);\n    }\n    table.appendChild(tbody);\n    parent.appendChild(table);\n}\n\nexport const transformsLesson: Lesson = {\n    id: 'transforms',\n    title: 'Transforms \u2014 imperative & matrix',\n    description:\n        'Three ways to change size: resize attributes (top-left anchor), scale() transform (SVG origin), scaleAt() transform (your pivot). Transform helpers prepend and stack on each click.',\n    apiRefs: [\n        'RectElement.resize',\n        'SvgElement.scale',\n        'SvgElement.scaleAt',\n        'Transformation.scaleAt',\n        'bindTransform',\n    ],\n    snippet: `panel.scale(1.2);                    // drift from (0,0)\npanel.scaleAt(1.2, 1.2, cx, cy);      // in place\n\nconst matrix = signal(\n  Transformation.identity().scaleAt(1.2, 1.2, cx, cy)\n);\nbindTransform(panel, matrix);`,\n    mount(panelEl, ctx) {\n        const svg = ctx.getContainer();\n        const panel = svg.getById('panel') as RectElement | null;\n        if (!panel) {\n            panelEl.appendChild(el('p', { textContent: 'Panel shard not found' }));\n            return () => {};\n        }\n\n        ctx.highlightShard(panel);\n        mountSizingTable(panelEl);\n\n        let unbind: (() => void) | null = null;\n        const matrixSignal = signal(Transformation.identity());\n        let matrixMode = false;\n\n        const pivot = () => rectCenter(panel);\n\n        const applyMatrix = (): void => {\n            const { x: cx, y: cy } = pivot();\n            if (!matrixMode) {\n                matrixMode = true;\n                panel.transform = null;\n                unbind = bindTransform(panel, matrixSignal);\n                ctx.log('bindTransform(panel, matrixSignal)', 'matrix mode ON');\n            }\n            matrixSignal.value = Transformation.identity()\n                .rotate(Number(rotateInput.value), cx, cy)\n                .translate(Number(txInput.value), Number(tyInput.value));\n        };\n\n        const rotateInput = el('input', { type: 'range', min: '0', max: '360', value: '0' }) as HTMLInputElement;\n        const txInput = el('input', { type: 'range', min: '-80', max: '80', value: '0' }) as HTMLInputElement;\n        const tyInput = el('input', { type: 'range', min: '-80', max: '80', value: '0' }) as HTMLInputElement;\n\n        rotateInput.addEventListener('input', applyMatrix);\n        txInput.addEventListener('input', applyMatrix);\n        tyInput.addEventListener('input', applyMatrix);\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('translate(15, 0)', () => {\n                unbind?.();\n                unbind = null;\n                matrixMode = false;\n                panel.translate(15, 0);\n                ctx.log('panel.translate(15, 0)', panel.transform ?? '');\n            }),\n        );\n        row.appendChild(\n            btn('rotate(20)', () => {\n                unbind?.();\n                unbind = null;\n                matrixMode = false;\n                const { x: cx, y: cy } = pivot();\n                panel.rotate(20, cx, cy);\n                ctx.log(`panel.rotate(20, ${cx}, ${cy})`, panel.transform ?? '');\n            }),\n        );\n        row.appendChild(\n            btn('scale(1.2)', () => {\n                unbind?.();\n                unbind = null;\n                matrixMode = false;\n                panel.scale(1.2);\n                ctx.log('panel.scale(1.2)', panel.transform ?? '');\n                ctx.log('note', 'from (0,0) \u2014 drift down-right');\n            }),\n        );\n        row.appendChild(\n            btn('scaleAt(1.2)', () => {\n                unbind?.();\n                unbind = null;\n                matrixMode = false;\n                const { x: cx, y: cy } = pivot();\n                panel.scaleAt(1.2, 1.2, cx, cy);\n                ctx.log(`panel.scaleAt(1.2, 1.2, ${cx}, ${cy})`, panel.transform ?? '');\n            }),\n        );\n        row.appendChild(\n            btn('Reset transform', () => {\n                unbind?.();\n                unbind = null;\n                matrixMode = false;\n                panel.transform = null;\n                rotateInput.value = '0';\n                txInput.value = '0';\n                tyInput.value = '0';\n                ctx.log('panel.transform = null');\n            }),\n        );\n        panelEl.appendChild(row);\n\n        panelEl.appendChild(el('p', { className: 'control-hint', textContent: 'Matrix mode (bindTransform):' }));\n        panelEl.appendChild(\n            el('div', { className: 'control-group' }, [el('label', { textContent: 'rotate\u00B0' }), rotateInput]),\n        );\n        panelEl.appendChild(\n            el('div', { className: 'control-group' }, [el('label', { textContent: 'translate X' }), txInput]),\n        );\n        panelEl.appendChild(\n            el('div', { className: 'control-group' }, [el('label', { textContent: 'translate Y' }), tyInput]),\n        );\n\n        return () => {\n            unbind?.();\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport type { SvgContainer } from '../../../src/core/SvgContainer';\n\nfunction countDomCircles(svg: SvgContainer): number {\n    return svg.htmlNode.querySelectorAll('circle').length;\n}\n\nexport const syncLesson: Lesson = {\n    id: 'sync',\n    title: 'Sync & Refresh',\n    description:\n        'This lesson is about the library index, not the picture. Adding a circle updates the DOM immediately, but svg.getByType(\"circle\") may stay behind until refresh() or a lazy getById(). Watch the stats panel and API log \u2014 the canvas only changes when you add circles.',\n    apiRefs: ['SvgContainer.refresh', 'SvgContainer.enableAutoRefresh', 'NodeRegistry'],\n    snippet: `svg.htmlNode.appendChild(newCircle);\n// index stale until:\nsvg.refresh();           // full re-parse\n// or\nsvg.getById('added-1');  // lazy wrap one node\n\nconst before = svg.getById('sun');\nsvg.refresh();\nconsole.log(before === svg.getById('sun')); // true \u2014 same wrapper`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        let autoObserve = false;\n        let addedCount = 0;\n        let lastAddedId: string | null = null;\n        let lastHighlightedId: string | null = null;\n\n        const hint = el('p', {\n            className: 'lesson-hint',\n            textContent:\n                'Try: 1) Add circle \u2014 DOM count rises, index may lag. 2) refresh() \u2014 index catches up (canvas unchanged). 3) getById \u2014 finds new node without full refresh, highlights it.',\n        });\n\n        const syncStatus = el('span', { className: 'status-badge', textContent: 'Index in sync' });\n\n        const domCountEl = el('strong', { textContent: '0' });\n        const indexedCountEl = el('strong', { textContent: '0' });\n\n        const stats = el('div', { className: 'sync-stats' }, [\n            el('div', { className: 'sync-stat' }, [\n                el('span', { className: 'sync-stat-label', textContent: 'Circles in DOM' }),\n                domCountEl,\n            ]),\n            el('div', { className: 'sync-stat' }, [\n                el('span', { className: 'sync-stat-label', textContent: 'Circles in index' }),\n                indexedCountEl,\n            ]),\n        ]);\n\n        const highlightLatest = (): void => {\n            if (!lastAddedId) {\n                return;\n            }\n            const shard = svg.getById(lastAddedId);\n            if (!shard) {\n                return;\n            }\n            ctx.highlightShard(shard);\n            lastHighlightedId = lastAddedId;\n        };\n\n        const updateStats = (): void => {\n            const dom = countDomCircles(svg);\n            const indexed = svg.getByType('circle').length;\n            domCountEl.textContent = String(dom);\n            indexedCountEl.textContent = String(indexed);\n\n            const stale = dom !== indexed;\n            if (autoObserve) {\n                syncStatus.textContent = stale ? 'Auto-sync pending\u2026' : 'Auto-sync \u2713';\n            } else {\n                syncStatus.textContent = stale ? 'Index stale \u2014 refresh or getById' : 'Index in sync \u2713';\n            }\n            syncStatus.className = stale ? 'status-badge warn' : 'status-badge ok';\n        };\n\n        const onAfterRefresh = (): void => {\n            updateStats();\n            if (autoObserve && lastAddedId !== lastHighlightedId) {\n                highlightLatest();\n            }\n        };\n\n        svg.onAfterRefresh(onAfterRefresh);\n\n        const addCircle = (): string => {\n            addedCount += 1;\n            const id = `added-${addedCount}`;\n            const c = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n            c.setAttribute('id', id);\n            c.setAttribute('cx', String(60 + addedCount * 25));\n            c.setAttribute('cy', '200');\n            c.setAttribute('r', '8');\n            c.setAttribute('fill', '#4a90d9');\n            svg.htmlNode.appendChild(c);\n            lastAddedId = id;\n            lastHighlightedId = null;\n            updateStats();\n            ctx.log('appendChild(circle)', `id=${id}`);\n            return id;\n        };\n\n        const toggleObserve = el('label', { className: 'toggle-row' });\n        const observeCheckbox = el('input', { type: 'checkbox' }) as HTMLInputElement;\n        toggleObserve.appendChild(observeCheckbox);\n        toggleObserve.appendChild(document.createTextNode(' Auto-refresh (MutationObserver)'));\n\n        observeCheckbox.addEventListener('change', () => {\n            autoObserve = observeCheckbox.checked;\n            if (autoObserve) {\n                svg.enableAutoRefresh({ debounceMs: 32 });\n                ctx.log('enableAutoRefresh({ debounceMs: 32 })', 'index follows DOM automatically');\n                svg.refresh();\n            } else {\n                svg.disableAutoRefresh();\n                ctx.log('disableAutoRefresh()', 'turn off to see stale index');\n                updateStats();\n            }\n        });\n\n        panel.appendChild(hint);\n        panel.appendChild(syncStatus);\n        panel.appendChild(stats);\n        panel.appendChild(toggleObserve);\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('1 \u00B7 Add circle', () => {\n                addCircle();\n                if (!autoObserve) {\n                    ctx.log('index', `${indexedCountEl.textContent} indexed vs ${domCountEl.textContent} in DOM`);\n                }\n            }),\n        );\n        row.appendChild(\n            btn('2 \u00B7 refresh()', () => {\n                const sunBefore = svg.getById('sun');\n                const indexedBefore = svg.getByType('circle').length;\n                svg.refresh();\n                const sunAfter = svg.getById('sun');\n                const same = sunBefore === sunAfter;\n                ctx.log('refresh()', `index ${indexedBefore} \u2192 ${svg.getByType('circle').length} (canvas unchanged)`);\n                ctx.log('sun wrapper identity', same ? 'same object \u2713' : 'different \u2717');\n                highlightLatest();\n            }),\n        );\n        row.appendChild(\n            btn('3 \u00B7 getById (lazy)', () => {\n                if (!lastAddedId) {\n                    ctx.log('Tip', 'Click \u201C1 \u00B7 Add circle\u201D first');\n                    return;\n                }\n                const indexedBefore = svg.getByType('circle').length;\n                const shard = svg.getById(lastAddedId);\n                updateStats();\n                ctx.highlightShard(shard);\n                lastHighlightedId = lastAddedId;\n                ctx.log(\n                    `getById('${lastAddedId}') without refresh`,\n                    shard ? `found \u2713 \u00B7 index ${indexedBefore} \u2192 ${svg.getByType('circle').length}` : 'null',\n                );\n            }),\n        );\n        panel.appendChild(row);\n\n        updateStats();\n\n        return () => {\n            svg.onAfterRefresh(null);\n            svg.disableAutoRefresh();\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import { signal } from '../../../src/reactive';\nimport { bindProperty } from '../../../src/reactive/bindProperty';\nimport { scheduleBatch } from '../../../src/reactive/scheduleBatch';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\nimport type { CircleElement } from '../../../src/elements/shapes/CircleElement';\n\nconst ORBIT_RX = 60;\nconst ORBIT_RY = 30;\n\nexport const reactiveLesson: Lesson = {\n    id: 'reactive',\n    title: 'Reactive \u2014 signals @ 60fps',\n    description:\n        'bindProperty connects a signal to a shard attribute \u2014 change signal.value and the DOM updates, no refresh() or setAttribute in your code. During orbit only sun.transform + opacity change; cx/cy stay at the orbit center.',\n    apiRefs: ['bindProperty', 'signal', 'scheduleBatch', 'svg-shards/reactive'],\n    snippet: `bindProperty(sun, 'cx', orbitCx);\nbindProperty(sun, 'transform', offset);\n\n// stopped: slider \u2192 orbitCx \u2192 sun.cx\n// running: rAF \u2192 offset (translate) + opacity only\n\nscheduleBatch(() => {\n  offset.value = \\`translate(\\${Math.cos(t) * 60}, \\${Math.sin(t) * 30})\\`;\n});`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        const sun = svg.getById('sun') as CircleElement | null;\n        if (!sun) {\n            return () => {};\n        }\n\n        ctx.highlightShard(sun);\n\n        const orbitCx = signal(sun.cx);\n        const orbitCy = signal(sun.cy);\n        const cxSig = signal(sun.cx);\n        const cySig = signal(sun.cy);\n        const transformSig = signal('');\n        const opacitySig = signal(sun.opacity);\n\n        const unbindCx = bindProperty(sun, 'cx', cxSig);\n        const unbindCy = bindProperty(sun, 'cy', cySig);\n        const unbindTransform = bindProperty(sun, 'transform', transformSig);\n        const unbindOp = bindProperty(sun, 'opacity', opacitySig);\n\n        const hint = el('p', {\n            className: 'lesson-hint',\n            textContent:\n                'Stop \u2192 sliders move sun via cx/cy signals. Start \u2192 only transform + opacity update each frame (cx/cy fixed at orbit center). Paint flashing may still tint the whole SVG in Chrome \u2014 that is a browser layer limit, not bindProperty touching the label.',\n        });\n\n        const readoutCx = el('strong', { textContent: String(Math.round(sun.cx)) });\n        const readoutCy = el('strong', { textContent: String(Math.round(sun.cy)) });\n        const readout = el('div', { className: 'signal-readout' }, [\n            document.createTextNode('visual cx '),\n            readoutCx,\n            document.createTextNode(' \u00B7 visual cy '),\n            readoutCy,\n            document.createTextNode(' \u00B7 opacity '),\n            el('strong', { textContent: sun.opacity.toFixed(2) }),\n        ]);\n        const readoutOpacity = readout.querySelector('strong:last-child')!;\n\n        let visualOffsetX = 0;\n        let visualOffsetY = 0;\n\n        const updateReadout = (): void => {\n            const cx = animating ? orbitCx.value + visualOffsetX : cxSig.value;\n            const cy = animating ? orbitCy.value + visualOffsetY : cySig.value;\n            readoutCx.textContent = String(Math.round(cx));\n            readoutCy.textContent = String(Math.round(cy));\n            readoutOpacity.textContent = opacitySig.value.toFixed(2);\n        };\n\n        const fpsEl = el('span', { className: 'fps-counter', textContent: 'FPS: \u2014' });\n        panel.appendChild(hint);\n        panel.appendChild(readout);\n        panel.appendChild(fpsEl);\n\n        let animating = false;\n\n        const cxRange = el('input', {\n            type: 'range',\n            min: '200',\n            max: '380',\n            value: String(sun.cx),\n        }) as HTMLInputElement;\n        const cyRange = el('input', {\n            type: 'range',\n            min: '20',\n            max: '180',\n            value: String(sun.cy),\n        }) as HTMLInputElement;\n\n        const syncOrbitCenterToShard = (): void => {\n            cxSig.value = orbitCx.value;\n            cySig.value = orbitCy.value;\n        };\n\n        const applyOrbitCenter = (): void => {\n            orbitCx.value = Number(cxRange.value);\n            orbitCy.value = Number(cyRange.value);\n            if (animating) {\n                syncOrbitCenterToShard();\n            } else {\n                cxSig.value = orbitCx.value;\n                cySig.value = orbitCy.value;\n                transformSig.value = '';\n                opacitySig.value = 1;\n            }\n            updateReadout();\n            ctx.log('orbit center', `${Math.round(orbitCx.value)}, ${Math.round(orbitCy.value)}`);\n        };\n\n        cxRange.addEventListener('input', applyOrbitCenter);\n        cyRange.addEventListener('input', applyOrbitCenter);\n\n        panel.appendChild(\n            el('div', { className: 'control-group' }, [\n                el('label', { textContent: 'Orbit center X (cx signal when stopped)' }),\n                cxRange,\n            ]),\n        );\n        panel.appendChild(\n            el('div', { className: 'control-group' }, [\n                el('label', { textContent: 'Orbit center Y (moves orbit while running)' }),\n                cyRange,\n            ]),\n        );\n\n        let rafId: number | null = null;\n        let frameCount = 0;\n        let lastFpsTime = performance.now();\n\n        const animate = (now: number): void => {\n            if (!animating) {\n                return;\n            }\n            const t = now / 500;\n            visualOffsetX = Math.cos(t) * ORBIT_RX;\n            visualOffsetY = Math.sin(t) * ORBIT_RY;\n            scheduleBatch(() => {\n                transformSig.value = `translate(${visualOffsetX}, ${visualOffsetY})`;\n                opacitySig.value = 0.55 + Math.sin(t * 2) * 0.45;\n                updateReadout();\n            });\n            frameCount += 1;\n            if (now - lastFpsTime >= 1000) {\n                fpsEl.textContent = `FPS: ~${frameCount}`;\n                frameCount = 0;\n                lastFpsTime = now;\n            }\n            rafId = requestAnimationFrame(animate);\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('Start orbit', () => {\n                if (animating) {\n                    return;\n                }\n                animating = true;\n                ctx.highlightShard(null);\n                orbitCx.value = Number(cxRange.value);\n                orbitCy.value = Number(cyRange.value);\n                syncOrbitCenterToShard();\n                sun.htmlNode.style.willChange = 'transform, opacity';\n                ctx.log(\n                    'scheduleBatch + rAF',\n                    `transform orbit @ ${Math.round(orbitCx.value)}, ${Math.round(orbitCy.value)}`,\n                );\n                rafId = requestAnimationFrame(animate);\n            }),\n        );\n        row.appendChild(\n            btn('Stop', () => {\n                if (!animating) {\n                    return;\n                }\n                animating = false;\n                if (rafId !== null) {\n                    cancelAnimationFrame(rafId);\n                    rafId = null;\n                }\n                fpsEl.textContent = 'FPS: \u2014';\n                sun.htmlNode.style.willChange = '';\n\n                const bakedCx = orbitCx.value + visualOffsetX;\n                const bakedCy = orbitCy.value + visualOffsetY;\n                visualOffsetX = 0;\n                visualOffsetY = 0;\n\n                transformSig.value = '';\n                cxSig.value = bakedCx;\n                cySig.value = bakedCy;\n                opacitySig.value = 1;\n                orbitCx.value = bakedCx;\n                orbitCy.value = bakedCy;\n                cxRange.value = String(Math.round(bakedCx));\n                cyRange.value = String(Math.round(bakedCy));\n                updateReadout();\n                ctx.log('animation', 'stopped \u2014 baked position into cx/cy');\n            }),\n        );\n        panel.appendChild(row);\n\n        updateReadout();\n\n        return () => {\n            animating = false;\n            if (rafId !== null) {\n                cancelAnimationFrame(rafId);\n            }\n            sun.htmlNode.style.willChange = '';\n            unbindCx();\n            unbindCy();\n            unbindTransform();\n            unbindOp();\n        };\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { GroupElement } from '../../../src/elements/GroupElement';\nimport type { Lesson } from '../types';\nimport { btn, el, shardLabel, shardTypeName } from '../types';\n\nexport const groupsLesson: Lesson = {\n    id: 'groups',\n    title: 'Groups \u2014 hierarchy',\n    description:\n        'On parse, GroupElement.children is populated with direct child shards. Use this to navigate nested SVG structure without manual DOM walking.',\n    apiRefs: ['GroupElement.children', 'elements.group'],\n    snippet: `const group = svg.getById('scene-group');\ngroup.children.forEach(child => {\n  console.log(child.id, child.htmlNode.tagName);\n});`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        const tree = el('div', { className: 'tree-view' });\n\n        const renderTree = (): void => {\n            tree.replaceChildren();\n            const group = svg.getById('scene-group') as GroupElement | null;\n            if (!group) {\n                tree.textContent = 'scene-group not found';\n                return;\n            }\n\n            const header = el('div', { className: 'tree-item' });\n            header.innerHTML = `<strong>&lt;g id=\"scene-group\"&gt;</strong> \u2014 ${group.children.length} children`;\n            tree.appendChild(header);\n\n            for (const child of group.children) {\n                const item = el('div', { className: 'tree-item' });\n                item.textContent = `  \u2514 ${shardTypeName(child)}#${child.id || '?'}`;\n                item.style.cursor = 'pointer';\n                item.addEventListener('click', () => {\n                    ctx.highlightShard(child);\n                    ctx.log('group.children[]', shardLabel(child, shardTypeName(child)));\n                });\n                tree.appendChild(item);\n            }\n\n            ctx.highlightShard(group);\n        };\n\n        renderTree();\n        panel.appendChild(tree);\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('Log children ids', () => {\n                const group = svg.getById('scene-group') as GroupElement | null;\n                if (!group) return;\n                const ids = group.children.map((c) => c.id || shardTypeName(c)).join(', ');\n                ctx.log('scene-group.children', ids);\n            }),\n        );\n        row.appendChild(\n            btn('Highlight group bbox', () => {\n                const group = svg.getById('scene-group') as GroupElement | null;\n                if (group) {\n                    ctx.highlightShard(group);\n                    const box = group.getBoundingBox();\n                    ctx.log('getBoundingBox()', `${box.width.toFixed(0)}\u00D7${box.height.toFixed(0)}`);\n                }\n            }),\n        );\n        panel.appendChild(row);\n\n        return () => {};\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import type { HighlightOptions } from '../../../src/core/types';\nimport type { SvgElement } from '../../../src/core/SvgElement';\nimport type { Lesson } from '../types';\nimport { btn, el } from '../types';\n\ntype PanelMode = 'orange' | 'outline' | null;\n\nexport const highlightLesson: Lesson = {\n    id: 'highlight',\n    title: 'Highlight \u2014 visual state',\n    description:\n        'applyHighlight saves the previous look and changes attributes; clearHighlight restores it. Always restore before applying again \u2014 otherwise strokeWidthBoost stacks. Buttons here toggle on/off.',\n    apiRefs: ['SvgElement.applyHighlight', 'SvgElement.clearHighlight', 'SvgElement.captureVisualState'],\n    snippet: `const prev = shard.applyHighlight({ fill: '#ff6600' });\n// \u2026 show selection \u2026\nshard.clearHighlight(prev);   // back to original\n\n// toggle pattern:\nif (prev) { clearHighlight(prev); prev = null; }\nelse { prev = applyHighlight({ ... }); }`,\n    mount(panel, ctx) {\n        const svg = ctx.getContainer();\n        const panelShard = svg.getById('panel');\n        if (!panelShard) {\n            return () => {};\n        }\n\n        const hint = el('p', {\n            className: 'lesson-hint',\n            textContent:\n                'Each button toggles: 1st click applyHighlight, 2nd click clearHighlight (original colors). Re-applying without clear stacks strokeWidthBoost \u2014 that is why we restore first.',\n        });\n        panel.appendChild(hint);\n\n        let panelPrevious: ReturnType<SvgElement['captureVisualState']> | null = null;\n        let panelMode: PanelMode = null;\n\n        const restorePanel = (): void => {\n            if (panelPrevious) {\n                panelShard.clearHighlight(panelPrevious);\n                panelPrevious = null;\n                panelMode = null;\n            }\n        };\n\n        const togglePanel = (mode: PanelMode, options: HighlightOptions, label: string): void => {\n            if (panelMode === mode) {\n                restorePanel();\n                ctx.highlightShard(null);\n                ctx.log('clearHighlight(panel)', 'toggle off');\n                return;\n            }\n\n            restorePanel();\n            panelPrevious = panelShard.applyHighlight(options);\n            panelMode = mode;\n            ctx.highlightShard(panelShard);\n            ctx.log(label, 'toggle on');\n        };\n\n        const row = el('div', { className: 'btn-row' });\n        row.appendChild(\n            btn('applyHighlight (orange)', () => {\n                togglePanel(\n                    'orange',\n                    { fill: '#ff6600', stroke: '#ff6600', strokeWidthBoost: 3 },\n                    'applyHighlight orange',\n                );\n            }),\n        );\n        row.appendChild(\n            btn('applyHighlight (outline)', () => {\n                togglePanel('outline', { fill: 'none', stroke: '#4a90d9', strokeWidth: 4 }, 'applyHighlight outline');\n            }),\n        );\n        row.appendChild(\n            btn('clearHighlight', () => {\n                restorePanel();\n                ctx.highlightShard(null);\n                ctx.log('clearHighlight(panel)', 'restored');\n            }),\n        );\n        row.appendChild(\n            btn('captureVisualState', () => {\n                ctx.log('captureVisualState(panel)', JSON.stringify(panelShard.captureVisualState()));\n            }),\n        );\n        panel.appendChild(row);\n\n        const targetPrevious = new Map<string, ReturnType<SvgElement['captureVisualState']>>();\n\n        const toggleTarget = (id: string, options: HighlightOptions): void => {\n            const shard = svg.getById(id);\n            if (!shard) {\n                return;\n            }\n\n            const existing = targetPrevious.get(id);\n            if (existing) {\n                shard.clearHighlight(existing);\n                targetPrevious.delete(id);\n                ctx.highlightShard(null);\n                ctx.log(`clearHighlight('${id}')`, 'toggle off');\n                return;\n            }\n\n            for (const [otherId, prev] of targetPrevious) {\n                const other = svg.getById(otherId);\n                other?.clearHighlight(prev);\n            }\n            targetPrevious.clear();\n\n            targetPrevious.set(id, shard.applyHighlight(options));\n            ctx.highlightShard(shard);\n            ctx.log(`applyHighlight('${id}')`, 'toggle on');\n        };\n\n        const targetRow = el('div', { className: 'btn-row' });\n        for (const id of ['sun', 'moon', 'badge']) {\n            targetRow.appendChild(\n                btn(`Highlight ${id}`, () => {\n                    toggleTarget(id, { fill: '#805ad5', strokeWidthBoost: 2 });\n                }),\n            );\n        }\n        panel.appendChild(targetRow);\n\n        const cleanup = (): void => {\n            restorePanel();\n            for (const [id, prev] of targetPrevious) {\n                svg.getById(id)?.clearHighlight(prev);\n            }\n            targetPrevious.clear();\n            ctx.highlightShard(null);\n        };\n\n        return cleanup;\n    },\n    reset(ctx) {\n        ctx.resetScene();\n    },\n};\n", "import { basicsLesson } from './01-basics';\nimport { queryLesson } from './02-query';\nimport { manipulateLesson } from './03-manipulate';\nimport { transformsLesson } from './04-transforms';\nimport { syncLesson } from './05-sync';\nimport { reactiveLesson } from './06-reactive';\nimport { groupsLesson } from './07-groups';\nimport { highlightLesson } from './08-highlight';\nimport type { Lesson } from '../types';\n\nexport const lessons: Lesson[] = [\n    basicsLesson,\n    queryLesson,\n    manipulateLesson,\n    transformsLesson,\n    syncLesson,\n    reactiveLesson,\n    groupsLesson,\n    highlightLesson,\n];\n\nexport const defaultLessonId = 'basics';\n", "import { highlighterLessons } from '../../../../plugins/svg-highlighter/playground/src/lessons';\nimport { particlesLessons } from '../../../../plugins/particles/playground/src/lessons';\nimport type { PluginLessonGroup } from '../../types';\nimport { lessons as coreLessons, defaultLessonId } from '../index';\n\nexport { defaultLessonId };\n\nexport const pluginGroups: PluginLessonGroup[] = [\n    {\n        id: 'highlighter',\n        title: '@svg-shards/highlighter',\n        lessons: highlighterLessons,\n    },\n    {\n        id: 'particles',\n        title: '@svg-shards/particles',\n        lessons: particlesLessons,\n    },\n];\n\nexport const allLessons = [...coreLessons, ...pluginGroups.flatMap((group) => group.lessons)];\n", "import { createLessonContext, initAppState, resetScene } from './app-state';\nimport { clearLog, initLogPanel, logApi } from './log';\nimport { allLessons, defaultLessonId, pluginGroups } from './lessons/plugins';\nimport { lessons as coreLessons } from './lessons';\nimport type { Lesson } from './types';\n\nlet activeCleanup: (() => void) | null = null;\nlet activeLesson: Lesson | null = null;\n\nconst navEl = document.getElementById('lesson-nav')!;\nconst pluginGroupsHost = document.getElementById('plugin-groups-host')!;\nconst titleEl = document.getElementById('lesson-title')!;\nconst descEl = document.getElementById('lesson-description')!;\nconst apiRefsEl = document.getElementById('lesson-api-refs')!;\nconst controlsEl = document.getElementById('lesson-controls')!;\nconst snippetEl = document.getElementById('lesson-snippet')!;\nconst canvasHost = document.getElementById('canvas-host')!;\n\nfunction setSnippet(code: string): void {\n    snippetEl.textContent = code;\n}\n\nfunction getLessonFromHash(): Lesson {\n    const id = location.hash.replace(/^#/, '') || defaultLessonId;\n    return allLessons.find((lesson) => lesson.id === id) ?? allLessons[0];\n}\n\nfunction isPluginLesson(id: string): boolean {\n    return pluginGroups.some((group) => group.lessons.some((lesson) => lesson.id === id));\n}\n\nfunction initPluginNav(): void {\n    pluginGroupsHost.replaceChildren();\n\n    for (const group of pluginGroups) {\n        const details = document.createElement('details');\n        details.className = 'plugin-group';\n        details.dataset.groupId = group.id;\n        details.open = true;\n\n        const summary = document.createElement('summary');\n        summary.className = 'plugin-group-title';\n        summary.textContent = group.title;\n\n        const list = document.createElement('ul');\n        list.className = 'lesson-nav plugin-lesson-nav';\n\n        details.appendChild(summary);\n        details.appendChild(list);\n        pluginGroupsHost.appendChild(details);\n    }\n}\n\nfunction updateNav(activeId: string): void {\n    navEl.replaceChildren();\n    for (const lesson of coreLessons) {\n        const link = document.createElement('a');\n        link.href = `#${lesson.id}`;\n        link.textContent = lesson.title.split(' \u2014 ')[0] || lesson.title;\n        if (lesson.id === activeId) {\n            link.classList.add('active');\n        }\n        navEl.appendChild(link);\n    }\n\n    for (const group of pluginGroups) {\n        const details = pluginGroupsHost.querySelector<HTMLDetailsElement>(\n            `.plugin-group[data-group-id=\"${group.id}\"]`,\n        );\n        const list = details?.querySelector('.plugin-lesson-nav');\n        if (!list) {\n            continue;\n        }\n\n        list.replaceChildren();\n        for (const lesson of group.lessons) {\n            const link = document.createElement('a');\n            link.href = `#${lesson.id}`;\n            link.textContent = lesson.title.split(' \u2014 ')[0] || lesson.title;\n            if (lesson.id === activeId) {\n                link.classList.add('active');\n            }\n            list.appendChild(link);\n        }\n    }\n\n    if (isPluginLesson(activeId)) {\n        document.querySelector('.plugin-section')?.setAttribute('open', '');\n        for (const group of pluginGroups) {\n            if (group.lessons.some((lesson) => lesson.id === activeId)) {\n                pluginGroupsHost.querySelector(`.plugin-group[data-group-id=\"${group.id}\"]`)?.setAttribute('open', '');\n            }\n        }\n    }\n}\n\nfunction mountLesson(lesson: Lesson): void {\n    if (activeCleanup) {\n        activeCleanup();\n        activeCleanup = null;\n    }\n\n    if (activeLesson) {\n        activeLesson.reset(createLessonContext(setSnippet));\n    }\n\n    resetScene();\n    logApi(`Lesson: ${lesson.title}`);\n\n    titleEl.textContent = lesson.title;\n    descEl.textContent = lesson.description;\n    apiRefsEl.replaceChildren();\n    for (const ref of lesson.apiRefs) {\n        const tag = document.createElement('span');\n        tag.className = 'tag';\n        tag.textContent = ref;\n        apiRefsEl.appendChild(tag);\n    }\n\n    snippetEl.textContent = lesson.snippet;\n    controlsEl.replaceChildren();\n\n    const ctx = createLessonContext(setSnippet);\n    activeCleanup = lesson.mount(controlsEl, ctx);\n    activeLesson = lesson;\n    updateNav(lesson.id);\n}\n\nfunction initRouter(): void {\n    const navigate = (): void => {\n        const lesson = getLessonFromHash();\n        if (activeLesson?.id !== lesson.id) {\n            mountLesson(lesson);\n        } else {\n            updateNav(lesson.id);\n        }\n    };\n\n    window.addEventListener('hashchange', navigate);\n    navigate();\n}\n\nfunction remountActiveLessonControls(): void {\n    if (!activeLesson) {\n        return;\n    }\n\n    if (activeCleanup) {\n        activeCleanup();\n        activeCleanup = null;\n    }\n\n    controlsEl.replaceChildren();\n    const ctx = createLessonContext(setSnippet);\n    activeCleanup = activeLesson.mount(controlsEl, ctx);\n}\n\nfunction init(): void {\n    initLogPanel(document.getElementById('log-output')!);\n    initAppState(canvasHost);\n    initPluginNav();\n\n    document.getElementById('btn-clear-log')!.addEventListener('click', clearLog);\n    document.getElementById('btn-reset-scene')!.addEventListener('click', () => {\n        if (activeLesson) {\n            activeLesson.reset(createLessonContext(setSnippet));\n            remountActiveLessonControls();\n        } else {\n            resetScene();\n        }\n        logApi('Scene reset');\n    });\n\n    initRouter();\n    logApi('Playground ready', `${allLessons.length} lessons loaded`);\n}\n\ninit();\n"],
  "mappings": "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",
  "names": ["SvgElement", "htmlNode", "value", "x", "y", "width", "height", "strokeWidth", "opacity", "str", "dx", "dy", "currentTransform", "angle", "cx", "cy", "sx", "sy", "syValue", "state", "options", "previous", "previousState", "graphicsElement", "bbox", "className", "name", "SHAPE_KIND_TO_TAG", "SVG_NS", "formatPoints", "points", "p", "applyBaseAttrs", "node", "options", "setNumericAttr", "name", "value", "buildShapeNode", "kind", "tag", "SHAPE_KIND_TO_TAG", "opts", "GroupElement", "SvgElement", "htmlNode", "children", "element", "index", "TAG_TO_MAP_KEY", "RectElement", "SvgElement", "htmlNode", "rx", "value", "ry", "CircleElement", "SvgElement", "htmlNode", "cx", "value", "str", "cy", "r", "x", "y", "radius", "EllipseElement", "SvgElement", "htmlNode", "cx", "value", "cy", "rx", "ry", "x", "y", "radiusX", "radiusY", "LineElement", "SvgElement", "htmlNode", "x1", "value", "y1", "x2", "y2", "x", "y", "dx", "dy", "length", "currentLength", "ratio", "centerX", "centerY", "PolygonElement", "SvgElement", "htmlNode", "value", "n", "PolylineElement", "PathElement", "SvgElement", "htmlNode", "value", "distance", "TextElement", "SvgElement", "htmlNode", "value", "readHref", "node", "writeHref", "value", "ImageElement", "SvgElement", "htmlNode", "readHref", "node", "writeHref", "value", "UseElement", "SvgElement", "htmlNode", "createEmptyMap", "ElementFactory", "node", "RectElement", "CircleElement", "EllipseElement", "LineElement", "PolygonElement", "PolylineElement", "PathElement", "TextElement", "ImageElement", "GroupElement", "UseElement", "svgNode", "registry", "elements", "element", "mapKey", "TAG_TO_MAP_KEY", "group", "children", "childNode", "child", "TYPE_ORDER", "SvgContainer", "htmlNode", "elements", "registry", "options", "type", "id", "node", "existing", "selector", "nodes", "results", "shard", "entries", "counters", "element", "index", "ElementFactory", "callback", "kind", "count", "factory", "parentGroup", "parentNode", "fragment", "i", "buildShapeNode", "shards", "mapKey", "TAG_TO_MAP_KEY", "bucket", "idx", "parentShard", "GroupElement", "parent", "match", "el", "wrapped", "NodeRegistry", "node", "cached", "created", "ElementFactory", "Transformation", "_Transformation", "a", "b", "c", "d", "e", "f", "tx", "ty", "angleDeg", "cx", "cy", "rad", "cos", "sin", "rotation", "toOrigin", "fromOrigin", "sx", "sy", "syValue", "scaleMatrix", "other", "SvgShardsFactory", "element", "options", "svgNode", "registry", "NodeRegistry", "elements", "ElementFactory", "SvgContainer", "createSvgShards", "outputEl", "initLogPanel", "element", "clearLog", "logApi", "message", "detail", "line", "time", "msg", "detailSpan", "HIGHLIGHT_CLASS", "canvasHost", "container", "highlightEl", "SCENE_TEMPLATE_ID", "initAppState", "host", "resetScene", "getContainer", "template", "svgNode", "createSvgShards", "clearHighlight", "logApi", "highlightShard", "shard", "svg", "bbox", "pad", "rect", "createLessonContext", "setSnippet", "SvgElement", "htmlNode", "value", "x", "y", "width", "height", "strokeWidth", "opacity", "str", "dx", "dy", "currentTransform", "angle", "cx", "cy", "sx", "sy", "syValue", "state", "options", "previous", "previousState", "graphicsElement", "bbox", "className", "name", "SHAPE_KIND_TO_TAG", "SVG_NS", "formatPoints", "points", "p", "applyBaseAttrs", "node", "options", "setNumericAttr", "name", "value", "buildShapeNode", "kind", "tag", "SHAPE_KIND_TO_TAG", "opts", "GroupElement", "SvgElement", "htmlNode", "children", "element", "index", "SvgElementType", "TAG_TO_MAP_KEY", "RectElement", "SvgElement", "htmlNode", "rx", "value", "ry", "CircleElement", "SvgElement", "htmlNode", "cx", "value", "str", "cy", "r", "x", "y", "radius", "EllipseElement", "SvgElement", "htmlNode", "cx", "value", "cy", "rx", "ry", "x", "y", "radiusX", "radiusY", "LineElement", "SvgElement", "htmlNode", "x1", "value", "y1", "x2", "y2", "x", "y", "dx", "dy", "length", "currentLength", "ratio", "centerX", "centerY", "PolygonElement", "SvgElement", "htmlNode", "value", "n", "PolylineElement", "PathElement", "SvgElement", "htmlNode", "value", "distance", "TextElement", "SvgElement", "htmlNode", "value", "readHref", "node", "writeHref", "value", "ImageElement", "SvgElement", "htmlNode", "readHref", "node", "writeHref", "value", "UseElement", "SvgElement", "htmlNode", "createEmptyMap", "ElementFactory", "node", "SvgElementType", "RectElement", "CircleElement", "EllipseElement", "LineElement", "PolygonElement", "PolylineElement", "PathElement", "TextElement", "ImageElement", "GroupElement", "UseElement", "svgNode", "registry", "elements", "element", "mapKey", "TAG_TO_MAP_KEY", "group", "children", "childNode", "child", "TYPE_ORDER", "SvgContainer", "htmlNode", "elements", "registry", "options", "type", "id", "node", "existing", "selector", "nodes", "results", "shard", "entries", "counters", "element", "index", "ElementFactory", "callback", "kind", "count", "factory", "parentGroup", "parentNode", "fragment", "i", "buildShapeNode", "shards", "mapKey", "TAG_TO_MAP_KEY", "bucket", "idx", "parentShard", "GroupElement", "parent", "match", "el", "wrapped", "NodeRegistry", "node", "cached", "created", "ElementFactory", "SvgShardsFactory", "element", "options", "svgNode", "registry", "NodeRegistry", "elements", "ElementFactory", "SvgContainer", "createSvgShards", "BRAND_SYMBOL", "Symbol", "endBatch", "batchDepth", "error", "hasError", "snapshots", "batchSnapshots", "_source", "_value", "_version", "_next", "reconcileBatchSnapshots", "batchedEffect", "effect", "batchIteration", "next", "_nextBatchedEffect", "_flags", "needsToRecompute", "_callback", "err", "batch", "fn", "currentBatchSnapshotVersion", "batchSnapshotVersion", "evalContext", "untracked", "prevContext", "capturedEffects", "globalVersion", "addDependency", "signal", "node", "_node", "_target", "_prevSource", "_sources", "_nextSource", "_prevTarget", "_nextTarget", "_rollbackNode", "_subscribe", "Signal", "value", "options", "this", "_targets", "_batchSnapshotVersion", "_watched", "watched", "_unwatched", "unwatched", "name", "prototype", "brand", "_refresh", "_this", "targets", "_this$_watched", "call", "_unsubscribe", "_this2", "prev", "_this2$_unwatched", "subscribe", "_this3", "valueOf", "toString", "toJSON", "peek", "_this4", "Object", "defineProperty", "get", "set", "Error", "source", "_notify", "target", "prepareSources", "rollbackNode", "cleanupSources", "head", "Computed", "undefined", "_fn", "_globalVersion", "OUTDATED", "computed", "cleanupEffect", "cleanup", "_cleanup", "disposeEffect", "endEffect", "Effect", "push", "finish", "_start", "bind", "_dispose", "dispose", "readSignalValue", "source", "bindVisual", "shard", "sources", "disposers", "j", "readSignalValue", "dispose", "pending", "rafId", "scheduleBatch", "fn", "callbacks", "n", "callback", "ViewportController", "_ViewportController", "host", "inner", "svg", "container", "step", "scale", "translateX", "translateY", "rotation", "event", "delta", "isSignalLike", "value", "readSignalValue", "source", "isHighlighterContainer", "parseStrokeWidth", "state", "element", "parsed", "SvgHighlighter", "_SvgHighlighter", "container", "options", "isSignalLike", "y", "ViewportController", "source", "isHighlighterContainer", "createSvgShards", "entry", "index", "next", "prev", "readSignalValue", "mode", "prevId", "groupNode", "candidate", "targets", "originalState", "baseStrokeWidth", "bindable", "fill", "g", "color", "stroke", "strokeWidth", "unbind", "bindVisual", "binding", "el", "tag", "props", "children", "node", "key", "value", "child", "btn", "label", "onClick", "className", "button", "shardLabel", "shard", "type", "id", "shardTypeName", "navigationLesson", "panel", "ctx", "highlighter", "SvgHighlighter", "list", "el", "refreshList", "active", "index", "entry", "item", "row", "btn", "modesLesson", "panel", "ctx", "color", "y", "highlighter", "SvgHighlighter", "colorInput", "el", "modeRow", "btn", "targetRow", "id", "index", "entry", "groupsLesson", "panel", "ctx", "highlighter", "SvgHighlighter", "status", "el", "highlightGroup", "groupEntry", "entry", "index", "row", "btn", "highlighterLessons", "navigationLesson", "modesLesson", "groupsLesson", "ParticlePool", "container", "options", "count", "init", "inits", "i", "index", "particle", "shard", "active", "fromIndex", "resolveWallBounce", "state", "bounds", "restitution", "cx", "cy", "vx", "vy", "r", "width", "height", "resolveWallBounceInPlace", "index", "resolved", "integrateParticle", "cx", "cy", "vx", "vy", "gravity", "dt", "nextVy", "stepParticles", "state", "bounds", "options", "restitution", "i", "integrated", "resolveWallBounceInPlace", "ParticleState", "count", "DEFAULT_RESTITUTION", "MAX_DT", "ParticleField", "container", "options", "ParticleState", "ParticlePool", "value", "count", "init", "inits", "i", "shards", "particle", "scheduleBatch", "now", "dt", "stepParticles", "viewBox", "width", "height", "PARTICLE_BOUNDS", "createFpsTracker", "initiallyActive", "element", "el", "active", "frameCount", "lastFpsTime", "rafId", "loop", "now", "kick", "next", "getParticlesGroup", "container", "ensureParticlesGroup", "existing", "groupNode", "clearGroupChildren", "group", "child", "randomHsl", "index", "step", "BOUNDS", "PARTICLE_BOUNDS", "bouncingBallsLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "field", "ParticleField", "running", "gravity", "restitution", "fps", "createFpsTracker", "readout", "el", "countEl", "gravityEl", "restitutionEl", "updateReadout", "spawn", "count", "i", "row", "btn", "gravityRow", "gravityInput", "restitutionRow", "restitutionInput", "createShardsLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "created", "readout", "el", "countEl", "stats", "updateStats", "last", "rEl", "row", "btn", "shard", "PARTICLE_BOUNDS", "randomHsl", "start", "batch", "i", "clearGroupChildren", "radiusRow", "radiusInput", "spawnInitLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "field", "ParticleField", "PARTICLE_BOUNDS", "pattern", "fps", "createFpsTracker", "readout", "el", "buildInit", "kind", "count", "i", "randomHsl", "angle", "respawn", "label", "countLabel", "row", "btn", "physicsMechanicsLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "gravity", "restitution", "field", "ParticleField", "PARTICLE_BOUNDS", "fps", "createFpsTracker", "formula", "el", "readout", "spawnFountain", "i", "randomHsl", "syncField", "gEl", "eEl", "gravityRow", "gInput", "restRow", "eInput", "presets", "btn", "lifecycleLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "field", "running", "gravity", "fps", "createFpsTracker", "stateEl", "el", "countEl", "readout", "updateReadout", "gLabel", "makeField", "ParticleField", "PARTICLE_BOUNDS", "spawn", "i", "randomHsl", "row", "btn", "gravityRow", "gInput", "resolvePathD", "template", "spawnFromPath", "container", "count", "init", "options", "d", "i", "particle", "SVG_NS", "snowflakePath", "size", "variant", "s", "segments", "arm", "angle", "dx", "dy", "fmt", "branchT", "bx", "by", "branchLen", "px", "py", "tx", "ty", "fork", "fpx", "fpy", "value", "ensureSnowGradients", "container", "defs", "SVG_NS", "palettes", "i", "inner", "outer", "edge", "grad", "appendStop", "offset", "color", "opacity", "stop", "snowGradientFill", "index", "snowflakeTransform", "cx", "cy", "rotationDeg", "scale", "SNOWFLAKE_COUNT", "createSnowState", "count", "initSnowflake", "state", "index", "width", "height", "respawnY", "stepSnowfall", "bounds", "step", "wind", "time", "i", "sway", "snowflakeTransform", "snowfallLesson", "panel", "ctx", "container", "group", "ensureParticlesGroup", "ensureSnowGradients", "speed", "running", "lastTime", "MAX_DT", "fps", "createFpsTracker", "SNOWFLAKE_COUNT", "shards", "spawnFromPath", "snowflakePath", "snowGradientFill", "PARTICLE_BOUNDS", "scheduleFrame", "scheduleBatch", "now", "rawDt", "countEl", "el", "readout", "updateCount", "windRow", "windInput", "label", "speedRow", "speedInput", "row", "btn", "start", "newShards", "idx", "next", "shard", "particlesLessons", "bouncingBallsLesson", "createShardsLesson", "spawnInitLesson", "physicsMechanicsLesson", "lifecycleLesson", "snowfallLesson", "defaultLessonId", "basicsLesson", "panel", "ctx", "svg", "counts", "el", "list", "refreshCounts", "arr", "type", "refreshList", "entry", "item", "li", "row", "btn", "labels", "e", "queryLesson", "panel", "ctx", "svg", "idInput", "el", "selectorInput", "row", "btn", "shard", "shardLabel", "shardTypeName", "circles", "sel", "results", "s", "i", "manipulateLesson", "panel", "ctx", "svg", "activeTab", "tabs", "el", "controls", "makeSlider", "label", "min", "max", "value", "onInput", "range", "valueLabel", "v", "renderControls", "sun", "trail", "strokeSlider", "hint", "tab", "button", "t", "readSignalValue", "source", "bindProperty", "shard", "key", "source", "j", "value", "readSignalValue", "bindTransform", "shard", "source", "j", "matrix", "readSignalValue", "pending", "rafId", "scheduleBatch", "fn", "callbacks", "n", "callback", "rectCenter", "rect", "mountSizingTable", "parent", "table", "el", "thead", "headRow", "label", "tbody", "rows", "approach", "api", "drift", "row", "transformsLesson", "panelEl", "ctx", "panel", "unbind", "matrixSignal", "y", "Transformation", "matrixMode", "pivot", "applyMatrix", "cx", "cy", "bindTransform", "rotateInput", "txInput", "tyInput", "btn", "countDomCircles", "svg", "syncLesson", "panel", "ctx", "autoObserve", "addedCount", "lastAddedId", "lastHighlightedId", "hint", "el", "syncStatus", "domCountEl", "indexedCountEl", "stats", "highlightLatest", "shard", "updateStats", "dom", "indexed", "stale", "onAfterRefresh", "addCircle", "id", "c", "toggleObserve", "observeCheckbox", "row", "btn", "sunBefore", "indexedBefore", "sunAfter", "same", "ORBIT_RX", "ORBIT_RY", "reactiveLesson", "panel", "ctx", "sun", "orbitCx", "y", "orbitCy", "cxSig", "cySig", "transformSig", "opacitySig", "unbindCx", "bindProperty", "unbindCy", "unbindTransform", "unbindOp", "hint", "el", "readoutCx", "readoutCy", "readout", "readoutOpacity", "visualOffsetX", "visualOffsetY", "updateReadout", "cx", "animating", "cy", "fpsEl", "cxRange", "cyRange", "syncOrbitCenterToShard", "applyOrbitCenter", "rafId", "frameCount", "lastFpsTime", "animate", "now", "t", "scheduleBatch", "row", "btn", "bakedCx", "bakedCy", "groupsLesson", "panel", "ctx", "svg", "tree", "el", "group", "header", "child", "item", "shardTypeName", "shardLabel", "row", "btn", "ids", "c", "box", "highlightLesson", "panel", "ctx", "svg", "panelShard", "hint", "el", "panelPrevious", "panelMode", "restorePanel", "togglePanel", "mode", "options", "label", "row", "btn", "targetPrevious", "toggleTarget", "id", "shard", "existing", "otherId", "prev", "targetRow", "lessons", "basicsLesson", "queryLesson", "manipulateLesson", "transformsLesson", "syncLesson", "reactiveLesson", "groupsLesson", "highlightLesson", "defaultLessonId", "pluginGroups", "highlighterLessons", "particlesLessons", "allLessons", "lessons", "group", "activeCleanup", "activeLesson", "navEl", "pluginGroupsHost", "titleEl", "descEl", "apiRefsEl", "controlsEl", "snippetEl", "canvasHost", "setSnippet", "code", "getLessonFromHash", "id", "defaultLessonId", "allLessons", "lesson", "isPluginLesson", "pluginGroups", "group", "initPluginNav", "details", "summary", "list", "updateNav", "activeId", "lessons", "link", "mountLesson", "createLessonContext", "resetScene", "logApi", "ref", "tag", "ctx", "initRouter", "navigate", "remountActiveLessonControls", "init", "initLogPanel", "initAppState", "clearLog"]
}
