stickyflow 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +51 -5
- package/dist/binding/index.cjs +34 -0
- package/dist/binding/index.cjs.map +1 -0
- package/dist/binding/index.d.cts +11 -0
- package/dist/binding/index.d.ts +11 -0
- package/dist/binding/index.js +5 -0
- package/dist/binding/index.js.map +1 -0
- package/dist/{chunk-XEN5QIIJ.js → chunk-7VW2XKVB.js} +3 -3
- package/dist/{chunk-XEN5QIIJ.js.map → chunk-7VW2XKVB.js.map} +1 -1
- package/dist/chunk-BODZN3ZI.js +1182 -0
- package/dist/chunk-BODZN3ZI.js.map +1 -0
- package/dist/{chunk-CSXQD3ON.js → chunk-G7NRK5AG.js} +1128 -1081
- package/dist/chunk-G7NRK5AG.js.map +1 -0
- package/dist/{chunk-BYMIYXP5.js → chunk-IEHE6WVN.js} +197 -19
- package/dist/chunk-IEHE6WVN.js.map +1 -0
- package/dist/{chunk-HFOGKSNU.cjs → chunk-L3VJXZFD.cjs} +15 -15
- package/dist/{chunk-HFOGKSNU.cjs.map → chunk-L3VJXZFD.cjs.map} +1 -1
- package/dist/{chunk-65IVT4GK.js → chunk-LTGF5OHP.js} +1008 -631
- package/dist/chunk-LTGF5OHP.js.map +1 -0
- package/dist/chunk-TWDLOXRM.cjs +1189 -0
- package/dist/chunk-TWDLOXRM.cjs.map +1 -0
- package/dist/{chunk-UXDWH2JC.cjs → chunk-VK3T6O5Z.cjs} +1165 -1118
- package/dist/chunk-VK3T6O5Z.cjs.map +1 -0
- package/dist/{chunk-CXL254BT.cjs → chunk-XY2GZUHC.cjs} +204 -18
- package/dist/chunk-XY2GZUHC.cjs.map +1 -0
- package/dist/{chunk-DDCTNLLD.cjs → chunk-ZMLQIMJK.cjs} +1504 -1128
- package/dist/chunk-ZMLQIMJK.cjs.map +1 -0
- package/dist/index.cjs +53 -1013
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -14
- package/dist/index.d.ts +22 -14
- package/dist/index.js +6 -993
- package/dist/index.js.map +1 -1
- package/dist/interaction/index.cjs +231 -231
- 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 +3 -3
- package/dist/interaction/index.js.map +1 -1
- package/dist/{render-C5X74hds.d.cts → render-CgX_y15a.d.cts} +193 -116
- package/dist/{render-C5X74hds.d.ts → render-CgX_y15a.d.ts} +193 -116
- package/dist/runtime-DnUxca3Y.d.ts +10 -0
- package/dist/runtime-reWgr7MP.d.cts +10 -0
- package/dist/{runtimeTypes-D8hPZ62T.d.ts → runtimeTypes-CEBGueYM.d.ts} +10 -5
- package/dist/{runtimeTypes-yTSAvtCn.d.cts → runtimeTypes-D60w6nyF.d.cts} +10 -5
- package/dist/stickyflow-diagram.global.js +35 -35
- package/dist/stickyflow-diagram.global.js.map +1 -1
- package/dist/{types-BDKDf4zr.d.cts → types-DYLC_lsk.d.ts} +3 -2
- package/dist/{types-CdgGdtoD.d.ts → types-DvhMpqrL.d.cts} +3 -2
- 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 +6 -1
- package/dist/chunk-65IVT4GK.js.map +0 -1
- package/dist/chunk-BYMIYXP5.js.map +0 -1
- package/dist/chunk-CSXQD3ON.js.map +0 -1
- package/dist/chunk-CXL254BT.cjs.map +0 -1
- package/dist/chunk-DDCTNLLD.cjs.map +0 -1
- package/dist/chunk-UXDWH2JC.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,33 @@ Two things count as breaking here that are easy to overlook:
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [0.5.0] - 2026-10-18
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- The entry `stickyflow/binding` with `createDataSource`, `createBindingRuntime`, `buildBindingGraph`, `renderBound` and `interactiveElements`. The same names stay exported from `stickyflow` for now.
|
|
25
|
+
- The components `switch`, `checkbox`, `toggleButton` and `button`. A switch, a checkbox and a toggle button hold a boolean value, a button fires `onTap`. They are drawn from scene nodes, so they render without a DOM, and they carry `role`, `aria-checked` or `aria-pressed` and `aria-disabled`.
|
|
26
|
+
- `value: <-> source.field` binds the value of a component to a field of a record source in both directions. A change by the user writes the field. A value bound with `<-` cannot be changed by the user.
|
|
27
|
+
- `onChange` runs when the user changes the value of a component. A binding or another handler never fires it.
|
|
28
|
+
- The states `focused` and `value` of a component are readable in expressions, and `disabled` can be set and bound. `runtime.change(id, value)` and `runtime.activate(id)` do from code what a tap and the keyboard do.
|
|
29
|
+
- `onTap` also fires when a component that can take focus is activated with Enter or Space. `connectInteraction` handles focus and the keyboard.
|
|
30
|
+
- `defineComponent()` adds a component type from outside the library, with its description and its drawing. `getComponentDescriptor()` reads a description.
|
|
31
|
+
- A type of component that is not known draws a dashed placeholder with its name, and is reported as before.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- The `Widget` block is now called `Component`. Both names are read, so existing documents render as before. The types follow the new name (`Component`, `ComponentType`, `RollingNumberComponent`, `TickScaleComponent`, `RulerComponent`) and `viewer.setComponentValue()` replaces `viewer.setWidgetValue()`. `RenderInput` takes `components`. The old names remain as aliases for now.
|
|
36
|
+
- The diagnostic `unsupported-widget-type` is now `unsupported-component-type`.
|
|
37
|
+
- `sflToRenderInput()` returns the components as `components` and no longer as `widgets`. `BoundProperty.ownerKind` is `'Component'` for a `Component` and for a `Widget` block, and a binding is keyed `Component.value`.
|
|
38
|
+
- `Component` now also covers components that are not one of the three built-in types. Narrow with `isGenericComponent()` before reading `parameters` or `style`.
|
|
39
|
+
- The component types are listed in one place, `COMPONENT_TYPES`, as the shape and chart types are, and no longer repeated in the code that reads them.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- The number next to the knob of a ruler fades to the `peak` color and no longer always to white, so it stays readable on a light canvas.
|
|
44
|
+
|
|
45
|
+
The DOM contract is unchanged. The attributes `data-sf-widget*`, the role `widget` and the scene ids keep their names.
|
|
46
|
+
|
|
20
47
|
## [0.4.0] - 2026-10-17
|
|
21
48
|
|
|
22
49
|
### Added
|
package/README.md
CHANGED
|
@@ -104,16 +104,17 @@ const { svg, width, height, diagnostics } = render(sfl)
|
|
|
104
104
|
// A complete, deterministic SVG string. render() never touches the DOM.
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
##
|
|
107
|
+
## Five entry points
|
|
108
108
|
|
|
109
109
|
| Import | What it is |
|
|
110
110
|
|---|---|
|
|
111
111
|
| `stickyflow` | Static tier. SFL text in, SVG string out. Node, SSR, CLI. |
|
|
112
|
-
| `stickyflow/viewer` |
|
|
112
|
+
| `stickyflow/viewer` | Viewer in the DOM: select, hover, pan, zoom, typed events, and live input for components such as a switch or a button. |
|
|
113
113
|
| `stickyflow/interaction` | Editing gestures on a viewer. Reports what changed; the host applies the patch to the SFL text. |
|
|
114
|
+
| `stickyflow/binding` | Data sources, bindings and handlers. `createDataSource`, `createBindingRuntime`, `renderBound`. No DOM. |
|
|
114
115
|
| `stickyflow/web-component` | `<stickyflow-diagram>` custom element in Shadow DOM, no build step. |
|
|
115
116
|
|
|
116
|
-
Each
|
|
117
|
+
Each entry only depends on the ones below it; `test/architecture` enforces that.
|
|
117
118
|
|
|
118
119
|
```ts
|
|
119
120
|
import { createViewer } from 'stickyflow/viewer'
|
|
@@ -128,9 +129,52 @@ editing.on('moveChange', (event) => {
|
|
|
128
129
|
})
|
|
129
130
|
```
|
|
130
131
|
|
|
132
|
+
## Components and data binding
|
|
133
|
+
|
|
134
|
+
A component is an interface element with a value, a look and a behavior. Seven are built in. RollingNumber, TickScale and Ruler show a value. Switch, Checkbox, ToggleButton and Button are operated by the user. An application adds its own type with `defineComponent()`.
|
|
135
|
+
|
|
136
|
+
A document declares a data source and binds to it. `<-` makes a property follow the data. `<->` also writes the data when the user changes a component value, and `onChange` runs for each change by the user.
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
DataSource lamp {
|
|
140
|
+
mode: record
|
|
141
|
+
fields {
|
|
142
|
+
on: boolean
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Model demo {
|
|
147
|
+
Component power {
|
|
148
|
+
type: switch
|
|
149
|
+
value: <-> lamp.on
|
|
150
|
+
layout {
|
|
151
|
+
position: 0, 0
|
|
152
|
+
size: 104, 60
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
import { createBindingRuntime, createDataSource } from 'stickyflow/binding'
|
|
160
|
+
import { connectInteraction, createViewer } from 'stickyflow/viewer'
|
|
161
|
+
|
|
162
|
+
const viewer = createViewer({ container, source: sfl, interactive: true })
|
|
163
|
+
const runtime = createBindingRuntime(sfl)
|
|
164
|
+
const lamp = createDataSource({ on: false })
|
|
165
|
+
|
|
166
|
+
runtime.registerSource('lamp', lamp)
|
|
167
|
+
runtime.attach(viewer)
|
|
168
|
+
connectInteraction(viewer, runtime)
|
|
169
|
+
|
|
170
|
+
lamp.set({ on: true }) // the switch follows
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Binding and live input need only `stickyflow/binding` and `stickyflow/viewer`. Editing with `stickyflow/interaction` is separate.
|
|
174
|
+
|
|
131
175
|
## What it draws
|
|
132
176
|
|
|
133
|
-
Shapes, links, frames, swimlanes, paths and text. Fifteen chart types. Isometric objects. Shader surfaces and
|
|
177
|
+
Shapes, links, frames, swimlanes, paths and text. Fifteen chart types. Isometric objects. Shader surfaces and components. Data sources with bindings, and events with handlers, so a document can react to data and input.
|
|
134
178
|
|
|
135
179
|
## Principles
|
|
136
180
|
|
|
@@ -140,11 +184,13 @@ Shapes, links, frames, swimlanes, paths and text. Fifteen chart types. Isometric
|
|
|
140
184
|
|
|
141
185
|
```
|
|
142
186
|
src/
|
|
187
|
+
model/ types and registries for shapes, charts, components
|
|
143
188
|
sflLanguage/ AST, lexer, parser, canonical emitter
|
|
144
189
|
sflSemantic/ SFL AST to canvas state
|
|
145
190
|
renderInput/ renderer contract and style decoding
|
|
146
191
|
renderScene/ deterministic scene construction
|
|
147
192
|
svg/ SVG serialization and the DOM contract
|
|
193
|
+
binding/ data sources, bindings and handlers
|
|
148
194
|
runtime/ viewer, interaction, web component
|
|
149
195
|
```
|
|
150
196
|
|
|
@@ -155,7 +201,7 @@ npm run ci # lint, typecheck, tests, build, smoke
|
|
|
155
201
|
npm run build # tsup
|
|
156
202
|
```
|
|
157
203
|
|
|
158
|
-
How the package and its neighbours fit together: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). Adding a new placeable object: [docs/ADDING_CANVAS_OBJECT.md](docs/ADDING_CANVAS_OBJECT.md). Changes: [CHANGELOG.md](CHANGELOG.md).
|
|
204
|
+
How the package and its neighbours fit together: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). Adding a new placeable object: [docs/ADDING_CANVAS_OBJECT.md](docs/ADDING_CANVAS_OBJECT.md). Adding a component: [docs/ADDING_COMPONENT.md](docs/ADDING_COMPONENT.md). Changes: [CHANGELOG.md](CHANGELOG.md).
|
|
159
205
|
|
|
160
206
|
## More
|
|
161
207
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkTWDLOXRM_cjs = require('../chunk-TWDLOXRM.cjs');
|
|
4
|
+
require('../chunk-ZMLQIMJK.cjs');
|
|
5
|
+
require('../chunk-XY2GZUHC.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, "buildBindingGraph", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () { return chunkTWDLOXRM_cjs.buildBindingGraph; }
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "collectContracts", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return chunkTWDLOXRM_cjs.collectContracts; }
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(exports, "createBindingRuntime", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return chunkTWDLOXRM_cjs.createBindingRuntime; }
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(exports, "createDataSource", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return chunkTWDLOXRM_cjs.createDataSource; }
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "interactiveElements", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () { return chunkTWDLOXRM_cjs.interactiveElements; }
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(exports, "renderBound", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function () { return chunkTWDLOXRM_cjs.renderBound; }
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=index.cjs.map
|
|
34
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { S as SflDocument, D as DataSourceContract, B as BindingDiagnostic } from '../runtimeTypes-D60w6nyF.cjs';
|
|
2
|
+
export { a as BindingGraph, b as BindingRuntime, c as BindingRuntimeOptions, d as BindingTarget, e as BindingType, f as BindingValue, g as BoundAssignment, h as BoundHandler, i as BoundProperty, j as DataSource, E as ElementInfo, k as ElementState, I as InteractiveElements, M as MutableDataSource, l as buildBindingGraph, m as createDataSource, n as interactiveElements } from '../runtimeTypes-D60w6nyF.cjs';
|
|
3
|
+
export { R as RenderBoundOptions, c as createBindingRuntime, r as renderBound } from '../runtime-reWgr7MP.cjs';
|
|
4
|
+
import '../render-CgX_y15a.cjs';
|
|
5
|
+
|
|
6
|
+
declare function collectContracts(sflDocument: SflDocument): {
|
|
7
|
+
contracts: Map<string, DataSourceContract>;
|
|
8
|
+
diagnostics: BindingDiagnostic[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { BindingDiagnostic, DataSourceContract, collectContracts };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { S as SflDocument, D as DataSourceContract, B as BindingDiagnostic } from '../runtimeTypes-CEBGueYM.js';
|
|
2
|
+
export { a as BindingGraph, b as BindingRuntime, c as BindingRuntimeOptions, d as BindingTarget, e as BindingType, f as BindingValue, g as BoundAssignment, h as BoundHandler, i as BoundProperty, j as DataSource, E as ElementInfo, k as ElementState, I as InteractiveElements, M as MutableDataSource, l as buildBindingGraph, m as createDataSource, n as interactiveElements } from '../runtimeTypes-CEBGueYM.js';
|
|
3
|
+
export { R as RenderBoundOptions, c as createBindingRuntime, r as renderBound } from '../runtime-DnUxca3Y.js';
|
|
4
|
+
import '../render-CgX_y15a.js';
|
|
5
|
+
|
|
6
|
+
declare function collectContracts(sflDocument: SflDocument): {
|
|
7
|
+
contracts: Map<string, DataSourceContract>;
|
|
8
|
+
diagnostics: BindingDiagnostic[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { BindingDiagnostic, DataSourceContract, collectContracts };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { buildBindingGraph, collectContracts, createBindingRuntime, createDataSource, interactiveElements, renderBound } from '../chunk-BODZN3ZI.js';
|
|
2
|
+
import '../chunk-LTGF5OHP.js';
|
|
3
|
+
import '../chunk-IEHE6WVN.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DOM_CONTRACT_VERSION, SYMBOL_BOUNDS_ATTR, PATH_POINTS_ATTR, PATH_CLOSED_ATTR, PATH_TENSION_ATTR, ISOMETRIC_SIZE_ATTR, CORNER_RADIUS_ATTR, ISOMETRIC_LABEL_OFFSET_ATTR, AXIS_COS, isometricFaces, PATH_POINT_INDEX_ATTR } from './chunk-
|
|
1
|
+
import { DOM_CONTRACT_VERSION, SYMBOL_BOUNDS_ATTR, PATH_POINTS_ATTR, PATH_CLOSED_ATTR, PATH_TENSION_ATTR, ISOMETRIC_SIZE_ATTR, CORNER_RADIUS_ATTR, ISOMETRIC_LABEL_OFFSET_ATTR, AXIS_COS, isometricFaces, PATH_POINT_INDEX_ATTR } from './chunk-IEHE6WVN.js';
|
|
2
2
|
|
|
3
3
|
// src/runtime/eventing/emitter.ts
|
|
4
4
|
var Emitter = class {
|
|
@@ -797,5 +797,5 @@ function shapeSelectionOverlay(document, primary, id, svg, lockHeight = false) {
|
|
|
797
797
|
}
|
|
798
798
|
|
|
799
799
|
export { CHANGE_COLOR, DERIVED_HEIGHT_ROLES, Emitter, FLASH_DURATION_MS, ISO_DUPLICATE_BUBBLES_ATTR, ISO_HALO_ATTR, PATH_HALO_ATTR, REDUCED_MOTION_DURATION_MS, SVG_NAMESPACE, axisArrowPlacements, clearAlignmentGuides, findAllOwnerNodes, findIsometricApexCandidates, findOwnerNode, findSnapCandidateBounds, isCameraGesture, isContractCompatible, isPrimary, isTextLabel, isometricGeometryOf, isometricSelectionOverlay, linkChangeOverlay, linkSelectionOverlay, parseContractVersion, pathGeometryOf, pathSelectionOverlay, pointerUserPoint, pxPerUnit, quickDuplicateBubbles, resizeHandlePositions, resolveOwner, screenRectOf, shapeChangeOverlay, shapeSelectionOverlay, startChangeFade, symbolDeclaredBounds, updateAlignmentGuides, updateAxisArrowGroup, updateHalo, updateQuickDuplicateBubbles };
|
|
800
|
-
//# sourceMappingURL=chunk-
|
|
801
|
-
//# sourceMappingURL=chunk-
|
|
800
|
+
//# sourceMappingURL=chunk-7VW2XKVB.js.map
|
|
801
|
+
//# sourceMappingURL=chunk-7VW2XKVB.js.map
|
|
@@ -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":["el","g","RING_COLOR","HALO_EXTRA_WIDTH_PX"],"mappings":"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","file":"chunk-XEN5QIIJ.js","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":["el","g","RING_COLOR","HALO_EXTRA_WIDTH_PX"],"mappings":"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","file":"chunk-7VW2XKVB.js","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"]}
|