stickyflow 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +1 -1
- package/dist/binding/index.cjs +9 -9
- package/dist/binding/index.d.cts +4 -4
- package/dist/binding/index.d.ts +4 -4
- package/dist/binding/index.js +3 -3
- package/dist/{chunk-VOYX6JMW.cjs → chunk-5EY7EK5V.cjs} +797 -669
- package/dist/chunk-5EY7EK5V.cjs.map +1 -0
- package/dist/{chunk-EDOPENSE.js → chunk-7ZEC7AB4.js} +228 -46
- package/dist/chunk-7ZEC7AB4.js.map +1 -0
- package/dist/{chunk-XPM3E7NV.cjs → chunk-BL5NCXS4.cjs} +23 -23
- package/dist/chunk-BL5NCXS4.cjs.map +1 -0
- package/dist/{chunk-LFEGZJWC.js → chunk-CM35H45Z.js} +3 -3
- package/dist/{chunk-LFEGZJWC.js.map → chunk-CM35H45Z.js.map} +1 -1
- package/dist/{chunk-GLZVHUSW.js → chunk-D2266VBZ.js} +393 -5
- package/dist/chunk-D2266VBZ.js.map +1 -0
- package/dist/{chunk-CZW3ARXQ.js → chunk-IKTSCLIK.js} +5 -5
- package/dist/chunk-IKTSCLIK.js.map +1 -0
- package/dist/{chunk-FQ7GMLCM.cjs → chunk-OUWGWDJ2.cjs} +15 -15
- package/dist/{chunk-FQ7GMLCM.cjs.map → chunk-OUWGWDJ2.cjs.map} +1 -1
- package/dist/{chunk-LNW5VIEA.cjs → chunk-QL7MNEMT.cjs} +393 -4
- package/dist/chunk-QL7MNEMT.cjs.map +1 -0
- package/dist/{chunk-IR2T47NW.cjs → chunk-RUSNRDLI.cjs} +257 -75
- package/dist/chunk-RUSNRDLI.cjs.map +1 -0
- package/dist/{chunk-MAPNY7MJ.js → chunk-TH2HFMEL.js} +147 -19
- package/dist/chunk-TH2HFMEL.js.map +1 -0
- package/dist/index.cjs +36 -36
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/interaction/index.cjs +232 -230
- package/dist/interaction/index.cjs.map +1 -1
- package/dist/interaction/index.d.cts +2 -2
- package/dist/interaction/index.d.ts +2 -2
- package/dist/interaction/index.js +4 -2
- package/dist/interaction/index.js.map +1 -1
- package/dist/{render-Bp2FLEzv.d.cts → render-DU4lYbRl.d.cts} +19 -11
- package/dist/{render-Bp2FLEzv.d.ts → render-DU4lYbRl.d.ts} +19 -11
- package/dist/{runtime-DIag-XBa.d.cts → runtime-DG8X3Fwf.d.cts} +2 -2
- package/dist/{runtime-CWIGxRcL.d.ts → runtime-kqD1RS17.d.ts} +2 -2
- package/dist/{runtimeTypes-C7sSLfOK.d.ts → runtimeTypes-CvjlBZds.d.cts} +7 -3
- package/dist/{runtimeTypes-BYODuxHk.d.cts → runtimeTypes-vRaHOIHi.d.ts} +7 -3
- package/dist/stickyflow-diagram.global.js +192 -40
- package/dist/stickyflow-diagram.global.js.map +1 -1
- package/dist/{types-D2w6D_wG.d.cts → types-B5jrEEcF.d.cts} +1 -1
- package/dist/{types-B9QM_H3R.d.ts → types-B7IkZ0w4.d.ts} +1 -1
- package/dist/viewer/index.cjs +9 -9
- package/dist/viewer/index.d.cts +4 -4
- package/dist/viewer/index.d.ts +4 -4
- package/dist/viewer/index.js +4 -4
- package/dist/web-component/index.cjs +6 -6
- package/dist/web-component/index.d.cts +2 -2
- package/dist/web-component/index.d.ts +2 -2
- package/dist/web-component/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-CZW3ARXQ.js.map +0 -1
- package/dist/chunk-EDOPENSE.js.map +0 -1
- package/dist/chunk-GLZVHUSW.js.map +0 -1
- package/dist/chunk-IR2T47NW.cjs.map +0 -1
- package/dist/chunk-LNW5VIEA.cjs.map +0 -1
- package/dist/chunk-MAPNY7MJ.js.map +0 -1
- package/dist/chunk-VOYX6JMW.cjs.map +0 -1
- package/dist/chunk-XPM3E7NV.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/eventing/emitter.ts","../src/runtime/dom/contract.ts","../src/runtime/dom/svgNamespace.ts","../src/runtime/dom/alignmentGuideOverlay.ts","../src/runtime/dom/canvasObjectRoles.ts","../src/runtime/dom/selectionOverlay/dom.ts","../src/runtime/dom/changeOverlay.ts","../src/runtime/dom/domQuery.ts","../src/runtime/dom/selectionOverlay/scale.ts","../src/runtime/dom/selectionOverlay/quickDuplicate.ts","../src/runtime/dom/selectionOverlay/isometric.ts","../src/runtime/dom/selectionOverlay/link.ts","../src/runtime/dom/selectionOverlay/path.ts","../src/runtime/dom/selectionOverlay/resizeHandles.ts","../src/runtime/dom/selectionOverlay/shape.ts"],"names":["DOM_CONTRACT_VERSION","el","SYMBOL_BOUNDS_ATTR","PATH_POINTS_ATTR","PATH_TENSION_ATTR","PATH_CLOSED_ATTR","ISOMETRIC_SIZE_ATTR","CORNER_RADIUS_ATTR","ISOMETRIC_LABEL_OFFSET_ATTR","g","AXIS_COS","isometricFaces","RING_COLOR","HALO_EXTRA_WIDTH_PX","PATH_POINT_INDEX_ATTR"],"mappings":"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","file":"chunk-FQ7GMLCM.cjs","sourcesContent":["export type Unsubscribe = () => void;\n\nexport class Emitter<EventMap extends object> {\n private handlers = new Map<keyof EventMap, Set<(event: never) => void>>();\n\n on<T extends keyof EventMap>(name: T, handler: (event: EventMap[T]) => void): Unsubscribe {\n const eventHandlers = this.handlers.get(name) ?? new Set<(event: never) => void>();\n this.handlers.set(name, eventHandlers);\n\n const storedHandler = handler as (event: never) => void;\n eventHandlers.add(storedHandler);\n return () => eventHandlers.delete(storedHandler);\n }\n\n emit<T extends keyof EventMap>(name: T, event: EventMap[T]): void {\n const registered = this.handlers.get(name);\n if (registered === undefined) {\n return;\n }\n\n for (const handler of [...registered]) {\n try {\n (handler as (event: EventMap[T]) => void)(event);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n","import type { SceneRole } from '../../renderScene/scene';\nimport {\n CORNER_RADIUS_ATTR,\n ISOMETRIC_LABEL_OFFSET_ATTR,\n ISOMETRIC_SIZE_ATTR,\n PATH_CLOSED_ATTR,\n PATH_POINTS_ATTR,\n PATH_TENSION_ATTR,\n SYMBOL_BOUNDS_ATTR,\n} from '../../svg/domContract/attributes';\nimport { DOM_CONTRACT_VERSION } from '../../svg/domContract/version';\nimport type { OwnerRef } from './types';\n\nexport interface AttrElement {\n getAttribute(name: string): string | null;\n closest(selector: string): AttrElement | null;\n}\n\nexport function isCameraGesture(e: { ctrlKey: boolean; metaKey: boolean }): boolean {\n return e.ctrlKey || e.metaKey;\n}\n\nexport function parseContractVersion(svg: string): number | null {\n const match = /data-sf-contract=\"(\\d+)\"/.exec(svg);\n return match ? Number(match[1]) : null;\n}\n\nexport function isContractCompatible(version: number | null): boolean {\n return version === DOM_CONTRACT_VERSION;\n}\n\nconst ROLES: ReadonlySet<string> = new Set([\n 'entity',\n 'link',\n 'frame',\n 'swimlane',\n 'chart',\n 'path',\n 'widget',\n 'isometric',\n]);\n\nfunction sceneRole(domRole: string): SceneRole {\n return domRole === 'entity' ? 'shape' : (domRole as SceneRole);\n}\n\nexport function symbolDeclaredBounds(el: {\n getAttribute(name: string): string | null;\n}): { x: number; y: number; width: number; height: number } | null {\n const raw = el.getAttribute(SYMBOL_BOUNDS_ATTR);\n if (!raw) {\n return null;\n }\n const [x, y, width, height] = raw.split(',').map(Number);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(width) && Number.isFinite(height)\n ? { x, y, width, height }\n : null;\n}\n\nexport interface PathGeometry {\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n}\n\nexport function pathGeometryOf(el: { getAttribute(name: string): string | null }): PathGeometry | null {\n const raw = el.getAttribute(PATH_POINTS_ATTR);\n if (!raw) {\n return null;\n }\n let points: unknown;\n try {\n points = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!Array.isArray(points) || !points.every(point => Array.isArray(point) && point.length === 2)) {\n return null;\n }\n return {\n points: points as Array<[number, number]>,\n tension: Number(el.getAttribute(PATH_TENSION_ATTR)) || 0,\n closed: el.getAttribute(PATH_CLOSED_ATTR) === 'true',\n };\n}\n\nexport interface IsometricGeometry {\n width: number;\n height: number;\n depth: number;\n cornerRadius: number;\n bounds: { x: number; y: number; width: number; height: number } | null;\n labelOffsetX: number;\n labelOffsetY: number;\n}\n\nexport function isometricGeometryOf(el: { getAttribute(name: string): string | null }): IsometricGeometry | null {\n const raw = el.getAttribute(ISOMETRIC_SIZE_ATTR);\n if (raw === null) {\n return null;\n }\n const [width, height, depth] = raw.split(',').map(Number);\n if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(depth)) {\n return null;\n }\n const cornerRadius = Number(el.getAttribute(CORNER_RADIUS_ATTR)) || 0;\n const [labelOffsetX, labelOffsetY] = (el.getAttribute(ISOMETRIC_LABEL_OFFSET_ATTR) ?? '0,0').split(',').map(Number);\n return {\n width,\n height,\n depth,\n cornerRadius,\n bounds: symbolDeclaredBounds(el),\n labelOffsetX: Number.isFinite(labelOffsetX) ? labelOffsetX : 0,\n labelOffsetY: Number.isFinite(labelOffsetY) ? labelOffsetY : 0,\n };\n}\n\nexport function resolveOwner(target: AttrElement | null): OwnerRef | null {\n const el = target?.closest('[data-sf-id]');\n if (!el) {\n return null;\n }\n const id = el.getAttribute('data-sf-id');\n const role = el.getAttribute('data-sf-role');\n if (!id || !role || !ROLES.has(role)) {\n return null;\n }\n return {\n role: sceneRole(role),\n id,\n kind: el.getAttribute('data-sf-kind') ?? undefined,\n label: el.getAttribute('aria-label') ?? undefined,\n };\n}\n","export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n","import { SVG_NAMESPACE } from './svgNamespace';\n\nconst NS = SVG_NAMESPACE;\nconst DASH = '8 4';\n\nexport type GuideLine =\n | { orientation: 'vertical' | 'horizontal'; position: number; from: number; to: number }\n | { orientation: 'segment'; x1: number; y1: number; x2: number; y2: number };\n\nfunction el<K extends keyof SVGElementTagNameMap>(doc: Document, tag: K): SVGElementTagNameMap[K] {\n return doc.createElementNS(NS, tag) as SVGElementTagNameMap[K];\n}\n\nexport function updateAlignmentGuides(svg: SVGSVGElement, guides: GuideLine[], color: string): void {\n svg.querySelectorAll('[data-sf-alignment-guides]').forEach(g => {\n g.remove();\n });\n if (!guides.length) {\n return;\n }\n const doc = svg.ownerDocument;\n const g = el(doc, 'g');\n g.setAttribute('data-sf-alignment-guides', '');\n g.setAttribute('pointer-events', 'none');\n guides.forEach(guide => {\n const line = el(doc, 'line');\n if (guide.orientation === 'segment') {\n line.setAttribute('x1', String(guide.x1));\n line.setAttribute('y1', String(guide.y1));\n line.setAttribute('x2', String(guide.x2));\n line.setAttribute('y2', String(guide.y2));\n } else if (guide.orientation === 'vertical') {\n line.setAttribute('x1', String(guide.position));\n line.setAttribute('x2', String(guide.position));\n line.setAttribute('y1', String(guide.from));\n line.setAttribute('y2', String(guide.to));\n } else {\n line.setAttribute('y1', String(guide.position));\n line.setAttribute('y2', String(guide.position));\n line.setAttribute('x1', String(guide.from));\n line.setAttribute('x2', String(guide.to));\n }\n line.setAttribute('stroke', color);\n line.setAttribute('stroke-width', '1');\n line.setAttribute('stroke-dasharray', DASH);\n line.setAttribute('opacity', '0.8');\n line.setAttribute('vector-effect', 'non-scaling-stroke');\n g.appendChild(line);\n });\n svg.appendChild(g);\n}\n\nexport function clearAlignmentGuides(svg: SVGSVGElement): void {\n svg.querySelectorAll('[data-sf-alignment-guides]').forEach(g => {\n g.remove();\n });\n}\n","import type { SceneRole } from '../../renderScene/scene';\n\nexport const DERIVED_HEIGHT_ROLES: ReadonlySet<SceneRole> = new Set([]);\n","import { SVG_NAMESPACE } from '../svgNamespace';\n\nexport function svgElement<K extends keyof SVGElementTagNameMap>(document: Document, tag: K): SVGElementTagNameMap[K] {\n return document.createElementNS(SVG_NAMESPACE, tag) as SVGElementTagNameMap[K];\n}\n\nexport function selectionOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-selection-overlay', id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n","import { svgElement } from './selectionOverlay/dom';\n\nconst OVERLAY_ATTR = 'data-sf-change-overlay';\n\nexport const CHANGE_COLOR = '#f59e0b';\n\nexport const FLASH_DURATION_MS = 1300;\n\nexport const REDUCED_MOTION_DURATION_MS = 400;\n\nfunction changeOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(OVERLAY_ATTR, id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n\nexport function startChangeFade(target: SVGGElement, reducedMotion: boolean): void {\n if (reducedMotion) {\n return;\n }\n target.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: FLASH_DURATION_MS,\n easing: 'linear',\n fill: 'forwards',\n });\n}\n\nexport function shapeChangeOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const bounds = primary.getBBox();\n const group = changeOverlayGroup(document, id, primary);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - 4));\n ring.setAttribute('y', String(bounds.y - 4));\n ring.setAttribute('width', String(bounds.width + 8));\n ring.setAttribute('height', String(bounds.height + 8));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', color);\n ring.setAttribute('stroke-width', '3');\n group.appendChild(ring);\n return group;\n}\n\nexport function linkChangeOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const group = changeOverlayGroup(document, id, primary);\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', color);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + 6));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.6');\n group.appendChild(halo);\n return group;\n}\n","import { AXIS_COS } from '../../model/isometricObject';\nimport { isometricGeometryOf } from './contract';\n\nexport function findOwnerNode(\n svg: SVGSVGElement,\n id: string,\n predicate: (el: Element) => boolean,\n): SVGGraphicsElement | null {\n const nodes = svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`);\n for (const el of nodes) {\n if (predicate(el)) {\n return el as unknown as SVGGraphicsElement;\n }\n }\n return null;\n}\n\nexport function findAllOwnerNodes(svg: SVGSVGElement, id: string): SVGGraphicsElement[] {\n return Array.from(svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`)) as unknown as SVGGraphicsElement[];\n}\n\nexport const isPrimary = (el: Element): boolean => el.hasAttribute('data-sf-primary');\nexport const isTextLabel = (el: Element): boolean =>\n el.tagName.toLowerCase() === 'text' && !el.hasAttribute('data-sf-primary');\n\nexport function pointerUserPoint(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } | null {\n const ctm = svg.getScreenCTM();\n if (!ctm) {\n return null;\n }\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(ctm.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function screenRectOf(el: SVGGraphicsElement): { left: number; top: number; width: number; height: number } {\n const bbox = el.getBBox();\n const ctm = el.getScreenCTM();\n if (!ctm) {\n return { left: 0, top: 0, width: 0, height: 0 };\n }\n const topLeft = new DOMPoint(bbox.x, bbox.y).matrixTransform(ctm);\n const bottomRight = new DOMPoint(bbox.x + bbox.width, bbox.y + bbox.height).matrixTransform(ctm);\n return { left: topLeft.x, top: topLeft.y, width: bottomRight.x - topLeft.x, height: bottomRight.y - topLeft.y };\n}\n\nexport function pxPerUnit(svg: SVGSVGElement): number {\n const rect = svg.getBoundingClientRect();\n const { width: viewBoxWidth, height: viewBoxHeight } = svg.viewBox.baseVal;\n if (rect.width <= 0 || viewBoxWidth <= 0) {\n return 1;\n }\n const horizontal = rect.width / viewBoxWidth;\n return rect.height > 0 && viewBoxHeight > 0 ? Math.min(horizontal, rect.height / viewBoxHeight) : horizontal;\n}\n\nexport function findIsometricApexCandidates(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ id: string; apex: { x: number; y: number } }> {\n const results: Array<{ id: string; apex: { x: number; y: number } }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id][data-sf-role=\"isometric\"]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n if (!id || excludeIds.has(id)) {\n return;\n }\n const geometry = isometricGeometryOf(node);\n const bounds = geometry?.bounds ?? (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ id, apex: { x: bounds.x + (geometry?.depth ?? 0) * AXIS_COS, y: bounds.y } });\n });\n return results;\n}\n\nexport function findSnapCandidateBounds(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ x: number; y: number; width: number; height: number }> {\n const results: Array<{ x: number; y: number; width: number; height: number }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n const role = node.getAttribute('data-sf-role');\n if (!id || role === 'link' || excludeIds.has(id)) {\n return;\n }\n const bbox = (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height });\n });\n return results;\n}\n","import { pxPerUnit } from '../domQuery';\n\nexport function screenPx(svg: SVGSVGElement, px: number): number {\n return px / pxPerUnit(svg);\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, QuickDuplicateDirection } from './types';\n\nexport const BUBBLE_RADIUS_PX = 6;\nconst BUBBLE_MARGIN_PX = 14;\nexport const PLUS_HALF_SIZE_PX = 3;\nexport const BUBBLE_STROKE_WIDTH_PX = 1.5;\n\nfunction quickDuplicatePositions(\n bounds: OverlayBounds,\n offset: number,\n): Array<[number, number, QuickDuplicateDirection]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [centerX, bounds.y - offset, 'top'],\n [bounds.x + bounds.width + offset, centerY, 'right'],\n [centerX, bounds.y + bounds.height + offset, 'bottom'],\n [bounds.x - offset, centerY, 'left'],\n ];\n}\n\nexport function plusPath(x: number, y: number, halfSize: number): string {\n return `M ${x - halfSize} ${y} L ${x + halfSize} ${y} M ${x} ${y - halfSize} L ${x} ${y + halfSize}`;\n}\n\nconst BUBBLE_FILL = '#e8e8e8';\nconst BUBBLE_STROKE = '#ccc';\nconst BUBBLE_HOVER_FILL = '#9b42df';\nconst BUBBLE_HOVER_STROKE = '#7c2fb5';\nconst BUBBLE_HOVER_SCALE = 1.2;\n\nexport function duplicateBubble(\n document: Document,\n x: number,\n y: number,\n radius: number,\n strokeWidth: number,\n direction: string,\n): SVGCircleElement {\n const bubble = svgElement(document, 'circle');\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n bubble.setAttribute('stroke-width', String(strokeWidth));\n bubble.setAttribute('data-sf-quick-duplicate', direction);\n bubble.style.pointerEvents = 'auto';\n bubble.style.cursor = 'pointer';\n bubble.style.transition = 'r 120ms ease, fill 120ms ease, stroke 120ms ease';\n bubble.addEventListener('pointerenter', () => {\n bubble.setAttribute('r', String(radius * BUBBLE_HOVER_SCALE));\n bubble.setAttribute('fill', BUBBLE_HOVER_FILL);\n bubble.setAttribute('stroke', BUBBLE_HOVER_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#ffffff');\n });\n bubble.addEventListener('pointerleave', () => {\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#999');\n });\n return bubble;\n}\n\nexport function duplicatePlus(\n document: Document,\n x: number,\n y: number,\n halfSize: number,\n strokeWidth: number,\n): SVGPathElement {\n const plus = svgElement(document, 'path');\n plus.setAttribute('d', plusPath(x, y, halfSize));\n plus.setAttribute('stroke', '#999');\n plus.setAttribute('stroke-width', String(strokeWidth));\n plus.setAttribute('stroke-linecap', 'round');\n return plus;\n}\n\nexport function quickDuplicateBubbles(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const offset = radius + screenPx(svg, BUBBLE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n for (const [x, y, direction] of quickDuplicatePositions(bounds, offset)) {\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function updateQuickDuplicateBubbles(group: SVGGElement, bounds: OverlayBounds): void {\n const bubbles = group.querySelectorAll('circle[data-sf-quick-duplicate]');\n const firstRadius = Number(bubbles[0]?.getAttribute('r')) || BUBBLE_RADIUS_PX;\n const offset = firstRadius * ((BUBBLE_RADIUS_PX + BUBBLE_MARGIN_PX) / BUBBLE_RADIUS_PX);\n const halfSize = firstRadius * (PLUS_HALF_SIZE_PX / BUBBLE_RADIUS_PX);\n for (const [index, [x, y]] of quickDuplicatePositions(bounds, offset).entries()) {\n const bubble = bubbles[index];\n if (!bubble) {\n continue;\n }\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n const plus = bubble.nextElementSibling;\n if (plus) {\n plus.setAttribute('d', plusPath(x, y, halfSize));\n }\n }\n}\n","import { isometricFaces } from '../../../model/isometricObject';\nimport { isometricGeometryOf, symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport {\n BUBBLE_RADIUS_PX,\n BUBBLE_STROKE_WIDTH_PX,\n duplicateBubble,\n duplicatePlus,\n PLUS_HALF_SIZE_PX,\n} from './quickDuplicate';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 2;\nconst SHAFT_WIDTH_PX = 3.25;\nconst HIT_WIDTH_PX = 14;\nconst ARROW_LENGTH_PX = 34;\nconst ARROWHEAD_LENGTH_PX = 10.5;\nconst ARROWHEAD_WIDTH_PX = 8.5;\n\nexport type IsometricAxis = 'width' | 'height' | 'depth';\n\nexport interface Vec {\n x: number;\n y: number;\n}\n\nexport function normalizeVec(v: Vec): Vec {\n const length = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / length, y: v.y / length };\n}\n\nfunction axisCursorUrl(direction: Vec): string {\n const angleDeg = (Math.atan2(direction.y, direction.x) * 180) / Math.PI;\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\">` +\n `<g transform=\"rotate(${angleDeg} 13 13)\" stroke-linejoin=\"round\" stroke-linecap=\"round\">` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"white\" stroke-width=\"4.5\"/>` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"black\" stroke-width=\"1.6\"/>` +\n `<path d=\"M4 13 L9.5 8.5 L9.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `<path d=\"M22 13 L16.5 8.5 L16.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `</g></svg>`;\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\") 13 13, pointer`;\n}\n\nfunction centroid(points: readonly Vec[]): Vec {\n const sum = points.reduce((acc, p) => ({ x: acc.x + p.x, y: acc.y + p.y }), { x: 0, y: 0 });\n return { x: sum.x / points.length, y: sum.y / points.length };\n}\n\nexport const ISO_HALO_ATTR = 'data-sf-iso-halo';\n\ninterface ArrowElements {\n group: SVGGElement;\n hit: SVGLineElement;\n shaft: SVGLineElement;\n head: SVGPolygonElement;\n}\n\nfunction createAxisArrow(document: Document, axis: IsometricAxis, direction: Vec, svg: SVGSVGElement): ArrowElements {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-resize-handle', `iso-${axis}`);\n group.style.cursor = axisCursorUrl(direction);\n\n const hit = svgElement(document, 'line');\n hit.setAttribute('stroke', 'transparent');\n hit.setAttribute('stroke-width', String(screenPx(svg, HIT_WIDTH_PX)));\n hit.setAttribute('stroke-linecap', 'round');\n hit.style.pointerEvents = 'stroke';\n group.appendChild(hit);\n\n const shaft = svgElement(document, 'line');\n shaft.setAttribute('stroke', RING_COLOR);\n shaft.setAttribute('stroke-width', String(screenPx(svg, SHAFT_WIDTH_PX)));\n shaft.setAttribute('stroke-linecap', 'round');\n shaft.style.pointerEvents = 'none';\n group.appendChild(shaft);\n\n const head = svgElement(document, 'polygon');\n head.setAttribute('fill', RING_COLOR);\n head.style.pointerEvents = 'none';\n group.appendChild(head);\n\n return { group, hit, shaft, head };\n}\n\nfunction positionAxisArrow(elements: ArrowElements, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const length = screenPx(svg, ARROW_LENGTH_PX);\n const headLength = screenPx(svg, ARROWHEAD_LENGTH_PX);\n const headWidth = screenPx(svg, ARROWHEAD_WIDTH_PX);\n const tip: Vec = { x: origin.x + direction.x * length, y: origin.y + direction.y * length };\n const shaftEnd: Vec = {\n x: origin.x + direction.x * (length - headLength),\n y: origin.y + direction.y * (length - headLength),\n };\n const normal: Vec = { x: -direction.y, y: direction.x };\n const headLeft: Vec = { x: shaftEnd.x + (normal.x * headWidth) / 2, y: shaftEnd.y + (normal.y * headWidth) / 2 };\n const headRight: Vec = { x: shaftEnd.x - (normal.x * headWidth) / 2, y: shaftEnd.y - (normal.y * headWidth) / 2 };\n\n elements.hit.setAttribute('x1', String(origin.x));\n elements.hit.setAttribute('y1', String(origin.y));\n elements.hit.setAttribute('x2', String(tip.x));\n elements.hit.setAttribute('y2', String(tip.y));\n\n elements.shaft.setAttribute('x1', String(origin.x));\n elements.shaft.setAttribute('y1', String(origin.y));\n elements.shaft.setAttribute('x2', String(shaftEnd.x));\n elements.shaft.setAttribute('y2', String(shaftEnd.y));\n\n elements.head.setAttribute('points', `${tip.x},${tip.y} ${headLeft.x},${headLeft.y} ${headRight.x},${headRight.y}`);\n}\n\nfunction axisArrow(\n document: Document,\n origin: Vec,\n direction: Vec,\n axis: IsometricAxis,\n svg: SVGSVGElement,\n): SVGGElement {\n const elements = createAxisArrow(document, axis, direction, svg);\n positionAxisArrow(elements, origin, direction, svg);\n return elements.group;\n}\n\nexport function updateAxisArrowGroup(group: SVGGElement, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const hit = group.querySelector('line:nth-child(1)') as SVGLineElement | null;\n const shaft = group.querySelector('line:nth-child(2)') as SVGLineElement | null;\n const head = group.querySelector('polygon') as SVGPolygonElement | null;\n if (!hit || !shaft || !head) {\n return;\n }\n positionAxisArrow({ group, hit, shaft, head }, origin, direction, svg);\n}\n\nexport function updateHalo(halo: SVGPathElement, d: string): void {\n halo.setAttribute('d', d);\n}\n\nexport interface IsometricSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport function axisArrowPlacements(object: IsometricSize): Record<IsometricAxis, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const apex = faces.top[0];\n const right = faces.top[1];\n const left = faces.top[3];\n const bottom = faces.front[2];\n return {\n width: { origin: centroid(faces.right), direction: normalizeVec({ x: right.x - apex.x, y: right.y - apex.y }) },\n height: { origin: bottom, direction: { x: 0, y: 1 } },\n depth: { origin: centroid(faces.front), direction: normalizeVec({ x: left.x - apex.x, y: left.y - apex.y }) },\n };\n}\n\nconst DUPLICATE_MARGIN_PX = ARROW_LENGTH_PX + BUBBLE_RADIUS_PX + 10;\n\nexport type IsometricQuickDuplicateDirection =\n | 'iso-width-pos'\n | 'iso-width-neg'\n | 'iso-depth-pos'\n | 'iso-depth-neg'\n | 'iso-height-pos'\n | 'iso-height-neg';\n\nfunction reflect(point: Vec, through: Vec): Vec {\n return { x: through.x * 2 - point.x, y: through.y * 2 - point.y };\n}\n\nexport function quickDuplicatePlacements(\n object: IsometricSize,\n): Record<IsometricQuickDuplicateDirection, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const placements = axisArrowPlacements(object);\n const visualCenter = centroid([\n faces.top[0],\n faces.top[1],\n faces.top[2],\n faces.top[3],\n faces.front[2],\n faces.front[3],\n faces.right[2],\n ]);\n return {\n 'iso-width-pos': placements.width,\n 'iso-width-neg': {\n origin: reflect(placements.width.origin, visualCenter),\n direction: { x: -placements.width.direction.x, y: -placements.width.direction.y },\n },\n 'iso-depth-pos': placements.depth,\n 'iso-depth-neg': {\n origin: reflect(placements.depth.origin, visualCenter),\n direction: { x: -placements.depth.direction.x, y: -placements.depth.direction.y },\n },\n 'iso-height-pos': placements.height,\n 'iso-height-neg': {\n origin: reflect(placements.height.origin, visualCenter),\n direction: { x: -placements.height.direction.x, y: -placements.height.direction.y },\n },\n };\n}\n\nexport const ISO_DUPLICATE_BUBBLES_ATTR = 'data-sf-iso-duplicate-bubbles';\n\nconst VISIBLE_FACE_DIRECTIONS: readonly IsometricQuickDuplicateDirection[] = [\n 'iso-height-neg',\n 'iso-depth-pos',\n 'iso-width-pos',\n];\n\nexport function isometricQuickDuplicateBubbles(\n document: Document,\n object: IsometricSize,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(ISO_DUPLICATE_BUBBLES_ATTR, '');\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const margin = screenPx(svg, DUPLICATE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const placements = quickDuplicatePlacements(object);\n for (const direction of VISIBLE_FACE_DIRECTIONS) {\n const { origin, direction: dir } = placements[direction];\n const x = origin.x + dir.x * margin;\n const y = origin.y + dir.y * margin;\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function isometricSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const geometry = isometricGeometryOf(primary);\n const group = selectionOverlayGroup(document, id, primary);\n\n const halo = svgElement(document, 'path');\n halo.setAttribute(ISO_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('opacity', '0.6');\n halo.style.pointerEvents = 'none';\n group.appendChild(halo);\n\n const placements = axisArrowPlacements({\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n });\n group.appendChild(axisArrow(document, placements.width.origin, placements.width.direction, 'width', svg));\n group.appendChild(axisArrow(document, placements.height.origin, placements.height.direction, 'height', svg));\n group.appendChild(axisArrow(document, placements.depth.origin, placements.depth.direction, 'depth', svg));\n group.appendChild(\n isometricQuickDuplicateBubbles(\n document,\n {\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n },\n svg,\n ),\n );\n return group;\n}\n","import { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { LinkEndpoint } from './types';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst ENDPOINT_RADIUS_PX = 5;\nconst ENDPOINT_STROKE_WIDTH_PX = 1.5;\n\nfunction linkHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction endpointHandle(\n document: Document,\n primary: SVGPathElement,\n atLength: number,\n endpoint: LinkEndpoint,\n svg: SVGSVGElement,\n): SVGCircleElement {\n const point = primary.getPointAtLength(atLength);\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(point.x));\n handle.setAttribute('cy', String(point.y));\n handle.setAttribute('r', String(screenPx(svg, ENDPOINT_RADIUS_PX)));\n handle.setAttribute('fill', RING_COLOR);\n handle.setAttribute('stroke', 'white');\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-endpoint', endpoint);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'crosshair';\n return handle;\n}\n\nconst SEGMENT_LENGTH_PX = 22;\nconst SEGMENT_THICKNESS_PX = 8;\n\ninterface LinkSegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n movable: boolean;\n}\n\nfunction readSegments(primary: SVGPathElement): LinkSegmentData[] {\n try {\n return JSON.parse(primary.getAttribute('data-sf-link-segments') ?? '[]') as LinkSegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction segmentHandles(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGRectElement[] {\n const handles: SVGRectElement[] = [];\n readSegments(primary).forEach((segment, index) => {\n if (!segment.movable) {\n return;\n }\n const horizontal = Math.abs(segment.bx - segment.ax) > Math.abs(segment.by - segment.ay);\n const length = screenPx(svg, SEGMENT_LENGTH_PX);\n const thickness = screenPx(svg, SEGMENT_THICKNESS_PX);\n const width = horizontal ? length : thickness;\n const height = horizontal ? thickness : length;\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n handle.setAttribute('width', String(width));\n handle.setAttribute('height', String(height));\n handle.setAttribute('rx', String(thickness / 2));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-segment', String(index));\n handle.setAttribute('data-sf-link-segment-axis', horizontal ? 'y' : 'x');\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = horizontal ? 'ns-resize' : 'ew-resize';\n handles.push(handle);\n });\n return handles;\n}\n\nexport function linkSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const length = primary.getTotalLength();\n group.append(\n linkHalo(document, primary, svg),\n ...segmentHandles(document, primary, svg),\n endpointHandle(document, primary, 0, 'from', svg),\n endpointHandle(document, primary, length, 'to', svg),\n );\n return group;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { pathGeometryOf } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst POINT_RADIUS_PX = 5;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport const PATH_HALO_ATTR = 'data-sf-path-halo';\n\nfunction pathHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute(PATH_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction pointHandle(document: Document, x: number, y: number, index: number, svg: SVGSVGElement): SVGCircleElement {\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(x));\n handle.setAttribute('cy', String(y));\n handle.setAttribute('r', String(screenPx(svg, POINT_RADIUS_PX)));\n handle.setAttribute('fill', '#ffffff');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, POINT_STROKE_WIDTH_PX)));\n handle.setAttribute(PATH_POINT_INDEX_ATTR, String(index));\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'move';\n return handle;\n}\n\nexport function pathSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n group.appendChild(pathHalo(document, primary, svg));\n const geometry = pathGeometryOf(primary);\n for (const [index, [x, y]] of (geometry?.points ?? []).entries()) {\n group.appendChild(pointHandle(document, x, y, index, svg));\n }\n return group;\n}\n","import { svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, ResizeHandle } from './types';\n\nconst HANDLE_SIZE_PX = 6;\nconst HANDLE_STROKE_WIDTH_PX = 1;\nconst HANDLE_STROKE = '#992dff';\nconst HANDLE_CURSORS: Record<ResizeHandle, string> = {\n 'top-left': 'nwse-resize',\n top: 'ns-resize',\n 'top-right': 'nesw-resize',\n right: 'ew-resize',\n 'bottom-right': 'nwse-resize',\n bottom: 'ns-resize',\n 'bottom-left': 'nesw-resize',\n left: 'ew-resize',\n};\n\nexport function resizeHandlePositions(bounds: OverlayBounds): Array<[number, number, ResizeHandle]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [bounds.x, bounds.y, 'top-left'],\n [centerX, bounds.y, 'top'],\n [bounds.x + bounds.width, bounds.y, 'top-right'],\n [bounds.x + bounds.width, centerY, 'right'],\n [bounds.x + bounds.width, bounds.y + bounds.height, 'bottom-right'],\n [centerX, bounds.y + bounds.height, 'bottom'],\n [bounds.x, bounds.y + bounds.height, 'bottom-left'],\n [bounds.x, centerY, 'left'],\n ];\n}\n\nconst LOCKED_HEIGHT_HANDLES: ReadonlySet<ResizeHandle> = new Set(['top', 'bottom']);\n\nexport function renderResizeHandles(\n document: Document,\n bounds: OverlayBounds,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGRectElement[] {\n const size = screenPx(svg, HANDLE_SIZE_PX);\n const strokeWidth = screenPx(svg, HANDLE_STROKE_WIDTH_PX);\n const positions = lockHeight\n ? resizeHandlePositions(bounds).filter(([, , name]) => !LOCKED_HEIGHT_HANDLES.has(name))\n : resizeHandlePositions(bounds);\n return positions.map(([centerX, centerY, name]) => {\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n handle.setAttribute('width', String(size));\n handle.setAttribute('height', String(size));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', HANDLE_STROKE);\n handle.setAttribute('stroke-width', String(strokeWidth));\n handle.setAttribute('data-sf-resize-handle', name);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = lockHeight ? 'ew-resize' : HANDLE_CURSORS[name];\n return handle;\n });\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { renderResizeHandles } from './resizeHandles';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst RING_STROKE_WIDTH_PX = 3;\nconst RING_OFFSET_PX = 1;\n\nexport function shapeSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const group = selectionOverlayGroup(document, id, primary);\n const offset = screenPx(svg, RING_OFFSET_PX);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - offset));\n ring.setAttribute('y', String(bounds.y - offset));\n ring.setAttribute('width', String(bounds.width + offset * 2));\n ring.setAttribute('height', String(bounds.height + offset * 2));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', RING_COLOR);\n ring.setAttribute('stroke-width', String(screenPx(svg, RING_STROKE_WIDTH_PX)));\n group.appendChild(ring);\n group.append(...renderResizeHandles(document, bounds, svg, lockHeight));\n return group;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime/eventing/emitter.ts","../src/runtime/dom/contract.ts","../src/runtime/dom/svgNamespace.ts","../src/runtime/dom/alignmentGuideOverlay.ts","../src/runtime/dom/canvasObjectRoles.ts","../src/runtime/dom/selectionOverlay/dom.ts","../src/runtime/dom/changeOverlay.ts","../src/runtime/dom/domQuery.ts","../src/runtime/dom/selectionOverlay/scale.ts","../src/runtime/dom/selectionOverlay/quickDuplicate.ts","../src/runtime/dom/selectionOverlay/isometric.ts","../src/runtime/dom/selectionOverlay/link.ts","../src/runtime/dom/selectionOverlay/path.ts","../src/runtime/dom/selectionOverlay/resizeHandles.ts","../src/runtime/dom/selectionOverlay/shape.ts"],"names":["DOM_CONTRACT_VERSION","el","SYMBOL_BOUNDS_ATTR","PATH_POINTS_ATTR","PATH_TENSION_ATTR","PATH_CLOSED_ATTR","ISOMETRIC_SIZE_ATTR","CORNER_RADIUS_ATTR","ISOMETRIC_LABEL_OFFSET_ATTR","g","AXIS_COS","isometricFaces","RING_COLOR","HALO_EXTRA_WIDTH_PX","PATH_POINT_INDEX_ATTR"],"mappings":"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","file":"chunk-OUWGWDJ2.cjs","sourcesContent":["export type Unsubscribe = () => void;\n\nexport class Emitter<EventMap extends object> {\n private handlers = new Map<keyof EventMap, Set<(event: never) => void>>();\n\n on<T extends keyof EventMap>(name: T, handler: (event: EventMap[T]) => void): Unsubscribe {\n const eventHandlers = this.handlers.get(name) ?? new Set<(event: never) => void>();\n this.handlers.set(name, eventHandlers);\n\n const storedHandler = handler as (event: never) => void;\n eventHandlers.add(storedHandler);\n return () => eventHandlers.delete(storedHandler);\n }\n\n emit<T extends keyof EventMap>(name: T, event: EventMap[T]): void {\n const registered = this.handlers.get(name);\n if (registered === undefined) {\n return;\n }\n\n for (const handler of [...registered]) {\n try {\n (handler as (event: EventMap[T]) => void)(event);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n","import type { SceneRole } from '../../renderScene/scene';\nimport {\n CORNER_RADIUS_ATTR,\n ISOMETRIC_LABEL_OFFSET_ATTR,\n ISOMETRIC_SIZE_ATTR,\n PATH_CLOSED_ATTR,\n PATH_POINTS_ATTR,\n PATH_TENSION_ATTR,\n SYMBOL_BOUNDS_ATTR,\n} from '../../svg/domContract/attributes';\nimport { DOM_CONTRACT_VERSION } from '../../svg/domContract/version';\nimport type { OwnerRef } from './types';\n\nexport interface AttrElement {\n getAttribute(name: string): string | null;\n closest(selector: string): AttrElement | null;\n}\n\nexport function isCameraGesture(e: { ctrlKey: boolean; metaKey: boolean }): boolean {\n return e.ctrlKey || e.metaKey;\n}\n\nexport function parseContractVersion(svg: string): number | null {\n const match = /data-sf-contract=\"(\\d+)\"/.exec(svg);\n return match ? Number(match[1]) : null;\n}\n\nexport function isContractCompatible(version: number | null): boolean {\n return version === DOM_CONTRACT_VERSION;\n}\n\nconst ROLES: ReadonlySet<string> = new Set([\n 'entity',\n 'link',\n 'frame',\n 'swimlane',\n 'chart',\n 'path',\n 'widget',\n 'isometric',\n]);\n\nfunction sceneRole(domRole: string): SceneRole {\n return domRole === 'entity' ? 'shape' : (domRole as SceneRole);\n}\n\nexport function symbolDeclaredBounds(el: {\n getAttribute(name: string): string | null;\n}): { x: number; y: number; width: number; height: number } | null {\n const raw = el.getAttribute(SYMBOL_BOUNDS_ATTR);\n if (!raw) {\n return null;\n }\n const [x, y, width, height] = raw.split(',').map(Number);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(width) && Number.isFinite(height)\n ? { x, y, width, height }\n : null;\n}\n\nexport interface PathGeometry {\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n}\n\nexport function pathGeometryOf(el: { getAttribute(name: string): string | null }): PathGeometry | null {\n const raw = el.getAttribute(PATH_POINTS_ATTR);\n if (!raw) {\n return null;\n }\n let points: unknown;\n try {\n points = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!Array.isArray(points) || !points.every(point => Array.isArray(point) && point.length === 2)) {\n return null;\n }\n return {\n points: points as Array<[number, number]>,\n tension: Number(el.getAttribute(PATH_TENSION_ATTR)) || 0,\n closed: el.getAttribute(PATH_CLOSED_ATTR) === 'true',\n };\n}\n\nexport interface IsometricGeometry {\n width: number;\n height: number;\n depth: number;\n cornerRadius: number;\n bounds: { x: number; y: number; width: number; height: number } | null;\n labelOffsetX: number;\n labelOffsetY: number;\n}\n\nexport function isometricGeometryOf(el: { getAttribute(name: string): string | null }): IsometricGeometry | null {\n const raw = el.getAttribute(ISOMETRIC_SIZE_ATTR);\n if (raw === null) {\n return null;\n }\n const [width, height, depth] = raw.split(',').map(Number);\n if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(depth)) {\n return null;\n }\n const cornerRadius = Number(el.getAttribute(CORNER_RADIUS_ATTR)) || 0;\n const [labelOffsetX, labelOffsetY] = (el.getAttribute(ISOMETRIC_LABEL_OFFSET_ATTR) ?? '0,0').split(',').map(Number);\n return {\n width,\n height,\n depth,\n cornerRadius,\n bounds: symbolDeclaredBounds(el),\n labelOffsetX: Number.isFinite(labelOffsetX) ? labelOffsetX : 0,\n labelOffsetY: Number.isFinite(labelOffsetY) ? labelOffsetY : 0,\n };\n}\n\nexport function resolveOwner(target: AttrElement | null): OwnerRef | null {\n const el = target?.closest('[data-sf-id]');\n if (!el) {\n return null;\n }\n const id = el.getAttribute('data-sf-id');\n const role = el.getAttribute('data-sf-role');\n if (!id || !role || !ROLES.has(role)) {\n return null;\n }\n return {\n role: sceneRole(role),\n id,\n kind: el.getAttribute('data-sf-kind') ?? undefined,\n label: el.getAttribute('aria-label') ?? undefined,\n };\n}\n","export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n","import { SVG_NAMESPACE } from './svgNamespace';\n\nconst NS = SVG_NAMESPACE;\nconst DASH = '8 4';\n\nexport type GuideLine =\n | { orientation: 'vertical' | 'horizontal'; position: number; from: number; to: number }\n | { orientation: 'segment'; x1: number; y1: number; x2: number; y2: number };\n\nfunction el<K extends keyof SVGElementTagNameMap>(doc: Document, tag: K): SVGElementTagNameMap[K] {\n return doc.createElementNS(NS, tag) as SVGElementTagNameMap[K];\n}\n\nexport function updateAlignmentGuides(svg: SVGSVGElement, guides: GuideLine[], color: string): void {\n svg.querySelectorAll('[data-sf-alignment-guides]').forEach(g => {\n g.remove();\n });\n if (!guides.length) {\n return;\n }\n const doc = svg.ownerDocument;\n const g = el(doc, 'g');\n g.setAttribute('data-sf-alignment-guides', '');\n g.setAttribute('pointer-events', 'none');\n guides.forEach(guide => {\n const line = el(doc, 'line');\n if (guide.orientation === 'segment') {\n line.setAttribute('x1', String(guide.x1));\n line.setAttribute('y1', String(guide.y1));\n line.setAttribute('x2', String(guide.x2));\n line.setAttribute('y2', String(guide.y2));\n } else if (guide.orientation === 'vertical') {\n line.setAttribute('x1', String(guide.position));\n line.setAttribute('x2', String(guide.position));\n line.setAttribute('y1', String(guide.from));\n line.setAttribute('y2', String(guide.to));\n } else {\n line.setAttribute('y1', String(guide.position));\n line.setAttribute('y2', String(guide.position));\n line.setAttribute('x1', String(guide.from));\n line.setAttribute('x2', String(guide.to));\n }\n line.setAttribute('stroke', color);\n line.setAttribute('stroke-width', '1');\n line.setAttribute('stroke-dasharray', DASH);\n line.setAttribute('opacity', '0.8');\n line.setAttribute('vector-effect', 'non-scaling-stroke');\n g.appendChild(line);\n });\n svg.appendChild(g);\n}\n\nexport function clearAlignmentGuides(svg: SVGSVGElement): void {\n svg.querySelectorAll('[data-sf-alignment-guides]').forEach(g => {\n g.remove();\n });\n}\n","import type { SceneRole } from '../../renderScene/scene';\n\nexport const DERIVED_HEIGHT_ROLES: ReadonlySet<SceneRole> = new Set([]);\n","import { SVG_NAMESPACE } from '../svgNamespace';\n\nexport function svgElement<K extends keyof SVGElementTagNameMap>(document: Document, tag: K): SVGElementTagNameMap[K] {\n return document.createElementNS(SVG_NAMESPACE, tag) as SVGElementTagNameMap[K];\n}\n\nexport function selectionOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-selection-overlay', id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n","import { svgElement } from './selectionOverlay/dom';\n\nconst OVERLAY_ATTR = 'data-sf-change-overlay';\n\nexport const CHANGE_COLOR = '#f59e0b';\n\nexport const FLASH_DURATION_MS = 1300;\n\nexport const REDUCED_MOTION_DURATION_MS = 400;\n\nfunction changeOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(OVERLAY_ATTR, id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n\nexport function startChangeFade(target: SVGGElement, reducedMotion: boolean): void {\n if (reducedMotion) {\n return;\n }\n target.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: FLASH_DURATION_MS,\n easing: 'linear',\n fill: 'forwards',\n });\n}\n\nexport function shapeChangeOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const bounds = primary.getBBox();\n const group = changeOverlayGroup(document, id, primary);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - 4));\n ring.setAttribute('y', String(bounds.y - 4));\n ring.setAttribute('width', String(bounds.width + 8));\n ring.setAttribute('height', String(bounds.height + 8));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', color);\n ring.setAttribute('stroke-width', '3');\n group.appendChild(ring);\n return group;\n}\n\nexport function linkChangeOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const group = changeOverlayGroup(document, id, primary);\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', color);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + 6));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.6');\n group.appendChild(halo);\n return group;\n}\n","import { AXIS_COS } from '../../model/isometricObject';\nimport { isometricGeometryOf } from './contract';\n\nexport function findOwnerNode(\n svg: SVGSVGElement,\n id: string,\n predicate: (el: Element) => boolean,\n): SVGGraphicsElement | null {\n const nodes = svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`);\n for (const el of nodes) {\n if (predicate(el)) {\n return el as unknown as SVGGraphicsElement;\n }\n }\n return null;\n}\n\nexport function findAllOwnerNodes(svg: SVGSVGElement, id: string): SVGGraphicsElement[] {\n return Array.from(svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`)) as unknown as SVGGraphicsElement[];\n}\n\nexport const isPrimary = (el: Element): boolean => el.hasAttribute('data-sf-primary');\nexport const isTextLabel = (el: Element): boolean =>\n el.tagName.toLowerCase() === 'text' && !el.hasAttribute('data-sf-primary');\n\nexport function pointerUserPoint(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } | null {\n const ctm = svg.getScreenCTM();\n if (!ctm) {\n return null;\n }\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(ctm.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function screenRectOf(el: SVGGraphicsElement): { left: number; top: number; width: number; height: number } {\n const bbox = el.getBBox();\n const ctm = el.getScreenCTM();\n if (!ctm) {\n return { left: 0, top: 0, width: 0, height: 0 };\n }\n const topLeft = new DOMPoint(bbox.x, bbox.y).matrixTransform(ctm);\n const bottomRight = new DOMPoint(bbox.x + bbox.width, bbox.y + bbox.height).matrixTransform(ctm);\n return { left: topLeft.x, top: topLeft.y, width: bottomRight.x - topLeft.x, height: bottomRight.y - topLeft.y };\n}\n\nexport function pxPerUnit(svg: SVGSVGElement): number {\n const rect = svg.getBoundingClientRect();\n const { width: viewBoxWidth, height: viewBoxHeight } = svg.viewBox.baseVal;\n if (rect.width <= 0 || viewBoxWidth <= 0) {\n return 1;\n }\n const horizontal = rect.width / viewBoxWidth;\n return rect.height > 0 && viewBoxHeight > 0 ? Math.min(horizontal, rect.height / viewBoxHeight) : horizontal;\n}\n\nexport function findIsometricApexCandidates(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ id: string; apex: { x: number; y: number } }> {\n const results: Array<{ id: string; apex: { x: number; y: number } }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id][data-sf-role=\"isometric\"]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n if (!id || excludeIds.has(id)) {\n return;\n }\n const geometry = isometricGeometryOf(node);\n const bounds = geometry?.bounds ?? (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ id, apex: { x: bounds.x + (geometry?.depth ?? 0) * AXIS_COS, y: bounds.y } });\n });\n return results;\n}\n\nexport function findSnapCandidateBounds(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ x: number; y: number; width: number; height: number }> {\n const results: Array<{ x: number; y: number; width: number; height: number }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n const role = node.getAttribute('data-sf-role');\n if (!id || role === 'link' || excludeIds.has(id)) {\n return;\n }\n const bbox = (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height });\n });\n return results;\n}\n","import { pxPerUnit } from '../domQuery';\n\nexport function screenPx(svg: SVGSVGElement, px: number): number {\n return px / pxPerUnit(svg);\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, QuickDuplicateDirection } from './types';\n\nexport const BUBBLE_RADIUS_PX = 6;\nconst BUBBLE_MARGIN_PX = 14;\nexport const PLUS_HALF_SIZE_PX = 3;\nexport const BUBBLE_STROKE_WIDTH_PX = 1.5;\n\nfunction quickDuplicatePositions(\n bounds: OverlayBounds,\n offset: number,\n): Array<[number, number, QuickDuplicateDirection]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [centerX, bounds.y - offset, 'top'],\n [bounds.x + bounds.width + offset, centerY, 'right'],\n [centerX, bounds.y + bounds.height + offset, 'bottom'],\n [bounds.x - offset, centerY, 'left'],\n ];\n}\n\nexport function plusPath(x: number, y: number, halfSize: number): string {\n return `M ${x - halfSize} ${y} L ${x + halfSize} ${y} M ${x} ${y - halfSize} L ${x} ${y + halfSize}`;\n}\n\nconst BUBBLE_FILL = '#e8e8e8';\nconst BUBBLE_STROKE = '#ccc';\nconst BUBBLE_HOVER_FILL = '#9b42df';\nconst BUBBLE_HOVER_STROKE = '#7c2fb5';\nconst BUBBLE_HOVER_SCALE = 1.2;\n\nexport function duplicateBubble(\n document: Document,\n x: number,\n y: number,\n radius: number,\n strokeWidth: number,\n direction: string,\n): SVGCircleElement {\n const bubble = svgElement(document, 'circle');\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n bubble.setAttribute('stroke-width', String(strokeWidth));\n bubble.setAttribute('data-sf-quick-duplicate', direction);\n bubble.style.pointerEvents = 'auto';\n bubble.style.cursor = 'pointer';\n bubble.style.transition = 'r 120ms ease, fill 120ms ease, stroke 120ms ease';\n bubble.addEventListener('pointerenter', () => {\n bubble.setAttribute('r', String(radius * BUBBLE_HOVER_SCALE));\n bubble.setAttribute('fill', BUBBLE_HOVER_FILL);\n bubble.setAttribute('stroke', BUBBLE_HOVER_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#ffffff');\n });\n bubble.addEventListener('pointerleave', () => {\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#999');\n });\n return bubble;\n}\n\nexport function duplicatePlus(\n document: Document,\n x: number,\n y: number,\n halfSize: number,\n strokeWidth: number,\n): SVGPathElement {\n const plus = svgElement(document, 'path');\n plus.setAttribute('d', plusPath(x, y, halfSize));\n plus.setAttribute('stroke', '#999');\n plus.setAttribute('stroke-width', String(strokeWidth));\n plus.setAttribute('stroke-linecap', 'round');\n return plus;\n}\n\nexport function quickDuplicateBubbles(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const offset = radius + screenPx(svg, BUBBLE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n for (const [x, y, direction] of quickDuplicatePositions(bounds, offset)) {\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function updateQuickDuplicateBubbles(group: SVGGElement, bounds: OverlayBounds): void {\n const bubbles = group.querySelectorAll('circle[data-sf-quick-duplicate]');\n const firstRadius = Number(bubbles[0]?.getAttribute('r')) || BUBBLE_RADIUS_PX;\n const offset = firstRadius * ((BUBBLE_RADIUS_PX + BUBBLE_MARGIN_PX) / BUBBLE_RADIUS_PX);\n const halfSize = firstRadius * (PLUS_HALF_SIZE_PX / BUBBLE_RADIUS_PX);\n for (const [index, [x, y]] of quickDuplicatePositions(bounds, offset).entries()) {\n const bubble = bubbles[index];\n if (!bubble) {\n continue;\n }\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n const plus = bubble.nextElementSibling;\n if (plus) {\n plus.setAttribute('d', plusPath(x, y, halfSize));\n }\n }\n}\n","import { isometricFaces } from '../../../model/isometricObject';\nimport { isometricGeometryOf, symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport {\n BUBBLE_RADIUS_PX,\n BUBBLE_STROKE_WIDTH_PX,\n duplicateBubble,\n duplicatePlus,\n PLUS_HALF_SIZE_PX,\n} from './quickDuplicate';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 2;\nconst SHAFT_WIDTH_PX = 3.25;\nconst HIT_WIDTH_PX = 14;\nconst ARROW_LENGTH_PX = 34;\nconst ARROWHEAD_LENGTH_PX = 10.5;\nconst ARROWHEAD_WIDTH_PX = 8.5;\n\nexport type IsometricAxis = 'width' | 'height' | 'depth';\n\nexport interface Vec {\n x: number;\n y: number;\n}\n\nexport function normalizeVec(v: Vec): Vec {\n const length = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / length, y: v.y / length };\n}\n\nfunction axisCursorUrl(direction: Vec): string {\n const angleDeg = (Math.atan2(direction.y, direction.x) * 180) / Math.PI;\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\">` +\n `<g transform=\"rotate(${angleDeg} 13 13)\" stroke-linejoin=\"round\" stroke-linecap=\"round\">` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"white\" stroke-width=\"4.5\"/>` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"black\" stroke-width=\"1.6\"/>` +\n `<path d=\"M4 13 L9.5 8.5 L9.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `<path d=\"M22 13 L16.5 8.5 L16.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `</g></svg>`;\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\") 13 13, pointer`;\n}\n\nfunction centroid(points: readonly Vec[]): Vec {\n const sum = points.reduce((acc, p) => ({ x: acc.x + p.x, y: acc.y + p.y }), { x: 0, y: 0 });\n return { x: sum.x / points.length, y: sum.y / points.length };\n}\n\nexport const ISO_HALO_ATTR = 'data-sf-iso-halo';\n\ninterface ArrowElements {\n group: SVGGElement;\n hit: SVGLineElement;\n shaft: SVGLineElement;\n head: SVGPolygonElement;\n}\n\nfunction createAxisArrow(document: Document, axis: IsometricAxis, direction: Vec, svg: SVGSVGElement): ArrowElements {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-resize-handle', `iso-${axis}`);\n group.style.cursor = axisCursorUrl(direction);\n\n const hit = svgElement(document, 'line');\n hit.setAttribute('stroke', 'transparent');\n hit.setAttribute('stroke-width', String(screenPx(svg, HIT_WIDTH_PX)));\n hit.setAttribute('stroke-linecap', 'round');\n hit.style.pointerEvents = 'stroke';\n group.appendChild(hit);\n\n const shaft = svgElement(document, 'line');\n shaft.setAttribute('stroke', RING_COLOR);\n shaft.setAttribute('stroke-width', String(screenPx(svg, SHAFT_WIDTH_PX)));\n shaft.setAttribute('stroke-linecap', 'round');\n shaft.style.pointerEvents = 'none';\n group.appendChild(shaft);\n\n const head = svgElement(document, 'polygon');\n head.setAttribute('fill', RING_COLOR);\n head.style.pointerEvents = 'none';\n group.appendChild(head);\n\n return { group, hit, shaft, head };\n}\n\nfunction positionAxisArrow(elements: ArrowElements, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const length = screenPx(svg, ARROW_LENGTH_PX);\n const headLength = screenPx(svg, ARROWHEAD_LENGTH_PX);\n const headWidth = screenPx(svg, ARROWHEAD_WIDTH_PX);\n const tip: Vec = { x: origin.x + direction.x * length, y: origin.y + direction.y * length };\n const shaftEnd: Vec = {\n x: origin.x + direction.x * (length - headLength),\n y: origin.y + direction.y * (length - headLength),\n };\n const normal: Vec = { x: -direction.y, y: direction.x };\n const headLeft: Vec = { x: shaftEnd.x + (normal.x * headWidth) / 2, y: shaftEnd.y + (normal.y * headWidth) / 2 };\n const headRight: Vec = { x: shaftEnd.x - (normal.x * headWidth) / 2, y: shaftEnd.y - (normal.y * headWidth) / 2 };\n\n elements.hit.setAttribute('x1', String(origin.x));\n elements.hit.setAttribute('y1', String(origin.y));\n elements.hit.setAttribute('x2', String(tip.x));\n elements.hit.setAttribute('y2', String(tip.y));\n\n elements.shaft.setAttribute('x1', String(origin.x));\n elements.shaft.setAttribute('y1', String(origin.y));\n elements.shaft.setAttribute('x2', String(shaftEnd.x));\n elements.shaft.setAttribute('y2', String(shaftEnd.y));\n\n elements.head.setAttribute('points', `${tip.x},${tip.y} ${headLeft.x},${headLeft.y} ${headRight.x},${headRight.y}`);\n}\n\nfunction axisArrow(\n document: Document,\n origin: Vec,\n direction: Vec,\n axis: IsometricAxis,\n svg: SVGSVGElement,\n): SVGGElement {\n const elements = createAxisArrow(document, axis, direction, svg);\n positionAxisArrow(elements, origin, direction, svg);\n return elements.group;\n}\n\nexport function updateAxisArrowGroup(group: SVGGElement, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const hit = group.querySelector('line:nth-child(1)') as SVGLineElement | null;\n const shaft = group.querySelector('line:nth-child(2)') as SVGLineElement | null;\n const head = group.querySelector('polygon') as SVGPolygonElement | null;\n if (!hit || !shaft || !head) {\n return;\n }\n positionAxisArrow({ group, hit, shaft, head }, origin, direction, svg);\n}\n\nexport function updateHalo(halo: SVGPathElement, d: string): void {\n halo.setAttribute('d', d);\n}\n\nexport interface IsometricSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport function axisArrowPlacements(object: IsometricSize): Record<IsometricAxis, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const apex = faces.top[0];\n const right = faces.top[1];\n const left = faces.top[3];\n const bottom = faces.front[2];\n return {\n width: { origin: centroid(faces.right), direction: normalizeVec({ x: right.x - apex.x, y: right.y - apex.y }) },\n height: { origin: bottom, direction: { x: 0, y: 1 } },\n depth: { origin: centroid(faces.front), direction: normalizeVec({ x: left.x - apex.x, y: left.y - apex.y }) },\n };\n}\n\nconst DUPLICATE_MARGIN_PX = ARROW_LENGTH_PX + BUBBLE_RADIUS_PX + 10;\n\nexport type IsometricQuickDuplicateDirection =\n | 'iso-width-pos'\n | 'iso-width-neg'\n | 'iso-depth-pos'\n | 'iso-depth-neg'\n | 'iso-height-pos'\n | 'iso-height-neg';\n\nfunction reflect(point: Vec, through: Vec): Vec {\n return { x: through.x * 2 - point.x, y: through.y * 2 - point.y };\n}\n\nexport function quickDuplicatePlacements(\n object: IsometricSize,\n): Record<IsometricQuickDuplicateDirection, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const placements = axisArrowPlacements(object);\n const visualCenter = centroid([\n faces.top[0],\n faces.top[1],\n faces.top[2],\n faces.top[3],\n faces.front[2],\n faces.front[3],\n faces.right[2],\n ]);\n return {\n 'iso-width-pos': placements.width,\n 'iso-width-neg': {\n origin: reflect(placements.width.origin, visualCenter),\n direction: { x: -placements.width.direction.x, y: -placements.width.direction.y },\n },\n 'iso-depth-pos': placements.depth,\n 'iso-depth-neg': {\n origin: reflect(placements.depth.origin, visualCenter),\n direction: { x: -placements.depth.direction.x, y: -placements.depth.direction.y },\n },\n 'iso-height-pos': placements.height,\n 'iso-height-neg': {\n origin: reflect(placements.height.origin, visualCenter),\n direction: { x: -placements.height.direction.x, y: -placements.height.direction.y },\n },\n };\n}\n\nexport const ISO_DUPLICATE_BUBBLES_ATTR = 'data-sf-iso-duplicate-bubbles';\n\nconst VISIBLE_FACE_DIRECTIONS: readonly IsometricQuickDuplicateDirection[] = [\n 'iso-height-neg',\n 'iso-depth-pos',\n 'iso-width-pos',\n];\n\nexport function isometricQuickDuplicateBubbles(\n document: Document,\n object: IsometricSize,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(ISO_DUPLICATE_BUBBLES_ATTR, '');\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const margin = screenPx(svg, DUPLICATE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const placements = quickDuplicatePlacements(object);\n for (const direction of VISIBLE_FACE_DIRECTIONS) {\n const { origin, direction: dir } = placements[direction];\n const x = origin.x + dir.x * margin;\n const y = origin.y + dir.y * margin;\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function isometricSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const geometry = isometricGeometryOf(primary);\n const group = selectionOverlayGroup(document, id, primary);\n\n const halo = svgElement(document, 'path');\n halo.setAttribute(ISO_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('opacity', '0.6');\n halo.style.pointerEvents = 'none';\n group.appendChild(halo);\n\n const placements = axisArrowPlacements({\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n });\n group.appendChild(axisArrow(document, placements.width.origin, placements.width.direction, 'width', svg));\n group.appendChild(axisArrow(document, placements.height.origin, placements.height.direction, 'height', svg));\n group.appendChild(axisArrow(document, placements.depth.origin, placements.depth.direction, 'depth', svg));\n group.appendChild(\n isometricQuickDuplicateBubbles(\n document,\n {\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n },\n svg,\n ),\n );\n return group;\n}\n","import { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { LinkEndpoint } from './types';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst ENDPOINT_RADIUS_PX = 5;\nconst ENDPOINT_STROKE_WIDTH_PX = 1.5;\n\nfunction linkHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction endpointHandle(\n document: Document,\n primary: SVGPathElement,\n atLength: number,\n endpoint: LinkEndpoint,\n svg: SVGSVGElement,\n): SVGCircleElement {\n const point = primary.getPointAtLength(atLength);\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(point.x));\n handle.setAttribute('cy', String(point.y));\n handle.setAttribute('r', String(screenPx(svg, ENDPOINT_RADIUS_PX)));\n handle.setAttribute('fill', RING_COLOR);\n handle.setAttribute('stroke', 'white');\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-endpoint', endpoint);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'crosshair';\n return handle;\n}\n\nconst SEGMENT_LENGTH_PX = 22;\nconst SEGMENT_THICKNESS_PX = 8;\n\ninterface LinkSegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n movable: boolean;\n}\n\nfunction readSegments(primary: SVGPathElement): LinkSegmentData[] {\n try {\n return JSON.parse(primary.getAttribute('data-sf-link-segments') ?? '[]') as LinkSegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction segmentHandles(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGRectElement[] {\n const handles: SVGRectElement[] = [];\n readSegments(primary).forEach((segment, index) => {\n if (!segment.movable) {\n return;\n }\n const horizontal = Math.abs(segment.bx - segment.ax) > Math.abs(segment.by - segment.ay);\n const length = screenPx(svg, SEGMENT_LENGTH_PX);\n const thickness = screenPx(svg, SEGMENT_THICKNESS_PX);\n const width = horizontal ? length : thickness;\n const height = horizontal ? thickness : length;\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n handle.setAttribute('width', String(width));\n handle.setAttribute('height', String(height));\n handle.setAttribute('rx', String(thickness / 2));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-segment', String(index));\n handle.setAttribute('data-sf-link-segment-axis', horizontal ? 'y' : 'x');\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = horizontal ? 'ns-resize' : 'ew-resize';\n handles.push(handle);\n });\n return handles;\n}\n\nexport function linkSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const length = primary.getTotalLength();\n group.append(\n linkHalo(document, primary, svg),\n ...segmentHandles(document, primary, svg),\n endpointHandle(document, primary, 0, 'from', svg),\n endpointHandle(document, primary, length, 'to', svg),\n );\n return group;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { pathGeometryOf } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst POINT_RADIUS_PX = 5;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport const PATH_HALO_ATTR = 'data-sf-path-halo';\n\nfunction pathHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute(PATH_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction pointHandle(document: Document, x: number, y: number, index: number, svg: SVGSVGElement): SVGCircleElement {\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(x));\n handle.setAttribute('cy', String(y));\n handle.setAttribute('r', String(screenPx(svg, POINT_RADIUS_PX)));\n handle.setAttribute('fill', '#ffffff');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, POINT_STROKE_WIDTH_PX)));\n handle.setAttribute(PATH_POINT_INDEX_ATTR, String(index));\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'move';\n return handle;\n}\n\nexport function pathSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n group.appendChild(pathHalo(document, primary, svg));\n const geometry = pathGeometryOf(primary);\n for (const [index, [x, y]] of (geometry?.points ?? []).entries()) {\n group.appendChild(pointHandle(document, x, y, index, svg));\n }\n return group;\n}\n","import { svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, ResizeHandle } from './types';\n\nconst HANDLE_SIZE_PX = 6;\nconst HANDLE_STROKE_WIDTH_PX = 1;\nconst HANDLE_STROKE = '#992dff';\nconst HANDLE_CURSORS: Record<ResizeHandle, string> = {\n 'top-left': 'nwse-resize',\n top: 'ns-resize',\n 'top-right': 'nesw-resize',\n right: 'ew-resize',\n 'bottom-right': 'nwse-resize',\n bottom: 'ns-resize',\n 'bottom-left': 'nesw-resize',\n left: 'ew-resize',\n};\n\nexport function resizeHandlePositions(bounds: OverlayBounds): Array<[number, number, ResizeHandle]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [bounds.x, bounds.y, 'top-left'],\n [centerX, bounds.y, 'top'],\n [bounds.x + bounds.width, bounds.y, 'top-right'],\n [bounds.x + bounds.width, centerY, 'right'],\n [bounds.x + bounds.width, bounds.y + bounds.height, 'bottom-right'],\n [centerX, bounds.y + bounds.height, 'bottom'],\n [bounds.x, bounds.y + bounds.height, 'bottom-left'],\n [bounds.x, centerY, 'left'],\n ];\n}\n\nconst LOCKED_HEIGHT_HANDLES: ReadonlySet<ResizeHandle> = new Set(['top', 'bottom']);\n\nexport function renderResizeHandles(\n document: Document,\n bounds: OverlayBounds,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGRectElement[] {\n const size = screenPx(svg, HANDLE_SIZE_PX);\n const strokeWidth = screenPx(svg, HANDLE_STROKE_WIDTH_PX);\n const positions = lockHeight\n ? resizeHandlePositions(bounds).filter(([, , name]) => !LOCKED_HEIGHT_HANDLES.has(name))\n : resizeHandlePositions(bounds);\n return positions.map(([centerX, centerY, name]) => {\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n handle.setAttribute('width', String(size));\n handle.setAttribute('height', String(size));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', HANDLE_STROKE);\n handle.setAttribute('stroke-width', String(strokeWidth));\n handle.setAttribute('data-sf-resize-handle', name);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = lockHeight ? 'ew-resize' : HANDLE_CURSORS[name];\n return handle;\n });\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { renderResizeHandles } from './resizeHandles';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst RING_STROKE_WIDTH_PX = 3;\nconst RING_OFFSET_PX = 1;\n\nexport function shapeSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const group = selectionOverlayGroup(document, id, primary);\n const offset = screenPx(svg, RING_OFFSET_PX);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - offset));\n ring.setAttribute('y', String(bounds.y - offset));\n ring.setAttribute('width', String(bounds.width + offset * 2));\n ring.setAttribute('height', String(bounds.height + offset * 2));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', RING_COLOR);\n ring.setAttribute('stroke-width', String(screenPx(svg, RING_STROKE_WIDTH_PX)));\n group.appendChild(ring);\n group.append(...renderResizeHandles(document, bounds, svg, lockHeight));\n return group;\n}\n"]}
|