stickyflow 0.11.3 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/binding/index.cjs +9 -9
- package/dist/binding/index.d.cts +4 -4
- package/dist/binding/index.d.ts +4 -4
- package/dist/binding/index.js +3 -3
- package/dist/{chunk-WZA3DJJH.cjs → chunk-3OF37CZX.cjs} +15 -15
- package/dist/{chunk-WZA3DJJH.cjs.map → chunk-3OF37CZX.cjs.map} +1 -1
- package/dist/{chunk-G6IW2IX3.js → chunk-4SXXMOXR.js} +31 -5
- package/dist/chunk-4SXXMOXR.js.map +1 -0
- package/dist/{chunk-GQRJSA73.cjs → chunk-5JPONNKW.cjs} +23 -23
- package/dist/{chunk-GQRJSA73.cjs.map → chunk-5JPONNKW.cjs.map} +1 -1
- package/dist/{chunk-V22J7Z4H.cjs → chunk-6TTSSFCF.cjs} +37 -37
- package/dist/chunk-6TTSSFCF.cjs.map +1 -0
- package/dist/{chunk-BFQWCOEC.js → chunk-FYSJMUJI.js} +3 -3
- package/dist/{chunk-BFQWCOEC.js.map → chunk-FYSJMUJI.js.map} +1 -1
- package/dist/{chunk-EBHO2FJ5.js → chunk-LLBTELO3.js} +12 -10
- package/dist/chunk-LLBTELO3.js.map +1 -0
- package/dist/{chunk-IQQ5KBL6.js → chunk-NZPLAEDJ.js} +6 -6
- package/dist/chunk-NZPLAEDJ.js.map +1 -0
- package/dist/{chunk-W25SXORW.js → chunk-P7HTMWBT.js} +4 -4
- package/dist/{chunk-W25SXORW.js.map → chunk-P7HTMWBT.js.map} +1 -1
- package/dist/{chunk-K5PGMZAD.cjs → chunk-PSC7G6NL.cjs} +664 -662
- package/dist/chunk-PSC7G6NL.cjs.map +1 -0
- package/dist/{chunk-UHKFJBY5.cjs → chunk-SKGJXCAO.cjs} +31 -5
- package/dist/chunk-SKGJXCAO.cjs.map +1 -0
- package/dist/index.cjs +36 -36
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/interaction/index.cjs +276 -238
- 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 +42 -4
- package/dist/interaction/index.js.map +1 -1
- package/dist/{render-BDO4S5uF.d.cts → render-BMhLssMa.d.cts} +1 -0
- package/dist/{render-BDO4S5uF.d.ts → render-BMhLssMa.d.ts} +1 -0
- package/dist/{runtime-lCAfU-1Q.d.ts → runtime-7Tpn2PHh.d.ts} +2 -2
- package/dist/{runtime-C-C5v9po.d.cts → runtime-BPBjVGa6.d.cts} +2 -2
- package/dist/{runtimeTypes-B7p6b1Bi.d.cts → runtimeTypes-Bt9twc5R.d.ts} +2 -2
- package/dist/{runtimeTypes-BDA_CfWh.d.ts → runtimeTypes-CRv6IJs-.d.cts} +2 -2
- package/dist/stickyflow-diagram.global.js +39 -39
- package/dist/stickyflow-diagram.global.js.map +1 -1
- package/dist/{types-CZJzycKw.d.cts → types-BnU5MZNj.d.cts} +1 -1
- package/dist/{types-Dp8JVZLB.d.ts → types-CLZFgmcG.d.ts} +1 -1
- package/dist/viewer/index.cjs +9 -9
- package/dist/viewer/index.d.cts +4 -4
- package/dist/viewer/index.d.ts +4 -4
- package/dist/viewer/index.js +4 -4
- package/dist/web-component/index.cjs +6 -6
- package/dist/web-component/index.d.cts +2 -2
- package/dist/web-component/index.d.ts +2 -2
- package/dist/web-component/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-EBHO2FJ5.js.map +0 -1
- package/dist/chunk-G6IW2IX3.js.map +0 -1
- package/dist/chunk-IQQ5KBL6.js.map +0 -1
- package/dist/chunk-K5PGMZAD.cjs.map +0 -1
- package/dist/chunk-UHKFJBY5.cjs.map +0 -1
- package/dist/chunk-V22J7Z4H.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/interaction/chartValue/coordinates.ts","../../src/runtime/interaction/chartValue/lineLookup.ts","../../src/runtime/interaction/chartValue/scale.ts","../../src/runtime/interaction/chartValue/preview.ts","../../src/runtime/interaction/chartValue/readout.ts","../../src/runtime/interaction/chartValue/target.ts","../../src/runtime/interaction/chartValue/session.ts","../../src/runtime/interaction/chartValueDrag.ts","../../src/runtime/interaction/colorEdit/color.ts","../../src/runtime/interaction/colorEdit/gradientValue.ts","../../src/runtime/interaction/colorEdit/gradientLookup.ts","../../src/runtime/interaction/colorEdit/value.ts","../../src/runtime/interaction/colorEdit/popoverActions.ts","../../src/runtime/interaction/colorEdit/popoverDom.ts","../../src/runtime/interaction/colorEdit/popoverView.ts","../../src/runtime/interaction/colorEdit/popoverEvents.ts","../../src/runtime/interaction/colorEdit/popoverRender.ts","../../src/runtime/interaction/colorEdit/styles/base.ts","../../src/runtime/interaction/colorEdit/styles/fields.ts","../../src/runtime/interaction/colorEdit/styles/gradient.ts","../../src/runtime/interaction/colorEdit/styles/tabsAndArea.ts","../../src/runtime/interaction/colorEdit/styles.ts","../../src/runtime/interaction/colorEdit/theme.ts","../../src/runtime/interaction/colorEdit/popover.ts","../../src/runtime/interaction/colorEdit/session.ts","../../src/runtime/interaction/propertyEdit/editable.ts","../../src/runtime/interaction/colorEdit/target.ts","../../src/runtime/interaction/colorEdit/zoneGradientSession.ts","../../src/runtime/interaction/colorEdit/binding.ts","../../src/runtime/interaction/deleteSelection.ts","../../src/runtime/interaction/events.ts","../../src/runtime/interaction/linkPreview/geometry.ts","../../src/runtime/interaction/linkPreview/discovery.ts","../../src/runtime/interaction/linkPreview/faceDiscovery.ts","../../src/runtime/interaction/linkPreview/faceUpdate.ts","../../src/runtime/interaction/linkPreview/update.ts","../../src/runtime/interaction/snapGrid.ts","../../src/runtime/interaction/isometricAxisResize/preview.ts","../../src/runtime/interaction/isometricAxisResize/state.ts","../../src/runtime/interaction/isometricAxisResize/session.ts","../../src/runtime/interaction/isometricAxisResizeDrag.ts","../../src/runtime/interaction/isometricLabelDrag/preview.ts","../../src/runtime/interaction/isometricLabelDrag/target.ts","../../src/runtime/interaction/isometricLabelDrag/session.ts","../../src/runtime/interaction/isometricLabelDrag/binding.ts","../../src/runtime/interaction/isometricQuickDuplicate/binding.ts","../../src/runtime/interaction/linkEndpoint/completion.ts","../../src/runtime/interaction/linkEndpoint/pointer.ts","../../src/runtime/interaction/linkEndpoint/preview.ts","../../src/runtime/interaction/linkGhost/ghost.ts","../../src/runtime/interaction/linkEndpoint/candidates.ts","../../src/runtime/interaction/linkEndpoint/sideSelection.ts","../../src/runtime/interaction/linkEndpoint/fixedEndpoint.ts","../../src/runtime/interaction/linkEndpoint/selection.ts","../../src/runtime/interaction/linkEndpoint/state.ts","../../src/runtime/interaction/linkEndpoint/geometry.ts","../../src/runtime/interaction/linkGhost/target.ts","../../src/runtime/interaction/linkEndpoint/target.ts","../../src/runtime/interaction/linkEndpoint/session.ts","../../src/runtime/interaction/linkEndpointDrag.ts","../../src/runtime/interaction/linkSegment/session.ts","../../src/runtime/interaction/linkSegmentDrag.ts","../../src/runtime/interaction/move/geometry.ts","../../src/runtime/interaction/move/pointer.ts","../../src/runtime/interaction/snapping/alignment.ts","../../src/runtime/interaction/snapping/candidates.ts","../../src/runtime/interaction/snapping/gaps.ts","../../src/runtime/interaction/snapping/isometricDiagonal.ts","../../src/runtime/interaction/snapping/resize.ts","../../src/runtime/interaction/snapping/types.ts","../../src/runtime/interaction/move/snapping.ts","../../src/runtime/interaction/move/completion.ts","../../src/runtime/interaction/move/preview.ts","../../src/runtime/interaction/geometryRoles.ts","../../src/runtime/interaction/move/canvasObjectCapture.ts","../../src/runtime/interaction/move/internalLinkCapture.ts","../../src/runtime/interaction/containerGeometry.ts","../../src/runtime/interaction/move/selection.ts","../../src/runtime/interaction/move/state.ts","../../src/runtime/interaction/move/session.ts","../../src/runtime/interaction/moveDrag.ts","../../src/runtime/interaction/nudgeSelection.ts","../../src/runtime/interaction/pathDraw/geometry.ts","../../src/runtime/interaction/pathDraw/preview.ts","../../src/runtime/interaction/pathDraw/state.ts","../../src/runtime/interaction/pathDraw/session.ts","../../src/runtime/interaction/pathDrawDrag.ts","../../src/runtime/interaction/pathReshape/preview.ts","../../src/runtime/interaction/pathReshape/target.ts","../../src/runtime/interaction/pathReshape/state.ts","../../src/runtime/interaction/pathReshape/session.ts","../../src/runtime/interaction/pathReshapeDrag.ts","../../src/runtime/interaction/pieLabelDrag/preview.ts","../../src/runtime/interaction/pieGeometry.ts","../../src/runtime/interaction/pieLabelDrag/target.ts","../../src/runtime/interaction/pieLabelDrag/session.ts","../../src/runtime/interaction/pieLabelDrag/binding.ts","../../src/runtime/interaction/propertyDrag/target.ts","../../src/runtime/interaction/propertyDrag/session.ts","../../src/runtime/interaction/propertyDrag/binding.ts","../../src/runtime/interaction/textEdit/activeEditor.ts","../../src/runtime/interaction/textEdit/textarea.ts","../../src/runtime/interaction/propertyEdit/target.ts","../../src/runtime/interaction/propertyEdit/session.ts","../../src/runtime/interaction/propertyEdit/binding.ts","../../src/runtime/interaction/quickDuplicate/completion.ts","../../src/runtime/interaction/quickDuplicate/pointer.ts","../../src/runtime/interaction/quickDuplicate/preview.ts","../../src/runtime/interaction/quickDuplicate/state.ts","../../src/runtime/interaction/quickDuplicate/target.ts","../../src/runtime/interaction/quickDuplicate/session.ts","../../src/runtime/interaction/quickDuplicate.ts","../../src/runtime/interaction/radarVertexDrag/preview.ts","../../src/runtime/interaction/radarVertexDrag/readout.ts","../../src/runtime/interaction/radarVertexDrag/target.ts","../../src/runtime/interaction/radarVertexDrag/session.ts","../../src/runtime/interaction/radarVertexDrag/binding.ts","../../src/runtime/interaction/resize/completion.ts","../../src/runtime/interaction/resize/textFit.ts","../../src/runtime/interaction/resize/geometry.ts","../../src/runtime/interaction/resize/pointer.ts","../../src/runtime/interaction/resize/rotation.ts","../../src/runtime/interaction/resize/geometryPreview.ts","../../src/runtime/interaction/resize/overlayPreview.ts","../../src/runtime/interaction/resize/textPreview.ts","../../src/runtime/interaction/resize/preview.ts","../../src/runtime/interaction/resize/snapping.ts","../../src/runtime/interaction/resize/bubbleCapture.ts","../../src/runtime/interaction/resize/selection.ts","../../src/runtime/interaction/resize/textCapture.ts","../../src/runtime/interaction/resize/state.ts","../../src/runtime/interaction/resize/session.ts","../../src/runtime/interaction/resizeDrag.ts","../../src/runtime/interaction/sankeyNode/rename.ts","../../src/runtime/interaction/sankeyNode/preview.ts","../../src/runtime/interaction/sankeyNode/target.ts","../../src/runtime/interaction/sankeyNode/session.ts","../../src/runtime/interaction/sankeyNode/binding.ts","../../src/runtime/interaction/textEdit/geometry.ts","../../src/runtime/interaction/textEdit/editorFactory.ts","../../src/runtime/interaction/textEdit/target.ts","../../src/runtime/interaction/textEdit/session.ts","../../src/runtime/interaction/textEdit/binding.ts","../../src/runtime/interaction/sflPatch/format.ts","../../src/runtime/interaction/sflPatch/blockInsert.ts","../../src/runtime/interaction/sflPatch/scan/sourceMask.ts","../../src/runtime/interaction/sflPatch/scan/blocks.ts","../../src/runtime/interaction/sflPatch/scan/path.ts","../../src/runtime/interaction/sflPatch/scan/properties.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/blockText.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/pathBlockText.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/insert.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/linkReferences.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/madeBlocks.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/removalRanges.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/remove.ts","../../src/runtime/interaction/sflPatch/changes/listElement.ts","../../src/runtime/interaction/sflPatch/changes/chartValueChange.ts","../../src/runtime/interaction/sflPatch/edits/propertyValues.ts","../../src/runtime/interaction/sflPatch/linkPatch/endpointText.ts","../../src/runtime/interaction/sflPatch/properties.ts","../../src/runtime/interaction/sflPatch/changes/linkReconnectChange.ts","../../src/runtime/interaction/sflPatch/changes/linkSegmentChange.ts","../../src/runtime/interaction/sflPatch/changes/pathPoints.ts","../../src/runtime/interaction/sflPatch/changes/moveChange.ts","../../src/runtime/interaction/sflPatch/changes/pathPointChange.ts","../../src/runtime/interaction/sflPatch/changes/propertyChange.ts","../../src/runtime/interaction/sflPatch/connectionPatch/blockText.ts","../../src/runtime/interaction/sflPatch/connectionPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/connectionPatch/insert.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/styleBlock.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/isometricDuplicate.ts","../../src/runtime/interaction/sflPatch/linkPatch/blockText.ts","../../src/runtime/interaction/sflPatch/linkPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/linkPatch/insert.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/shapeDuplicate.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicateChange.ts","../../src/runtime/interaction/sflPatch/changes/resizeChange.ts","../../src/runtime/interaction/sflPatch/changes/sankeyNodeChange.ts","../../src/runtime/interaction/sflPatch/changes/textChange.ts","../../src/runtime/interaction/sflPatch/linkPatch/remove.ts","../../src/runtime/interaction/index.ts"],"names":["el","element","linePathData","roundedBarPath","barShapePath","barLabelSize","pillPath","formatBarLabel","BAR_LABEL","SVG_NAMESPACE","findOwnerNode","isPrimary","isCameraGesture","resolveOwner","parseHexRgb","rgbToHex","hsvToRgb","rgbToHsv","ratio","screenRectOf","Emitter","pointAtPort","edgePointToward","roundedOrthogonalPathData","calculateLinkRoute","getLineMidpoint","isometricGeometryOf","isometricFaceCenter","labelGapDash","AXIS_COS","AXIS_SIN","isometricFaces","roundedPolygonPath","updateHalo","axisArrowPlacements","updateAxisArrowGroup","isometricTopFaceCenter","findAllOwnerNodes","ISO_HALO_ATTR","ISO_DUPLICATE_BUBBLES_ATTR","pointerUserPoint","CORNER_RADIUS_ATTR","delta","pxPerUnit","SIDES","relativeOffsetOnRectangleSide","segment","SCREEN_DRAG_THRESHOLD","AXES","GUIDE_OVERHANG","findIsometricApexCandidates","findSnapCandidateBounds","DERIVED_HEIGHT_ROLES","updateAlignmentGuides","clearAlignmentGuides","document","freeformPathData","GUIDE_COLOR","PATH_HALO_ATTR","PATH_POINT_INDEX_ATTR","pathGeometryOf","clipSegmentToRect","findLabelMark","isLabelPointer","LEADER_INSET","LABEL_WIDTH","MOVE_NOISE","seriesLabelOffsetXProp","seriesLabelOffsetYProp","radarVertexPoint","radarSeriesPath","GAP","HEIGHT","FONT_SIZE","PADDING_X","radarValueAtPoint","estimateTextWidth","wrapText","MIN_SIZE","pillCornerRadius","SYMBOL_POINTS_ATTR","SYMBOL_TENSION_ATTR","localShapePath","SQUARE_CORNER_ATTR","cornersRoundedRectPath","resizeHandlePositions","personLabelArea","updateQuickDuplicateBubbles","isTextLabel","symbolDeclaredBounds","tokenizeSource","sflToCanvasState","value","readSpan","isIsometricDirection","copyOf","isIsometricObject","escapeSflString"],"mappings":";;;;;;AAAO,SAAS,YAAA,CAAa,KAAoB,KAAA,EAA6B;AAC5E,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,EAAa;AACnC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,CAAA;AACzF;AAEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,EAAa;AACnC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,OAAA,EAAS,CAAA;AAC5F,EAAA,OAAO,UAAA,GAAa,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA;AACtC;;;ACnBO,SAAS,iBAAA,CAAkB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAA2C;AAChH,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAA;AAC5F,EAAA,OACE,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,IACtD,CAAAA,GAAAA,KAAMA,GAAAA,CAAG,OAAA,CAAQ,WAAA,EAAY,KAAM,MAAA,IAAU,CAACA,GAAAA,CAAG,EAAA,CAAG,QAAA,CAAS,kBAAkB;AAAA,GACjF,IAAK,IAAA;AAET;AAEO,SAAS,qBAAA,CAAsB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAA2C;AACpH,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAA;AAC5F,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAAA,QAAMA,GAAAA,CAAG,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAC,CAAA,IAAK,IAAA;AACnH;AAEO,SAAS,gBAAA,CAAiB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAAsC;AAC1G,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,uBAAA,CAAA;AAC5F,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAC1D,MAAA,CAAO,CAAAA,GAAAA,KAAMA,GAAAA,CAAG,OAAA,CAAQ,aAAY,KAAM,SAAS,CAAA,CACnD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,EAAE,YAAA,CAAa,qBAAqB,CAAC,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,YAAA,CAAa,qBAAqB,CAAC,CAAC,CAAA;AACjH;;;ACjBO,SAAS,gBAAgBC,QAAAA,EAA4C;AAC1E,EAAA,MAAM,GAAA,GAAMA,QAAAA,EAAS,YAAA,CAAa,qBAAqB,CAAA;AACvD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,CAAC,OAAO,UAAA,EAAY,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA,CAAM,IAAI,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,KAAA,KAAS,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA,IAAc,CAAA,IAAK,GAAA,KAAQ,GAAA,EAAK;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,CAAC,CAAA,KAAM,YAAA,GAChB,EAAE,YAAY,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,KAAI,GAChD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAK,GAAA,EAAI;AACpC;AAEO,SAAS,YAAA,CAAa,UAAkB,KAAA,EAA2B;AACxE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,GAAA,CAClB,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,UAAA,GAAA,CAChC,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,YAAY,KAAA,CAAM,UAAA;AACxD,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,GAAM,QAAA,IAAY,KAAA,CAAM,MAAM,KAAA,CAAM,GAAA,CAAA;AACxD,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA;AACvD;AAEO,SAAS,aAAA,CAAc,OAAe,KAAA,EAA2B;AACtE,EAAA,MAAM,YAAY,KAAA,GAAQ,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,MAAM,KAAA,CAAM,GAAA,CAAA;AAC1D,EAAA,OAAO,KAAA,CAAM,UAAA,GACT,KAAA,CAAM,KAAA,GAAQ,QAAA,GAAW,KAAA,CAAM,UAAA,GAC/B,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,QAAA,GAAW,KAAA,CAAM,UAAA;AACxD;;;AC1BA,SAAS,mBAAA,CAAoB,KAAoB,IAAA,EAAiC;AAChF,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,IAC7E,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,IAAI,CAAC;AAAA,GACpC,CAAE,CAAA;AACF,EAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,KAAK,KAAA,CAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AAC9D,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,aAAa,GAAA,EAAKC,8BAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAO,qBAAA,CAAsB,GAAA,EAAK,KAAK,KAAA,CAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AAClE,EAAA,IAAI,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,IAAI,CAAA,EAAGA,8BAAA,CAAa,QAAQ,IAAA,CAAK,WAAW,CAAC,CAAA,GAAA,EAAM,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,GAAA,EAAM,MAAM,CAAC,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,EAAA,CAAA;AACxG,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC1B;AACF;AAEA,SAAS,UAAA,CAAW,GAAA,EAAoB,IAAA,EAA2B,CAAA,EAAiB;AAClF,EAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,CAAQ,YAAA,EAAc,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AACtG,IAAA,IAAA,EAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC3B;AACF;AAEO,SAAS,uBAAA,CAAwB,GAAA,EAAoB,IAAA,EAA2B,KAAA,EAAqB;AAC1G,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,OAAO,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA;AACtE,IAAA,UAAA,CAAW,GAAA,EAAK,IAAA,EAAMC,gCAAA,CAAe,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AACnG,IAAA;AAAA,EACF;AACA,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAK,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AACnD,IAAA,UAAA,CAAW,GAAA,EAAK,IAAA,EAAMC,8BAAA,CAAa,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AACzF,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AACzC,EAAA,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAC/B;AAgBA,SAAS,YAAA,CAAa,KAAoB,IAAA,EAAoD;AAC5F,EAAA,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,CAAQ,cAAc,kBAAkB,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAA8B,CAAA,KAAA,EAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA,GAAA,CAAK,IAAA,EAAM,YAAA,CAAa,cAAc,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA;AACxF,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,aAAA,CAA8B,QAAQ,EAAE,CAAA,OAAA,CAAS,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS;AACnG;AAEA,SAAS,UAAA,CAAW,SAAA,EAAmB,MAAA,EAAmB,GAAA,EAAa,MAAA,EAAwB;AAC7F,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA,KAAc,QAAA,GAAW,GAAA,GAAM,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA,GAAK,GAAA,GAAM,MAAA,CAAO,GAAA;AACrG;AAEA,SAAS,UAAA,CAAW,IAAA,EAAsB,IAAA,EAAsB,KAAA,EAAe,EAAA,EAAkB;AAC/F,EAAA,MAAM,WAAW,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,WAAW,KAAK,IAAI,CAAA;AAClE,EAAA,MAAM,IAAA,GAAOC,8BAAA,CAAa,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAA,CAAY,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA;AACpF,EAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,MAAA;AACvB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAC7C,EAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAKC,0BAAA,CAAS,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAClG,EAAA,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AACrD;AAEA,SAAS,wBAAA,CACP,KAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,OAAA,GAAUC,gCAAA,CAAe,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AACpD,EAAA,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,IAAK,KAAA,CAAM,MAAM,WAAA,GAAc,OAAA;AAChE,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAQ;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,KAAK,YAAA,CAAa,WAAW,KAAK,IAAI,CAAA;AACxE,EAAA,MAAM,OAAOF,8BAAA,CAAa,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,OAAO,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,GAAO,KAAA;AAC1B,EAAA,MAAM,MAAA,GACJ,MAAM,SAAA,KAAc,SAAA,GAChB,MAAMG,2BAAA,CAAU,GAAA,GAAM,KAAK,KAAA,GAAQ,CAAA,GACnC,MAAM,SAAA,KAAc,QAAA,GAClB,MAAMA,2BAAA,CAAU,GAAA,GAAM,KAAK,KAAA,GAAQ,CAAA,GACnC,MAAA,CAAO,IAAA,GAAO,KAAA,GAAQ,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,GAAA;AAC9E,EAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,QAAA,GAAW,MAAA;AAC9B,EAAA,KAAA,CAAM,IAAA,CAAK,aAAa,WAAA,EAAa,CAAA,UAAA,EAAa,SAAS,MAAA,CAAO,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA;AAC9E,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AAC/F,IAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAA,GAAU,KAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,WAAW,CAAA;AACtC,IAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAKF,0BAAA,CAAS,SAAS,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACxG;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAA,CACd,GAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,GAAI,IAAA;AACrD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY;AACzB,IAAA,OAAO,wBAAA,CAAyB,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAK,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA;AACtC,EAAA,MAAM,KAAK,UAAA,CAAW,KAAA,CAAM,SAAA,EAAW,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAUC,gCAAA,CAAe,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAEpD,EAAA,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,IAAK,KAAA,CAAM,MAAM,WAAA,GAAc,OAAA;AAChE,EAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AACzD,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,SAAS,EAAE,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAA;AACT;;;ACjJA,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,GAAA,GAAM,CAAA;AACZ,IAAM,UAAA,GAAa,uBAAA;AAEnB,SAAS,OAAA,CAA8C,KAAoB,GAAA,EAAiC;AAC1G,EAAA,OAAO,GAAA,CAAI,aAAA,CAAc,eAAA,CAAgBE,+BAAA,EAAe,GAAG,CAAA;AAC7D;AAEO,SAAS,mBAAmB,GAAA,EAAiC;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC9B,EAAA,KAAA,CAAM,YAAA,CAAa,yBAAyB,EAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,UAAA,CAAW,YAAA,CAAa,MAAM,GAAG,CAAA;AACjC,EAAA,UAAA,CAAW,YAAA,CAAa,QAAQ,UAAU,CAAA;AAC1C,EAAA,KAAA,CAAM,YAAY,UAAU,CAAA;AAE5B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACjC,EAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,SAAS,CAAA;AACpC,EAAA,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AACjD,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,8BAA8B,CAAA;AAChE,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,KAAK,CAAA;AACvC,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,KAAA,CAAM,YAAA,CAAa,qBAAqB,SAAS,CAAA;AACjD,EAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAEvB,EAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACrB,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,IAAA,EAAmC;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,GAAY,CAAA;AACxC;AAEO,SAAS,YAAY,IAAA,EAAmC;AAC7D,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACpC;AAQO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,IAAI,EAAE,CAAA;AAC3C;AAEA,SAAS,aAAa,KAAA,EAA2B;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,kBAAA,CAAmB,SAAS,EAAE,MAAA,GAAS,CAAA;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAK,QAAQ,SAAA,GAAa,GAAA,GAAM,YAAY,CAAC,CAAA;AAC/D;AAEO,SAAS,kBAAA,CAAmB,OAAA,EAAsB,MAAA,EAAuB,KAAA,EAAqB;AACnG,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY;AACxB,IAAA;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAEvC,EAAA,IAAI,MAAA,CAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,UAAA;AAClD,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,GAAM,KAAA,IAAS,UAAU,KAAA,GAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,KAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,CAAA;AAClC,IAAA,UAAA,CAAW,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACzC,IAAA,UAAA,CAAW,aAAa,GAAA,EAAK,MAAA,CAAO,OAAA,GAAU,MAAA,GAAS,CAAC,CAAC,CAAA;AACzD,IAAA,UAAA,CAAW,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9C,IAAA,UAAA,CAAW,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,aAAa,GAAA,EAAK,MAAA,CAAO,IAAA,GAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,MAAA,IAAU,OAAO,KAAA,CAAM,KAAA;AACnD,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAS,KAAA,GAAQ,GAAA;AACnD,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,EAAA,UAAA,CAAW,aAAa,GAAA,EAAK,MAAA,CAAO,OAAA,GAAU,KAAA,GAAQ,CAAC,CAAC,CAAA;AACxD,EAAA,UAAA,CAAW,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AACxC,EAAA,UAAA,CAAW,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9C,EAAA,UAAA,CAAW,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAChD,EAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACtC,EAAA,IAAA,CAAK,aAAa,GAAA,EAAK,MAAA,CAAO,GAAA,GAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACjD;AAEO,SAAS,mBAAmB,OAAA,EAAmC;AACpE,EAAA,OAAA,EAAS,MAAA,EAAO;AAClB;;;AC7FA,SAAS,aAAA,CAAc,KAAoB,MAAA,EAAqD;AAC9F,EAAA,MAAM,WACJ,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA,mBAAA,EACvB,GAAA,CAAI,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA,wBAAA,EACpB,OAAO,KAAK,CAAA,EAAA,CAAA;AACvC,EAAA,OACE,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAAR,QAAAA,KAAW;AACtE,IAAA,MAAM,GAAA,GAAMA,QAAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AACxC,IAAA,OAAO,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,MAAA;AAAA,EACxD,CAAC,CAAA,IAAK,IAAA;AAEV;AAEO,SAAS,qBAAA,CAAsB,KAAoB,KAAA,EAAiD;AACzG,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AACrC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,qBAAqB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,gBAAgBS,+BAAA,CAAc,GAAA,EAAK,OAAO,KAAA,CAAM,EAAA,EAAIC,2BAAS,CAAC,CAAA;AAC5E,EAAA,MAAM,WAAW,KAAA,GAAQ,yBAAA,CAA0B,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AACzE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,SAAS,CAAA;AACxC,EAAA,OAAO,yBAAA,CAA0B,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,SAAS,CAAA;AAC3E;AAEA,SAAS,yBAAA,CACP,MAAA,EACA,KAAA,EACA,QAAA,EACA,SAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG,QAAA;AAAA,IACH,SAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,oBAAoB,KAAA,EAA8B;AACzD,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAACC,kCAAgB,KAAK,CAAA;AACrD;AAEA,SAAS,mBAAmB,KAAA,EAAgD;AAC1E,EAAA,OAAQ,KAAA,CAAM,MAAA,EAA2B,OAAA,GAAU,uBAAuB,CAAA;AAC5E;AAEA,SAAS,qBAAqB,IAAA,EAAmD;AAC/E,EAAA,MAAM,KAAA,GAAQC,+BAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,EAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,qBAAqB,CAAC,CAAA;AAC7D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;AAEA,SAAS,yBAAA,CACP,GAAA,EACA,MAAA,EACA,KAAA,EAC2B;AAC3B,EAAA,MAAMZ,QAAAA,GAAU,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACzC,EAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQA,QAAAA,CAAQ,YAAA,CAAa,cAAc,CAAA,KAAM,KAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQA,QAAAA,CAAQ,OAAA,EAAQ,GAAI,IAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA;AAChE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA,EAAG;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,GAAO,iBAAA,CAAkB,KAAK,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,MAAA,CAAO,MAAM,CAAA;AACjF,EAAA,OAAO;AAAA,IACL,OAAA,EAAAA,QAAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,MAAM,CAAA,IAAK,CAAA;AAAA,IACjB,QAAA,EAAU,MAAM,KAAA,IAAS,CAAA;AAAA,IACzB,MAAA,EAAQ,MAAM,CAAA,IAAK,CAAA;AAAA,IACnB,SAAA,EAAW,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3B,SAAA,EAAW,QAAQ,MAAA,CAAOA,QAAAA,CAAQ,aAAa,oBAAoB,CAAC,KAAK,CAAA,GAAI,CAAA;AAAA,IAC7E,aAAa,MAAA,CAAO,IAAA,EAAM,YAAA,CAAa,sBAAsB,CAAC,CAAA,IAAK;AAAA,GACrE;AACF;;;AC1GO,IAAM,wBAAN,MAA4B;AAAA,EACxB,IAAA;AAAA,EACA,QAAA;AAAA,EACT,KAAA,GAAoC,IAAA;AAAA,EACpC,QAAA,GAA+B,IAAA;AAAA,EAC/B,OAAA,GAA4B,IAAA;AAAA,EAE5B,WAAA,CAAY,KAAoB,OAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,YAAY,IAAA,EAAiC;AAC3C,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,mBAAA,EAAqB;AAAA,QACtC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,EAA8B;AAClC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ;AACvC,MAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,IACjF;AACA,IAAA,OAAO,KAAK,KAAA,KAAU,IAAA;AAAA,EACxB;AAAA,EAEA,KAAK,KAAA,EAA2B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,MAAM,SAAA,KAAc,IAAA,CAAK,MAAM,SAAA,EAAW;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA,EAAG,IAAA,CAAK,MAAM,KAAK,CAAA;AACjH,IAAA,uBAAA,CAAwB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAEpD,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,mBAAA,EAAqB;AAAA,MACtC,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MAClB,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,MACnB,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MAClB;AAAA,KACD,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,KAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA,EAAG;AAC9E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,kBAAA;AAAA,MACE,IAAA,CAAK,QAAA;AAAA,MACL,EAAE,OAAA,EAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,EAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,MAC9F;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEA,OAAO,KAAA,EAA2B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,MAAM,SAAA,KAAc,IAAA,CAAK,MAAM,SAAA,EAAW;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAC,KAAA,CAAM,MAAA,EAAoB,qBAAA,GAAwB,IAAA,CAAK,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,kBAAA,EAAoB;AAAA,MACrC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,KAAA,EAAO,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG,IAAA,CAAK,KAAK;AAAA,KAC/F,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;AC9FO,SAAS,kBAAA,CAAmB,QAAgB,OAAA,EAAwC;AACzF,EAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,CAAsB,MAAA,CAAO,KAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,IACxB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACpB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAwB;AAC3C,IAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EACtB,CAAA;AACA,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,aAAA,EAAe,aAAa,CAAA;AACxD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,aAAA,EAAe,aAAa,CAAA;AACxD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,WAAW,CAAA;AACpD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,eAAA,EAAiB,WAAW,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,OAAA,GAAU;AACR,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAC3D,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAC3D,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa,WAAW,CAAA;AACvD,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,eAAA,EAAiB,WAAW,CAAA;AAAA,IAC7D;AAAA,GACF;AACF;;;ACfO,SAAS,aAAa,KAAA,EAA8B;AACzD,EAAA,MAAM,QAAA,GAAWa,8BAAY,KAAK,CAAA;AAClC,EAAA,OAAO,QAAA,IAAYC,0BAAA,CAAS,GAAG,QAAQ,CAAA;AACzC;AAEA,IAAM,cAAA,GACJ,iGAAA;AACF,IAAM,cAAA,GAAiB,gCAAA;AAOhB,SAAS,gBAAgB,KAAA,EAAkC;AAChE,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,EAAK;AACvB,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAClC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAC,CAAA,KAAM,SAAY,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,IAAI,GAAA,GAAM,CAAA,CAAA;AACvE,IAAA,OAAO;AAAA,MACL,GAAA,EAAKA,UAAS,EAAE,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,MACtE,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC;AAAA,KACvC;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AACrC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,EAAO,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,IAAI,GAAA,EAAI;AAAA,EACzF;AACA,EAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,EAAA,OAAO,GAAA,GAAM,EAAE,GAAA,EAAK,KAAA,EAAO,GAAE,GAAI,IAAA;AACnC;AAEO,SAAS,gBAAA,CAAiB,KAAa,KAAA,EAAuB;AACnE,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9C,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,SAAS,GAAG,CAAA;AAChC,EAAA,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAClE;AAEO,SAAS,MAAM,KAAA,EAAuB;AAC3C,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,GAAA,IAAO,SAAA;AACxC;AAEO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,KAAA,IAAS,CAAA;AAC1C;AAMO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACrD;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAID,6BAAA,CAAY,GAAG,CAAA,IAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,SAASC,UAAS,GAAA,EAAkB;AACzC,EAAA,OAAOA,0BAAA,CAAS,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/E;AAGO,SAASC,UAAS,GAAA,EAAe;AACtC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAIA,0BAAA;AAAA,IAAA,CAChB,GAAA,CAAI,CAAA,GAAI,GAAA,GAAO,GAAA,IAAO,GAAA;AAAA,IACxB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IAC9B,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC;AAAA,GAChC;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,SAASC,UAAS,GAAA,EAAe;AACtC,EAAA,OAAOA,0BAAA,CAAc,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AACpF;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,OAAOA,SAAAA,CAAS,QAAA,CAAS,GAAG,CAAC,CAAA;AAC/B;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,OAAOF,SAAAA,CAASC,SAAAA,CAAS,GAAG,CAAC,CAAA;AAC/B;;;AC7FO,IAAM,sBAAA,GAAyB,EAAA;AAEtC,IAAM,QAAA,GAAW,4CAAA;AACjB,IAAM,IAAA,GAAO,+DAAA;AAEb,SAAS,KAAK,KAAA,EAAuB;AACnC,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChC;AAEO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AACzC;AAEO,SAAS,UAAU,KAAA,EAA0D;AAClF,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAC1D;AAEO,SAAS,cAAc,MAAA,EAAsC;AAClE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,MAAM,QAAQ,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAC/B,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,QAAQ,GAAG,CAAA;AAAA,IACrG;AAAA,EACF;AACA,EAAA,OAAO,MAAM,MAAA,IAAU,CAAA,GAAI,EAAE,KAAA,EAAO,OAAM,GAAI,IAAA;AAChD;AAEO,SAAS,eAAe,KAAA,EAA8B;AAC3D,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,KAAK,EAChC,GAAA,CAAI,CAAA,IAAA,KAAQ,GAAG,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,aAAA,CAAc,KAAK,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAClE,KAAK,IAAI,CAAA;AACZ,EAAA,OAAO,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AAChD;AAEO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAChC,GAAA,CAAI,UAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,cAAc,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAC5D,KAAK,IAAI,CAAA;AACZ,EAAA,OAAO,mBAAmB,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,CAAC,QAAQ,KAAK,CAAA,CAAA,CAAA;AAC/D;;;AC1DA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,MAAM,cAAc,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,MAAA,CAAO,WAAW,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,IAAK,EAAE,CAAC,CAAA;AACxG,EAAA,IAAI,CAAC,WAAA,CAAY,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,sBAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,WAAA;AACzB,EAAA,MAAM,KAAA,GAAS,KAAK,KAAA,CAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK,EAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChC;AAEO,SAAS,iBAAA,CAAkB,KAAoB,IAAA,EAA2C;AAC/F,EAAA,MAAM,EAAA,GAAK,IAAA,EAAM,KAAA,CAAM,mBAAmB,IAAI,CAAC,CAAA;AAC/C,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,CAAA,KAAA,EAAQ,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACxD,EAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,WAAA,EAAY,KAAM,gBAAA,EAAkB;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC/C,IAAA,MAAM,SAAS,eAAA,CAAgB,IAAA,CAAK,YAAA,CAAa,YAAY,KAAK,EAAE,CAAA;AACpE,IAAA,MAAM,SAAS,MAAA,CAAO,UAAA,CAAW,KAAK,YAAA,CAAa,QAAQ,KAAK,EAAE,CAAA;AAClE,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,MAAM,GAAG,CAAA;AAAA,IACnG;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,GAAG,GAAG,KAAA,EAAM;AACxC;;;ACzBO,IAAM,cAAA,GAAiB,SAAA;AAMvB,SAAS,QAAA,CAAS,MAAqB,QAAA,EAA6C;AACzF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,QAAA,CAAS,OAAO,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAE;AAAA,EACrF;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACjF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,GAAI,IAAA;AAC7C,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,cAAA,EAAgB,KAAA,EAAO,KAAA,EAAO,KAAA,IAAS,CAAA,EAAE;AACxF;AAEO,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA,GAClB,iBAAiB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,IAAS,CAAC,CAAA,GAC9C,cAAA,CAAe,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC/D;AAEO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,EAAA,OAAO,QAAA,GAAW,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA;AAC5C;AAEO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAW,KAAA,CAAM,SAAS,CAAA,GAAK,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,SAAS,cAAc,CAAA;AACjH;AAEO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,SAAS,cAAc,CAAA;AACxG;AAEO,SAAS,OAAO,GAAA,EAAqB;AAC1C,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,OAAO,QAAA,CAAS,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA;AAC1D;AAEO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO,EAAE,OAAO,KAAA,CAAM,KAAA,EAAO,OAAO,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EAC7D;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,EAAE,KAAA,EAAO,gBAAA,CAAiB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,IAAS,CAAC,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAAA,MACtE,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,CAAC,CAAA,EAAG,QAAA,EAAU,GAAA;AAAI;AAClF,GACF;AACF;;;AC1DA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAmBX,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,IAAS,KAAA,CAAM,KAAA;AACtG;AAEO,SAAS,UAAU,MAAA,EAAwB;AAChD,EAAA,OAAO,KAAA,CAAM,WAAA,CAAY,MAAM,CAAC,CAAA;AAClC;AAEO,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AACzF;AAEA,SAAS,mBAAA,CAAoB,MAAA,EAAgB,GAAA,EAAa,KAAA,EAAqB;AAC7E,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AACd,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB,WAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC/C,IAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,GAAI;AAAA,MACrC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAM,QAAQ,CAAA;AAAA,MACtC,KAAA,EAAO,gBAAA,CAAiB,GAAA,EAAK,KAAK;AAAA,KACpC;AAAA,EACF;AACF;AAEO,SAAS,cAAA,CAAe,QAAgB,GAAA,EAAmB;AAChE,EAAA,mBAAA,CAAoB,MAAA,EAAQ,GAAA,EAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACtD;AAEA,SAAS,aAAa,MAAA,EAA6B;AACjD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA,GAClB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,OAAM,GACxD,EAAE,MAAM,UAAA,EAAY,GAAG,MAAM,QAAA,EAAS;AAC5C;AAEO,SAAS,OAAO,MAAA,EAAsB;AAC3C,EAAA,MAAA,CAAO,QAAA,CAAS,iBAAA,CAAkB,YAAA,CAAa,MAAM,CAAC,CAAC,CAAA;AACzD;AAEO,SAAS,QAAA,CAAS,QAAgB,IAAA,EAAiB;AACxD,EAAA,MAAA,CAAO,MAAM,GAAA,GAAM,IAAA;AACnB,EAAA,cAAA,CAAe,MAAA,EAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AACrC,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,QAAA,CAAS,QAAgB,GAAA,EAAmB;AAC1D,EAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,EAAA,cAAA,CAAe,QAAQ,GAAG,CAAA;AAC1B,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,GAAA,EAAmB;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA;AAAA,EACF;AACA,EAAA,mBAAA,CAAoB,MAAA,EAAQ,SAAA,CAAU,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,IAAI,GAAG,CAAA;AACtF,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,GAAA,EAAmB;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA;AAAA,EACF;AACA,EAAA,MAAA,CAAO,MAAM,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,MAAM,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA,EAAE;AAC7F,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,KAAA,EAAqB;AAC9D,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,KAAU,KAAA,CAAM,QAAA,IAAY,CAAC,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AACzF,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,EAAA,KAAA,CAAM,GAAA,GAAM,SAAS,KAAA,CAAM,KAAA,CAAM,SAAS,KAAA,CAAM,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7D,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,KAAA,EAAqB;AAC9D,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,UAAU,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,OAAO,CAAC,KAAA,EAAO,EAAA,KAAO,EAAA,KAAO,KAAK,CAAA,EAAE;AACtG,EAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,UAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzE,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,WAAW,MAAA,EAAsB;AAC/C,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACtE,UAAU,aAAA,CAAA,CAAe,IAAA,CAAK,YAAY,QAAA,EAAU,QAAA,IAAY,MAAM,CAAC;AAAA,GACzE;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,UAAU,KAAA,EAAO,SAAA,CAAU,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA,EAAE;AAC5F,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtD,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,OAAA,CAAQ,QAAgB,IAAA,EAAiC;AACvE,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,KAAA,CAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,gBAAgB,MAAA,EAAsB;AACpD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAE;AAC7E,EAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,UAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzE,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;;;AClKO,SAAS,EAAA,CACd,GAAA,EACA,SAAA,EACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,MAAA,EAAQ,YAAY,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SAAA,CAAU,OAAe,MAAA,EAAwC;AAC/E,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA;AAC/C,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,KAAK,CAAA;AACjC,EAAA,MAAA,CAAO,WAAA,GAAc,KAAA;AACrB,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAA,CAAY,MAAA,EAAqB,GAAA,EAAa,GAAA,EAA+B;AAC3F,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,EAAS,cAAA,EAAgB,MAAM,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,UAAA,CAAW,MAAA,EAAqB,IAAA,EAAc,GAAA,EAAa,GAAA,EAAyB;AAClG,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,aAAA,EAAe,MAAM,CAAA;AAC3C,EAAA,EAAA,CAAG,MAAA,EAAQ,oBAAoB,GAAG,CAAA;AAClC,EAAA,EAAA,CAAG,MAAA,EAAQ,qBAAqB,GAAG,CAAA;AACnC,EAAA,EAAA,CAAG,MAAA,EAAQ,mBAAA,EAAqB,GAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,EAAS,mBAAA,EAAqB,GAAG,CAAA;AAClD,EAAA,KAAA,CAAM,IAAA,GAAO,OAAA;AACb,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,SAAA,CAAU,IAAI,oBAAoB,CAAA;AACzC,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAC9B;AAEO,SAAS,UAAU,KAAA,EAA+B;AACvD,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACjD,EAAA,MAAME,MAAAA,GAAQ,IAAA,GAAO,CAAA,GAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,IAAK,IAAA,GAAO,CAAA;AAC5E,EAAA,KAAA,CAAM,aAAA,EAAe,KAAA,CAAM,WAAA,CAAY,YAAA,EAAc,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,MAAK,CAAC,CAAC,CAAC,CAAA;AAC9F;AAEO,SAAS,WAAA,CAAY,QAAqB,IAAA,EAA8B;AAC7E,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,WAAA,EAAa,MAAM,CAAA;AACzC,EAAA,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AAC7C,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,KAAA,CAAM,OAAe,IAAA,EAAsB;AACzD,EAAA,OAAO,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,IAAI,CAAC,CAAA,GAAI,CAAA;AAC7D;AAEO,SAAS,SAAA,CAAU,IAAA,EAAmB,MAAA,EAAqC,KAAA,EAA+B;AAC/G,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB,MAAA,CAAO,KAAK,CAAA;AAChD,EAAA,MAAM,KAAK,MAAM;AACf,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAC1C,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB;AAClC,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAA,CAAO,KAAK,CAAA;AACZ,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC3C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACzC,CAAA;AACA,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACvC,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC1C,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAAA,EAC5C,CAAA;AACF;;;AC/EO,IAAM,QAAA,GAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAItC,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,eAAA,GAAkB,CAAA;AAoExB,SAAS,gBAAgB,MAAA,EAAwC;AAC/D,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,MAAM,CAAA;AACtD,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,KAAA,GAAQ,8BAAA;AACf,EAAA,MAAA,CAAO,YAAA,CAAa,cAAc,8BAA8B,CAAA;AAChE,EAAA,MAAA,CAAO,SAAA,GACL,wUAAA;AACF,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAAkC;AAC5D,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAC7C,EAAA,EAAA,CAAG,KAAA,EAAO,sBAAsB,MAAM,CAAA;AACtC,EAAA,EAAA,CAAG,KAAA,EAAO,sBAAsB,MAAM,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,KAAA,EAAO,qBAAA,EAAuB,MAAM,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,iBAAA,EAAmB,GAAG,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,MAAM,gBAAgB,EAAC;AACvB,EAAA,MAAM,iBAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,EAAM,QAAQ,WAAA,EAAY,EAAG,GAAG,GAAG,CAAA;AAC5D,IAAA,aAAA,CAAc,OAAO,IAAI,KAAA,CAAM,KAAA;AAC/B,IAAA,cAAA,CAAe,OAAO,IAAI,KAAA,CAAM,MAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,GAAG,GAAG,CAAA;AAC1C,EAAA,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,oBAAoB,CAAA;AAC5C,EAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,UAAA,EAAY,MAAA,EAAQ,aAAY,GAAI,KAAA;AAClE,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,EAAS,YAAA,EAAc,MAAM,CAAA;AACjD,EAAA,QAAA,CAAS,IAAA,GAAO,MAAA;AAChB,EAAA,QAAA,CAAS,UAAA,GAAa,KAAA;AACtB,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,MAAA;AACtE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,qBAAA,CAAsB,MAAmB,SAAA,EAAsC;AACtF,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,KAAA,EAAO,eAAA,EAAiB,IAAI,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,OAAA,EAAS,GAAG,GAAG,CAAA;AACjD,EAAA,KAAA,CAAM,IAAI,MAAA,GAAS,SAAA;AACnB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,aAAY,GAAI,KAAA;AACnD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,oBAAA,EAAsB,OAAO,CAAA;AACpD,EAAA,EAAA,CAAG,MAAA,EAAQ,eAAA,EAAiB,IAAI,CAAA,CAAE,WAAA,GAAc,OAAA;AAChD,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,QAAA,EAAU,gBAAA,EAAkB,IAAI,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,EAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AACtB,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA;AAChB,EAAA,OAAA,CAAQ,MAAA,GAAS,SAAA;AACjB,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,aAAA,EAAe,OAAO,CAAA;AACjD,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,WAAA,EAAa,SAAS,QAAA,EAAS;AACxE;AAEO,SAAS,gBAAgB,OAAA,EAAkC;AAChE,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAU,GAAI,OAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAC9B,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,MAAA;AACxC,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,CAAA;AAChC,EAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,GAAA,GAAM,MAAA,CAAO,SAAS,gBAAgB,CAAA,EAAA,CAAA;AAEjE,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,SAAS,CAAA;AACnC,EAAA,IAAA,CAAK,SAAS,CAAC,aAAA;AACf,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAI,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA;AAEtD,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,WAAA,GAAc,EAAA,CAAG,QAAA,EAAU,aAAA,EAAe,IAAI,CAAA;AAC9C,IAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,IAAA,WAAA,CAAY,WAAA,GAAc,kBAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,GAAG,KAAA,EAAO,GAAG,QAAA,EAAU,QAAA,EAAU,EAAC,EAAG,WAAA,EAAY;AACzF;AAEO,SAAS,iBAAA,CAAkB,MAAmB,MAAA,EAAsB;AACzE,EAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,eAAA;AAClD,EAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,gBAAA;AACzC,IAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,CAAI,eAAA,EAAiB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,eAAA;AACjD,EAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACvB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,EACzD;AACF;;;ACvKA,SAAS,UAAU,MAAA,EAAmC;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAA,CAAO,IAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,MACE,MAAA;AAAA,MACA,CAAA,KAAA,KAAS;AACP,QAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,QAAA,QAAA,CAAS,MAAA,EAAQ;AAAA,UACf,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA;AAAA,UACpB,GAAG,KAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,UAC9C,CAAA,EAAG,IAAI,KAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,GAAA,EAAK,KAAK,MAAM;AAAA,SACnD,CAAA;AAAA,MACH,CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA;AAAA,MACE,GAAA;AAAA,MACA,CAAA,KAAA,KAAS;AACP,QAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,QAAA,QAAA,CAAS,QAAQ,EAAE,GAAG,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,KAAK,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,GAAI,KAAK,CAAA;AAAA,MACjG,CAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEA,SAAS,WAAA,CAAY,QAAgB,OAAA,EAAwB;AAC3D,EAAA,MAAM,EAAE,aAAA,EAAe,cAAA,EAAe,GAAI,MAAA,CAAO,IAAA;AACjD,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA,EAAG,CAAC,OAAO,GAAG,KAAA,EAAM;AAChE,IAAA,MAAM,OAAA,GAAUD,UAAS,IAAI,CAAA;AAC7B,IAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,EAAE,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,GAAE,GAAI,OAAA;AAC7E,IAAA,cAAA,CAAe,MAAA,EAAQF,SAAAA,CAAS,IAAI,CAAC,CAAA;AACrC,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,aAAA,CAAc,OAAO,EAAE,gBAAA,CAAiB,OAAA,EAAS,WAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAClF,EAAA,aAAA,CAAc,OAAO,CAAA,CAAE,gBAAA,CAAiB,UAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACtE,EAAA,cAAA,CAAe,OAAO,EAAE,gBAAA,CAAiB,OAAA,EAAS,WAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AACnF,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,gBAAA,CAAiB,UAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACzE;AAEA,SAAS,UAAU,MAAA,EAAsB;AACvC,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,MAAA,CAAO,IAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC1D,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC9E,EAAA,WAAA,CAAY,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D;AAEA,SAAS,QAAQ,MAAA,EAAsB;AACrC,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAA,CAAO,IAAA;AAC5B,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,MAAM;AACxC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,MAAA,MAAA,CAAO,MAAM,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,MAAA,EAAQ,MAAM,MAAA,CAAO,QAAQ,CAAA;AACzD;AAEA,SAAS,UAAU,MAAA,EAAsB;AACvC,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,MAAA,CAAO,IAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC1D,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC9E,EAAA,WAAA,CAAY,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D;AAEA,SAAS,eAAe,MAAA,EAAsB;AAC5C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAA,CAAO,IAAA;AAC9B,EAAA,UAAA,EAAY,gBAAA,CAAiB,SAAS,YAAY;AAChD,IAAA,MAAM,UAAW,MAAA,CACd,UAAA;AACH,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,cAAc,MAAM,IAAI,SAAQ,CAAE,IAAA,IAAQ,OAAO,CAAA;AAC7D,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,QAAA,MAAA,CAAO,MAAM,CAAA;AAAA,MACf;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,MAAM,SAAA,GAAY,UAAU,MAAM,CAAA;AAClC,EAAA,IAAA,CAAK,SAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AACtE,EAAA,IAAA,CAAK,YAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC5E,EAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AAC/D,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,WAAA,CAAY,QAAQ,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,SAAA,CAAU,MAAM,CAAA;AAChB,EAAA,OAAA,CAAQ,MAAM,CAAA;AACd,EAAA,cAAA,CAAe,MAAM,CAAA;AACrB,EAAA,SAAA,CAAU,MAAM,CAAA;AAChB,EAAA,OAAO,SAAA;AACT;;;ACtHA,SAAS,aAAA,CAAc,QAAgB,KAAA,EAAwB;AAC7D,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM,GAAI,MAAA;AACnC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,KAAK,QAAQ,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,EAAQ,mBAAA,EAAqB,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,EAAQ,gBAAA,EAAkB,IAAI,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,EAAS,gBAAA,EAAkB,IAAI,CAAA;AACnD,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,GAAA,GAAM,GAAA;AACf,EAAA,QAAA,CAAS,GAAA,GAAM,KAAA;AACf,EAAA,QAAA,CAAS,QAAA,GAAW,SAAA;AACpB,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,mBAAA,EAAqB,IAAI,CAAA;AACrD,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,WAAA,GAAc,MAAA;AACrB,EAAA,MAAA,CAAO,KAAA,GAAQ,aAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAEhB,EAAA,IAAA,CAAK,iBAAiB,WAAA,EAAa,MAAM,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AAClE,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,KAAK,CAAA,EAAE;AAC/F,IAAA,aAAA,CAAc,MAAM,CAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,MAAM,eAAA,CAAgB,MAAM,CAAC,CAAA;AACjE,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS;AACxC,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,EAC1B,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,UAAU,MAAA,EAAO;AAC/C;AAEA,SAAS,YAAY,MAAA,EAAsB;AACzC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACxB,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,EAAQ;AAChD,IAAA,IAAA,CAAK,GAAA,EAAI,EAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,EAAQ;AAChD,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAM,KAAA,KAAU;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,KAAK,CAAA;AACtB,IAAA,GAAA,CAAI,KAAK,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvE,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAChC,IAAA,GAAA,CAAI,IAAI,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,EAAG,KAAA,CAAM,KAAK,KAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AACvG,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,GAAA,CAAI,QAAA,EAAU;AAC3C,MAAA,GAAA,CAAI,SAAS,KAAA,GAAQ,MAAA,CAAO,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,IAAU,SAAA;AAAA,EACvD,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,MAAA,EAAsB;AAC3C,EAAA,MAAA,CAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,aAAa,WAAA,CAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC1E;AAEO,SAAS,aAAa,MAAA,EAAsB;AACjD,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACxB,EAAA,IAAA,CAAK,SAAS,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,CAAM,IAAA,KAAS,OAAO,CAAC,CAAA;AAC1E,EAAA,IAAA,CAAK,YAAY,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,CAAM,IAAA,KAAS,UAAU,CAAC,CAAA;AAChF,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,IAAA,KAAS,UAAA;AAErC,EAAA,MAAM,GAAA,GAAM,UAAU,MAAM,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,IAAA,CAAK,OAAO,KAAA,CAAM,UAAA,GAAa,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAC,CAAA,YAAA,CAAA;AACjD,EAAA,IAAA,CAAK,aAAa,KAAA,CAAM,IAAA,GAAO,GAAG,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA,CAAA,CAAA;AACnD,EAAA,IAAA,CAAK,YAAA,CAAa,MAAM,GAAA,GAAM,CAAA,EAAA,CAAI,IAAI,KAAA,CAAM,GAAA,CAAI,KAAK,GAAG,CAAA,CAAA,CAAA;AACxD,EAAA,IAAA,CAAK,QAAA,CAAS,MAAM,GAAA,GAAM,CAAA,EAAI,MAAM,GAAA,CAAI,CAAA,GAAI,MAAO,GAAG,CAAA,CAAA,CAAA;AAEtD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAA,CAAK,cAAc,OAAO,CAAA,CAAE,QAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AACvD,IAAA,SAAA,CAAU,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AACrC,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3D,MAAA,IAAA,CAAK,eAAe,OAAO,CAAA,CAAE,QAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,IAAI,GAAG,CAAA;AACpD,EAAA,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,MAAA,CAAO,OAAO,CAAA;AACtC,EAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AACzB,EAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,WAAA,EAAa;AAC/C,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,GAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,CAAC,KAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAC/C,EAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,CAAA,+BAAA,EAAkC,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,SAAS,MAAM,CAAA,yIAAA,CAAA;AAC3G,EAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,QAAA,EAAU;AAC5C,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,GAAA;AAAA,EACxB;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAC/D,IAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AACzB,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,WAAA,EAAa;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,aAAA,CAAc,MAAM,CAAA;AACpB,IAAA,WAAA,CAAY,MAAM,CAAA;AAAA,EACpB;AACF;;;AClHA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBb,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,8BAAA,EAqCQ,WAAW,CAAA;;AAAA;AAAA,gCAAA,EAGT,WAAW,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;;;AC7DtC,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;;;ACAnB,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA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","file":"index.cjs","sourcesContent":["export function pointerUserY(svg: SVGSVGElement, event: PointerEvent): number {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return 0;\n }\n return new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse()).y;\n}\n\nexport function pointerAlongValueAxis(\n svg: SVGSVGElement,\n event: PointerEvent,\n horizontal: boolean | undefined,\n): number {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return 0;\n }\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return horizontal ? point.x : point.y;\n}\n","export function findConnectedLine(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"]`;\n return (\n [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(\n el => el.tagName.toLowerCase() === 'path' && !el.id.includes('chart-line-area-'),\n ) ?? null\n );\n}\n\nexport function findConnectedLineArea(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(el => el.id.includes('chart-line-area-')) ?? null;\n}\n\nexport function findSeriesPoints(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"][data-sf-value-index]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)]\n .filter(el => el.tagName.toLowerCase() === 'ellipse')\n .sort((a, b) => Number(a.getAttribute('data-sf-value-index')) - Number(b.getAttribute('data-sf-value-index')));\n}\n","import type { ValueScale } from './types';\n\nexport function parseValueScale(element: Element | null): ValueScale | null {\n const raw = element?.getAttribute('data-sf-value-scale');\n if (!raw) {\n return null;\n }\n const parts = raw.split(',');\n const [plotY, plotHeight, min, max] = parts.map(Number);\n if ([plotY, plotHeight, min, max].some(value => !Number.isFinite(value))) {\n return null;\n }\n if (plotHeight <= 0 || max === min) {\n return null;\n }\n return parts[4] === 'horizontal'\n ? { horizontal: true, plotY, plotHeight, min, max }\n : { plotY, plotHeight, min, max };\n}\n\nexport function valueAtPixel(position: number, scale: ValueScale): number {\n const fraction = scale.horizontal\n ? (position - scale.plotY) / scale.plotHeight\n : (scale.plotY + scale.plotHeight - position) / scale.plotHeight;\n const value = scale.min + fraction * (scale.max - scale.min);\n return Math.min(Math.max(value, scale.min), scale.max);\n}\n\nexport function pixelForValue(value: number, scale: ValueScale): number {\n const fraction = (value - scale.min) / (scale.max - scale.min);\n return scale.horizontal\n ? scale.plotY + fraction * scale.plotHeight\n : scale.plotY + scale.plotHeight - fraction * scale.plotHeight;\n}\n","import { BAR_LABEL, barLabelSize, formatBarLabel, pillPath } from '../../../renderScene/charts/primitives/barLabel';\nimport { barShapePath, roundedBarPath } from '../../../renderScene/charts/primitives/barShape';\nimport { linePathData } from '../../../renderScene/charts/primitives/linePath';\nimport { findConnectedLine, findConnectedLineArea, findSeriesPoints } from './lineLookup';\nimport { pixelForValue } from './scale';\nimport type { ChartValueDragState } from './types';\n\nfunction updateConnectedLine(svg: SVGSVGElement, drag: ChartValueDragState): void {\n const points = findSeriesPoints(svg, drag.owner.id, drag.series).map(point => ({\n x: Number(point.getAttribute('cx')),\n y: Number(point.getAttribute('cy')),\n }));\n const line = findConnectedLine(svg, drag.owner.id, drag.series);\n if (line) {\n line.setAttribute('d', linePathData(points, drag.lineTension));\n }\n const area = findConnectedLineArea(svg, drag.owner.id, drag.series);\n if (area && points.length > 1) {\n const first = points[0];\n const last = points[points.length - 1];\n const d = `${linePathData(points, drag.lineTension)} L ${last.x} ${drag.baseY} L ${first.x} ${drag.baseY} Z`;\n area.setAttribute('d', d);\n }\n}\n\nfunction setBarPath(svg: SVGSVGElement, drag: ChartValueDragState, d: string): void {\n drag.element.setAttribute('d', d);\n for (const kind of ['glow', 'shadow']) {\n const copy = svg.querySelector(`[id=\"${drag.element.id.replace('chart-bar-', `chart-bar-${kind}-`)}\"]`);\n copy?.setAttribute('d', d);\n }\n}\n\nexport function updateChartValuePreview(svg: SVGSVGElement, drag: ChartValueDragState, value: number): void {\n if (drag.isBar && drag.scale.horizontal) {\n const width = Math.max(0, pixelForValue(value, drag.scale) - drag.barX);\n setBarPath(svg, drag, roundedBarPath(drag.barX, drag.barTop, width, drag.barHeight, drag.barRadius));\n return;\n }\n const y = pixelForValue(value, drag.scale);\n if (drag.isBar) {\n const top = Math.min(y, drag.baseY);\n const height = Math.max(0, Math.abs(drag.baseY - y));\n setBarPath(svg, drag, barShapePath(drag.barX, top, drag.barWidth, height, drag.barRadius));\n return;\n }\n drag.element.setAttribute('cy', String(y));\n updateConnectedLine(svg, drag);\n}\n\nexport interface BarOrigin {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\ninterface BarLabelElements {\n text: SVGTextElement;\n pill: SVGPathElement | null;\n placement: string;\n template: string;\n}\n\nfunction findBarLabel(svg: SVGSVGElement, drag: ChartValueDragState): BarLabelElements | null {\n const id = drag.element.id.replace('chart-bar-', 'chart-bar-label-');\n const text = svg.querySelector<SVGTextElement>(`[id=\"${id}\"]`);\n const [kind, placement, template] = (text?.getAttribute('data-sf-mark') ?? '').split('|');\n if (!text || kind !== 'bar-label') {\n return null;\n }\n return { text, pill: svg.querySelector<SVGPathElement>(`[id=\"${id}-pill\"]`), placement, template };\n}\n\nfunction labelShift(placement: string, origin: BarOrigin, top: number, height: number): number {\n if (placement === 'axis') {\n return 0;\n }\n return placement === 'center' ? top + height / 2 - (origin.top + origin.height / 2) : top - origin.top;\n}\n\nfunction resizePill(pill: SVGPathElement, text: SVGTextElement, label: string, dy: number): void {\n const fontSize = parseFloat(text.getAttribute('font-size') ?? '12');\n const size = barLabelSize(label, fontSize, true);\n const stored = pill.dataset.sfPillY ?? (pill.getAttribute('d') ?? '').split(/\\s+/)[2];\n pill.dataset.sfPillY = stored;\n const centerX = Number(text.getAttribute('x'));\n pill.setAttribute('d', pillPath(centerX - size.width / 2, Number(stored), size.width, size.height));\n pill.setAttribute('transform', `translate(0 ${dy})`);\n}\n\nfunction updateHorizontalBarLabel(\n label: BarLabelElements,\n drag: ChartValueDragState,\n origin: BarOrigin,\n value: number,\n): boolean {\n const content = formatBarLabel(value, label.template);\n (label.text.querySelector('tspan') ?? label.text).textContent = content;\n if (label.placement === 'axis') {\n return true;\n }\n const fontSize = parseFloat(label.text.getAttribute('font-size') ?? '12');\n const size = barLabelSize(content, fontSize, label.pill !== null);\n const width = Math.max(0, pixelForValue(value, drag.scale) - origin.left);\n const end = origin.left + width;\n const center =\n label.placement === 'outside'\n ? end + BAR_LABEL.gap + size.width / 2\n : label.placement === 'inside'\n ? end - BAR_LABEL.gap - size.width / 2\n : origin.left + width / 2;\n const stored = label.text.dataset.sfLabelX ?? label.text.getAttribute('x') ?? '0';\n label.text.dataset.sfLabelX = stored;\n label.text.setAttribute('transform', `translate(${center - Number(stored)} 0)`);\n if (label.pill) {\n const pillY = label.pill.dataset.sfPillY ?? (label.pill.getAttribute('d') ?? '').split(/\\s+/)[2];\n label.pill.dataset.sfPillY = pillY;\n label.pill.removeAttribute('transform');\n label.pill.setAttribute('d', pillPath(center - size.width / 2, Number(pillY), size.width, size.height));\n }\n return true;\n}\n\nexport function updateBarLabel(\n svg: SVGSVGElement,\n drag: ChartValueDragState,\n origin: BarOrigin,\n value: number,\n): boolean {\n const label = drag.isBar ? findBarLabel(svg, drag) : null;\n if (!label) {\n return false;\n }\n if (drag.scale.horizontal) {\n return updateHorizontalBarLabel(label, drag, origin, value);\n }\n const y = pixelForValue(value, drag.scale);\n const top = Math.min(y, drag.baseY);\n const height = Math.abs(drag.baseY - y);\n const dy = labelShift(label.placement, origin, top, height);\n const content = formatBarLabel(value, label.template);\n\n (label.text.querySelector('tspan') ?? label.text).textContent = content;\n label.text.setAttribute('transform', `translate(0 ${dy})`);\n if (label.pill) {\n resizePill(label.pill, label.text, content, dy);\n }\n return true;\n}\n","import { SVG_NAMESPACE } from '../../dom';\nimport { pixelForValue } from './scale';\nimport type { ChartValueDragState, ValueScale } from './types';\n\nconst FONT_SIZE = 11;\nconst PADDING_X = 7;\nconst HEIGHT = 18;\nconst GAP = 8;\nconst BACKGROUND = 'rgba(15, 23, 42, 0.9)';\n\nfunction element<K extends keyof SVGElementTagNameMap>(svg: SVGSVGElement, tag: K): SVGElementTagNameMap[K] {\n return svg.ownerDocument.createElementNS(SVG_NAMESPACE, tag) as SVGElementTagNameMap[K];\n}\n\nexport function createValueReadout(svg: SVGSVGElement): SVGGElement {\n const group = element(svg, 'g');\n group.setAttribute('data-sf-value-readout', '');\n group.setAttribute('pointer-events', 'none');\n\n const background = element(svg, 'rect');\n background.setAttribute('rx', '4');\n background.setAttribute('fill', BACKGROUND);\n group.appendChild(background);\n\n const label = element(svg, 'text');\n label.setAttribute('fill', '#ffffff');\n label.setAttribute('font-size', String(FONT_SIZE));\n label.setAttribute('font-family', 'Inter, system-ui, sans-serif');\n label.setAttribute('font-weight', '600');\n label.setAttribute('text-anchor', 'middle');\n label.setAttribute('dominant-baseline', 'central');\n group.appendChild(label);\n\n svg.appendChild(group);\n return group;\n}\n\nexport function markAnchorY(drag: ChartValueDragState): number {\n return drag.barTop + drag.barHeight / 2;\n}\n\nexport function markAnchorX(drag: ChartValueDragState): number {\n if (drag.isBar) {\n return drag.barX + drag.barWidth / 2;\n }\n const cx = Number(drag.element.getAttribute('cx'));\n return Number.isFinite(cx) ? cx : 0;\n}\n\nexport interface ReadoutAnchor {\n centerX: number;\n centerY?: number;\n scale: ValueScale;\n}\n\nexport function formatReadoutValue(value: number): string {\n return String(Math.round(value * 10) / 10);\n}\n\nfunction readoutWidth(scale: ValueScale): number {\n const magnitude = Math.max(Math.abs(scale.min), Math.abs(scale.max));\n const sign = scale.min < 0 ? 1 : 0;\n const chars = sign + formatReadoutValue(magnitude).length + 2;\n return Math.max(28, (chars * FONT_SIZE) / 1.7 + PADDING_X * 2);\n}\n\nexport function updateValueReadout(readout: SVGGElement, anchor: ReadoutAnchor, value: number): void {\n const text = readout.querySelector('text');\n const background = readout.querySelector('rect');\n if (!text || !background) {\n return;\n }\n\n text.textContent = formatReadoutValue(value);\n const width = readoutWidth(anchor.scale);\n\n if (anchor.scale.horizontal) {\n const markX = pixelForValue(value, anchor.scale);\n const plotEnd = anchor.scale.plotY + anchor.scale.plotHeight;\n const left = markX + GAP + width <= plotEnd ? markX + GAP : markX - GAP - width;\n const centerY = anchor.centerY ?? 0;\n background.setAttribute('x', String(left));\n background.setAttribute('y', String(centerY - HEIGHT / 2));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(left + width / 2));\n text.setAttribute('y', String(centerY));\n return;\n }\n\n const markY = pixelForValue(value, anchor.scale);\n const above = markY - GAP - HEIGHT >= anchor.scale.plotY;\n const top = above ? markY - GAP - HEIGHT : markY + GAP;\n const centerX = anchor.centerX;\n\n background.setAttribute('x', String(centerX - width / 2));\n background.setAttribute('y', String(top));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(centerX));\n text.setAttribute('y', String(top + HEIGHT / 2));\n}\n\nexport function removeValueReadout(readout: SVGGElement | null): void {\n readout?.remove();\n}\n","import { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport { findConnectedLine } from './lineLookup';\nimport { parseValueScale } from './scale';\nimport type { ChartValueDragState, ValueScale } from './types';\n\ntype ChartValueTarget = Pick<ChartValueDragState, 'owner' | 'series' | 'index'>;\n\ntype ChartValueGeometry = Pick<\n ChartValueDragState,\n 'element' | 'baseY' | 'isBar' | 'barX' | 'barWidth' | 'barTop' | 'barHeight' | 'barRadius' | 'lineTension'\n>;\n\nfunction chartGeometry(svg: SVGSVGElement, target: ChartValueTarget): SVGGraphicsElement | null {\n const selector =\n `[data-sf-id=\"${CSS.escape(target.owner.id)}\"]` +\n `[data-sf-series=\"${CSS.escape(target.series)}\"]` +\n `[data-sf-value-index=\"${target.index}\"]`;\n return (\n [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(element => {\n const tag = element.tagName.toLowerCase();\n return tag === 'rect' || tag === 'ellipse' || tag === 'path';\n }) ?? null\n );\n}\n\nexport function resolveChartValueDrag(svg: SVGSVGElement, event: PointerEvent): ChartValueDragState | null {\n if (!isChartValuePointer(event)) {\n return null;\n }\n const mark = findChartValueMark(event);\n if (!mark) {\n return null;\n }\n const target = readChartValueTarget(mark);\n if (!target) {\n return null;\n }\n const scale = parseValueScale(findOwnerNode(svg, target.owner.id, isPrimary));\n const geometry = scale ? resolveChartValueGeometry(svg, target, scale) : null;\n if (!scale || !geometry) {\n return null;\n }\n mark.setPointerCapture?.(event.pointerId);\n return createChartValueDragState(target, scale, geometry, event.pointerId);\n}\n\nfunction createChartValueDragState(\n target: ChartValueTarget,\n scale: ValueScale,\n geometry: ChartValueGeometry,\n pointerId: number,\n): ChartValueDragState {\n return {\n owner: target.owner,\n series: target.series,\n index: target.index,\n scale,\n ...geometry,\n pointerId,\n moved: false,\n };\n}\n\nfunction isChartValuePointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findChartValueMark(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-value-index]') as SVGGraphicsElement | null;\n}\n\nfunction readChartValueTarget(mark: SVGGraphicsElement): ChartValueTarget | null {\n const owner = resolveOwner(mark);\n if (owner?.role !== 'chart') {\n return null;\n }\n const series = mark.getAttribute('data-sf-series');\n const index = Number(mark.getAttribute('data-sf-value-index'));\n if (!series || !Number.isInteger(index)) {\n return null;\n }\n return { owner, series, index };\n}\n\nfunction resolveChartValueGeometry(\n svg: SVGSVGElement,\n target: ChartValueTarget,\n scale: ValueScale,\n): ChartValueGeometry | null {\n const element = chartGeometry(svg, target);\n if (!element) {\n return null;\n }\n const isBar = element.getAttribute('data-sf-mark') === 'bar';\n const bbox = isBar ? element.getBBox() : null;\n const baseY = bbox ? bbox.y + bbox.height : scale.plotY + scale.plotHeight;\n if (!Number.isFinite(baseY)) {\n return null;\n }\n if (bbox && scale.horizontal && Math.abs(bbox.x - scale.plotY) > 1) {\n return null;\n }\n const line = isBar ? null : findConnectedLine(svg, target.owner.id, target.series);\n return {\n element,\n baseY,\n isBar,\n barX: bbox?.x ?? 0,\n barWidth: bbox?.width ?? 0,\n barTop: bbox?.y ?? 0,\n barHeight: bbox?.height ?? 0,\n barRadius: isBar ? Number(element.getAttribute('data-sf-bar-radius')) || 0 : 0,\n lineTension: Number(line?.getAttribute('data-sf-line-tension')) || 0,\n };\n}\n","import type { Emitter } from '../events';\nimport { pointerAlongValueAxis } from './coordinates';\nimport { type BarOrigin, updateBarLabel, updateChartValuePreview } from './preview';\nimport { createValueReadout, markAnchorX, markAnchorY, removeValueReadout, updateValueReadout } from './readout';\nimport { valueAtPixel } from './scale';\nimport { resolveChartValueDrag } from './target';\nimport type { ChartValueDragState } from './types';\n\nexport class ChartValueDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: ChartValueDragState | null = null;\n #readout: SVGGElement | null = null;\n #origin: BarOrigin | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n #endPreview(drag: ChartValueDragState): void {\n if (drag.moved) {\n this.#emitter.emit('chartValuePreview', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value: null,\n });\n }\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveChartValueDrag(this.#svg, event);\n if (this.#drag?.isBar) {\n const box = this.#drag.element.getBBox();\n this.#origin = { top: box.y, height: box.height, left: box.x, width: box.width };\n }\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n this.#drag.moved = true;\n const value = valueAtPixel(pointerAlongValueAxis(this.#svg, event, this.#drag.scale.horizontal), this.#drag.scale);\n updateChartValuePreview(this.#svg, this.#drag, value);\n\n this.#emitter.emit('chartValuePreview', {\n owner: this.#drag.owner,\n series: this.#drag.series,\n index: this.#drag.index,\n value,\n });\n\n if (this.#origin && updateBarLabel(this.#svg, this.#drag, this.#origin, value)) {\n return;\n }\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n updateValueReadout(\n this.#readout,\n { centerX: markAnchorX(this.#drag), centerY: markAnchorY(this.#drag), scale: this.#drag.scale },\n value,\n );\n }\n\n cancel(): void {\n if (this.#drag) {\n this.#endPreview(this.#drag);\n }\n this.#drag = null;\n this.#origin = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n this.#origin = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n this.#emitter.emit('chartValueChange', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value: valueAtPixel(pointerAlongValueAxis(this.#svg, event, drag.scale.horizontal), drag.scale),\n });\n this.#endPreview(drag);\n }\n}\n","import type { Viewer } from '../viewer';\nimport { ChartValueDragSession } from './chartValue/session';\nimport type { Emitter } from './events';\n\nexport interface ChartValueDragHandle {\n destroy(): void;\n}\n\nexport function bindChartValueDrag(viewer: Viewer, emitter: Emitter): ChartValueDragHandle {\n const session = new ChartValueDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import {\n rgbToHex as modelHex,\n hsvToRgb as modelHsvToRgb,\n rgbToHsv as modelRgbToHsv,\n parseHexRgb,\n} from '../../../model/color';\n\nexport interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface Hsv {\n h: number;\n s: number;\n v: number;\n}\n\nexport function normalizeHex(value: string): string | null {\n const channels = parseHexRgb(value);\n return channels && modelHex(...channels);\n}\n\nconst COLOR_FUNCTION =\n /^rgba?\\(\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*(?:[,/]\\s*(\\d*\\.?\\d+)(%?)\\s*)?\\)$/i;\nconst HEX_WITH_ALPHA = /^#([0-9a-f]{6})([0-9a-f]{2})$/i;\n\nexport interface ColorAlpha {\n hex: string;\n alpha: number;\n}\n\nexport function parseColorAlpha(value: string): ColorAlpha | null {\n const raw = value.trim();\n const fn = COLOR_FUNCTION.exec(raw);\n if (fn) {\n const alpha = fn[4] === undefined ? 1 : Number(fn[4]) / (fn[5] ? 100 : 1);\n return {\n hex: rgbToHex({ r: Number(fn[1]), g: Number(fn[2]), b: Number(fn[3]) }),\n alpha: Math.max(0, Math.min(1, alpha)),\n };\n }\n const eight = HEX_WITH_ALPHA.exec(raw);\n if (eight) {\n return { hex: `#${eight[1].toLowerCase()}`, alpha: Number.parseInt(eight[2], 16) / 255 };\n }\n const hex = normalizeHex(raw);\n return hex ? { hex, alpha: 1 } : null;\n}\n\nexport function formatColorAlpha(hex: string, alpha: number): string {\n const clamped = Math.max(0, Math.min(1, alpha));\n if (clamped >= 1) {\n return hex;\n }\n const { r, g, b } = hexToRgb(hex);\n return `rgba(${r}, ${g}, ${b}, ${Math.round(clamped * 100) / 100})`;\n}\n\nexport function hexOf(value: string): string {\n return parseColorAlpha(value)?.hex ?? '#000000';\n}\n\nexport function alphaOf(value: string): number {\n return parseColorAlpha(value)?.alpha ?? 1;\n}\n\nexport function isHexColor(value: string): boolean {\n return normalizeHex(value) !== null;\n}\n\nexport function clampChannel(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nexport function hexToRgb(hex: string): Rgb {\n const [r, g, b] = parseHexRgb(hex) ?? [0, 0, 0];\n return { r, g, b };\n}\n\nexport function rgbToHex(rgb: Rgb): string {\n return modelHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));\n}\n\n// The picker may be given a hue that has turned around or a part that is out of its range, which the conversion of the model does not take.\nexport function hsvToRgb(hsv: Hsv): Rgb {\n const { r, g, b } = modelHsvToRgb(\n ((hsv.h % 360) + 360) % 360,\n Math.max(0, Math.min(1, hsv.s)),\n Math.max(0, Math.min(1, hsv.v)),\n );\n return { r, g, b };\n}\n\nexport function rgbToHsv(rgb: Rgb): Hsv {\n return modelRgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));\n}\n\nexport function hexToHsv(hex: string): Hsv {\n return rgbToHsv(hexToRgb(hex));\n}\n\nexport function hsvToHex(hsv: Hsv): string {\n return rgbToHex(hsvToRgb(hsv));\n}\n","import { formatColorAlpha, parseColorAlpha } from './color';\n\nexport interface GradientStopValue {\n color: string;\n position: number;\n}\n\nexport interface GradientValue {\n angle: number;\n stops: GradientStopValue[];\n}\n\nexport const DEFAULT_GRADIENT_ANGLE = 90;\n\nconst GRADIENT = /^gradient\\(\\s*(-?[\\d.]+)\\s*,\\s*(.+)\\)\\s*$/i;\nconst STOP = /(rgba?\\([^)]*\\)|#[0-9a-f]{3}(?:[0-9a-f]{3})?)\\s+(-?[\\d.]+)%/gi;\n\nfunction trim(value: number): number {\n return Number(value.toFixed(1));\n}\n\nexport function clampPosition(value: number): number {\n return Math.max(0, Math.min(100, value));\n}\n\nexport function sortStops(stops: readonly GradientStopValue[]): GradientStopValue[] {\n return [...stops].sort((a, b) => a.position - b.position);\n}\n\nexport function parseGradient(source: string): GradientValue | null {\n const match = source.trim().match(GRADIENT);\n if (!match) {\n return null;\n }\n const angle = Number(match[1]);\n if (!Number.isFinite(angle)) {\n return null;\n }\n const stops: GradientStopValue[] = [];\n for (const stop of match[2].matchAll(STOP)) {\n const parsed = parseColorAlpha(stop[1]);\n const position = Number(stop[2]);\n if (parsed && Number.isFinite(position)) {\n stops.push({ color: formatColorAlpha(parsed.hex, parsed.alpha), position: clampPosition(position) });\n }\n }\n return stops.length >= 2 ? { angle, stops } : null;\n}\n\nexport function formatGradient(value: GradientValue): string {\n const stops = sortStops(value.stops)\n .map(stop => `${stop.color} ${trim(clampPosition(stop.position))}%`)\n .join(', ');\n return `gradient(${trim(value.angle)}, ${stops})`;\n}\n\nexport function gradientCss(value: GradientValue): string {\n const stops = sortStops(value.stops)\n .map(stop => `${stop.color} ${clampPosition(stop.position)}%`)\n .join(', ');\n return `linear-gradient(${trim(value.angle + 90)}deg, ${stops})`;\n}\n","import { formatColorAlpha, parseColorAlpha } from './color';\nimport { clampPosition, DEFAULT_GRADIENT_ANGLE, type GradientStopValue, type GradientValue } from './gradientValue';\n\nfunction readAngle(def: Element): number {\n const coordinates = ['x1', 'y1', 'x2', 'y2'].map(name => Number.parseFloat(def.getAttribute(name) ?? ''));\n if (!coordinates.every(Number.isFinite)) {\n return DEFAULT_GRADIENT_ANGLE;\n }\n const [x1, y1, x2, y2] = coordinates;\n const angle = (Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI;\n return Number(angle.toFixed(1));\n}\n\nexport function readGradientValue(svg: SVGSVGElement, fill: string | null): GradientValue | null {\n const id = fill?.match(/^url\\(#([^)]+)\\)$/)?.[1];\n if (!id) {\n return null;\n }\n const def = svg.querySelector(`[id=\"${CSS.escape(id)}\"]`);\n if (def?.tagName.toLowerCase() !== 'lineargradient') {\n return null;\n }\n\n const stops: GradientStopValue[] = [];\n for (const stop of def.querySelectorAll('stop')) {\n const parsed = parseColorAlpha(stop.getAttribute('stop-color') ?? '');\n const offset = Number.parseFloat(stop.getAttribute('offset') ?? '');\n if (parsed && Number.isFinite(offset)) {\n stops.push({ color: formatColorAlpha(parsed.hex, parsed.alpha), position: clampPosition(offset) });\n }\n }\n if (stops.length < 2) {\n return null;\n }\n return { angle: readAngle(def), stops };\n}\n","import { alphaOf, formatColorAlpha, hexOf, hexToHsv, hsvToHex, parseColorAlpha } from './color';\nimport {\n DEFAULT_GRADIENT_ANGLE,\n formatGradient,\n type GradientValue,\n gradientCss,\n parseGradient,\n sortStops,\n} from './gradientValue';\n\nexport const FALLBACK_COLOR = '#888888';\n\nexport type PickerValue =\n | { mode: 'solid'; color: string; alpha?: number }\n | { mode: 'gradient'; angle: number; stops: GradientValue['stops'] };\n\nexport function seedFrom(fill: string | null, gradient: GradientValue | null): PickerValue {\n if (gradient) {\n return { mode: 'gradient', angle: gradient.angle, stops: sortStops(gradient.stops) };\n }\n const parsed = fill ? parseGradient(fill) : null;\n if (parsed) {\n return { mode: 'gradient', angle: parsed.angle, stops: sortStops(parsed.stops) };\n }\n const solid = fill ? parseColorAlpha(fill) : null;\n return { mode: 'solid', color: solid?.hex ?? FALLBACK_COLOR, alpha: solid?.alpha ?? 1 };\n}\n\nexport function formatPickerValue(value: PickerValue): string {\n return value.mode === 'solid'\n ? formatColorAlpha(value.color, value.alpha ?? 1)\n : formatGradient({ angle: value.angle, stops: value.stops });\n}\n\nexport function cssBackground(color: string): string {\n const gradient = parseGradient(color);\n return gradient ? gradientCss(gradient) : color;\n}\n\nexport function toAlpha(value: PickerValue): number {\n return value.mode === 'solid' ? (value.alpha ?? 1) : alphaOf(sortStops(value.stops)[0]?.color ?? FALLBACK_COLOR);\n}\n\nexport function toSolid(value: PickerValue): string {\n return value.mode === 'solid' ? value.color : hexOf(sortStops(value.stops)[0]?.color ?? FALLBACK_COLOR);\n}\n\nexport function darken(hex: string): string {\n const hsv = hexToHsv(hex);\n return hsvToHex({ ...hsv, v: Math.max(0, hsv.v * 0.55) });\n}\n\nexport function toGradient(value: PickerValue): GradientValue {\n if (value.mode === 'gradient') {\n return { angle: value.angle, stops: sortStops(value.stops) };\n }\n return {\n angle: DEFAULT_GRADIENT_ANGLE,\n stops: [\n { color: formatColorAlpha(value.color, value.alpha ?? 1), position: 0 },\n { color: formatColorAlpha(darken(value.color), value.alpha ?? 1), position: 100 },\n ],\n };\n}\n","import { alphaOf, formatColorAlpha, type Hsv, hexOf, hexToHsv, hsvToHex } from './color';\nimport { clampPosition, type GradientValue, sortStops } from './gradientValue';\nimport type { PickerView } from './popoverView';\nimport { darken, formatPickerValue, type PickerValue, toAlpha, toGradient, toSolid } from './value';\n\nconst MIN_STOPS = 2;\nconst MAX_STOPS = 8;\n\nexport interface PickerState {\n mode: PickerValue['mode'];\n solid: string;\n alpha: number;\n gradient: GradientValue;\n selected: number;\n hsv: Hsv;\n}\n\nexport interface Picker {\n view: PickerView;\n state: PickerState;\n lockStops: boolean;\n onCommit(value: string): void;\n render(): void;\n}\n\nexport function activeColor(picker: Picker): string {\n const { state } = picker;\n return state.mode === 'solid' ? state.solid : (state.gradient.stops[state.selected]?.color ?? state.solid);\n}\n\nexport function activeHex(picker: Picker): string {\n return hexOf(activeColor(picker));\n}\n\nexport function activeAlpha(picker: Picker): number {\n return picker.state.mode === 'solid' ? picker.state.alpha : alphaOf(activeColor(picker));\n}\n\nfunction setActiveColorAlpha(picker: Picker, hex: string, alpha: number): void {\n const { state } = picker;\n if (state.mode === 'solid') {\n state.solid = hex;\n state.alpha = alpha;\n } else if (state.gradient.stops[state.selected]) {\n state.gradient.stops[state.selected] = {\n ...state.gradient.stops[state.selected],\n color: formatColorAlpha(hex, alpha),\n };\n }\n}\n\nexport function setActiveColor(picker: Picker, hex: string): void {\n setActiveColorAlpha(picker, hex, activeAlpha(picker));\n}\n\nfunction currentValue(picker: Picker): PickerValue {\n const { state } = picker;\n return state.mode === 'solid'\n ? { mode: 'solid', color: state.solid, alpha: state.alpha }\n : { mode: 'gradient', ...state.gradient };\n}\n\nexport function commit(picker: Picker): void {\n picker.onCommit(formatPickerValue(currentValue(picker)));\n}\n\nexport function applyHsv(picker: Picker, next: Hsv): void {\n picker.state.hsv = next;\n setActiveColor(picker, hsvToHex(next));\n picker.render();\n}\n\nexport function applyHex(picker: Picker, hex: string): void {\n picker.state.hsv = hexToHsv(hex);\n setActiveColor(picker, hex);\n picker.render();\n}\n\nexport function applyAlpha(picker: Picker, raw: string): void {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n setActiveColorAlpha(picker, activeHex(picker), Math.max(0, Math.min(100, value)) / 100);\n picker.render();\n}\n\nexport function applyAngle(picker: Picker, raw: string): void {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n picker.state.gradient = { ...picker.state.gradient, angle: Math.max(0, Math.min(360, value)) };\n picker.render();\n}\n\nexport function selectStop(picker: Picker, index: number): void {\n const { state } = picker;\n if (state.mode !== 'gradient' || index === state.selected || !state.gradient.stops[index]) {\n return;\n }\n state.selected = index;\n state.hsv = hexToHsv(hexOf(state.gradient.stops[index].color));\n picker.render();\n}\n\nexport function removeStop(picker: Picker, index: number): void {\n const { state } = picker;\n if (state.gradient.stops.length <= MIN_STOPS) {\n return;\n }\n state.gradient = { ...state.gradient, stops: state.gradient.stops.filter((_stop, at) => at !== index) };\n state.selected = Math.min(state.selected, state.gradient.stops.length - 1);\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function appendStop(picker: Picker): void {\n const { state } = picker;\n if (state.gradient.stops.length >= MAX_STOPS) {\n return;\n }\n const sorted = sortStops(state.gradient.stops);\n const last = sorted[sorted.length - 1];\n const previous = sorted[sorted.length - 2];\n const inserted = {\n color: formatColorAlpha(darken(hexOf(last.color)), alphaOf(last.color)),\n position: clampPosition((last.position + (previous?.position ?? 0)) / 2),\n };\n state.gradient = { ...state.gradient, stops: sortStops([...state.gradient.stops, inserted]) };\n state.selected = state.gradient.stops.indexOf(inserted);\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function setMode(picker: Picker, next: PickerValue['mode']): void {\n const { state } = picker;\n if (state.mode === next) {\n return;\n }\n const value = currentValue(picker);\n state.mode = next;\n if (next === 'gradient') {\n state.gradient = toGradient(value);\n state.selected = 0;\n } else {\n state.solid = toSolid(value);\n state.alpha = toAlpha(value);\n }\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function commitStopOrder(picker: Picker): void {\n const { state } = picker;\n state.gradient = { ...state.gradient, stops: sortStops(state.gradient.stops) };\n state.selected = Math.min(state.selected, state.gradient.stops.length - 1);\n picker.render();\n commit(picker);\n}\n\nexport { MIN_STOPS };\n","export function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n parent?: HTMLElement,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n parent?.appendChild(node);\n return node;\n}\n\nexport function tabButton(label: string, parent: HTMLElement): HTMLButtonElement {\n const button = el('button', 'sf-cp-tab', parent);\n button.type = 'button';\n button.setAttribute('role', 'tab');\n button.textContent = label;\n return button;\n}\n\nexport function numberField(parent: HTMLElement, min: number, max: number): HTMLInputElement {\n const input = el('input', 'sf-cp-number', parent);\n input.type = 'number';\n input.min = String(min);\n input.max = String(max);\n return input;\n}\n\nexport interface FluidField {\n row: HTMLDivElement;\n range: HTMLInputElement;\n number: HTMLInputElement;\n}\n\nexport function fluidField(parent: HTMLElement, text: string, min: number, max: number): FluidField {\n const row = el('div', 'sf-cp-fluid', parent);\n el('span', 'sf-cp-fluid-fill', row);\n el('span', 'sf-cp-fluid-thumb', row);\n el('span', 'sf-cp-fluid-label', row).textContent = text;\n const range = el('input', 'sf-cp-fluid-range', row);\n range.type = 'range';\n range.min = String(min);\n range.max = String(max);\n const number = numberField(row, min, max);\n number.classList.add('sf-cp-fluid-number');\n return { row, range, number };\n}\n\nexport function showRatio(range: HTMLInputElement): void {\n const span = Number(range.max) - Number(range.min);\n const ratio = span > 0 ? (Number(range.value) - Number(range.min)) / span : 0;\n range.parentElement?.style.setProperty('--sf-ratio', String(Math.max(0, Math.min(1, ratio))));\n}\n\nexport function labelledRow(parent: HTMLElement, text: string): HTMLDivElement {\n const row = el('div', 'sf-cp-row', parent);\n el('span', 'sf-cp-label', row).textContent = text;\n return row;\n}\n\nexport function ratio(value: number, size: number): number {\n return size > 0 ? Math.max(0, Math.min(1, value / size)) : 0;\n}\n\nexport function trackDrag(node: HTMLElement, onMove: (event: MouseEvent) => void, onEnd: () => void): () => void {\n const move = (event: MouseEvent) => onMove(event);\n const up = () => {\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', up);\n onEnd();\n };\n const down = (event: MouseEvent) => {\n event.preventDefault();\n onMove(event);\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', up);\n };\n node.addEventListener('mousedown', down);\n return () => {\n node.removeEventListener('mousedown', down);\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', up);\n };\n}\n","import { el, fluidField, labelledRow, tabButton } from './popoverDom';\nimport type { ColorPickerTheme } from './theme';\n\nexport const CHANNELS = ['r', 'g', 'b'] as const;\n\nexport type Channel = (typeof CHANNELS)[number];\n\nconst GAP_BELOW_ANCHOR = 6;\nconst VIEWPORT_MARGIN = 8;\n\nexport interface Anchor {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface StopRow {\n root: HTMLDivElement;\n swatch: HTMLSpanElement;\n hex: HTMLSpanElement;\n position: HTMLInputElement;\n remove: HTMLButtonElement;\n}\n\nexport interface PickerView {\n root: HTMLDivElement;\n solidTab: HTMLButtonElement;\n gradientTab: HTMLButtonElement;\n matrix: HTMLDivElement;\n matrixCursor: HTMLDivElement;\n hue: HTMLDivElement;\n hueThumb: HTMLDivElement;\n channelRanges: Record<Channel, HTMLInputElement>;\n channelNumbers: Record<Channel, HTMLInputElement>;\n alphaRow: HTMLDivElement;\n alphaRange: HTMLInputElement;\n alphaNumber: HTMLInputElement;\n hexInput: HTMLInputElement;\n eyedropper?: HTMLButtonElement;\n section: HTMLDivElement;\n preview: HTMLDivElement;\n angleRange: HTMLInputElement;\n angleNumber: HTMLInputElement;\n addStop: HTMLButtonElement;\n stopList: HTMLDivElement;\n stopRows: StopRow[];\n resetButton?: HTMLButtonElement;\n}\n\nexport interface ViewOptions {\n anchor: Anchor;\n theme?: ColorPickerTheme;\n allowGradient: boolean;\n lockStops: boolean;\n withReset: boolean;\n}\n\ntype SolidControls = Pick<\n PickerView,\n | 'matrix'\n | 'matrixCursor'\n | 'hue'\n | 'hueThumb'\n | 'channelRanges'\n | 'channelNumbers'\n | 'alphaRow'\n | 'alphaRange'\n | 'alphaNumber'\n | 'hexInput'\n | 'eyedropper'\n>;\n\ntype GradientControls = Pick<PickerView, 'section' | 'preview' | 'angleRange' | 'angleNumber' | 'addStop' | 'stopList'>;\n\n// The pipette takes a color from anywhere on the screen. Only some browsers can do that, the others do not show it.\nfunction buildEyedropper(parent: HTMLElement): HTMLButtonElement {\n const button = el('button', 'sf-cp-eyedropper', parent);\n button.type = 'button';\n button.title = 'Pick a color from the screen';\n button.setAttribute('aria-label', 'Pick a color from the screen');\n button.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 22l1-1h3l9-9\"/><path d=\"M3 21v-3l9-9\"/><path d=\"M15 6l3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4z\"/></svg>';\n return button;\n}\n\nfunction buildSolidControls(root: HTMLElement): SolidControls {\n const area = el('div', 'sf-cp-area', root);\n const matrix = el('div', 'sf-cp-matrix', area);\n el('div', 'sf-cp-matrix-white', matrix);\n el('div', 'sf-cp-matrix-black', matrix);\n const matrixCursor = el('div', 'sf-cp-matrix-cursor', matrix);\n const hue = el('div', 'sf-cp-hue', area);\n const hueThumb = el('div', 'sf-cp-hue-thumb', hue);\n\n const rows = el('div', 'sf-cp-rows', root);\n const channelRanges = {} as Record<Channel, HTMLInputElement>;\n const channelNumbers = {} as Record<Channel, HTMLInputElement>;\n for (const channel of CHANNELS) {\n const field = fluidField(rows, channel.toUpperCase(), 0, 255);\n channelRanges[channel] = field.range;\n channelNumbers[channel] = field.number;\n }\n const alpha = fluidField(rows, 'A', 0, 100);\n alpha.row.classList.add('sf-cp-fluid--alpha');\n const { row: alphaRow, range: alphaRange, number: alphaNumber } = alpha;\n const hexRow = labelledRow(rows, 'Hex');\n const hexInput = el('input', 'sf-cp-text', hexRow);\n hexInput.type = 'text';\n hexInput.spellcheck = false;\n const eyedropper = 'EyeDropper' in window ? buildEyedropper(hexRow) : undefined;\n return {\n matrix,\n matrixCursor,\n hue,\n hueThumb,\n channelRanges,\n channelNumbers,\n alphaRow,\n alphaRange,\n alphaNumber,\n hexInput,\n eyedropper,\n };\n}\n\nfunction buildGradientControls(root: HTMLElement, lockStops: boolean): GradientControls {\n const section = el('div', 'sf-cp-section', root);\n const preview = el('div', 'sf-cp-preview', section);\n const angle = fluidField(section, 'Angle', 0, 360);\n angle.row.hidden = lockStops;\n const { range: angleRange, number: angleNumber } = angle;\n const head = el('div', 'sf-cp-section-head', section);\n el('span', 'sf-cp-heading', head).textContent = 'Stops';\n const addStop = el('button', 'sf-cp-icon-btn', head);\n addStop.type = 'button';\n addStop.textContent = '+';\n addStop.title = 'Add stop';\n addStop.hidden = lockStops;\n const stopList = el('div', 'sf-cp-stops', section);\n return { section, preview, angleRange, angleNumber, addStop, stopList };\n}\n\nexport function buildPickerView(options: ViewOptions): PickerView {\n const { anchor, allowGradient, lockStops } = options;\n const root = el('div', 'sf-cp');\n root.dataset.sfTheme = options.theme ?? 'auto';\n root.style.left = `${anchor.left}px`;\n root.style.top = `${anchor.top + anchor.height + GAP_BELOW_ANCHOR}px`;\n\n const tabs = el('div', 'sf-cp-tabs', root);\n tabs.setAttribute('role', 'tablist');\n tabs.hidden = !allowGradient;\n const solidTab = tabButton('Solid', tabs);\n const gradientTab = tabButton('Gradient', tabs);\n\n const solid = buildSolidControls(root);\n const gradient = buildGradientControls(root, lockStops);\n\n let resetButton: HTMLButtonElement | undefined;\n if (options.withReset) {\n resetButton = el('button', 'sf-cp-reset', root);\n resetButton.type = 'button';\n resetButton.textContent = 'Use series color';\n }\n\n return { root, solidTab, gradientTab, ...solid, ...gradient, stopRows: [], resetButton };\n}\n\nexport function clampIntoViewport(root: HTMLElement, anchor: Anchor): void {\n const rect = root.getBoundingClientRect();\n if (rect.height === 0 && rect.width === 0) {\n return;\n }\n const maxTop = window.innerHeight - rect.height - VIEWPORT_MARGIN;\n if (rect.top > maxTop) {\n const above = anchor.top - rect.height - GAP_BELOW_ANCHOR;\n root.style.top = `${Math.max(VIEWPORT_MARGIN, above)}px`;\n }\n const maxLeft = window.innerWidth - rect.width - VIEWPORT_MARGIN;\n if (rect.left > maxLeft) {\n root.style.left = `${Math.max(VIEWPORT_MARGIN, maxLeft)}px`;\n }\n}\n","import { hexToRgb, normalizeHex, rgbToHex, rgbToHsv } from './color';\nimport {\n activeHex,\n appendStop,\n applyAlpha,\n applyAngle,\n applyHex,\n applyHsv,\n commit,\n type Picker,\n setActiveColor,\n setMode,\n} from './popoverActions';\nimport { ratio, trackDrag } from './popoverDom';\nimport { CHANNELS, type Channel } from './popoverView';\n\nfunction bindAreas(picker: Picker): Array<() => void> {\n const { matrix, hue } = picker.view;\n const done = () => commit(picker);\n return [\n trackDrag(\n matrix,\n event => {\n const rect = matrix.getBoundingClientRect();\n applyHsv(picker, {\n h: picker.state.hsv.h,\n s: ratio(event.clientX - rect.left, rect.width),\n v: 1 - ratio(event.clientY - rect.top, rect.height),\n });\n },\n done,\n ),\n trackDrag(\n hue,\n event => {\n const rect = hue.getBoundingClientRect();\n applyHsv(picker, { ...picker.state.hsv, h: ratio(event.clientY - rect.top, rect.height) * 360 });\n },\n done,\n ),\n ];\n}\n\nfunction bindChannel(picker: Picker, channel: Channel): void {\n const { channelRanges, channelNumbers } = picker.view;\n const fromChannel = (raw: string) => {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n const next = { ...hexToRgb(activeHex(picker)), [channel]: value };\n const nextHsv = rgbToHsv(next);\n picker.state.hsv = nextHsv.s === 0 ? { ...nextHsv, h: picker.state.hsv.h } : nextHsv;\n setActiveColor(picker, rgbToHex(next));\n picker.render();\n };\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n channelRanges[channel].addEventListener('input', event => fromChannel(read(event)));\n channelRanges[channel].addEventListener('change', () => commit(picker));\n channelNumbers[channel].addEventListener('input', event => fromChannel(read(event)));\n channelNumbers[channel].addEventListener('change', () => commit(picker));\n}\n\nfunction bindAlpha(picker: Picker): void {\n const { alphaRange, alphaNumber } = picker.view;\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n alphaRange.addEventListener('input', event => applyAlpha(picker, read(event)));\n alphaRange.addEventListener('change', () => commit(picker));\n alphaNumber.addEventListener('input', event => applyAlpha(picker, read(event)));\n alphaNumber.addEventListener('change', () => commit(picker));\n}\n\nfunction bindHex(picker: Picker): void {\n const { hexInput } = picker.view;\n hexInput.addEventListener('input', () => {\n const hex = normalizeHex(hexInput.value);\n if (hex) {\n applyHex(picker, hex);\n }\n });\n hexInput.addEventListener('change', () => {\n const hex = normalizeHex(hexInput.value);\n if (hex) {\n applyHex(picker, hex);\n commit(picker);\n } else {\n picker.render();\n }\n });\n hexInput.addEventListener('blur', () => picker.render());\n}\n\nfunction bindAngle(picker: Picker): void {\n const { angleRange, angleNumber } = picker.view;\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n angleRange.addEventListener('input', event => applyAngle(picker, read(event)));\n angleRange.addEventListener('change', () => commit(picker));\n angleNumber.addEventListener('input', event => applyAngle(picker, read(event)));\n angleNumber.addEventListener('change', () => commit(picker));\n}\n\nfunction bindEyedropper(picker: Picker): void {\n const { eyedropper } = picker.view;\n eyedropper?.addEventListener('click', async () => {\n const Dropper = (window as unknown as { EyeDropper: new () => { open(): Promise<{ sRGBHex: string }> } })\n .EyeDropper;\n try {\n const hex = normalizeHex((await new Dropper().open()).sRGBHex);\n if (hex) {\n applyHex(picker, hex);\n commit(picker);\n }\n } catch {\n // Escape ends the picking, which leaves the color as it is.\n }\n });\n}\n\nexport function bindPickerEvents(picker: Picker): Array<() => void> {\n const { view } = picker;\n const disposers = bindAreas(picker);\n view.solidTab.addEventListener('click', () => setMode(picker, 'solid'));\n view.gradientTab.addEventListener('click', () => setMode(picker, 'gradient'));\n view.addStop.addEventListener('click', () => appendStop(picker));\n for (const channel of CHANNELS) {\n bindChannel(picker, channel);\n }\n bindAlpha(picker);\n bindHex(picker);\n bindEyedropper(picker);\n bindAngle(picker);\n return disposers;\n}\n","import { alphaOf, hexOf, hexToRgb } from './color';\nimport { clampPosition, gradientCss } from './gradientValue';\nimport {\n activeAlpha,\n activeHex,\n commitStopOrder,\n MIN_STOPS,\n type Picker,\n removeStop,\n selectStop,\n} from './popoverActions';\nimport { el, showRatio } from './popoverDom';\nimport { CHANNELS, type StopRow } from './popoverView';\n\nfunction createStopRow(picker: Picker, index: number): StopRow {\n const { view, lockStops, state } = picker;\n const root = el('div', 'sf-cp-stop', view.stopList);\n const swatch = el('span', 'sf-cp-stop-swatch', root);\n const hex = el('span', 'sf-cp-stop-hex', root);\n const position = el('input', 'sf-cp-stop-pos', root);\n position.type = 'number';\n position.min = '0';\n position.max = '100';\n position.disabled = lockStops;\n const remove = el('button', 'sf-cp-stop-remove', root);\n remove.type = 'button';\n remove.textContent = '×';\n remove.title = 'Remove stop';\n remove.hidden = lockStops;\n\n root.addEventListener('mousedown', () => selectStop(picker, index));\n position.addEventListener('input', () => {\n const value = Number(position.value);\n if (!Number.isFinite(value)) {\n return;\n }\n state.gradient.stops[index] = { ...state.gradient.stops[index], position: clampPosition(value) };\n renderPreview(picker);\n });\n position.addEventListener('change', () => commitStopOrder(picker));\n remove.addEventListener('click', event => {\n event.stopPropagation();\n removeStop(picker, index);\n });\n return { root, swatch, hex, position, remove };\n}\n\nfunction renderStops(picker: Picker): void {\n const { view, state } = picker;\n const rows = view.stopRows;\n while (rows.length > state.gradient.stops.length) {\n rows.pop()?.root.remove();\n }\n while (rows.length < state.gradient.stops.length) {\n rows.push(createStopRow(picker, rows.length));\n }\n state.gradient.stops.forEach((stop, index) => {\n const row = rows[index];\n row.root.setAttribute('aria-selected', String(index === state.selected));\n row.swatch.style.background = stop.color;\n const alpha = alphaOf(stop.color);\n row.hex.textContent = alpha < 1 ? `${hexOf(stop.color)} ${Math.round(alpha * 100)}%` : hexOf(stop.color);\n if (document.activeElement !== row.position) {\n row.position.value = String(Math.round(stop.position));\n }\n row.remove.disabled = state.gradient.stops.length <= MIN_STOPS;\n });\n}\n\nfunction renderPreview(picker: Picker): void {\n picker.view.preview.style.background = gradientCss(picker.state.gradient);\n}\n\nexport function renderPicker(picker: Picker): void {\n const { view, state } = picker;\n view.solidTab.setAttribute('aria-selected', String(state.mode === 'solid'));\n view.gradientTab.setAttribute('aria-selected', String(state.mode === 'gradient'));\n view.section.hidden = state.mode !== 'gradient';\n\n const hex = activeHex(picker);\n const rgb = hexToRgb(hex);\n view.matrix.style.background = `hsl(${state.hsv.h}, 100%, 50%)`;\n view.matrixCursor.style.left = `${state.hsv.s * 100}%`;\n view.matrixCursor.style.top = `${(1 - state.hsv.v) * 100}%`;\n view.hueThumb.style.top = `${(state.hsv.h / 360) * 100}%`;\n\n for (const channel of CHANNELS) {\n view.channelRanges[channel].value = String(rgb[channel]);\n showRatio(view.channelRanges[channel]);\n if (document.activeElement !== view.channelNumbers[channel]) {\n view.channelNumbers[channel].value = String(rgb[channel]);\n }\n }\n const percent = Math.round(activeAlpha(picker) * 100);\n view.alphaRange.value = String(percent);\n showRatio(view.alphaRange);\n if (document.activeElement !== view.alphaNumber) {\n view.alphaNumber.value = String(percent);\n }\n const opaque = `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n view.alphaRow.style.background = `linear-gradient(to right, rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0), ${opaque}), conic-gradient(var(--sf-cp-check-a) 25%, var(--sf-cp-check-b) 0 50%, var(--sf-cp-check-a) 0 75%, var(--sf-cp-check-b) 0) 0 0 / 8px 8px`;\n if (document.activeElement !== view.hexInput) {\n view.hexInput.value = hex;\n }\n\n if (state.mode === 'gradient') {\n view.angleRange.value = String(Math.round(state.gradient.angle));\n showRatio(view.angleRange);\n if (document.activeElement !== view.angleNumber) {\n view.angleNumber.value = String(Math.round(state.gradient.angle));\n }\n renderPreview(picker);\n renderStops(picker);\n }\n}\n","const DARK_TOKENS = `\n --sf-cp-bg: #1a1a1a;\n --sf-cp-border: rgba(255, 255, 255, 0.08);\n --sf-cp-shadow: 0 8px 24px rgba(0, 0, 0, 0.6);\n --sf-cp-fg: rgba(255, 255, 255, 0.92);\n --sf-cp-muted: rgba(255, 255, 255, 0.6);\n --sf-cp-tabs-bg: rgba(255, 255, 255, 0.05);\n --sf-cp-tab-active-bg: rgba(255, 255, 255, 0.1);\n --sf-cp-field-bg: rgba(255, 255, 255, 0.04);\n --sf-cp-field-border: rgba(255, 255, 255, 0.08);\n --sf-cp-row-bg: rgba(255, 255, 255, 0.04);\n --sf-cp-hover: rgba(255, 255, 255, 0.08);\n --sf-cp-track: linear-gradient(to right, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.4));\n --sf-cp-thumb-bg: #e8e8e8;\n --sf-cp-thumb-border: #555;\n --sf-cp-danger: #ff7a77;\n --sf-cp-accent: rgba(255, 255, 255, 0.85);\n --sf-cp-check-a: #3b3b3f;\n --sf-cp-check-b: #2a2a2d;\n`;\n\nexport const BASE_CSS = `\n.sf-cp {\n --sf-cp-bg: #ffffff;\n --sf-cp-border: #e0e0e0;\n --sf-cp-shadow: 0 8px 24px rgba(15, 23, 42, 0.16);\n --sf-cp-fg: #333333;\n --sf-cp-muted: #666666;\n --sf-cp-tabs-bg: #f1f5f9;\n --sf-cp-tab-active-bg: #ffffff;\n --sf-cp-field-bg: #f8f8f8;\n --sf-cp-field-border: #e0e0e0;\n --sf-cp-row-bg: #f8f8f8;\n --sf-cp-hover: rgba(0, 0, 0, 0.05);\n --sf-cp-track: linear-gradient(to right, #e0e0e0, #606060);\n --sf-cp-thumb-bg: #ffffff;\n --sf-cp-thumb-border: #666666;\n --sf-cp-danger: #e53935;\n --sf-cp-accent: #0f172a;\n --sf-cp-check-a: #c8c8c8;\n --sf-cp-check-b: #ffffff;\n\n position: fixed;\n z-index: 10000;\n box-sizing: border-box;\n width: 268px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border: 1px solid var(--sf-cp-border);\n border-radius: 12px;\n background: var(--sf-cp-bg);\n box-shadow: var(--sf-cp-shadow);\n color: var(--sf-cp-fg);\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.sf-cp[data-sf-theme=\"dark\"] {${DARK_TOKENS}}\n\n@media (prefers-color-scheme: dark) {\n .sf-cp[data-sf-theme=\"auto\"] {${DARK_TOKENS}}\n}\n\n.sf-cp *,\n.sf-cp *::before,\n.sf-cp *::after {\n box-sizing: border-box;\n}\n\n`;\n","export const FIELDS_CSS = `\n.sf-cp-rows {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.sf-cp-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sf-cp-label {\n flex: none;\n width: 34px;\n color: var(--sf-cp-muted);\n font-weight: 600;\n}\n\n.sf-cp-fluid {\n --sf-ratio: 0;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n height: 26px;\n padding: 0 8px;\n border-radius: 8px;\n background: var(--sf-cp-row-bg);\n overflow: hidden;\n user-select: none;\n}\n\n.sf-cp-fluid[hidden] {\n display: none;\n}\n\n.sf-cp-fluid-fill {\n position: absolute;\n inset: 0 auto 0 0;\n width: calc(var(--sf-ratio) * 100%);\n border-radius: 8px;\n background: linear-gradient(90deg, color-mix(in srgb, currentColor 5%, transparent), color-mix(in srgb, currentColor 18%, transparent));\n pointer-events: none;\n}\n\n.sf-cp-fluid--alpha .sf-cp-fluid-fill {\n display: none;\n}\n\n.sf-cp-fluid-thumb {\n position: absolute;\n top: 50%;\n left: calc(var(--sf-ratio) * 100% - var(--sf-ratio) * 5px);\n width: 5px;\n height: 14px;\n border-radius: 999px;\n background: var(--sf-cp-fg);\n box-shadow: 0 0 0 1px var(--sf-cp-bg);\n transform: translateY(-50%);\n pointer-events: none;\n transition: height 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease;\n}\n\n.sf-cp-fluid:hover .sf-cp-fluid-thumb,\n.sf-cp-fluid:focus-within .sf-cp-fluid-thumb {\n height: 20px;\n}\n\n.sf-cp-fluid:has(.sf-cp-fluid-range:active) .sf-cp-fluid-thumb {\n height: 26px;\n box-shadow: 0 0 0 1px var(--sf-cp-bg), 0 0 0 5px color-mix(in srgb, var(--sf-cp-fg) 15%, transparent);\n}\n\n.sf-cp-fluid-label {\n position: relative;\n color: var(--sf-cp-muted);\n font-size: 11px;\n font-weight: 600;\n pointer-events: none;\n}\n\n.sf-cp-fluid-range {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: ew-resize;\n}\n\n.sf-cp-number.sf-cp-fluid-number {\n position: relative;\n z-index: 2;\n width: 44px;\n padding: 1px 6px;\n border: none;\n background: transparent;\n text-align: right;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n -moz-appearance: textfield;\n appearance: textfield;\n}\n\n.sf-cp-fluid-number::-webkit-inner-spin-button,\n.sf-cp-fluid-number::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.sf-cp-fluid-number:hover {\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-number.sf-cp-fluid-number:focus {\n background: var(--sf-cp-field-bg);\n box-shadow: 0 0 0 1px var(--sf-cp-accent);\n}\n\n.sf-cp-number,\n.sf-cp-eyedropper {\n flex: none;\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n margin-left: auto;\n padding: 0;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 6px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-fg);\n cursor: pointer;\n}\n\n.sf-cp-eyedropper:hover {\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-text {\n flex: none;\n width: 52px;\n padding: 3px 8px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 6px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-fg);\n font: inherit;\n font-weight: 500;\n text-align: center;\n}\n\n.sf-cp-text {\n flex: 1;\n width: auto;\n min-width: 0;\n text-align: left;\n font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n text-transform: uppercase;\n}\n\n.sf-cp-number:focus,\n.sf-cp-text:focus {\n outline: none;\n border-color: var(--sf-cp-accent);\n}\n\n`;\n","export const GRADIENT_CSS = `\n.sf-cp-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-top: 12px;\n border-top: 1px solid var(--sf-cp-border);\n}\n\n.sf-cp-section[hidden] {\n display: none;\n}\n\n.sf-cp-preview {\n height: 34px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 8px;\n}\n\n.sf-cp-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.sf-cp-heading {\n color: var(--sf-cp-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.5px;\n text-transform: uppercase;\n}\n\n.sf-cp-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 5px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 15px;\n line-height: 1;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n}\n\n.sf-cp-icon-btn:hover:not(:disabled) {\n background: var(--sf-cp-hover);\n color: var(--sf-cp-fg);\n}\n\n.sf-cp-icon-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.sf-cp-stops {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 132px;\n overflow-y: auto;\n}\n\n.sf-cp-stop {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: var(--sf-cp-row-bg);\n cursor: pointer;\n}\n\n.sf-cp-stop[aria-selected=\"true\"] {\n border-color: var(--sf-cp-accent);\n}\n\n.sf-cp-stop-swatch {\n flex: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 1px 2px rgba(0, 0, 0, 0.2);\n}\n\n.sf-cp-stop-hex {\n flex: 1;\n min-width: 0;\n color: var(--sf-cp-fg);\n font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n text-transform: uppercase;\n}\n\n.sf-cp-stop-pos {\n flex: none;\n width: 46px;\n padding: 2px 4px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 4px;\n background: var(--sf-cp-bg);\n color: var(--sf-cp-muted);\n font: inherit;\n text-align: center;\n}\n\n.sf-cp-stop-pos:focus {\n outline: none;\n border-color: var(--sf-cp-accent);\n}\n\n.sf-cp-stop-remove {\n flex: none;\n width: 20px;\n height: 20px;\n padding: 0;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 15px;\n line-height: 1;\n cursor: pointer;\n}\n\n.sf-cp-stop-remove:hover:not(:disabled) {\n background: var(--sf-cp-hover);\n color: var(--sf-cp-danger);\n}\n\n.sf-cp-stop-remove:disabled {\n opacity: 0.3;\n cursor: default;\n}\n\n.sf-cp-reset {\n padding: 4px 0 0;\n border: none;\n border-top: 1px solid var(--sf-cp-border);\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sf-cp-reset:hover {\n color: var(--sf-cp-accent);\n}\n`;\n","export const TABS_AND_AREA_CSS = `\n.sf-cp-tabs {\n display: flex;\n gap: 2px;\n height: 28px;\n padding: 2px;\n border-radius: 8px;\n background: var(--sf-cp-tabs-bg);\n}\n\n.sf-cp-tabs[hidden] {\n display: none;\n}\n\n.sf-cp-tab {\n flex: 1;\n padding: 0 12px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.sf-cp-tab:hover {\n color: var(--sf-cp-fg);\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-tab[aria-selected=\"true\"] {\n background: var(--sf-cp-tab-active-bg);\n color: var(--sf-cp-fg);\n box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);\n}\n\n.sf-cp-area {\n display: flex;\n gap: 12px;\n height: 148px;\n}\n\n.sf-cp-matrix {\n position: relative;\n flex: 1;\n border-radius: 8px;\n overflow: hidden;\n cursor: crosshair;\n user-select: none;\n}\n\n.sf-cp-matrix-white,\n.sf-cp-matrix-black {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n.sf-cp-matrix-white {\n background: linear-gradient(to right, #ffffff, rgba(255, 255, 255, 0));\n}\n\n.sf-cp-matrix-black {\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0), #000000);\n}\n\n.sf-cp-matrix-cursor {\n position: absolute;\n width: 14px;\n height: 14px;\n border: 2px solid #ffffff;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.sf-cp-hue {\n position: relative;\n width: 12px;\n border-radius: 6px;\n cursor: pointer;\n user-select: none;\n background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n}\n\n.sf-cp-hue-thumb {\n position: absolute;\n left: 50%;\n width: 18px;\n height: 5px;\n border: 2px solid #ffffff;\n border-radius: 3px;\n background: transparent;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.35);\n}\n\n`;\n","import { BASE_CSS } from './styles/base';\nimport { FIELDS_CSS } from './styles/fields';\nimport { GRADIENT_CSS } from './styles/gradient';\nimport { TABS_AND_AREA_CSS } from './styles/tabsAndArea';\n\nexport const COLOR_PICKER_CSS = `${BASE_CSS}${TABS_AND_AREA_CSS}${FIELDS_CSS}${GRADIENT_CSS}`;\n","import { COLOR_PICKER_CSS } from './styles';\n\nexport type ColorPickerTheme = 'light' | 'dark' | 'auto';\n\nexport type ColorPickerThemeOption = ColorPickerTheme | (() => ColorPickerTheme);\n\nexport function resolveTheme(option: ColorPickerThemeOption | undefined): ColorPickerTheme {\n return (typeof option === 'function' ? option() : option) ?? 'auto';\n}\n\nconst STYLE_ID = 'sf-color-picker-styles';\n\nexport function ensureColorPickerStyles(doc: Document): void {\n if (doc.getElementById(STYLE_ID)) {\n return;\n }\n const style = doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = COLOR_PICKER_CSS;\n doc.head.appendChild(style);\n}\n","import { hexToHsv } from './color';\nimport type { Picker } from './popoverActions';\nimport { bindPickerEvents } from './popoverEvents';\nimport { renderPicker } from './popoverRender';\nimport { type Anchor, buildPickerView, clampIntoViewport } from './popoverView';\nimport { type ColorPickerTheme, ensureColorPickerStyles } from './theme';\nimport { type PickerValue, toAlpha, toGradient, toSolid } from './value';\n\nexport interface ColorPopoverOptions {\n seed: PickerValue;\n anchor: Anchor;\n theme?: ColorPickerTheme;\n allowGradient?: boolean;\n lockStops?: boolean;\n onCommit(value: string): void;\n onReset?(): void;\n}\n\nexport interface ColorPopoverHandle {\n close(): void;\n}\n\nexport function openColorPopover(options: ColorPopoverOptions): ColorPopoverHandle {\n const { seed, anchor, onCommit, onReset } = options;\n const allowGradient = options.allowGradient ?? true;\n const lockStops = options.lockStops ?? false;\n ensureColorPickerStyles(document);\n\n const solid = toSolid(seed);\n const view = buildPickerView({ anchor, theme: options.theme, allowGradient, lockStops, withReset: Boolean(onReset) });\n const picker: Picker = {\n view,\n lockStops,\n onCommit,\n state: {\n mode: allowGradient ? seed.mode : 'solid',\n solid,\n alpha: toAlpha(seed),\n gradient: toGradient(seed),\n selected: 0,\n hsv: hexToHsv(solid),\n },\n render: () => renderPicker(picker),\n };\n\n const root = view.root;\n document.body.appendChild(root);\n clampIntoViewport(root, anchor);\n\n const disposers = bindPickerEvents(picker);\n view.resetButton?.addEventListener('click', () => {\n onReset?.();\n close();\n });\n\n const onOutsideClick = (event: MouseEvent) => {\n if (!root.contains(event.target as Node)) {\n close();\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n close();\n }\n };\n\n const attach = window.setTimeout(() => {\n document.addEventListener('mousedown', onOutsideClick, true);\n document.addEventListener('keydown', onKeyDown);\n }, 0);\n\n function close(): void {\n window.clearTimeout(attach);\n document.removeEventListener('mousedown', onOutsideClick, true);\n document.removeEventListener('keydown', onKeyDown);\n for (const dispose of disposers) {\n dispose();\n }\n root.remove();\n }\n\n picker.render();\n\n return { close };\n}\n","import { screenRectOf } from '../../dom';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { readGradientValue } from './gradientLookup';\nimport { type ColorPopoverHandle, openColorPopover } from './popover';\nimport type { ColorEditTarget } from './target';\nimport { type ColorPickerThemeOption, resolveTheme } from './theme';\nimport { seedFrom } from './value';\n\nexport type ColorEditResolver = (event: Event, rules: EditableRules | undefined) => ColorEditTarget | null;\n\nexport class ColorEditSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n readonly #theme: ColorPickerThemeOption | undefined;\n readonly #resolve: ColorEditResolver;\n #open: ColorPopoverHandle | null = null;\n\n constructor(\n svg: SVGSVGElement,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme: ColorPickerThemeOption | undefined,\n resolve: ColorEditResolver,\n ) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n this.#theme = theme;\n this.#resolve = resolve;\n }\n\n readonly trigger = (event: Event): void => {\n const target = this.#resolve(event, this.#rules);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.#open?.close();\n\n const fill = target.node.getAttribute('fill');\n const hasOverride = target.node.getAttribute('data-sf-color-override') === 'true';\n this.#open = openColorPopover({\n seed: seedFrom(fill, readGradientValue(this.#svg, fill)),\n anchor: screenRectOf(target.node),\n theme: resolveTheme(this.#theme),\n allowGradient: !target.solidOnly,\n onCommit: color => {\n this.#emitter.emit('propertyChange', { owner: target.owner, path: target.path, value: color });\n },\n onReset: hasOverride\n ? () => {\n this.#emitter.emit('propertyChange', {\n owner: target.owner,\n path: target.path,\n value: 'none',\n quote: false,\n });\n }\n : undefined,\n });\n };\n\n cancel(): void {\n this.#open?.close();\n this.#open = null;\n }\n}\n","export type EditableRules = Record<string, boolean> | ((path: string) => boolean);\n\nconst SEGMENT = '[^.\\\\[\\\\]]+';\n\nfunction patternPart(part: string): string {\n if (part === '**') {\n return '.+';\n }\n if (part === '*') {\n return SEGMENT;\n }\n return part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n return new RegExp(\n `^${pattern\n .split(/(\\*\\*|\\*)/)\n .map(patternPart)\n .join('')}$`,\n );\n}\n\nconst cache = new Map<string, RegExp>();\n\nfunction matches(pattern: string, path: string): boolean {\n let expression = cache.get(pattern);\n if (expression === undefined) {\n expression = patternToRegExp(pattern);\n cache.set(pattern, expression);\n }\n return expression.test(path);\n}\n\nexport function isEditablePath(path: string, rules: EditableRules | undefined): boolean {\n if (rules === undefined) {\n return true;\n }\n if (typeof rules === 'function') {\n return rules(path);\n }\n\n const entries = Object.entries(rules);\n if (entries.some(([pattern, allowed]) => !allowed && matches(pattern, path))) {\n return false;\n }\n return entries.some(([pattern, allowed]) => allowed && matches(pattern, path));\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { type EditableRules, isEditablePath } from '../propertyEdit/editable';\n\nexport interface ColorEditTarget {\n owner: OwnerRef;\n path: string;\n node: SVGGraphicsElement;\n solidOnly: boolean;\n}\n\nlet selectedBeforeGesture: ReadonlySet<string> = new Set();\n\nexport function snapshotSelectionBeforeGesture(svg: SVGSVGElement): void {\n selectedBeforeGesture = new Set(\n [...svg.querySelectorAll('[data-sf-selection-overlay]')].map(\n el => el.getAttribute('data-sf-selection-overlay') ?? '',\n ),\n );\n}\n\nfunction requiresPriorSelection(node: SVGGraphicsElement, owner: { id: string }): boolean {\n if (node.getAttribute('data-sf-role') !== 'isometric') {\n return false;\n }\n return !selectedBeforeGesture.has(owner.id);\n}\n\nfunction resolveTarget(\n event: Event,\n selector: string,\n pathOf: (node: SVGGraphicsElement) => string | null,\n rules: EditableRules | undefined,\n): ColorEditTarget | null {\n const node = (event.target as Element | null)?.closest?.(selector) as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n\n const path = pathOf(node);\n const owner = resolveOwner(node);\n if (!path || !owner || !isEditablePath(path, rules) || requiresPriorSelection(node, owner)) {\n return null;\n }\n const solidOnly = node.getAttribute('data-sf-prop-solid-only') === 'true';\n return { owner, path, node, solidOnly };\n}\n\nexport function resolveColorEditTarget(event: Event, rules: EditableRules | undefined): ColorEditTarget | null {\n return resolveTarget(event, '[data-sf-prop-kind=\"color\"]', node => node.getAttribute('data-sf-prop'), rules);\n}\n\nexport function resolveBarColorEditTarget(event: Event, rules: EditableRules | undefined): ColorEditTarget | null {\n return resolveTarget(event, '[data-sf-color-prop]', node => node.getAttribute('data-sf-color-prop'), rules);\n}\n","import { resolveOwner, screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { isEditablePath } from '../propertyEdit/editable';\nimport { readGradientValue } from './gradientLookup';\nimport { parseGradient, sortStops } from './gradientValue';\nimport { type ColorPopoverHandle, openColorPopover } from './popover';\nimport { type ColorPickerThemeOption, resolveTheme } from './theme';\nimport { seedFrom } from './value';\n\ninterface ZoneGradientTarget {\n owner: OwnerRef;\n node: SVGGraphicsElement;\n}\n\nfunction resolveZoneGradientTarget(event: Event): ZoneGradientTarget | null {\n const node = (event.target as Element | null)?.closest?.(\n '[data-sf-zone-gradient=\"true\"]',\n ) as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n const owner = resolveOwner(node);\n if (!owner) {\n return null;\n }\n return { owner, node };\n}\n\nexport class ZoneGradientSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n readonly #theme: ColorPickerThemeOption | undefined;\n #open: ColorPopoverHandle | null = null;\n\n constructor(\n svg: SVGSVGElement,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme: ColorPickerThemeOption | undefined,\n ) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n this.#theme = theme;\n }\n\n readonly trigger = (event: Event): void => {\n if (!isEditablePath('zones[0][1]', this.#rules)) {\n return;\n }\n const target = resolveZoneGradientTarget(event);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.#open?.close();\n\n const fill = target.node.getAttribute('fill');\n const gradient = readGradientValue(this.#svg, fill);\n if (!gradient) {\n return;\n }\n const beforeStops = sortStops(gradient.stops);\n\n this.#open = openColorPopover({\n seed: seedFrom(fill, gradient),\n anchor: screenRectOf(target.node),\n theme: resolveTheme(this.#theme),\n allowGradient: true,\n lockStops: true,\n onCommit: value => {\n const next = parseGradient(value);\n if (!next) {\n return;\n }\n const afterStops = sortStops(next.stops);\n afterStops.forEach((stop, index) => {\n const before = beforeStops[index];\n const path = `zones[${index}][1]`;\n if (before && stop.color !== before.color && isEditablePath(path, this.#rules)) {\n this.#emitter.emit('propertyChange', { owner: target.owner, path, value: stop.color });\n }\n });\n },\n });\n };\n\n cancel(): void {\n this.#open?.close();\n this.#open = null;\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { ColorEditSession } from './session';\nimport { resolveBarColorEditTarget, resolveColorEditTarget, snapshotSelectionBeforeGesture } from './target';\nimport type { ColorPickerThemeOption } from './theme';\nimport { ZoneGradientSession } from './zoneGradientSession';\n\nexport interface ColorEditHandle {\n destroy(): void;\n}\n\nexport function bindColorEdit(\n viewer: Viewer,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme?: ColorPickerThemeOption,\n): ColorEditHandle {\n const svg = viewer.svg;\n const swatch = new ColorEditSession(svg, emitter, rules, theme, resolveColorEditTarget);\n const mark = new ColorEditSession(svg, emitter, rules, theme, resolveBarColorEditTarget);\n const zoneGradient = new ZoneGradientSession(svg, emitter, rules, theme);\n const onPointerDown = () => snapshotSelectionBeforeGesture(svg);\n\n svg.addEventListener('pointerdown', onPointerDown, true);\n svg.addEventListener('click', swatch.trigger, true);\n svg.addEventListener('click', zoneGradient.trigger, true);\n svg.addEventListener('dblclick', mark.trigger, true);\n\n return {\n destroy() {\n swatch.cancel();\n mark.cancel();\n zoneGradient.cancel();\n svg.removeEventListener('pointerdown', onPointerDown, true);\n svg.removeEventListener('click', swatch.trigger, true);\n svg.removeEventListener('click', zoneGradient.trigger, true);\n svg.removeEventListener('dblclick', mark.trigger, true);\n },\n };\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\n\nexport interface DeleteSelectionHandle {\n destroy(): void;\n}\n\nexport function bindDeleteSelection(viewer: Viewer, emitter: Emitter): DeleteSelectionHandle {\n const svg = viewer.svg;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Backspace' && e.key !== 'Delete') {\n return;\n }\n const owners = viewer.getSelection();\n if (!owners.length) {\n return;\n }\n e.preventDefault();\n emitter.emit('delete', { owners });\n };\n\n svg.addEventListener('keydown', onKeyDown);\n\n return {\n destroy() {\n svg.removeEventListener('keydown', onKeyDown);\n },\n };\n}\n","import type { Side } from '../../model/geometry/types';\nimport { Emitter as GenericEmitter } from '../eventing/emitter';\nimport type { OwnerRef } from '../viewer';\n\nexport interface TextChangeEvent {\n owner: OwnerRef;\n text: string;\n}\n\nexport interface MoveChangeEvent {\n owner: OwnerRef;\n dx: number;\n dy: number;\n}\n\nexport interface ResizeChangeEvent {\n owner: OwnerRef;\n dx: number;\n dy: number;\n dWidth: number;\n dHeight: number;\n x: number;\n y: number;\n width: number;\n height: number;\n depth?: number;\n}\n\nexport interface LinkReconnectEvent {\n owner: OwnerRef;\n end: 'from' | 'to';\n target: OwnerRef;\n side: Side;\n fraction: number;\n}\n\nexport interface LinkSegmentChangeEvent {\n owner: OwnerRef;\n index: number;\n offset: number;\n}\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\nexport interface QuickDuplicateEvent {\n owner: OwnerRef;\n direction: 'top' | 'right' | 'bottom' | 'left' | IsometricQuickDuplicateDirection;\n}\n\nexport interface DeleteEvent {\n owners: OwnerRef[];\n}\n\nexport interface LinkToEvent {\n owner: OwnerRef;\n direction: 'top' | 'right' | 'bottom' | 'left';\n target: OwnerRef;\n side: Side;\n fraction: number;\n}\n\nexport interface ChartValueChangeEvent {\n owner: OwnerRef;\n series: string;\n index: number;\n value: number;\n}\n\nexport interface ChartValuePreviewEvent {\n owner: OwnerRef;\n series: string;\n index: number;\n value: number | null;\n}\n\nexport type PropertyValue = string | number | boolean | readonly number[];\n\nexport interface PropertyChangeEvent {\n owner: OwnerRef;\n path: string;\n value: PropertyValue;\n quote?: boolean;\n}\n\nexport interface PathPoint {\n x: number;\n y: number;\n}\n\nexport interface PathPointChangeEvent {\n owner: OwnerRef;\n points: PathPoint[];\n}\n\nexport interface PathDrawCompleteEvent {\n points: PathPoint[];\n closed: boolean;\n tension: number;\n}\n\nexport interface SankeyNodeMoveEvent {\n owner: OwnerRef;\n nodeId: string;\n dx: number;\n dy: number;\n}\n\nexport interface SankeyNodeRenameEvent {\n owner: OwnerRef;\n nodeId: string;\n label: string;\n}\n\nexport interface InteractionEventMap {\n textChange: TextChangeEvent;\n moveChange: MoveChangeEvent;\n resizeChange: ResizeChangeEvent;\n linkReconnect: LinkReconnectEvent;\n linkSegmentChange: LinkSegmentChangeEvent;\n quickDuplicate: QuickDuplicateEvent;\n linkTo: LinkToEvent;\n delete: DeleteEvent;\n chartValueChange: ChartValueChangeEvent;\n chartValuePreview: ChartValuePreviewEvent;\n propertyChange: PropertyChangeEvent;\n pathPointChange: PathPointChangeEvent;\n pathDrawComplete: PathDrawCompleteEvent;\n sankeyNodeMove: SankeyNodeMoveEvent;\n sankeyNodeRename: SankeyNodeRenameEvent;\n}\n\nexport type InteractionEventName = keyof InteractionEventMap;\nexport class Emitter extends GenericEmitter<InteractionEventMap> {}\nexport type { Unsubscribe } from '../eventing/emitter';\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport { edgePointToward, elementCenter } from '../../../model/geometry/rectangle';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { Link, PathType } from '../../../model/link';\nimport { calculateLinkRoute, getLineMidpoint } from '../../../renderScene/artifacts/link/geometry';\nimport type { PathSegment } from '../../../renderScene/artifacts/link/geometry/routing/types';\nimport { roundedOrthogonalPathData } from '../../../renderScene/artifacts/link/roundedOrthogonalPathData';\n\nexport function centerOf(bounds: Rect): { x: number; y: number } {\n return elementCenter(bounds);\n}\n\nexport function anchorPoint(bounds: Rect, side: Side | null, other: Rect): { x: number; y: number } {\n if (side) {\n return pointAtPort(bounds, { side, offset: 0.5 });\n }\n return edgePointToward(bounds, other);\n}\n\nfunction polylinePathData(points: number[]): string {\n if (points.length < 4) {\n return '';\n }\n let path = `M ${points[0]} ${points[1]}`;\n for (let index = 2; index < points.length; index += 2) {\n path += ` L ${points[index]} ${points[index + 1]}`;\n }\n return path;\n}\n\nexport function previewPathData(\n points: number[],\n segments: PathSegment[],\n pathType: PathType,\n strokeWidth: number,\n): string {\n if (pathType === 'curved' && points.length >= 8) {\n return `M ${points[0]} ${points[1]} C ${points[2]} ${points[3]} ${points[4]} ${points[5]} ${points[6]} ${points[7]}`;\n }\n if (pathType === 'orthogonal' && segments.length > 0) {\n return roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));\n }\n return polylinePathData(points);\n}\n\n// The link that stands in for the one being drawn, with its ends on a side of a block or loose in the air when there is no side yet.\nexport function previewLink(fromSide: Side | null, toSide: Side | null): Link {\n return {\n id: 'preview',\n fromId: '',\n toId: '',\n layerGroup: '',\n orderKey: '',\n isVisible: true,\n isLocked: false,\n fromPoint: fromSide ? { kind: 'side', side: fromSide, offset: 0.5 } : undefined,\n toPoint: toSide ? { kind: 'side', side: toSide, offset: 0.5 } : undefined,\n };\n}\n\nexport function routePreviewLink(\n fromBounds: Rect,\n toBounds: Rect,\n fromSide: Side | null,\n toSide: Side | null,\n pathType: PathType,\n) {\n const from = anchorPoint(fromBounds, fromSide, toBounds);\n const to = anchorPoint(toBounds, toSide, fromBounds);\n const { points, segments } = calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);\n return { points, segments, midpoint: getLineMidpoint(points, pathType, from, to) };\n}\n","import type { Rect, Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport { findOwnerNode, isPrimary } from '../../dom';\nimport { routePreviewLink } from './geometry';\nimport type { LiveLink } from './types';\n\ninterface OppositeEndpoint {\n draggedIsFrom: boolean;\n bounds: Rect;\n}\n\ninterface LiveLinkDraft {\n path: SVGPathElement;\n pathType: PathType;\n fromSide: Side | null;\n toSide: Side | null;\n otherBounds: Rect;\n draggedIsFrom: boolean;\n strokeWidth: number;\n}\n\ninterface LiveLinkLabelCapture {\n labelText: SVGTextElement | null;\n initialMidpoint: { x: number; y: number } | null;\n labelGapSize: { width: number; height: number } | null;\n}\n\nfunction discoverLiveLink(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n draggedBounds: Rect,\n): LiveLink | null {\n const draft = createLiveLinkDraft(svg, path, canvasObjectId);\n if (!draft) {\n return null;\n }\n return { ...draft, ...captureLiveLinkLabel(svg, draft, draggedBounds) };\n}\n\nfunction createLiveLinkDraft(svg: SVGSVGElement, path: SVGPathElement, canvasObjectId: string): LiveLinkDraft | null {\n const oppositeEndpoint = resolveOppositeEndpoint(svg, path, canvasObjectId);\n if (!oppositeEndpoint) {\n return null;\n }\n return {\n path,\n pathType: (path.getAttribute('data-sf-route') as PathType | null) ?? 'straight',\n fromSide: path.getAttribute('data-sf-from-side') as Side | null,\n toSide: path.getAttribute('data-sf-to-side') as Side | null,\n otherBounds: oppositeEndpoint.bounds,\n draggedIsFrom: oppositeEndpoint.draggedIsFrom,\n strokeWidth: Number(path.getAttribute('stroke-width')) || 2,\n };\n}\n\nfunction resolveOppositeEndpoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n): OppositeEndpoint | null {\n const draggedIsFrom = path.getAttribute('data-sf-from') === canvasObjectId;\n const otherId = path.getAttribute(draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n if (!otherId) {\n return null;\n }\n const otherPrimary = findOwnerNode(svg, otherId, isPrimary);\n return otherPrimary ? { draggedIsFrom, bounds: otherPrimary.getBBox() } : null;\n}\n\nfunction captureLiveLinkLabel(svg: SVGSVGElement, draft: LiveLinkDraft, draggedBounds: Rect): LiveLinkLabelCapture {\n const labelText = findLinkLabel(svg, draft.path);\n if (!labelText) {\n return { labelText: null, initialMidpoint: null, labelGapSize: null };\n }\n return {\n labelText,\n initialMidpoint: initialLinkMidpoint(draft, draggedBounds),\n labelGapSize: draft.path.getAttribute('data-sf-label-gap') === 'true' ? labelText.getBBox() : null,\n };\n}\n\nfunction findLinkLabel(svg: SVGSVGElement, path: SVGPathElement): SVGTextElement | null {\n const linkId = path.getAttribute('data-sf-id');\n return linkId ? svg.querySelector<SVGTextElement>(`text[data-sf-id=\"${CSS.escape(linkId)}\"]`) : null;\n}\n\nfunction initialLinkMidpoint(draft: LiveLinkDraft, draggedBounds: Rect): { x: number; y: number } {\n const fromBounds = draft.draggedIsFrom ? draggedBounds : draft.otherBounds;\n const toBounds = draft.draggedIsFrom ? draft.otherBounds : draggedBounds;\n return routePreviewLink(fromBounds, toBounds, draft.fromSide, draft.toSide, draft.pathType).midpoint;\n}\n\nexport function findLiveLinks(svg: SVGSVGElement, canvasObjectId: string, draggedBounds: Rect): LiveLink[] {\n const escapedId = CSS.escape(canvasObjectId);\n const candidates = svg.querySelectorAll<SVGPathElement>(\n `path[data-sf-from=\"${escapedId}\"], path[data-sf-to=\"${escapedId}\"]`,\n );\n const links: LiveLink[] = [];\n for (const path of candidates) {\n const link = discoverLiveLink(svg, path, canvasObjectId, draggedBounds);\n if (link) {\n links.push(link);\n }\n }\n return links;\n}\n","import { type IsometricFace, isometricFaceCenter } from '../../../model/isometricObject';\nimport { findOwnerNode, isometricGeometryOf, isPrimary } from '../../dom';\nimport type { LiveFaceLink } from './types';\n\ntype IsometricObjectSize = Parameters<typeof isometricFaceCenter>[0];\n\nfunction resolveOtherFacePoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n): { otherPoint: ReturnType<typeof isometricFaceCenter>; draggedIsFrom: boolean; face: IsometricFace } | null {\n const draggedIsFrom = path.getAttribute('data-sf-from') === canvasObjectId;\n const otherId = path.getAttribute(draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n const face = path.getAttribute(draggedIsFrom ? 'data-sf-from-face' : 'data-sf-to-face') as IsometricFace | null;\n const otherFace = path.getAttribute(draggedIsFrom ? 'data-sf-to-face' : 'data-sf-from-face') as IsometricFace | null;\n if (!otherId || !face || !otherFace) {\n return null;\n }\n const otherPrimary = findOwnerNode(svg, otherId, isPrimary);\n const otherGeometry = otherPrimary && isometricGeometryOf(otherPrimary);\n if (!otherGeometry?.bounds) {\n return null;\n }\n const otherObject: IsometricObjectSize = {\n x: otherGeometry.bounds.x,\n y: otherGeometry.bounds.y,\n width: otherGeometry.width,\n height: otherGeometry.height,\n depth: otherGeometry.depth,\n };\n return { otherPoint: isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };\n}\n\nexport function findLiveFaceLinks(svg: SVGSVGElement, canvasObjectId: string): LiveFaceLink[] {\n const escapedId = CSS.escape(canvasObjectId);\n const candidates = svg.querySelectorAll<SVGPathElement>(\n `path[data-sf-kind=\"connection\"][data-sf-from=\"${escapedId}\"], path[data-sf-kind=\"connection\"][data-sf-to=\"${escapedId}\"]`,\n );\n const links: LiveFaceLink[] = [];\n for (const path of candidates) {\n const resolved = resolveOtherFacePoint(svg, path, canvasObjectId);\n if (resolved) {\n links.push({ path, ...resolved });\n }\n }\n return links;\n}\n","import { isometricFaceCenter } from '../../../model/isometricObject';\nimport type { LiveFaceLink } from './types';\n\ntype IsometricObjectSize = Parameters<typeof isometricFaceCenter>[0];\n\nfunction updateLiveFaceLink(link: LiveFaceLink, liveObject: IsometricObjectSize): void {\n const draggedPoint = isometricFaceCenter(liveObject, link.face);\n const from = link.draggedIsFrom ? draggedPoint : link.otherPoint;\n const to = link.draggedIsFrom ? link.otherPoint : draggedPoint;\n link.path.setAttribute('d', `M ${from.x} ${from.y} L ${to.x} ${to.y}`);\n}\n\nexport function updateLiveFaceLinks(links: LiveFaceLink[], liveObject: IsometricObjectSize): void {\n for (const link of links) {\n updateLiveFaceLink(link, liveObject);\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { labelGapDash } from '../../../renderScene/artifacts/link/geometry';\nimport { previewPathData, routePreviewLink } from './geometry';\nimport type { LiveLink } from './types';\n\nfunction updateLabelPosition(link: LiveLink, midpoint: { x: number; y: number }): void {\n if (!link.labelText || !link.initialMidpoint) {\n return;\n }\n const dx = midpoint.x - link.initialMidpoint.x;\n const dy = midpoint.y - link.initialMidpoint.y;\n link.labelText.setAttribute('transform', `translate(${dx} ${dy})`);\n}\n\nfunction updateLabelGap(link: LiveLink, points: number[]): void {\n if (!link.labelGapSize) {\n return;\n }\n const gap = labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);\n if (gap) {\n link.path.setAttribute('stroke-dasharray', `${gap.dashBefore} ${gap.gapLength} 1000000`);\n } else {\n link.path.removeAttribute('stroke-dasharray');\n }\n}\n\nfunction updateLiveLink(link: LiveLink, draggedBounds: Rect): void {\n const fromBounds = link.draggedIsFrom ? draggedBounds : link.otherBounds;\n const toBounds = link.draggedIsFrom ? link.otherBounds : draggedBounds;\n const { points, segments, midpoint } = routePreviewLink(\n fromBounds,\n toBounds,\n link.fromSide,\n link.toSide,\n link.pathType,\n );\n link.path.setAttribute('d', previewPathData(points, segments, link.pathType, link.strokeWidth));\n updateLabelPosition(link, midpoint);\n updateLabelGap(link, points);\n}\n\nexport function updateLiveLinks(liveLinks: LiveLink[], draggedBounds: Rect): void {\n for (const link of liveLinks) {\n updateLiveLink(link, draggedBounds);\n }\n}\n","import { AXIS_COS, AXIS_SIN } from '../../model/isometricObject';\n\nexport const SNAP_GRID_ATTR = 'data-sf-snap-grid';\nexport const SNAP_ATTR = 'data-sf-snap';\n\nexport function isSnapDisabled(svg: SVGSVGElement): boolean {\n return svg.getAttribute(SNAP_ATTR) === 'off';\n}\n\nexport const SNAP_DISTANCE_ATTR = 'data-sf-snap-distance';\nconst DEFAULT_SNAP_DISTANCE_PX = 20;\n\n// How close, in screen pixels, a shape has to come to another before it snaps. The host can set it as a number on the svg.\nexport function snapDistancePx(svg: SVGSVGElement): number {\n const value = Number(svg.getAttribute(SNAP_DISTANCE_ATTR));\n return value > 0 ? value : DEFAULT_SNAP_DISTANCE_PX;\n}\n\nconst ISOMETRIC_GRID = /^isometric:(\\d+(?:\\.\\d+)?)$/;\n\nexport function readIsometricSnapStep(svg: SVGSVGElement): number | null {\n const match = ISOMETRIC_GRID.exec(svg.getAttribute(SNAP_GRID_ATTR) ?? '');\n const step = match ? Number(match[1]) : 0;\n return step > 0 ? step : null;\n}\n\nexport function nearestIsometricLatticePoint(point: { x: number; y: number }, step: number): { x: number; y: number } {\n const u = point.x / (AXIS_COS * step);\n const v = point.y / (AXIS_SIN * step);\n const i = Math.round((u + v) / 2);\n const j = Math.round((u - v) / 2);\n return { x: (i + j) * AXIS_COS * step, y: (i - j) * AXIS_SIN * step };\n}\n\nexport function snapToStep(value: number, step: number, min: number): number {\n return Math.max(min, Math.round(value / step) * step);\n}\n","import { isometricFaces, isometricTopFaceCenter } from '../../../model/isometricObject';\nimport { roundedPolygonPath } from '../../../renderScene/scene/roundedPolygonPath';\nimport { axisArrowPlacements, updateAxisArrowGroup, updateHalo } from '../../dom';\nimport type { IsometricAxis } from '../../dom/selectionOverlay/isometric';\nimport type { IsometricGeometryNodes, IsometricObjectSize } from './state';\n\nconst LABEL_GAP = 12;\nconst LABEL_HEIGHT = 20;\nconst LABEL_FONT_SIZE = 12;\nconst LABEL_LINE_HEIGHT = 1.2;\nconst LABEL_BASELINE_OFFSET =\n -LABEL_GAP - LABEL_HEIGHT + (LABEL_HEIGHT - LABEL_FONT_SIZE * LABEL_LINE_HEIGHT) / 2 + LABEL_FONT_SIZE;\n\nexport function applyIsometricAxisPreview(\n nodes: IsometricGeometryNodes,\n object: IsometricObjectSize,\n cornerRadius: number,\n overlay: { halo: SVGPathElement | null; arrows: Record<IsometricAxis, SVGGElement | null> },\n svg: SVGSVGElement,\n): void {\n const faces = isometricFaces(object);\n\n nodes.top?.setAttribute('d', roundedPolygonPath(faces.top, 0));\n nodes.front?.setAttribute('d', roundedPolygonPath(faces.front, 0));\n nodes.side?.setAttribute('d', roundedPolygonPath(faces.right, 0));\n\n const silhouette = [faces.top[0], faces.top[1], faces.right[2], faces.front[2], faces.front[3], faces.top[3]];\n const hullPath = roundedPolygonPath(silhouette, cornerRadius);\n nodes.hull?.setAttribute('d', hullPath);\n if (overlay.halo) {\n updateHalo(overlay.halo, hullPath);\n }\n\n const placements = axisArrowPlacements(object);\n (Object.keys(placements) as IsometricAxis[]).forEach(axis => {\n const group = overlay.arrows[axis];\n if (group) {\n updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);\n }\n });\n\n nodes.seams?.setAttribute(\n 'd',\n `M ${faces.top[3].x} ${faces.top[3].y} L ${faces.top[2].x} ${faces.top[2].y} L ${faces.top[1].x} ${faces.top[1].y} M ${faces.top[2].x} ${faces.top[2].y} L ${faces.front[2].x} ${faces.front[2].y}`,\n );\n\n if (nodes.groundShadow) {\n const contactFootprint = faces.top.map(point => ({ x: point.x, y: point.y + object.height }));\n const footprintCenter = {\n x: contactFootprint.reduce((sum, point) => sum + point.x, 0) / contactFootprint.length,\n y: contactFootprint.reduce((sum, point) => sum + point.y, 0) / contactFootprint.length,\n };\n const shadowSpread = 1.3;\n const footprint = contactFootprint.map(point => ({\n x: footprintCenter.x + (point.x - footprintCenter.x) * shadowSpread,\n y: footprintCenter.y + (point.y - footprintCenter.y) * shadowSpread,\n }));\n nodes.groundShadow.setAttribute('d', roundedPolygonPath(footprint, 0));\n }\n\n const anchor = isometricTopFaceCenter(object);\n if (nodes.labelGuide) {\n nodes.labelGuide.setAttribute('d', `M ${anchor.x} ${anchor.y - LABEL_GAP} L ${anchor.x} ${anchor.y}`);\n }\n if (nodes.label) {\n nodes.label.setAttribute('x', String(anchor.x));\n nodes.label.setAttribute('y', String(anchor.y + LABEL_BASELINE_OFFSET));\n nodes.label.querySelectorAll('tspan').forEach(tspan => {\n tspan.setAttribute('x', String(anchor.x));\n });\n }\n}\n","import { CORNER_RADIUS_ATTR } from '../../../svg/domContract/attributes';\nimport {\n findAllOwnerNodes,\n findOwnerNode,\n ISO_DUPLICATE_BUBBLES_ATTR,\n ISO_HALO_ATTR,\n isometricGeometryOf,\n isPrimary,\n pointerUserPoint,\n resolveOwner,\n} from '../../dom';\nimport type { IsometricAxis } from '../../dom/selectionOverlay/isometric';\nimport type { OwnerRef } from '../../viewer';\nimport { findLiveFaceLinks, type LiveFaceLink } from '../linkPreview';\n\nconst AXES: readonly IsometricAxis[] = ['width', 'height', 'depth'];\n\nexport interface IsometricGeometryNodes {\n top: SVGGraphicsElement | null;\n front: SVGGraphicsElement | null;\n side: SVGGraphicsElement | null;\n hull: SVGGraphicsElement | null;\n seams: SVGGraphicsElement | null;\n groundShadow: SVGGraphicsElement | null;\n label: SVGGraphicsElement | null;\n labelGuide: SVGGraphicsElement | null;\n}\n\nexport interface IsometricObjectSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport interface IsometricAxisDragState {\n owner: OwnerRef;\n axis: IsometricAxis;\n pointerId: number;\n startUser: { x: number; y: number };\n start: IsometricObjectSize;\n cornerRadius: number;\n nodes: IsometricGeometryNodes;\n overlayHalo: SVGPathElement | null;\n overlayArrows: Record<IsometricAxis, SVGGElement | null>;\n overlayDuplicateBubbles: SVGGElement | null;\n liveFaceLinks: LiveFaceLink[];\n moved: boolean;\n current: IsometricObjectSize;\n}\n\nfunction collectNodes(svg: SVGSVGElement, ownerId: string): IsometricGeometryNodes {\n const all = findAllOwnerNodes(svg, ownerId);\n const bySuffix = (suffix: string) => all.find(el => el.id.endsWith(suffix)) ?? null;\n return {\n top: bySuffix('-top'),\n front: bySuffix('-front'),\n side: bySuffix('-side'),\n hull: bySuffix('-hull'),\n seams: bySuffix('-seams'),\n groundShadow: bySuffix('-ground-shadow'),\n label: bySuffix('-label'),\n labelGuide: bySuffix('-label-guide'),\n };\n}\n\ninterface ResizeHandle {\n captureTarget: SVGGraphicsElement;\n axis: IsometricAxis;\n overlay: Element;\n ownerId: string;\n}\n\n// The arrow of the selection overlay that the pointer went down on, with the axis it stands for and the object the overlay belongs to.\nfunction findResizeHandle(event: PointerEvent): ResizeHandle | null {\n const target = event.target as Element | null;\n const captureTarget = target?.closest?.('[data-sf-resize-handle]') as SVGGraphicsElement | null;\n const handleAttr = captureTarget?.getAttribute('data-sf-resize-handle');\n if (!captureTarget || !handleAttr?.startsWith('iso-')) {\n return null;\n }\n const overlay = captureTarget.closest('[data-sf-selection-overlay]');\n const ownerId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!overlay || !ownerId) {\n return null;\n }\n return { captureTarget, axis: handleAttr.slice(4) as IsometricAxis, overlay, ownerId };\n}\n\n// The parts of the overlay that follow the drag. The bubbles that duplicate the object are hidden while it is dragged.\nfunction overlayPartsOf(\n overlay: Element,\n): Pick<IsometricAxisDragState, 'overlayHalo' | 'overlayArrows' | 'overlayDuplicateBubbles'> {\n const overlayHalo = (overlay.querySelector(`[${ISO_HALO_ATTR}]`) as SVGPathElement | null) ?? null;\n const overlayArrows = Object.fromEntries(\n AXES.map(axis => [\n axis,\n (overlay.querySelector(`[data-sf-resize-handle=\"iso-${axis}\"]`) as SVGGElement | null) ?? null,\n ]),\n ) as Record<IsometricAxis, SVGGElement | null>;\n const overlayDuplicateBubbles =\n (overlay.querySelector(`[${ISO_DUPLICATE_BUBBLES_ATTR}]`) as SVGGElement | null) ?? null;\n if (overlayDuplicateBubbles) {\n overlayDuplicateBubbles.style.display = 'none';\n }\n return { overlayHalo, overlayArrows, overlayDuplicateBubbles };\n}\n\nexport function createIsometricAxisDragState(svg: SVGSVGElement, event: PointerEvent): IsometricAxisDragState | null {\n const handle = findResizeHandle(event);\n if (!handle) {\n return null;\n }\n const { captureTarget, axis, overlay, ownerId } = handle;\n\n const primary = findOwnerNode(svg, ownerId, isPrimary);\n const owner = primary && resolveOwner(primary);\n if (!primary || owner?.role !== 'isometric') {\n return null;\n }\n\n const startUser = pointerUserPoint(svg, event);\n if (!startUser) {\n return null;\n }\n\n const geometry = isometricGeometryOf(primary);\n const bounds = geometry?.bounds ?? primary.getBBox();\n const nodes = collectNodes(svg, ownerId);\n [nodes.top, nodes.front, nodes.side].forEach(node => {\n node?.removeAttribute('clip-path');\n });\n\n captureTarget.setPointerCapture?.(event.pointerId);\n\n const start: IsometricObjectSize = {\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\n return {\n owner,\n axis,\n pointerId: event.pointerId,\n startUser,\n start,\n cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(CORNER_RADIUS_ATTR)) ?? 0,\n nodes,\n ...overlayPartsOf(overlay),\n liveFaceLinks: findLiveFaceLinks(svg, ownerId),\n moved: false,\n current: start,\n };\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport { isCameraGesture, pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { updateLiveFaceLinks } from '../linkPreview';\nimport { readIsometricSnapStep, snapToStep } from '../snapGrid';\nimport { applyIsometricAxisPreview } from './preview';\nimport { createIsometricAxisDragState, type IsometricAxisDragState, type IsometricObjectSize } from './state';\n\nconst MIN_SIZE = 10;\n\nfunction nextGeometry(\n drag: IsometricAxisDragState,\n point: { x: number; y: number },\n step: number | null,\n): IsometricObjectSize {\n const { start, axis } = drag;\n const length = (value: number, min: number): number => (step ? snapToStep(value, step, step) : Math.max(min, value));\n const dx = point.x - drag.startUser.x;\n const dy = point.y - drag.startUser.y;\n\n if (axis === 'width') {\n const delta = dx * AXIS_COS + dy * AXIS_SIN;\n return { ...start, width: length(start.width + delta, MIN_SIZE) };\n }\n if (axis === 'height') {\n return { ...start, height: length(start.height + dy, MIN_SIZE) };\n }\n const delta = -dx * AXIS_COS + dy * AXIS_SIN;\n const depth = length(start.depth + delta, 0);\n const x = start.x + (start.depth - depth) * AXIS_COS;\n return { ...start, x, depth };\n}\n\nexport class IsometricAxisResizeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: IsometricAxisDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n this.#drag = createIsometricAxisDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n drag.moved = true;\n drag.current = nextGeometry(drag, point, readIsometricSnapStep(this.#svg));\n updateLiveFaceLinks(drag.liveFaceLinks, drag.current);\n applyIsometricAxisPreview(\n drag.nodes,\n drag.current,\n drag.cornerRadius,\n { halo: drag.overlayHalo, arrows: drag.overlayArrows },\n this.#svg,\n );\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n if (drag.overlayDuplicateBubbles) {\n drag.overlayDuplicateBubbles.style.display = '';\n }\n if (!drag.moved) {\n return;\n }\n const next = drag.current;\n this.#emitter.emit('resizeChange', {\n owner: drag.owner,\n dx: 0,\n dy: 0,\n dWidth: next.width - drag.start.width,\n dHeight: next.height - drag.start.height,\n x: next.x,\n y: next.y,\n width: next.width,\n height: next.height,\n depth: next.depth,\n });\n };\n\n cancel(): void {\n if (this.#drag?.overlayDuplicateBubbles) {\n this.#drag.overlayDuplicateBubbles.style.display = '';\n }\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { IsometricAxisResizeSession } from './isometricAxisResize/session';\n\nexport interface IsometricAxisResizeDragHandle {\n destroy(): void;\n}\n\nexport function bindIsometricAxisResize(viewer: Viewer, emitter: Emitter): IsometricAxisResizeDragHandle {\n const svg = viewer.svg;\n const session = new IsometricAxisResizeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import type { IsometricLabelDragState } from './types';\n\nexport function updateIsometricLabelDragPreview(drag: IsometricLabelDragState, dx: number, dy: number): void {\n for (const element of drag.labelElements) {\n element.setAttribute('transform', `translate(${dx}, ${dy})`);\n }\n if (!drag.guideElement) {\n return;\n }\n drag.guideElement.setAttribute('d', `M ${drag.anchorX} ${drag.anchorY} L ${drag.restX + dx} ${drag.restY + dy}`);\n}\n\nexport function clearIsometricLabelDragPreview(drag: IsometricLabelDragState): void {\n for (const element of drag.labelElements) {\n element.removeAttribute('transform');\n }\n if (!drag.guideElement) {\n return;\n }\n if (drag.guideOriginalD === null) {\n drag.guideElement.removeAttribute('d');\n } else {\n drag.guideElement.setAttribute('d', drag.guideOriginalD);\n }\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport { isCameraGesture, isometricGeometryOf, pointerUserPoint, resolveOwner } from '../../dom';\nimport type { IsometricLabelDragState } from './types';\n\nfunction findLabelMark(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.(\n '[id$=\"-label\"], [id$=\"-label-background\"]',\n ) as SVGGraphicsElement | null;\n}\n\nfunction isLabelPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findHull(svg: SVGSVGElement, ownerId: string): SVGGraphicsElement | null {\n return svg.querySelector<SVGGraphicsElement>(`[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-primary=\"true\"]`);\n}\n\nfunction findBySuffix(svg: SVGSVGElement, suffix: string): SVGGraphicsElement | null {\n return svg.querySelector<SVGGraphicsElement>(`[id$=\"${CSS.escape(suffix)}\"]`);\n}\n\nexport function resolveIsometricLabelDrag(svg: SVGSVGElement, event: PointerEvent): IsometricLabelDragState | null {\n if (!isLabelPointer(event)) {\n return null;\n }\n const clicked = findLabelMark(event);\n if (!clicked) {\n return null;\n }\n const owner = resolveOwner(clicked);\n if (owner?.role !== 'isometric') {\n return null;\n }\n const hull = findHull(svg, owner.id);\n const geometry = hull ? isometricGeometryOf(hull) : null;\n if (!geometry?.bounds) {\n return null;\n }\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n const anchorX = geometry.bounds.x + geometry.bounds.width / 2;\n const anchorY = geometry.bounds.y + (geometry.bounds.width * (AXIS_SIN / AXIS_COS)) / 2;\n const text = findBySuffix(svg, `-${owner.id}-label`);\n if (!text) {\n return null;\n }\n const background = findBySuffix(svg, `-${owner.id}-label-background`);\n const guideElement = findBySuffix(svg, `-${owner.id}-label-guide`);\n const box = text.getBBox();\n const restX = box.x + box.width / 2;\n const restY = box.y + box.height;\n clicked.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n anchorX,\n anchorY,\n restX,\n restY,\n startX: start.x,\n startY: start.y,\n baseOffsetX: geometry.labelOffsetX,\n baseOffsetY: geometry.labelOffsetY,\n moved: false,\n lastDx: 0,\n lastDy: 0,\n labelElements: background ? [text, background] : [text],\n guideElement,\n guideOriginalD: guideElement?.getAttribute('d') ?? null,\n };\n}\n","import { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { clearIsometricLabelDragPreview, updateIsometricLabelDragPreview } from './preview';\nimport { resolveIsometricLabelDrag } from './target';\nimport type { IsometricLabelDragState } from './types';\n\nconst MOVE_NOISE = 2;\n\nexport class IsometricLabelDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: IsometricLabelDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveIsometricLabelDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const dx = point.x - drag.startX;\n const dy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(dx, dy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updateIsometricLabelDragPreview(drag, dx, dy);\n }\n\n cancel(): void {\n if (this.#drag) {\n clearIsometricLabelDragPreview(this.#drag);\n }\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearIsometricLabelDragPreview(drag);\n if (!drag.moved) {\n return;\n }\n const offsetX = Math.round(drag.baseOffsetX + drag.lastDx);\n const offsetY = Math.round(drag.baseOffsetY + drag.lastDy);\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: 'style.labelOffsetX', value: offsetX });\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: 'style.labelOffsetY', value: offsetY });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { IsometricLabelDragSession } from './session';\n\nexport interface IsometricLabelDragHandle {\n destroy(): void;\n}\n\nexport function bindIsometricLabelDrag(viewer: Viewer, emitter: Emitter): IsometricLabelDragHandle {\n const session = new IsometricLabelDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import { isCameraGesture, resolveOwner } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport type { Emitter, IsometricQuickDuplicateDirection } from '../events';\n\nfunction isIsometricDirection(value: string): value is IsometricQuickDuplicateDirection {\n return value.startsWith('iso-');\n}\n\nexport interface IsometricQuickDuplicateHandle {\n destroy(): void;\n}\n\nexport function bindIsometricQuickDuplicate(viewer: Viewer, emitter: Emitter): IsometricQuickDuplicateHandle {\n const svg = viewer.svg;\n\n const onPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || isCameraGesture(event)) {\n return;\n }\n const bubble = (event.target as Element | null)?.closest('[data-sf-quick-duplicate]');\n const direction = bubble?.getAttribute('data-sf-quick-duplicate');\n if (!bubble || !direction || !isIsometricDirection(direction)) {\n return;\n }\n const overlay = bubble.closest('[data-sf-selection-overlay]');\n const sourceId = overlay?.getAttribute('data-sf-selection-overlay');\n const primary = sourceId\n ? svg.querySelector(`[data-sf-id=\"${CSS.escape(sourceId)}\"][data-sf-primary=\"true\"]`)\n : null;\n const owner = primary && resolveOwner(primary);\n if (!owner) {\n return;\n }\n event.stopPropagation();\n emitter.emit('quickDuplicate', { owner, direction });\n };\n\n svg.addEventListener('pointerdown', onPointerDown);\n return {\n destroy() {\n svg.removeEventListener('pointerdown', onPointerDown);\n },\n };\n}\n","import type { Emitter } from '../events';\nimport type { LinkEndpointDragState } from './state';\n\nexport function completeLinkEndpointDrag(emitter: Emitter, drag: LinkEndpointDragState): void {\n if (!drag.moved) {\n return;\n }\n if (!drag.hit) {\n drag.path.setAttribute('d', drag.originalD);\n return;\n }\n\n emitter.emit('linkReconnect', {\n owner: drag.linkOwner,\n end: drag.end,\n target: drag.hit.owner,\n side: drag.hit.side,\n fraction: Math.round(drag.hit.offset * 100) / 100,\n });\n}\n","import type { LinkEndpointDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function endpointPointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedEndpointDragThreshold(drag: LinkEndpointDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport { calculateLinkRoute } from '../../../renderScene/artifacts/link/geometry';\nimport { previewPathData } from '../linkPreview';\nimport { previewLink } from '../linkPreview/geometry';\nimport type { LinkEndpointDragState } from './state';\n\nexport function updateEndpointPreview(\n drag: LinkEndpointDragState,\n draggedPoint: { x: number; y: number },\n draggedSide: Side,\n): void {\n const fromPoint = drag.end === 'from' ? draggedPoint : drag.fixedPoint;\n const toPoint = drag.end === 'to' ? draggedPoint : drag.fixedPoint;\n const fromSide = drag.end === 'from' ? draggedSide : drag.fixedSide;\n const toSide = drag.end === 'to' ? draggedSide : drag.fixedSide;\n const { points, segments } = calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);\n drag.path.setAttribute('d', previewPathData(points, segments, drag.pathType, drag.strokeWidth));\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\n\nexport const GHOST_FREE_STROKE = '#727272';\nexport const GHOST_SNAPPED_STROKE = '#992dff';\nconst GHOST_OPACITY = '0.7';\nconst GHOST_DASH_PX = 6;\nconst ANCHOR_RADIUS_PX = 6;\nconst ANCHOR_OUTLINE_PX = 2;\nconst ANCHOR_OPACITY = '0.9';\nconst RESTORED_ATTRIBUTES = ['stroke', 'stroke-dasharray', 'stroke-linecap', 'opacity'] as const;\n\nexport class LinkGhost {\n readonly #svg: SVGSVGElement;\n readonly #path: SVGPathElement;\n readonly #saved = new Map<string, string | null>();\n readonly #anchors: SVGGElement;\n #shown = false;\n\n constructor(svg: SVGSVGElement, path: SVGPathElement) {\n this.#svg = svg;\n this.#path = path;\n this.#anchors = svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'g');\n this.#anchors.setAttribute('data-sf-link-target', '');\n this.#anchors.setAttribute('pointer-events', 'none');\n }\n\n show(snapped: boolean, targetBounds: Rect | null): void {\n if (!this.#shown) {\n this.#shown = true;\n for (const name of RESTORED_ATTRIBUTES) {\n this.#saved.set(name, this.#path.getAttribute(name));\n }\n const dash = GHOST_DASH_PX / pxPerUnit(this.#svg);\n this.#path.setAttribute('stroke-dasharray', `${dash} ${dash}`);\n this.#path.setAttribute('stroke-linecap', 'round');\n this.#path.setAttribute('opacity', GHOST_OPACITY);\n this.#svg.appendChild(this.#anchors);\n }\n this.#path.setAttribute('stroke', snapped ? GHOST_SNAPPED_STROKE : GHOST_FREE_STROKE);\n this.#drawAnchors(targetBounds);\n }\n\n hide(): void {\n this.#anchors.remove();\n if (!this.#shown) {\n return;\n }\n this.#shown = false;\n for (const [name, value] of this.#saved) {\n if (value === null) {\n this.#path.removeAttribute(name);\n } else {\n this.#path.setAttribute(name, value);\n }\n }\n this.#saved.clear();\n }\n\n #drawAnchors(bounds: Rect | null): void {\n this.#anchors.replaceChildren();\n if (!bounds) {\n return;\n }\n const unit = 1 / pxPerUnit(this.#svg);\n const centers: Array<[number, number]> = [\n [bounds.x + bounds.width / 2, bounds.y],\n [bounds.x + bounds.width, bounds.y + bounds.height / 2],\n [bounds.x + bounds.width / 2, bounds.y + bounds.height],\n [bounds.x, bounds.y + bounds.height / 2],\n ];\n for (const [cx, cy] of centers) {\n const dot = this.#svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'circle');\n dot.setAttribute('cx', String(cx));\n dot.setAttribute('cy', String(cy));\n dot.setAttribute('r', String(ANCHOR_RADIUS_PX * unit));\n dot.setAttribute('fill', GHOST_SNAPPED_STROKE);\n dot.setAttribute('stroke', '#ffffff');\n dot.setAttribute('stroke-width', String(ANCHOR_OUTLINE_PX * unit));\n dot.setAttribute('opacity', ANCHOR_OPACITY);\n this.#anchors.appendChild(dot);\n }\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface EndpointCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport function collectEndpointCandidates(svg: SVGSVGElement): EndpointCandidate[] {\n const candidates: EndpointCandidate[] = [];\n\n for (const element of svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary]')) {\n if (element.getAttribute('data-sf-role') === 'link') {\n continue;\n }\n\n const owner = resolveOwner(element);\n if (owner) {\n candidates.push({ owner, bounds: element.getBBox() });\n }\n }\n\n return candidates;\n}\n","import type { Rect, Side } from '../../../model/geometry/types';\n\nconst SIDES: Side[] = ['left', 'right', 'top', 'bottom'];\nconst SIDE_CHANGE_HYSTERESIS = 40;\n\nfunction sideNormal(side: Side): [number, number] {\n switch (side) {\n case 'top':\n return [0, -1];\n case 'right':\n return [1, 0];\n case 'bottom':\n return [0, 1];\n case 'left':\n return [-1, 0];\n }\n}\n\nfunction sideScore(side: Side, vector: { x: number; y: number }): number {\n const normal = sideNormal(side);\n const dotProduct = normal[0] * vector.x + normal[1] * vector.y;\n const horizontalMagnitude = Math.abs(vector.x);\n const verticalMagnitude = Math.abs(vector.y);\n const axisBias =\n side === 'left' || side === 'right'\n ? horizontalMagnitude - verticalMagnitude\n : verticalMagnitude - horizontalMagnitude;\n return dotProduct + 0.5 * axisBias;\n}\n\nfunction localDirection(from: Rect, to: Rect): { x: number; y: number } {\n const fromCenter = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n const toCenter = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n const radians = (-(from.rotation ?? 0) * Math.PI) / 180;\n const cosine = Math.cos(radians);\n const sine = Math.sin(radians);\n const deltaX = toCenter.x - fromCenter.x;\n const deltaY = toCenter.y - fromCenter.y;\n return { x: deltaX * cosine - deltaY * sine, y: deltaX * sine + deltaY * cosine };\n}\n\nexport function chooseSide(from: Rect, to: Rect, stickySide?: Side): Side {\n const direction = localDirection(from, to);\n const bestSide = SIDES.reduce((best, candidate) => {\n return sideScore(candidate, direction) > sideScore(best, direction) ? candidate : best;\n }, 'right');\n if (!stickySide) {\n return bestSide;\n }\n const improvement = sideScore(bestSide, direction) - sideScore(stickySide, direction);\n return improvement > SIDE_CHANGE_HYSTERESIS ? bestSide : stickySide;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { LinkEndpoint } from '../../dom';\nimport { findOwnerNode, isPrimary } from '../../dom';\nimport { chooseSide } from './sideSelection';\n\nexport interface FixedEndpoint {\n point: { x: number; y: number };\n side: Side;\n}\n\ninterface FixedEndpointReference {\n fixedId: string | null;\n draggedId: string | null;\n pathPoint: DOMPoint;\n declaredSide: Side | null;\n}\n\nfunction referenceWhenDraggingFrom(path: SVGPathElement): FixedEndpointReference {\n return {\n fixedId: path.getAttribute('data-sf-to'),\n draggedId: path.getAttribute('data-sf-from'),\n pathPoint: path.getPointAtLength(path.getTotalLength()),\n declaredSide: path.getAttribute('data-sf-to-side') as Side | null,\n };\n}\n\nfunction referenceWhenDraggingTo(path: SVGPathElement): FixedEndpointReference {\n return {\n fixedId: path.getAttribute('data-sf-from'),\n draggedId: path.getAttribute('data-sf-to'),\n pathPoint: path.getPointAtLength(0),\n declaredSide: path.getAttribute('data-sf-from-side') as Side | null,\n };\n}\n\nfunction fixedEndpointReference(path: SVGPathElement, draggedEnd: LinkEndpoint): FixedEndpointReference {\n if (draggedEnd === 'from') {\n return referenceWhenDraggingFrom(path);\n }\n\n return referenceWhenDraggingTo(path);\n}\n\nfunction inferFixedSide(svg: SVGSVGElement, reference: FixedEndpointReference, fixedPrimary: SVGGraphicsElement): Side {\n if (reference.declaredSide) {\n return reference.declaredSide;\n }\n\n const draggedPrimary = reference.draggedId ? findOwnerNode(svg, reference.draggedId, isPrimary) : null;\n if (!draggedPrimary) {\n return 'right';\n }\n\n return chooseSide(fixedPrimary.getBBox(), draggedPrimary.getBBox());\n}\n\nexport function resolveFixedEndpoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n draggedEnd: LinkEndpoint,\n): FixedEndpoint | null {\n const reference = fixedEndpointReference(path, draggedEnd);\n const fixedPrimary = reference.fixedId ? findOwnerNode(svg, reference.fixedId, isPrimary) : null;\n if (!fixedPrimary) {\n return null;\n }\n\n return {\n point: { x: reference.pathPoint.x, y: reference.pathPoint.y },\n side: inferFixedSide(svg, reference, fixedPrimary),\n };\n}\n","import type { LinkEndpoint } from '../../dom';\nimport { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface SelectedLinkEndpoint {\n captureTarget: Element;\n end: LinkEndpoint;\n path: SVGPathElement;\n linkOwner: OwnerRef;\n}\n\nexport function selectLinkEndpoint(svg: SVGSVGElement, event: PointerEvent): SelectedLinkEndpoint | null {\n const target = event.target as Element | null;\n const end = target?.closest('[data-sf-link-endpoint]')?.getAttribute('data-sf-link-endpoint') as\n | LinkEndpoint\n | null\n | undefined;\n const overlay = target?.closest('[data-sf-selection-overlay]');\n const linkId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!target || !end || !linkId) {\n return null;\n }\n\n const path = findOwnerNode<SVGPathElement>(svg, linkId, isPrimary);\n const linkOwner = path && resolveOwner(path);\n if (!path || !linkOwner) {\n return null;\n }\n\n return { captureTarget: target, end, path, linkOwner };\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport type { LinkEndpoint } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { LinkGhost } from '../linkGhost/ghost';\nimport { collectEndpointCandidates, type EndpointCandidate } from './candidates';\nimport { resolveFixedEndpoint } from './fixedEndpoint';\nimport { selectLinkEndpoint } from './selection';\n\nexport interface LinkEndpointDragState {\n linkOwner: OwnerRef;\n end: LinkEndpoint;\n path: SVGPathElement;\n pathType: PathType;\n strokeWidth: number;\n originalD: string;\n fixedPoint: { x: number; y: number };\n fixedSide: Side;\n candidates: EndpointCandidate[];\n ghost: LinkGhost;\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n hit: { owner: OwnerRef; side: Side; offset: number } | null;\n}\n\nexport function createLinkEndpointDragState(svg: SVGSVGElement, event: PointerEvent): LinkEndpointDragState | null {\n const selection = selectLinkEndpoint(svg, event);\n if (!selection) {\n return null;\n }\n\n const fixedEndpoint = resolveFixedEndpoint(svg, selection.path, selection.end);\n if (!fixedEndpoint) {\n return null;\n }\n\n selection.captureTarget.setPointerCapture?.(event.pointerId);\n return {\n linkOwner: selection.linkOwner,\n end: selection.end,\n path: selection.path,\n pathType: (selection.path.getAttribute('data-sf-route') as PathType | null) ?? 'straight',\n strokeWidth: Number(selection.path.getAttribute('stroke-width')) || 2,\n originalD: selection.path.getAttribute('d') ?? '',\n fixedPoint: fixedEndpoint.point,\n fixedSide: fixedEndpoint.side,\n candidates: collectEndpointCandidates(svg),\n ghost: new LinkGhost(svg, selection.path),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n hit: null,\n };\n}\n","import { pointAtPort, relativeOffsetOnRectangleSide } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\n\nconst SIDES: readonly Side[] = ['top', 'right', 'bottom', 'left'];\n\nexport function nearestPort(bounds: Rect, point: { x: number; y: number }): { side: Side; offset: number } {\n let nearest = { side: 'right' as Side, offset: 0.5 };\n let nearestDistance = Infinity;\n\n for (const side of SIDES) {\n const offset = Math.max(0, Math.min(1, relativeOffsetOnRectangleSide(bounds, side, point)));\n const candidate = pointAtPort(bounds, { side, offset });\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = { side, offset };\n }\n }\n return nearest;\n}\n\nexport function sideFromDirection(from: { x: number; y: number }, to: { x: number; y: number }): Side {\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n if (angle >= -Math.PI / 4 && angle < Math.PI / 4) {\n return 'right';\n }\n if (angle >= Math.PI / 4 && angle < (3 * Math.PI) / 4) {\n return 'bottom';\n }\n if (angle >= (-3 * Math.PI) / 4 && angle < -Math.PI / 4) {\n return 'top';\n }\n return 'left';\n}\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { OwnerRef } from '../../viewer';\nimport { nearestPort, sideFromDirection } from '../linkEndpoint/geometry';\n\nconst HOVER_MARGIN_PX = 15;\nconst MAGNET_RADIUS_PX = 16;\n\nexport interface LinkCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport interface LinkHit {\n owner: OwnerRef;\n side: Side;\n offset: number;\n}\n\nexport interface LinkTarget {\n point: { x: number; y: number };\n side: Side;\n hit: LinkHit | null;\n bounds: Rect | null;\n}\n\nfunction distanceToRect(bounds: Rect, point: { x: number; y: number }): number {\n const dx = Math.max(bounds.x - point.x, 0, point.x - (bounds.x + bounds.width));\n const dy = Math.max(bounds.y - point.y, 0, point.y - (bounds.y + bounds.height));\n return Math.hypot(dx, dy);\n}\n\nfunction pickCandidate(\n candidates: readonly LinkCandidate[],\n point: { x: number; y: number },\n margin: number,\n): LinkCandidate | null {\n let containing: LinkCandidate | null = null;\n let nearby: LinkCandidate | null = null;\n let nearbyDistance = Infinity;\n for (const candidate of candidates) {\n const distance = distanceToRect(candidate.bounds, point);\n if (distance === 0) {\n containing = candidate;\n } else if (distance <= margin && distance < nearbyDistance) {\n nearby = candidate;\n nearbyDistance = distance;\n }\n }\n return containing ?? nearby;\n}\n\nexport function snapPort(\n bounds: Rect,\n point: { x: number; y: number },\n unitsPerPx: number,\n): { side: Side; offset: number } {\n const port = nearestPort(bounds, point);\n const sideLength = port.side === 'top' || port.side === 'bottom' ? bounds.width : bounds.height;\n const distanceFromCenter = Math.abs(port.offset - 0.5) * sideLength;\n return distanceFromCenter <= MAGNET_RADIUS_PX * unitsPerPx ? { side: port.side, offset: 0.5 } : port;\n}\n\nexport function resolveLinkTarget(\n candidates: readonly LinkCandidate[],\n fixedPoint: { x: number; y: number },\n point: { x: number; y: number },\n unitsPerPx: number,\n): LinkTarget {\n const candidate = pickCandidate(candidates, point, HOVER_MARGIN_PX * unitsPerPx);\n if (!candidate) {\n return { point, side: sideFromDirection(point, fixedPoint), hit: null, bounds: null };\n }\n const port = snapPort(candidate.bounds, point, unitsPerPx);\n return {\n point: pointAtPort(candidate.bounds, port),\n side: port.side,\n hit: { owner: candidate.owner, side: port.side, offset: port.offset },\n bounds: candidate.bounds,\n };\n}\n","import { type LinkTarget, resolveLinkTarget } from '../linkGhost/target';\nimport type { LinkEndpointDragState } from './state';\n\nexport type EndpointTarget = LinkTarget;\n\nexport function resolveEndpointTarget(\n drag: LinkEndpointDragState,\n point: { x: number; y: number },\n unitsPerPx: number,\n): EndpointTarget {\n const target = resolveLinkTarget(drag.candidates, drag.fixedPoint, point, unitsPerPx);\n drag.hit = target.hit;\n return target;\n}\n","import { isCameraGesture, pxPerUnit } from '../../dom';\nimport type { Emitter } from '../events';\nimport { completeLinkEndpointDrag } from './completion';\nimport { crossedEndpointDragThreshold, endpointPointerPosition } from './pointer';\nimport { updateEndpointPreview } from './preview';\nimport { createLinkEndpointDragState, type LinkEndpointDragState } from './state';\nimport { resolveEndpointTarget } from './target';\n\nexport class LinkEndpointSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: LinkEndpointDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createLinkEndpointDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedEndpointDragThreshold(drag, event)) {\n return;\n }\n\n drag.moved = true;\n const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / pxPerUnit(this.#svg));\n updateEndpointPreview(drag, target.point, target.side);\n drag.ghost.show(target.hit !== null, target.bounds);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n drag.ghost.hide();\n completeLinkEndpointDrag(this.#emitter, drag);\n };\n\n cancel(): void {\n this.#drag?.ghost.hide();\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { LinkEndpointSession } from './linkEndpoint/session';\n\nexport { nearestPort, sideFromDirection } from './linkEndpoint/geometry';\n\nexport interface LinkEndpointDragHandle {\n destroy(): void;\n}\n\nexport function bindLinkEndpointDrag(viewer: Viewer, emitter: Emitter): LinkEndpointDragHandle {\n const svg = viewer.svg;\n const session = new LinkEndpointSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { roundedOrthogonalPathData } from '../../../renderScene/artifacts/link/roundedOrthogonalPathData';\nimport { findOwnerNode, isCameraGesture, isPrimary, pointerUserPoint, pxPerUnit, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { isSnapDisabled } from '../snapGrid';\n\nconst SNAP_PX = 6;\nconst DRAG_THRESHOLD_PX = 3;\nconst GUIDE_COLOR = '#9b42df';\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\ninterface SegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n ox: number;\n oy: number;\n movable: boolean;\n}\n\ninterface SegmentDrag {\n owner: OwnerRef;\n path: SVGPathElement;\n overlay: Element;\n handle: SVGRectElement;\n segments: SegmentData[];\n index: number;\n axis: 'x' | 'y';\n base: number;\n start: number;\n origin: number;\n originalD: string;\n candidates: number[];\n guide: SVGLineElement;\n pointerId: number;\n startClient: { x: number; y: number };\n moved: boolean;\n value: number;\n}\n\nfunction parseSegments(path: SVGPathElement): SegmentData[] {\n try {\n return JSON.parse(path.getAttribute('data-sf-link-segments') ?? '[]') as SegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction snapCandidates(svg: SVGSVGElement, axis: 'x' | 'y', excludeIds: Set<string>): number[] {\n const values: number[] = [];\n svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary][data-sf-id]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n if (!id || node.getAttribute('data-sf-role') === 'link' || excludeIds.has(id)) {\n return;\n }\n const box = node.getBBox();\n if (axis === 'y') {\n values.push(box.y, box.y + box.height / 2, box.y + box.height);\n } else {\n values.push(box.x, box.x + box.width / 2, box.x + box.width);\n }\n });\n return values;\n}\n\nfunction movedSegments(drag: SegmentDrag, value: number): SegmentData[] {\n const next = drag.segments.map(segment => ({ ...segment }));\n const target = next[drag.index];\n const before = next[drag.index - 1];\n const after = next[drag.index + 1];\n if (drag.axis === 'y') {\n target.ay = value;\n target.by = value;\n if (before) {\n before.by = value;\n }\n if (after) {\n after.ay = value;\n }\n } else {\n target.ax = value;\n target.bx = value;\n if (before) {\n before.bx = value;\n }\n if (after) {\n after.ax = value;\n }\n }\n return next;\n}\n\nfunction pathSegments(segments: SegmentData[]) {\n return segments.map(segment => {\n const start = { x: segment.ax, y: segment.ay };\n const end = { x: segment.bx, y: segment.by };\n return {\n start,\n end,\n midpoint: { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 },\n originalMidpoint: { x: segment.ox, y: segment.oy },\n isHorizontal: Math.abs(end.x - start.x) > Math.abs(end.y - start.y),\n canMove: segment.movable,\n };\n });\n}\n\nexport class LinkSegmentSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: SegmentDrag | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n const target = event.target as Element | null;\n const handle = target?.closest('[data-sf-link-segment]') as SVGRectElement | null;\n const overlay = handle?.closest('[data-sf-selection-overlay]');\n const linkId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!handle || !overlay || !linkId) {\n return;\n }\n const path = findOwnerNode<SVGPathElement>(this.#svg, linkId, isPrimary);\n const owner = path && resolveOwner(path);\n const index = Number(handle.getAttribute('data-sf-link-segment'));\n const segments = path ? parseSegments(path) : [];\n const segment = segments[index];\n const point = pointerUserPoint(this.#svg, event);\n if (!path || !owner || !segment || !point) {\n return;\n }\n const axis = handle.getAttribute('data-sf-link-segment-axis') === 'x' ? 'x' : 'y';\n const guide = document.createElementNS(SVG_NAMESPACE, 'line');\n guide.setAttribute('stroke', GUIDE_COLOR);\n guide.setAttribute('stroke-dasharray', '4 4');\n guide.setAttribute('stroke-width', String(1 / pxPerUnit(this.#svg)));\n guide.setAttribute('visibility', 'hidden');\n overlay.appendChild(guide);\n handle.setPointerCapture?.(event.pointerId);\n const current = axis === 'y' ? segment.ay : segment.ax;\n this.#drag = {\n owner,\n path,\n overlay,\n handle,\n segments,\n index,\n axis,\n base: axis === 'y' ? segment.oy : segment.ox,\n start: axis === 'y' ? point.y : point.x,\n origin: current,\n originalD: path.getAttribute('d') ?? '',\n candidates: snapCandidates(this.#svg, axis, new Set([linkId])),\n guide,\n pointerId: event.pointerId,\n startClient: { x: event.clientX, y: event.clientY },\n moved: false,\n value: current,\n };\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n const travelled = Math.hypot(event.clientX - drag.startClient.x, event.clientY - drag.startClient.y);\n if (!drag.moved && travelled < DRAG_THRESHOLD_PX) {\n return;\n }\n drag.moved = true;\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const raw = drag.origin + ((drag.axis === 'y' ? point.y : point.x) - drag.start);\n const { value, snapped } = this.#snap(drag, raw);\n drag.value = value;\n this.#preview(drag, snapped);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n drag.handle.releasePointerCapture?.(drag.pointerId);\n drag.guide.remove();\n if (!drag.moved) {\n return;\n }\n const offset = Math.round((drag.value - drag.base) * 10) / 10;\n this.#emitter.emit('linkSegmentChange', { owner: drag.owner, index: drag.index, offset });\n };\n\n readonly doubleClick = (event: MouseEvent): void => {\n const handle = (event.target as Element | null)?.closest('[data-sf-link-segment]');\n const linkId = handle?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n const path = linkId ? findOwnerNode<SVGPathElement>(this.#svg, linkId, isPrimary) : null;\n const owner = path && resolveOwner(path);\n if (!handle || !owner) {\n return;\n }\n this.#emitter.emit('linkSegmentChange', {\n owner,\n index: Number(handle.getAttribute('data-sf-link-segment')),\n offset: 0,\n });\n };\n\n cancel(): void {\n const drag = this.#drag;\n if (!drag) {\n return;\n }\n drag.path.setAttribute('d', drag.originalD);\n drag.guide.remove();\n this.#drag = null;\n }\n\n #snap(drag: SegmentDrag, raw: number): { value: number; snapped: number | null } {\n if (isSnapDisabled(this.#svg)) {\n return { value: raw, snapped: null };\n }\n const threshold = SNAP_PX / pxPerUnit(this.#svg);\n let best: number | null = null;\n for (const candidate of [drag.base, ...drag.candidates]) {\n const closer = best === null || Math.abs(candidate - raw) < Math.abs(best - raw);\n if (Math.abs(candidate - raw) <= threshold && closer) {\n best = candidate;\n }\n }\n return best === null ? { value: raw, snapped: null } : { value: best, snapped: best };\n }\n\n #preview(drag: SegmentDrag, snapped: number | null): void {\n const next = movedSegments(drag, drag.value);\n const strokeWidth = Number(drag.path.getAttribute('stroke-width')) || 2;\n const data = roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));\n drag.path.setAttribute('d', data);\n drag.overlay.querySelector('path')?.setAttribute('d', data);\n const segment = next[drag.index];\n const width = Number(drag.handle.getAttribute('width'));\n const height = Number(drag.handle.getAttribute('height'));\n drag.handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n drag.handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n const view = this.#svg.viewBox.baseVal;\n if (snapped === null) {\n drag.guide.setAttribute('visibility', 'hidden');\n return;\n }\n drag.guide.setAttribute('visibility', 'visible');\n if (drag.axis === 'y') {\n drag.guide.setAttribute('x1', String(view.x));\n drag.guide.setAttribute('x2', String(view.x + view.width));\n drag.guide.setAttribute('y1', String(snapped));\n drag.guide.setAttribute('y2', String(snapped));\n } else {\n drag.guide.setAttribute('y1', String(view.y));\n drag.guide.setAttribute('y2', String(view.y + view.height));\n drag.guide.setAttribute('x1', String(snapped));\n drag.guide.setAttribute('x2', String(snapped));\n }\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { LinkSegmentSession } from './linkSegment/session';\n\nexport interface LinkSegmentDragHandle {\n destroy(): void;\n}\n\nexport function bindLinkSegmentDrag(viewer: Viewer, emitter: Emitter): LinkSegmentDragHandle {\n const svg = viewer.svg;\n const session = new LinkSegmentSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n svg.addEventListener('dblclick', session.doubleClick);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n svg.removeEventListener('dblclick', session.doubleClick);\n },\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { DraggedCanvasObject } from './types';\n\nexport function offsetBounds(bounds: Rect, dx: number, dy: number): Rect {\n return {\n x: bounds.x + dx,\n y: bounds.y + dy,\n width: bounds.width,\n height: bounds.height,\n };\n}\n\nexport function clampMoveDelta(\n canvasObjects: DraggedCanvasObject[],\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n let minDx = Number.NEGATIVE_INFINITY;\n let maxDx = Number.POSITIVE_INFINITY;\n let minDy = Number.NEGATIVE_INFINITY;\n let maxDy = Number.POSITIVE_INFINITY;\n for (const canvasObject of canvasObjects) {\n const container = canvasObject.containerBounds;\n if (!container) {\n continue;\n }\n const bounds = canvasObject.draggedBounds;\n minDx = Math.max(minDx, container.x - bounds.x);\n maxDx = Math.min(maxDx, container.x + container.width - (bounds.x + bounds.width));\n minDy = Math.max(minDy, container.y - bounds.y);\n maxDy = Math.min(maxDy, container.y + container.height - (bounds.y + bounds.height));\n }\n return {\n dx: minDx <= maxDx ? Math.min(Math.max(dx, minDx), maxDx) : dx,\n dy: minDy <= maxDy ? Math.min(Math.max(dy, minDy), maxDy) : dy,\n };\n}\n","import type { MoveDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function movePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedMoveDragThreshold(drag: MoveDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n\nexport function movePointerDelta(\n svg: SVGSVGElement,\n drag: MoveDragState,\n event: PointerEvent,\n): { dx: number; dy: number } {\n const point = movePointerPosition(svg, event);\n return { dx: point.x - drag.startUser.x, dy: point.y - drag.startUser.y };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { AxisSnap, EdgePoint, RectGuideLine, SnapConfig, SnapResult } from './types';\n\ninterface SnapMatch {\n distance: number;\n delta: number;\n guide: RectGuideLine;\n}\n\nconst TARGET_POINTS: EdgePoint[] = ['min', 'center', 'max'];\n\nfunction edgePoints(minimum: number, size: number): Record<EdgePoint, number> {\n return { min: minimum, center: minimum + size / 2, max: minimum + size };\n}\n\nfunction findHorizontalSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): AxisSnap {\n const sourcePoints = edgePoints(bounds.x, bounds.width);\n let bestMatch: SnapMatch | null = null;\n\n for (const candidate of candidates) {\n const targetPoints = edgePoints(candidate.x, candidate.width);\n for (const sourcePoint of config.activeX) {\n for (const targetPoint of TARGET_POINTS) {\n const distance = Math.abs(sourcePoints[sourcePoint] - targetPoints[targetPoint]);\n if (distance < config.threshold && (!bestMatch || distance < bestMatch.distance)) {\n bestMatch = {\n distance,\n delta: targetPoints[targetPoint] - sourcePoints[sourcePoint],\n guide: {\n orientation: 'vertical',\n position: targetPoints[targetPoint],\n from: Math.min(bounds.y, candidate.y) - config.guideOverhang,\n to: Math.max(bounds.y + bounds.height, candidate.y + candidate.height) + config.guideOverhang,\n },\n };\n }\n }\n }\n }\n\n return { delta: bestMatch?.delta ?? 0, guide: bestMatch?.guide ?? null };\n}\n\nfunction findVerticalSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): AxisSnap {\n const sourcePoints = edgePoints(bounds.y, bounds.height);\n let bestMatch: SnapMatch | null = null;\n\n for (const candidate of candidates) {\n const targetPoints = edgePoints(candidate.y, candidate.height);\n for (const sourcePoint of config.activeY) {\n for (const targetPoint of TARGET_POINTS) {\n const distance = Math.abs(sourcePoints[sourcePoint] - targetPoints[targetPoint]);\n if (distance < config.threshold && (!bestMatch || distance < bestMatch.distance)) {\n bestMatch = {\n distance,\n delta: targetPoints[targetPoint] - sourcePoints[sourcePoint],\n guide: {\n orientation: 'horizontal',\n position: targetPoints[targetPoint],\n from: Math.min(bounds.x, candidate.x) - config.guideOverhang,\n to: Math.max(bounds.x + bounds.width, candidate.x + candidate.width) + config.guideOverhang,\n },\n };\n }\n }\n }\n }\n\n return { delta: bestMatch?.delta ?? 0, guide: bestMatch?.guide ?? null };\n}\n\nexport function computeSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): SnapResult {\n return {\n x: findHorizontalSnap(bounds, candidates, config),\n y: findVerticalSnap(bounds, candidates, config),\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\n\nfunction centerDistance(from: Rect, to: Rect): number {\n const fromCenterX = from.x + from.width / 2;\n const fromCenterY = from.y + from.height / 2;\n const toCenterX = to.x + to.width / 2;\n const toCenterY = to.y + to.height / 2;\n return Math.hypot(toCenterX - fromCenterX, toCenterY - fromCenterY);\n}\n\nexport function nearestCandidates(bounds: Rect, candidates: Rect[], limit = 50): Rect[] {\n return [...candidates]\n .sort((first, second) => centerDistance(bounds, first) - centerDistance(bounds, second))\n .slice(0, limit);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { GuideLine } from '../../dom';\n\ntype Axis = 'x' | 'y';\n\nexport interface GapSnap {\n delta: number;\n guides: GuideLine[];\n}\n\ninterface Span {\n start: number;\n end: number;\n cross: number;\n}\n\n// The objects that lie in one row with the moved one on this axis, in order. An object in the row overlaps it across the axis.\nfunction rowOf(bounds: Rect, candidates: Rect[], axis: Axis): Span[] {\n const [crossStart, crossSize] = axis === 'x' ? (['y', 'height'] as const) : (['x', 'width'] as const);\n const [start, size] = axis === 'x' ? (['x', 'width'] as const) : (['y', 'height'] as const);\n return candidates\n .filter(\n candidate =>\n candidate[crossStart] < bounds[crossStart] + bounds[crossSize] &&\n bounds[crossStart] < candidate[crossStart] + candidate[crossSize],\n )\n .map(candidate => ({\n start: candidate[start],\n end: candidate[start] + candidate[size],\n cross: candidate[crossStart] + candidate[crossSize] / 2,\n }))\n .sort((first, second) => first.start - second.start);\n}\n\nfunction segment(axis: Axis, from: number, to: number, cross: number): GuideLine {\n return axis === 'x'\n ? { orientation: 'segment', x1: from, y1: cross, x2: to, y2: cross }\n : { orientation: 'segment', x1: cross, y1: from, x2: cross, y2: to };\n}\n\nfunction axisGapSnap(bounds: Rect, candidates: Rect[], axis: Axis, threshold: number): GapSnap | null {\n const row = rowOf(bounds, candidates, axis);\n const start = axis === 'x' ? bounds.x : bounds.y;\n const size = axis === 'x' ? bounds.width : bounds.height;\n const center = start + size / 2;\n const before = row.filter(span => (span.start + span.end) / 2 < center).at(-1);\n const after = row.find(span => (span.start + span.end) / 2 >= center);\n const pairs = row\n .slice(1)\n .map((span, index) => ({ first: row[index], second: span, gap: span.start - row[index].end }));\n\n let best: GapSnap | null = null;\n const consider = (target: number, guides: GuideLine[]) => {\n const delta = target - start;\n if (Math.abs(delta) < threshold && (!best || Math.abs(delta) < Math.abs(best.delta))) {\n best = { delta, guides };\n }\n };\n\n // Halfway between its two neighbors.\n if (before && after) {\n const target = (before.end + after.start - size) / 2;\n if (target >= before.end) {\n consider(target, [\n segment(axis, before.end, target, before.cross),\n segment(axis, target + size, after.start, after.cross),\n ]);\n }\n }\n // As far from a neighbor as two other objects of the row are from each other.\n for (const { first, second, gap } of pairs) {\n if (gap <= 0) {\n continue;\n }\n const existing = segment(axis, first.end, second.start, first.cross);\n if (before) {\n consider(before.end + gap, [existing, segment(axis, before.end, before.end + gap, before.cross)]);\n }\n if (after) {\n consider(after.start - gap - size, [existing, segment(axis, after.start - gap, after.start, after.cross)]);\n }\n }\n return best;\n}\n\nexport function computeGapSnap(\n bounds: Rect,\n candidates: Rect[],\n threshold: number,\n): { x: GapSnap | null; y: GapSnap | null } {\n return {\n x: axisGapSnap(bounds, candidates, 'x', threshold),\n y: axisGapSnap(bounds, candidates, 'y', threshold),\n };\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport type { GuideLine } from '../../dom';\n\nexport interface IsometricApexCandidate {\n apex: { x: number; y: number };\n}\n\nexport interface IsometricDiagonalSnap {\n dx: number;\n dy: number;\n guide: GuideLine;\n}\n\nconst AXES: ReadonlyArray<{ x: number; y: number }> = [\n { x: AXIS_COS, y: AXIS_SIN },\n { x: -AXIS_COS, y: AXIS_SIN },\n];\n\nconst GUIDE_OVERHANG = 40;\n\nexport function snapIsometricDiagonal(\n apex: { x: number; y: number },\n rawDx: number,\n rawDy: number,\n candidates: readonly IsometricApexCandidate[],\n threshold: number,\n): IsometricDiagonalSnap | null {\n const moved = { x: apex.x + rawDx, y: apex.y + rawDy };\n let best: { distance: number; corrected: { x: number; y: number }; guide: GuideLine } | null = null;\n\n for (const candidate of candidates) {\n for (const dir of AXES) {\n const rel = { x: moved.x - candidate.apex.x, y: moved.y - candidate.apex.y };\n const along = rel.x * dir.x + rel.y * dir.y;\n const perpX = rel.x - along * dir.x;\n const perpY = rel.y - along * dir.y;\n const distance = Math.hypot(perpX, perpY);\n if (distance < threshold && (!best || distance < best.distance)) {\n const corrected = { x: moved.x - perpX, y: moved.y - perpY };\n const from = { x: candidate.apex.x - dir.x * GUIDE_OVERHANG, y: candidate.apex.y - dir.y * GUIDE_OVERHANG };\n const to = { x: corrected.x + dir.x * GUIDE_OVERHANG, y: corrected.y + dir.y * GUIDE_OVERHANG };\n best = {\n distance,\n corrected,\n guide: { orientation: 'segment', x1: from.x, y1: from.y, x2: to.x, y2: to.y },\n };\n }\n }\n }\n\n if (!best) {\n return null;\n }\n return { dx: rawDx + (best.corrected.x - moved.x), dy: rawDy + (best.corrected.y - moved.y), guide: best.guide };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { EdgePoint, SnapResult } from './types';\n\nexport function resizeActivePoints(axisMove: 'left' | 'right' | 'top' | 'bottom' | 'none'): EdgePoint[] {\n if (axisMove === 'none') {\n return [];\n }\n return axisMove === 'left' || axisMove === 'top' ? ['min'] : ['max'];\n}\n\nexport function applyAxisSnap(\n bounds: Rect,\n moveX: 'left' | 'right' | 'none',\n moveY: 'top' | 'bottom' | 'none',\n snap: SnapResult,\n minSize: number,\n): Rect {\n let { x, y, width, height } = bounds;\n if (moveX === 'left' && snap.x.delta) {\n x += snap.x.delta;\n width -= snap.x.delta;\n } else if (moveX === 'right' && snap.x.delta) {\n width += snap.x.delta;\n }\n if (moveY === 'top' && snap.y.delta) {\n y += snap.y.delta;\n height -= snap.y.delta;\n } else if (moveY === 'bottom' && snap.y.delta) {\n height += snap.y.delta;\n }\n return { x, y, width: Math.max(minSize, width), height: Math.max(minSize, height) };\n}\n","import type { GuideLine } from '../../dom';\n\nexport type EdgePoint = 'min' | 'center' | 'max';\n\nexport type RectGuideLine = Extract<GuideLine, { orientation: 'vertical' | 'horizontal' }>;\n\nexport interface AxisSnap {\n delta: number;\n guide: RectGuideLine | null;\n}\n\nexport interface SnapResult {\n x: AxisSnap;\n y: AxisSnap;\n}\n\nexport interface SnapConfig {\n threshold: number;\n activeX: EdgePoint[];\n activeY: EdgePoint[];\n guideOverhang: number;\n}\n\nexport const MOVE_ACTIVE_POINTS: EdgePoint[] = ['min', 'center', 'max'];\n","import { AXIS_COS } from '../../../model/isometricObject';\nimport type { GuideLine } from '../../dom';\nimport {\n findIsometricApexCandidates,\n findOwnerNode,\n findSnapCandidateBounds,\n isometricGeometryOf,\n isPrimary,\n pxPerUnit,\n} from '../../dom';\nimport type { AxisSnap, GapSnap } from '../snapGeometry';\nimport {\n computeGapSnap,\n computeSnap,\n MOVE_ACTIVE_POINTS,\n nearestCandidates,\n snapIsometricDiagonal,\n} from '../snapGeometry';\nimport { isSnapDisabled, nearestIsometricLatticePoint, readIsometricSnapStep, snapDistancePx } from '../snapGrid';\nimport { offsetBounds } from './geometry';\nimport type { MoveDragState } from './state';\n\nconst GUIDE_OVERHANG = 10;\n\nexport interface MoveDelta {\n dx: number;\n dy: number;\n guides: GuideLine[];\n}\n\nfunction isometricApexOf(svg: SVGSVGElement, drag: MoveDragState, declared = false): { x: number; y: number } | null {\n if (drag.canvasObjects.length !== 1) {\n return null;\n }\n const lead = drag.canvasObjects[0];\n if (lead.owner.role !== 'isometric') {\n return null;\n }\n const primary = findOwnerNode(svg, lead.owner.id, isPrimary);\n const geometry = primary && isometricGeometryOf(primary);\n if (!geometry) {\n return null;\n }\n const frame = declared && geometry.bounds ? geometry.bounds : lead.draggedBounds;\n return { x: frame.x + geometry.depth * AXIS_COS, y: frame.y };\n}\n\nfunction snapIsometricGrid(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta | null {\n const step = readIsometricSnapStep(svg);\n const apex = step ? isometricApexOf(svg, drag, true) : null;\n if (!step || !apex) {\n return null;\n }\n const lattice = nearestIsometricLatticePoint({ x: apex.x + rawDx, y: apex.y + rawDy }, step);\n return { dx: lattice.x - apex.x, dy: lattice.y - apex.y, guides: [] };\n}\n\nfunction snapIsometricMove(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta | null {\n const apex = isometricApexOf(svg, drag);\n if (!apex) {\n return null;\n }\n const excludedIds = new Set(drag.canvasObjects.map(canvasObject => canvasObject.owner.id));\n const candidates = findIsometricApexCandidates(svg, excludedIds);\n const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / pxPerUnit(svg));\n return snap ? { dx: snap.dx, dy: snap.dy, guides: [snap.guide] } : null;\n}\n\nexport function snapMove(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta {\n if (isSnapDisabled(svg)) {\n return { dx: rawDx, dy: rawDy, guides: [] };\n }\n const isometricSnap = snapIsometricMove(svg, drag, rawDx, rawDy);\n if (isometricSnap) {\n return isometricSnap;\n }\n const gridSnap = snapIsometricGrid(svg, drag, rawDx, rawDy);\n if (gridSnap) {\n return gridSnap;\n }\n\n const leadBounds = offsetBounds(drag.canvasObjects[0].draggedBounds, rawDx, rawDy);\n const excludedIds = new Set(drag.canvasObjects.map(canvasObject => canvasObject.owner.id));\n const candidates = nearestCandidates(leadBounds, findSnapCandidateBounds(svg, excludedIds));\n const threshold = snapDistancePx(svg) / pxPerUnit(svg);\n const snap = computeSnap(leadBounds, candidates, {\n threshold,\n activeX: MOVE_ACTIVE_POINTS,\n activeY: MOVE_ACTIVE_POINTS,\n guideOverhang: GUIDE_OVERHANG,\n });\n // On each axis the nearer of the two wins: lining up with an edge, or keeping the gaps of a row equal.\n const gaps = computeGapSnap(leadBounds, candidates, threshold);\n const pick = (align: AxisSnap, gap: GapSnap | null): GapSnap => {\n if (gap && (!align.guide || Math.abs(gap.delta) < Math.abs(align.delta))) {\n return gap;\n }\n return { delta: align.delta, guides: align.guide ? [align.guide] : [] };\n };\n const x = pick(snap.x, gaps.x);\n const y = pick(snap.y, gaps.y);\n return { dx: rawDx + x.delta, dy: rawDy + y.delta, guides: [...x.guides, ...y.guides] };\n}\n","import type { Emitter } from '../events';\nimport { clampMoveDelta } from './geometry';\nimport { movePointerDelta } from './pointer';\nimport { snapMove } from './snapping';\nimport type { MoveDragState } from './state';\n\nexport function emitMoveCompletion(\n svg: SVGSVGElement,\n emitter: Emitter,\n drag: MoveDragState,\n event: PointerEvent,\n): void {\n if (!drag.moved) {\n return;\n }\n\n const rawDelta = movePointerDelta(svg, drag, event);\n const snapped = snapMove(svg, drag, rawDelta.dx, rawDelta.dy);\n const { dx, dy } = clampMoveDelta(drag.canvasObjects, snapped.dx, snapped.dy);\n for (const canvasObject of drag.canvasObjects) {\n emitter.emit('moveChange', { owner: canvasObject.owner, dx, dy });\n }\n}\n","import { updateLiveFaceLinks, updateLiveLinks } from '../linkPreview';\nimport { offsetBounds } from './geometry';\nimport type { MoveDragState } from './state';\n\nfunction translateNodes(nodes: SVGGraphicsElement[], baseTransforms: (string | null)[], dx: number, dy: number): void {\n nodes.forEach((node, index) => {\n const base = baseTransforms[index];\n node.setAttribute('transform', base ? `translate(${dx} ${dy}) ${base}` : `translate(${dx} ${dy})`);\n });\n}\n\nexport function applyMovePreview(drag: MoveDragState, dx: number, dy: number): void {\n for (const canvasObject of drag.canvasObjects) {\n translateNodes(canvasObject.nodes, canvasObject.baseTransforms, dx, dy);\n translateNodes(canvasObject.overlays, canvasObject.overlayBaseTransforms, dx, dy);\n const bounds = offsetBounds(canvasObject.draggedBounds, dx, dy);\n updateLiveLinks(canvasObject.liveLinks, bounds);\n if (canvasObject.isometricSize) {\n updateLiveFaceLinks(canvasObject.liveFaceLinks, { x: bounds.x, y: bounds.y, ...canvasObject.isometricSize });\n }\n }\n for (const link of drag.internalLinks) {\n translateNodes(link.nodes, link.baseTransforms, dx, dy);\n }\n}\n","import { DERIVED_HEIGHT_ROLES } from '../dom';\nimport type { OwnerRef } from '../viewer';\n\nconst GEOMETRY_ROLES: ReadonlySet<string> = new Set(['shape', 'chart', 'frame', 'swimlane', 'isometric', 'widget']);\nconst COMPOSITE_ROLES: ReadonlySet<string> = new Set(['chart']);\nconst MOVABLE_ROLES: ReadonlySet<string> = new Set([...GEOMETRY_ROLES, 'path']);\n\nexport function hasEditableGeometry(owner: OwnerRef | null | undefined): owner is OwnerRef {\n return owner !== null && owner !== undefined && GEOMETRY_ROLES.has(owner.role);\n}\n\nexport function hasMovableGeometry(owner: OwnerRef | null | undefined): owner is OwnerRef {\n return owner !== null && owner !== undefined && MOVABLE_ROLES.has(owner.role);\n}\n\nexport function isCompositeOwner(owner: OwnerRef | null | undefined): boolean {\n return owner !== null && owner !== undefined && COMPOSITE_ROLES.has(owner.role);\n}\n\nexport function hasDerivedHeight(owner: OwnerRef | null | undefined): boolean {\n return owner !== null && owner !== undefined && DERIVED_HEIGHT_ROLES.has(owner.role);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { findAllOwnerNodes, findOwnerNode, isometricGeometryOf, isPrimary } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { findLiveFaceLinks, findLiveLinks } from '../linkPreview';\nimport type { DraggedCanvasObject, IsometricLiveSize } from './types';\n\nfunction externalLiveLinks(svg: SVGSVGElement, ownerId: string, groupIds: Set<string>, bounds: Rect) {\n return findLiveLinks(svg, ownerId, bounds).filter(link => {\n const otherId = link.path.getAttribute(link.draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n return !otherId || !groupIds.has(otherId);\n });\n}\n\nfunction externalLiveFaceLinks(svg: SVGSVGElement, ownerId: string, groupIds: Set<string>) {\n return findLiveFaceLinks(svg, ownerId).filter(link => {\n const otherId = link.path.getAttribute(link.draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n return !otherId || !groupIds.has(otherId);\n });\n}\n\nfunction parentContainerBounds(\n svg: SVGSVGElement,\n primary: SVGGraphicsElement,\n groupIds: Set<string>,\n): Rect | undefined {\n const parentId = primary.getAttribute('data-sf-parent-frame');\n if (!parentId || groupIds.has(parentId)) {\n return undefined;\n }\n const container = findOwnerNode(svg, parentId, isPrimary);\n if (!container) {\n return undefined;\n }\n const bbox = container.getBBox();\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n}\n\nfunction captureCanvasObject(svg: SVGSVGElement, owner: OwnerRef, groupIds: Set<string>): DraggedCanvasObject | null {\n const nodes = findAllOwnerNodes(svg, owner.id);\n const primary = findOwnerNode(svg, owner.id, isPrimary);\n if (!nodes.length || !primary) {\n return null;\n }\n\n const overlays = [...svg.querySelectorAll<SVGGElement>(`[data-sf-selection-overlay=\"${CSS.escape(owner.id)}\"]`)];\n const draggedBounds = primary.getBBox();\n const isometricGeometry = owner.role === 'isometric' ? isometricGeometryOf(primary) : null;\n const isometricSize: IsometricLiveSize | undefined = isometricGeometry\n ? { width: isometricGeometry.width, height: isometricGeometry.height, depth: isometricGeometry.depth }\n : undefined;\n return {\n owner,\n nodes,\n baseTransforms: nodes.map(node => node.getAttribute('transform')),\n overlays,\n overlayBaseTransforms: overlays.map(overlay => overlay.getAttribute('transform')),\n draggedBounds,\n liveLinks: externalLiveLinks(svg, owner.id, groupIds, draggedBounds),\n liveFaceLinks: isometricSize ? externalLiveFaceLinks(svg, owner.id, groupIds) : [],\n isometricSize,\n containerBounds: parentContainerBounds(svg, primary, groupIds),\n };\n}\n\nexport function captureDraggedCanvasObjects(\n svg: SVGSVGElement,\n group: OwnerRef[],\n groupIds: Set<string>,\n): DraggedCanvasObject[] {\n const canvasObjects: DraggedCanvasObject[] = [];\n for (const owner of group) {\n const canvasObject = captureCanvasObject(svg, owner, groupIds);\n if (canvasObject) {\n canvasObjects.push(canvasObject);\n }\n }\n return canvasObjects;\n}\n","import { findAllOwnerNodes } from '../../dom';\nimport type { TransformedNodes } from './types';\n\nfunction belongsToMoveGroup(path: SVGPathElement, groupIds: Set<string>): boolean {\n const from = path.getAttribute('data-sf-from');\n const to = path.getAttribute('data-sf-to');\n return Boolean(from && to && groupIds.has(from) && groupIds.has(to));\n}\n\nexport function captureInternalLinks(svg: SVGSVGElement, groupIds: Set<string>): TransformedNodes[] {\n if (groupIds.size < 2) {\n return [];\n }\n\n const links: TransformedNodes[] = [];\n for (const path of svg.querySelectorAll<SVGPathElement>('path[data-sf-from][data-sf-to]')) {\n const linkId = path.getAttribute('data-sf-id');\n if (!linkId || !belongsToMoveGroup(path, groupIds)) {\n continue;\n }\n const nodes = findAllOwnerNodes(svg, linkId);\n if (nodes.length) {\n links.push({ nodes, baseTransforms: nodes.map(node => node.getAttribute('transform')) });\n }\n }\n return links;\n}\n","import type { Rect } from '../../model/geometry/types';\n\nexport const CONTAINER_ROLES: ReadonlySet<string> = new Set(['frame', 'swimlane']);\n\nexport function childrenUnionBounds(svg: SVGSVGElement, containerId: string): Rect | undefined {\n const nodes = svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-parent-frame=\"${CSS.escape(containerId)}\"]`);\n let result: Rect | undefined;\n nodes.forEach(node => {\n const bbox = node.getBBox();\n if (!result) {\n result = { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n return;\n }\n const minX = Math.min(result.x, bbox.x);\n const minY = Math.min(result.y, bbox.y);\n const maxX = Math.max(result.x + result.width, bbox.x + bbox.width);\n const maxY = Math.max(result.y + result.height, bbox.y + bbox.height);\n result = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n });\n return result;\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef, Viewer } from '../../viewer';\nimport { CONTAINER_ROLES } from '../containerGeometry';\nimport { hasMovableGeometry } from '../geometryRoles';\n\nfunction containedChildren(viewer: Viewer, owner: OwnerRef): OwnerRef[] {\n if (!CONTAINER_ROLES.has(owner.role)) {\n return [];\n }\n const nodes = viewer.svg.querySelectorAll(`[data-sf-parent-frame=\"${CSS.escape(owner.id)}\"]`);\n return [...nodes].map(node => resolveOwner(node)).filter((ref): ref is OwnerRef => ref !== null);\n}\n\nexport function selectedMoveGroup(viewer: Viewer, owner: OwnerRef): OwnerRef[] {\n const selection = viewer.getSelection();\n const isMultiSelect = selection.length > 1 && selection.some(selected => selected.id === owner.id);\n if (isMultiSelect) {\n return selection.filter(hasMovableGeometry);\n }\n return [owner, ...containedChildren(viewer, owner)];\n}\n","import { resolveOwner } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport { hasMovableGeometry } from '../geometryRoles';\nimport { captureDraggedCanvasObjects } from './canvasObjectCapture';\nimport { captureInternalLinks } from './internalLinkCapture';\nimport { selectedMoveGroup } from './selection';\nimport type { MoveDragState } from './types';\n\nfunction isChartInteractiveMark(target: Element | null): boolean {\n return target?.closest?.('[data-sf-value-index], [data-sf-prop-kind=\"value\"], [data-sf-mark]') != null;\n}\n\nexport function createMoveDragState(\n viewer: Viewer,\n event: PointerEvent,\n startUser: { x: number; y: number },\n): MoveDragState | null {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!hasMovableGeometry(owner) || isChartInteractiveMark(target)) {\n return null;\n }\n\n const group = selectedMoveGroup(viewer, owner);\n const groupIds = new Set(group.map(member => member.id));\n const canvasObjects = captureDraggedCanvasObjects(viewer.svg, group, groupIds);\n if (!canvasObjects.length) {\n return null;\n }\n\n (target as SVGGraphicsElement)?.setPointerCapture?.(event.pointerId);\n return {\n canvasObjects,\n internalLinks: captureInternalLinks(viewer.svg, groupIds),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n startUser,\n moved: false,\n };\n}\n\nexport type { DraggedCanvasObject, MoveDragState } from './types';\n","import { clearAlignmentGuides, isCameraGesture, updateAlignmentGuides } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { emitMoveCompletion } from './completion';\nimport { clampMoveDelta } from './geometry';\nimport { crossedMoveDragThreshold, movePointerDelta, movePointerPosition } from './pointer';\nimport { applyMovePreview } from './preview';\nimport { snapMove } from './snapping';\nimport { createMoveDragState, type MoveDragState } from './state';\n\nconst MOVE_GUIDE_COLOR = '#8b5cf6';\n\nexport class MoveSession {\n readonly #viewer: Viewer;\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: MoveDragState | null = null;\n\n constructor(viewer: Viewer, emitter: Emitter) {\n this.#viewer = viewer;\n this.#svg = viewer.svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createMoveDragState(this.#viewer, event, movePointerPosition(this.#svg, event));\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedMoveDragThreshold(drag, event)) {\n return;\n }\n\n drag.moved = true;\n const rawDelta = movePointerDelta(this.#svg, drag, event);\n const delta = snapMove(this.#svg, drag, rawDelta.dx, rawDelta.dy);\n const clamped = clampMoveDelta(drag.canvasObjects, delta.dx, delta.dy);\n applyMovePreview(drag, clamped.dx, clamped.dy);\n updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n clearAlignmentGuides(this.#svg);\n emitMoveCompletion(this.#svg, this.#emitter, drag, event);\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { MoveSession } from './move/session';\n\nexport interface MoveDragHandle {\n destroy(): void;\n}\n\nexport function bindShapeMovement(viewer: Viewer, emitter: Emitter): MoveDragHandle {\n const svg = viewer.svg;\n const session = new MoveSession(viewer, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { hasMovableGeometry } from './geometryRoles';\n\nexport interface NudgeSelectionHandle {\n destroy(): void;\n}\n\nconst STEP = 1;\nconst SHIFT_STEP = 10;\n\nconst DIRECTIONS: Record<string, { x: number; y: number }> = {\n ArrowLeft: { x: -1, y: 0 },\n ArrowRight: { x: 1, y: 0 },\n ArrowUp: { x: 0, y: -1 },\n ArrowDown: { x: 0, y: 1 },\n};\n\nfunction typingInField(event: KeyboardEvent): boolean {\n return event.target instanceof Element && event.target.closest('input, textarea, [contenteditable=\"true\"]') !== null;\n}\n\nexport function bindNudgeSelection(viewer: Viewer, emitter: Emitter): NudgeSelectionHandle {\n const svg = viewer.svg;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const direction = DIRECTIONS[e.key];\n if (!direction || e.altKey || e.ctrlKey || e.metaKey || typingInField(e)) {\n return;\n }\n const owners = viewer.getSelection().filter(hasMovableGeometry);\n if (!owners.length) {\n return;\n }\n e.preventDefault();\n const step = e.shiftKey ? SHIFT_STEP : STEP;\n for (const owner of owners) {\n emitter.emit('moveChange', { owner, dx: direction.x * step, dy: direction.y * step });\n }\n };\n\n svg.addEventListener('keydown', onKeyDown);\n\n return {\n destroy() {\n svg.removeEventListener('keydown', onKeyDown);\n },\n };\n}\n","import type { RectGuideLine } from '../snapGeometry';\n\nexport interface DrawPoint {\n x: number;\n y: number;\n}\n\nexport const MIN_POINTS_TO_CLOSE = 3;\nexport const MIN_POINTS_OPEN = 2;\n\nexport function isCloseToStart(points: readonly DrawPoint[], cursor: DrawPoint, snapDistanceUnits: number): boolean {\n if (points.length < MIN_POINTS_TO_CLOSE) {\n return false;\n }\n const start = points[0];\n return Math.hypot(cursor.x - start.x, cursor.y - start.y) <= snapDistanceUnits;\n}\n\nconst EIGHTH_TURN = Math.PI / 4;\n\nexport function snapTo45Degrees(reference: DrawPoint, point: DrawPoint): DrawPoint {\n const dx = point.x - reference.x;\n const dy = point.y - reference.y;\n const distance = Math.hypot(dx, dy);\n if (distance === 0) {\n return point;\n }\n const angle = Math.round(Math.atan2(dy, dx) / EIGHTH_TURN) * EIGHTH_TURN;\n return { x: reference.x + Math.cos(angle) * distance, y: reference.y + Math.sin(angle) * distance };\n}\n\nexport interface SessionGuideSnap {\n point: DrawPoint;\n guide: RectGuideLine | null;\n}\n\nexport function snapToSessionGuides(\n last: DrawPoint,\n angleSnapped: DrawPoint,\n priorPoints: readonly DrawPoint[],\n raw: DrawPoint,\n snapRadiusUnits: number,\n): SessionGuideSnap {\n const rayX = angleSnapped.x - last.x;\n const rayY = angleSnapped.y - last.y;\n const length = Math.hypot(rayX, rayY);\n if (length === 0) {\n return { point: angleSnapped, guide: null };\n }\n const ux = rayX / length;\n const uy = rayY / length;\n\n let best: { point: DrawPoint; guide: RectGuideLine; distance: number } | null = null;\n for (const prior of priorPoints) {\n if (Math.abs(ux) > 1e-8) {\n const t = (prior.x - last.x) / ux;\n if (t >= 0) {\n const point = { x: prior.x, y: last.y + uy * t };\n const distance = Math.hypot(point.x - raw.x, point.y - raw.y);\n if (distance <= snapRadiusUnits && (!best || distance < best.distance)) {\n best = {\n point,\n guide: {\n orientation: 'vertical',\n position: prior.x,\n from: Math.min(prior.y, point.y),\n to: Math.max(prior.y, point.y),\n },\n distance,\n };\n }\n }\n }\n if (Math.abs(uy) > 1e-8) {\n const t = (prior.y - last.y) / uy;\n if (t >= 0) {\n const point = { x: last.x + ux * t, y: prior.y };\n const distance = Math.hypot(point.x - raw.x, point.y - raw.y);\n if (distance <= snapRadiusUnits && (!best || distance < best.distance)) {\n best = {\n point,\n guide: {\n orientation: 'horizontal',\n position: prior.y,\n from: Math.min(prior.x, point.x),\n to: Math.max(prior.x, point.x),\n },\n distance,\n };\n }\n }\n }\n }\n return best ? { point: best.point, guide: best.guide } : { point: angleSnapped, guide: null };\n}\n","import { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\nimport type { PathDrawState } from './state';\n\nconst PREVIEW_COLOR = '#9b42df';\nconst LINE_WIDTH_PX = 2;\nconst DASH_PX = 6;\nconst GAP_PX = 4;\nconst POINT_RADIUS_PX = 4;\nconst START_POINT_RADIUS_PX = 6;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport function createPathDrawPreview(svg: SVGSVGElement): { group: SVGGElement; line: SVGPathElement } {\n const document = svg.ownerDocument;\n const group = document.createElementNS(SVG_NAMESPACE, 'g') as SVGGElement;\n group.setAttribute('pointer-events', 'none');\n const line = document.createElementNS(SVG_NAMESPACE, 'path') as SVGPathElement;\n line.setAttribute('fill', 'none');\n line.setAttribute('stroke', PREVIEW_COLOR);\n line.setAttribute('stroke-linecap', 'round');\n line.setAttribute('stroke-linejoin', 'round');\n group.appendChild(line);\n return { group, line };\n}\n\nfunction pointMarker(svg: SVGSVGElement, point: { x: number; y: number }, highlighted: boolean): SVGCircleElement {\n const document = svg.ownerDocument;\n const unit = 1 / pxPerUnit(svg);\n const circle = document.createElementNS(SVG_NAMESPACE, 'circle') as SVGCircleElement;\n circle.setAttribute('cx', String(point.x));\n circle.setAttribute('cy', String(point.y));\n circle.setAttribute('r', String((highlighted ? START_POINT_RADIUS_PX : POINT_RADIUS_PX) * unit));\n circle.setAttribute('fill', highlighted ? PREVIEW_COLOR : '#ffffff');\n circle.setAttribute('stroke', PREVIEW_COLOR);\n circle.setAttribute('stroke-width', String(POINT_STROKE_WIDTH_PX * unit));\n return circle;\n}\n\nexport function updatePathDrawPreview(svg: SVGSVGElement, state: PathDrawState): void {\n const { previewLine, previewGroup } = state;\n if (!previewLine || !previewGroup) {\n return;\n }\n const unit = 1 / pxPerUnit(svg);\n previewLine.setAttribute('stroke-width', String(LINE_WIDTH_PX * unit));\n previewLine.setAttribute('stroke-dasharray', `${DASH_PX * unit} ${GAP_PX * unit}`);\n\n const live = state.cursor ? [...state.points, state.cursor] : state.points;\n previewLine.setAttribute('d', freeformPathData({ points: live, tension: state.tension, closed: false }));\n\n while (previewGroup.childNodes.length > 1) {\n previewGroup.lastChild?.remove();\n }\n state.points.forEach((point, index) => {\n previewGroup.appendChild(pointMarker(svg, point, index === 0 && state.willClose));\n });\n}\n","import type { DrawPoint } from './geometry';\n\nexport interface PathDrawState {\n active: boolean;\n points: DrawPoint[];\n cursor: DrawPoint | null;\n willClose: boolean;\n tension: number;\n onExit: (() => void) | null;\n previewGroup: SVGGElement | null;\n previewLine: SVGPathElement | null;\n lastDown: { time: number; x: number; y: number } | null;\n}\n\nexport function createIdlePathDrawState(): PathDrawState {\n return {\n active: false,\n points: [],\n cursor: null,\n willClose: false,\n tension: 0,\n onExit: null,\n previewGroup: null,\n previewLine: null,\n lastDown: null,\n };\n}\n","import {\n clearAlignmentGuides,\n type GuideLine,\n isCameraGesture,\n pointerUserPoint,\n pxPerUnit,\n updateAlignmentGuides,\n} from '../../dom';\nimport type { Emitter } from '../events';\nimport {\n type DrawPoint,\n isCloseToStart,\n MIN_POINTS_OPEN,\n MIN_POINTS_TO_CLOSE,\n snapTo45Degrees,\n snapToSessionGuides,\n} from './geometry';\nimport { createPathDrawPreview, updatePathDrawPreview } from './preview';\nimport { createIdlePathDrawState, type PathDrawState } from './state';\n\nexport interface PathDrawOptions {\n tension?: number;\n onExit?: () => void;\n}\n\nconst CLOSE_SNAP_PX = 12;\nconst GUIDE_SNAP_PX = 14;\nconst GUIDE_COLOR = '#4CAF50';\nconst DOUBLE_CLICK_MS = 400;\nconst DOUBLE_CLICK_PX = 10;\n\nexport class PathDrawSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #state: PathDrawState = createIdlePathDrawState();\n #shiftHeld = false;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(options: PathDrawOptions = {}): void {\n if (this.#state.active) {\n this.#reset(false);\n }\n const { group, line } = createPathDrawPreview(this.#svg);\n this.#svg.appendChild(group);\n this.#state = {\n ...createIdlePathDrawState(),\n active: true,\n tension: options.tension ?? 0,\n onExit: options.onExit ?? null,\n previewGroup: group,\n previewLine: line,\n };\n }\n\n cancel(): void {\n if (this.#state.active) {\n this.#reset(true);\n }\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (!this.#state.active || event.button !== 0 || isCameraGesture(event)) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n\n const now = Date.now();\n const last = this.#state.lastDown;\n this.#state.lastDown = { time: now, x: event.clientX, y: event.clientY };\n if (\n last &&\n now - last.time < DOUBLE_CLICK_MS &&\n Math.hypot(event.clientX - last.x, event.clientY - last.y) < DOUBLE_CLICK_PX\n ) {\n return;\n }\n\n const resolved = this.#resolvePoint(point);\n if (resolved.willClose) {\n this.#commit(true);\n return;\n }\n\n this.#state.points = [...this.#state.points, resolved.point];\n this.#state.cursor = resolved.point;\n this.#state.willClose = false;\n updatePathDrawPreview(this.#svg, this.#state);\n clearAlignmentGuides(this.#svg);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const resolved = this.#resolvePoint(point);\n this.#state.cursor = resolved.point;\n this.#state.willClose = resolved.willClose;\n updatePathDrawPreview(this.#svg, this.#state);\n if (resolved.guide) {\n updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR);\n } else {\n clearAlignmentGuides(this.#svg);\n }\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n };\n\n readonly dblClick = (event: MouseEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n if (this.#state.points.length >= MIN_POINTS_OPEN) {\n this.#commit(false);\n }\n };\n\n readonly keyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Shift') {\n this.#shiftHeld = true;\n }\n if (!this.#state.active) {\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.#reset(true);\n } else if (event.key === 'Enter' && this.#state.points.length >= MIN_POINTS_OPEN) {\n event.preventDefault();\n this.#commit(false);\n } else if (event.key === 'Backspace' && this.#state.points.length > 0) {\n event.preventDefault();\n this.#state.points = this.#state.points.slice(0, -1);\n const closeSnapUnits = CLOSE_SNAP_PX / pxPerUnit(this.#svg);\n this.#state.willClose = this.#state.cursor\n ? isCloseToStart(this.#state.points, this.#state.cursor, closeSnapUnits)\n : false;\n updatePathDrawPreview(this.#svg, this.#state);\n clearAlignmentGuides(this.#svg);\n }\n };\n\n readonly keyUp = (event: KeyboardEvent): void => {\n if (event.key === 'Shift') {\n this.#shiftHeld = false;\n }\n };\n\n #resolvePoint(raw: DrawPoint): { point: DrawPoint; willClose: boolean; guide: GuideLine | null } {\n const closeSnapUnits = CLOSE_SNAP_PX / pxPerUnit(this.#svg);\n if (isCloseToStart(this.#state.points, raw, closeSnapUnits)) {\n return { point: this.#state.points[0], willClose: true, guide: null };\n }\n const points = this.#state.points;\n const last = points[points.length - 1];\n if (!this.#shiftHeld || !last) {\n return { point: raw, willClose: false, guide: null };\n }\n const angleSnapped = snapTo45Degrees(last, raw);\n const guideSnapUnits = GUIDE_SNAP_PX / pxPerUnit(this.#svg);\n const { point, guide } = snapToSessionGuides(last, angleSnapped, points.slice(0, -1), raw, guideSnapUnits);\n return { point, willClose: false, guide };\n }\n\n #commit(closed: boolean): void {\n const points = this.#state.points;\n const minPoints = closed ? MIN_POINTS_TO_CLOSE : MIN_POINTS_OPEN;\n if (points.length >= minPoints) {\n this.#emitter.emit('pathDrawComplete', { points: [...points], closed, tension: this.#state.tension });\n }\n this.#reset(true);\n }\n\n #reset(callExit: boolean): void {\n this.#state.previewGroup?.remove();\n clearAlignmentGuides(this.#svg);\n const exit = this.#state.onExit;\n this.#state = createIdlePathDrawState();\n this.#shiftHeld = false;\n if (callExit) {\n exit?.();\n }\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { type PathDrawOptions, PathDrawSession } from './pathDraw/session';\n\nexport type { PathDrawOptions } from './pathDraw/session';\n\nexport interface PathDrawDragHandle {\n start(options?: PathDrawOptions): void;\n cancel(): void;\n destroy(): void;\n}\n\nexport function bindPathDraw(viewer: Viewer, emitter: Emitter): PathDrawDragHandle {\n const svg = viewer.svg;\n const session = new PathDrawSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown, true);\n svg.addEventListener('pointermove', session.pointerMove, true);\n svg.addEventListener('pointerup', session.pointerUp, true);\n svg.addEventListener('dblclick', session.dblClick, true);\n window.addEventListener('keydown', session.keyDown);\n window.addEventListener('keyup', session.keyUp);\n\n return {\n start: options => {\n viewer.select([]);\n session.start(options);\n },\n cancel: () => session.cancel(),\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown, true);\n svg.removeEventListener('pointermove', session.pointerMove, true);\n svg.removeEventListener('pointerup', session.pointerUp, true);\n svg.removeEventListener('dblclick', session.dblClick, true);\n window.removeEventListener('keydown', session.keyDown);\n window.removeEventListener('keyup', session.keyUp);\n },\n };\n}\n","import { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { PATH_HALO_ATTR } from '../../dom';\nimport type { PathReshapeDragState } from './state';\n\nexport function applyPathReshapePreview(\n drag: PathReshapeDragState,\n point: { x: number; y: number },\n): Array<[number, number]> {\n const points = drag.points.map((existing, index) =>\n index === drag.pointIndex ? [point.x, point.y] : existing,\n ) as Array<[number, number]>;\n const d = freeformPathData({\n points: points.map(([x, y]) => ({ x, y })),\n tension: drag.tension,\n closed: drag.closed,\n });\n drag.pathNode.setAttribute('d', d);\n drag.handle.setAttribute('cx', String(point.x));\n drag.handle.setAttribute('cy', String(point.y));\n drag.overlay?.querySelector(`[${PATH_HALO_ATTR}]`)?.setAttribute('d', d);\n return points;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { findOwnerNode, isPrimary, pathGeometryOf, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface PathReshapeTarget {\n owner: OwnerRef;\n pathNode: SVGPathElement;\n handle: Element;\n pointIndex: number;\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n}\n\nexport function resolvePathReshapeTarget(svg: SVGSVGElement, event: PointerEvent): PathReshapeTarget | null {\n const handle = (event.target as Element | null)?.closest?.(`[${PATH_POINT_INDEX_ATTR}]`) ?? null;\n const indexAttr = handle?.getAttribute(PATH_POINT_INDEX_ATTR) ?? null;\n const pointIndex = indexAttr !== null ? Number(indexAttr) : Number.NaN;\n const ownerId = handle?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n if (!handle || !Number.isInteger(pointIndex) || !ownerId) {\n return null;\n }\n\n const pathNode = findOwnerNode<SVGPathElement>(svg, ownerId, isPrimary);\n const owner = pathNode && resolveOwner(pathNode);\n const geometry = pathNode && pathGeometryOf(pathNode);\n if (!pathNode || !owner || !geometry || pointIndex < 0 || pointIndex >= geometry.points.length) {\n return null;\n }\n\n return {\n owner,\n pathNode,\n handle,\n pointIndex,\n points: geometry.points,\n tension: geometry.tension,\n closed: geometry.closed,\n };\n}\n","import type { OwnerRef } from '../../viewer';\nimport { resolvePathReshapeTarget } from './target';\n\nexport interface PathReshapeDragState {\n owner: OwnerRef;\n pathNode: SVGPathElement;\n handle: Element;\n overlay: Element | null;\n pointIndex: number;\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n}\n\nexport function createPathReshapeDragState(svg: SVGSVGElement, event: PointerEvent): PathReshapeDragState | null {\n const target = resolvePathReshapeTarget(svg, event);\n if (!target) {\n return null;\n }\n\n (target.handle as SVGGraphicsElement & { setPointerCapture?: (id: number) => void }).setPointerCapture?.(\n event.pointerId,\n );\n return {\n ...target,\n overlay: target.handle.closest('[data-sf-selection-overlay]'),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n };\n}\n","import { isCameraGesture, pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { applyPathReshapePreview } from './preview';\nimport { createPathReshapeDragState, type PathReshapeDragState } from './state';\n\nexport class PathReshapeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: PathReshapeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n this.#drag = createPathReshapeDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n drag.moved = true;\n const point = pointerUserPoint(this.#svg, event);\n if (point) {\n applyPathReshapePreview(drag, point);\n }\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event) ?? {\n x: drag.points[drag.pointIndex][0],\n y: drag.points[drag.pointIndex][1],\n };\n const points = applyPathReshapePreview(drag, point);\n this.#emitter.emit('pathPointChange', { owner: drag.owner, points: points.map(([x, y]) => ({ x, y })) });\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { PathReshapeSession } from './pathReshape/session';\n\nexport interface PathReshapeDragHandle {\n destroy(): void;\n}\n\nexport function bindPathReshape(viewer: Viewer, emitter: Emitter): PathReshapeDragHandle {\n const svg = viewer.svg;\n const session = new PathReshapeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { clipSegmentToRect } from '../../../renderScene/charts/primitives';\nimport type { PieLabelDragState } from './types';\n\nconst PREVIEW_TICK_COLOR = '#334155';\nconst PREVIEW_TICK_STROKE_WIDTH = '1.5';\n\nexport function updatePieLabelDragPreview(drag: PieLabelDragState, dx: number, dy: number): void {\n for (const element of drag.labelElements) {\n element.setAttribute('transform', `translate(${dx}, ${dy})`);\n }\n if (!drag.tickElement) {\n return;\n }\n const from = { x: drag.tickStartX, y: drag.tickStartY };\n const to = { x: drag.restX + dx, y: drag.restY + dy };\n const clipped = clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);\n drag.tickElement.setAttribute('d', `M ${from.x} ${from.y} L ${clipped.x} ${clipped.y}`);\n drag.tickElement.setAttribute('stroke', PREVIEW_TICK_COLOR);\n drag.tickElement.setAttribute('stroke-width', PREVIEW_TICK_STROKE_WIDTH);\n}\n\nexport function clearPieLabelDragPreview(drag: PieLabelDragState): void {\n for (const element of drag.labelElements) {\n element.removeAttribute('transform');\n }\n if (!drag.tickElement) {\n return;\n }\n restoreAttribute(drag.tickElement, 'd', drag.tickOriginalD);\n restoreAttribute(drag.tickElement, 'stroke', drag.tickOriginalStroke);\n restoreAttribute(drag.tickElement, 'stroke-width', drag.tickOriginalStrokeWidth);\n}\n\nfunction restoreAttribute(element: SVGGraphicsElement, name: string, value: string | null): void {\n if (value === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value);\n }\n}\n","import { findOwnerNode, isPrimary } from '../dom';\n\nexport interface ParsedPieGeometry {\n centerX: number;\n centerY: number;\n outerRadius: number;\n innerRadius: number;\n cornerRadius: number;\n}\n\nexport function readPieGeometry(svg: SVGSVGElement, ownerId: string): ParsedPieGeometry | null {\n const raw = findOwnerNode(svg, ownerId, isPrimary)?.getAttribute('data-sf-pie-geometry');\n if (!raw) {\n return null;\n }\n const [centerX, centerY, outerRadius, innerRadius, cornerRadius = 0] = raw.split(',').map(Number);\n return [centerX, centerY, outerRadius, innerRadius].every(Number.isFinite)\n ? { centerX, centerY, outerRadius, innerRadius, cornerRadius: Number.isFinite(cornerRadius) ? cornerRadius : 0 }\n : null;\n}\n","import { LABEL_WIDTH, LEADER_INSET } from '../../../renderScene/charts/renderers/pie/labels';\nimport { isCameraGesture, pointerUserPoint, resolveOwner } from '../../dom';\nimport { readPieGeometry } from '../pieGeometry';\nimport type { PieLabelDragState } from './types';\n\nconst LABEL_MARKS = ['pie-label', 'polar-area-label'];\nconst TICK_MARKS: Record<string, string> = {\n 'pie-label': 'pie-label-tick',\n 'polar-area-label': 'polar-area-label-tick',\n};\n\nfunction findLabelMark(event: PointerEvent): SVGGraphicsElement | null {\n const selector = LABEL_MARKS.map(mark => `[data-sf-mark=\"${mark}\"]`).join(', ');\n return (event.target as Element | null)?.closest?.(selector) as SVGGraphicsElement | null;\n}\n\nfunction isLabelPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findLabelSiblings(svg: SVGSVGElement, ownerId: string, seriesId: string, mark: string): SVGGraphicsElement[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(seriesId)}\"][data-sf-mark=\"${mark}\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)];\n}\n\nfunction findTickElement(\n svg: SVGSVGElement,\n ownerId: string,\n seriesId: string,\n tickMark: string,\n): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(seriesId)}\"][data-sf-mark=\"${tickMark}\"]`;\n return svg.querySelector<SVGGraphicsElement>(selector);\n}\n\nfunction combinedCenter(elements: SVGGraphicsElement[]): { x: number; y: number } {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const element of elements) {\n const box = element.getBBox();\n minX = Math.min(minX, box.x);\n minY = Math.min(minY, box.y);\n maxX = Math.max(maxX, box.x + box.width);\n maxY = Math.max(maxY, box.y + box.height);\n }\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n}\n\nexport function resolvePieLabelDrag(svg: SVGSVGElement, event: PointerEvent): PieLabelDragState | null {\n if (!isLabelPointer(event)) {\n return null;\n }\n const clicked = findLabelMark(event);\n if (!clicked) {\n return null;\n }\n const owner = resolveOwner(clicked);\n if (owner?.role !== 'chart') {\n return null;\n }\n const seriesId = clicked.getAttribute('data-sf-series');\n if (!seriesId) {\n return null;\n }\n const midAngle = Number(clicked.getAttribute('data-sf-pie-mid-angle'));\n if (!Number.isFinite(midAngle)) {\n return null;\n }\n const geometry = readPieGeometry(svg, owner.id);\n if (!geometry) {\n return null;\n }\n const wedgeRadius = clicked.getAttribute('data-sf-pie-wedge-radius');\n const explicitRadius = wedgeRadius === null ? Number.NaN : Number(wedgeRadius);\n const outerRadius = Number.isFinite(explicitRadius) ? explicitRadius : geometry.outerRadius;\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n const mark = clicked.getAttribute('data-sf-mark') ?? 'pie-label';\n const labelElements = findLabelSiblings(svg, owner.id, seriesId, mark);\n if (!labelElements.length) {\n return null;\n }\n const fontSize = Number.parseFloat(clicked.getAttribute('font-size') ?? '12') || 12;\n const { x: restX, y: restY } = combinedCenter(labelElements);\n const tickElement = findTickElement(svg, owner.id, seriesId, TICK_MARKS[mark] ?? 'pie-label-tick');\n clicked.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n seriesId,\n centerX: geometry.centerX,\n centerY: geometry.centerY,\n outerRadius,\n anchorX: geometry.centerX + outerRadius * Math.cos(midAngle),\n anchorY: geometry.centerY + outerRadius * Math.sin(midAngle),\n tickStartX: geometry.centerX + (outerRadius + LEADER_INSET) * Math.cos(midAngle),\n tickStartY: geometry.centerY + (outerRadius + LEADER_INSET) * Math.sin(midAngle),\n restX,\n restY,\n startX: start.x,\n startY: start.y,\n halfWidth: LABEL_WIDTH / 2,\n halfHeight: fontSize * 1.2,\n moved: false,\n lastDx: 0,\n lastDy: 0,\n labelElements,\n tickElement,\n tickOriginalD: tickElement?.getAttribute('d') ?? null,\n tickOriginalStroke: tickElement?.getAttribute('stroke') ?? null,\n tickOriginalStrokeWidth: tickElement?.getAttribute('stroke-width') ?? null,\n };\n}\n","import { seriesLabelOffsetXProp, seriesLabelOffsetYProp } from '../../../renderScene/charts/propPath';\nimport { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { clearPieLabelDragPreview, updatePieLabelDragPreview } from './preview';\nimport { resolvePieLabelDrag } from './target';\nimport type { PieLabelDragState } from './types';\n\nconst PULL_THRESHOLD = 14;\nconst MOVE_NOISE = 2;\nconst MAX_PULL_FACTOR = 1.5;\n\nexport class PieLabelDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: PieLabelDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolvePieLabelDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const dx = point.x - drag.startX;\n const dy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(dx, dy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updatePieLabelDragPreview(drag, dx, dy);\n }\n\n cancel(): void {\n if (this.#drag) {\n clearPieLabelDragPreview(this.#drag);\n }\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearPieLabelDragPreview(drag);\n if (!drag.moved) {\n return;\n }\n const pathX = seriesLabelOffsetXProp(drag.seriesId);\n const pathY = seriesLabelOffsetYProp(drag.seriesId);\n if (!pathX || !pathY) {\n return;\n }\n const newX = drag.restX + drag.lastDx;\n const newY = drag.restY + drag.lastDy;\n const distanceFromCenter = Math.hypot(newX - drag.centerX, newY - drag.centerY);\n const pulled = distanceFromCenter > drag.outerRadius + PULL_THRESHOLD;\n const maxOffset = drag.outerRadius * MAX_PULL_FACTOR;\n const offsetX = pulled ? clampOffset(newX - drag.anchorX, maxOffset) : 0;\n const offsetY = pulled ? clampOffset(newY - drag.anchorY, maxOffset) : 0;\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: pathX, value: Math.round(offsetX) });\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: pathY, value: Math.round(offsetY) });\n }\n}\n\nfunction clampOffset(value: number, max: number): number {\n return Math.max(-max, Math.min(max, value));\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { PieLabelDragSession } from './session';\n\nexport interface PieLabelDragHandle {\n destroy(): void;\n}\n\nexport function bindPieLabelDrag(viewer: Viewer, emitter: Emitter): PieLabelDragHandle {\n const session = new PieLabelDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { parseValueScale } from '../chartValue/scale';\nimport type { ValueScale } from '../chartValue/types';\nimport { type EditableRules, isEditablePath } from '../propertyEdit/editable';\n\nexport interface PropertyDragTarget {\n owner: OwnerRef;\n path: string;\n scale: ValueScale;\n nodes: SVGGraphicsElement[];\n pointerId: number;\n}\n\nexport function blockPrefixOf(path: string): string {\n const lastDot = path.lastIndexOf('.');\n return lastDot === -1 ? '' : path.slice(0, lastDot + 1);\n}\n\nfunction siblingNodes(svg: SVGSVGElement, owner: OwnerRef, path: string): SVGGraphicsElement[] {\n const prefix = blockPrefixOf(path);\n const selector = `[data-sf-id=\"${CSS.escape(owner.id)}\"][data-sf-prop]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].filter(node => {\n const candidate = node.getAttribute('data-sf-prop') ?? '';\n return prefix === '' ? candidate === path : candidate.startsWith(prefix);\n });\n}\n\nexport function resolvePropertyDrag(\n svg: SVGSVGElement,\n event: PointerEvent,\n rules: EditableRules | undefined,\n): PropertyDragTarget | null {\n if (event.button !== 0 || isCameraGesture(event)) {\n return null;\n }\n\n const node = (event.target as Element | null)?.closest?.('[data-sf-prop-kind=\"value\"]') as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n\n const path = node.getAttribute('data-sf-prop');\n const owner = resolveOwner(node);\n if (!path || owner?.role !== 'chart' || !isEditablePath(path, rules)) {\n return null;\n }\n\n const scale = parseValueScale(findOwnerNode(svg, owner.id, isPrimary));\n if (!scale) {\n return null;\n }\n\n node.setPointerCapture?.(event.pointerId);\n return { owner, path, scale, nodes: siblingNodes(svg, owner, path), pointerId: event.pointerId };\n}\n","import { pointerUserY } from '../chartValue/coordinates';\nimport { createValueReadout, removeValueReadout, updateValueReadout } from '../chartValue/readout';\nimport { pixelForValue, valueAtPixel } from '../chartValue/scale';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { type PropertyDragTarget, resolvePropertyDrag } from './target';\n\nexport class PropertyDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n #drag: PropertyDragTarget | null = null;\n #startY = 0;\n #readout: SVGGElement | null = null;\n #moved = false;\n\n constructor(svg: SVGSVGElement, emitter: Emitter, rules: EditableRules | undefined) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n const drag = resolvePropertyDrag(this.#svg, event, this.#rules);\n if (!drag) {\n return false;\n }\n this.#drag = drag;\n this.#startY = pixelForValue(valueAtPixel(pointerUserY(this.#svg, event), drag.scale), drag.scale);\n this.#moved = false;\n return true;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n this.#moved = true;\n\n const value = valueAtPixel(pointerUserY(this.#svg, event), this.#drag.scale);\n const offset = pixelForValue(value, this.#drag.scale) - this.#startY;\n for (const node of this.#drag.nodes) {\n node.setAttribute('transform', `translate(0 ${offset})`);\n }\n\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n updateValueReadout(this.#readout, { centerX: this.#centerX(), scale: this.#drag.scale }, value);\n }\n\n cancel(): void {\n this.#clearPreview();\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n const moved = this.#moved;\n this.#clearPreview();\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!moved) {\n return;\n }\n this.#emitter.emit('propertyChange', {\n owner: drag.owner,\n path: drag.path,\n value: valueAtPixel(pointerUserY(this.#svg, event), drag.scale),\n });\n }\n\n #centerX(): number {\n const plot = this.#drag?.nodes[0]?.getBBox?.();\n return plot ? plot.x + plot.width / 2 : 0;\n }\n\n #clearPreview(): void {\n for (const node of this.#drag?.nodes ?? []) {\n node.removeAttribute('transform');\n }\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { PropertyDragSession } from './session';\n\nexport interface PropertyDragHandle {\n destroy(): void;\n}\n\nexport function bindPropertyDrag(\n viewer: Viewer,\n emitter: Emitter,\n rules: EditableRules | undefined,\n): PropertyDragHandle {\n const svg = viewer.svg;\n const session = new PropertyDragSession(svg, emitter, rules);\n\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => session.move(event);\n const onPointerUp = (event: PointerEvent) => session.finish(event);\n\n svg.addEventListener('pointerdown', onPointerDown);\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n svg.addEventListener('pointercancel', onPointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', onPointerDown);\n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","interface ActiveTextEditorOptions {\n textarea: HTMLTextAreaElement;\n originalText: string;\n commit: (text: string) => void;\n unbindAutoGrow: () => void;\n onClose: () => void;\n}\n\nexport class ActiveTextEditor {\n readonly #textarea: HTMLTextAreaElement;\n readonly #originalText: string;\n readonly #commit: (text: string) => void;\n readonly #unbindAutoGrow: () => void;\n readonly #onClose: () => void;\n #closed = false;\n\n constructor(options: ActiveTextEditorOptions) {\n this.#textarea = options.textarea;\n this.#originalText = options.originalText;\n this.#commit = options.commit;\n this.#unbindAutoGrow = options.unbindAutoGrow;\n this.#onClose = options.onClose;\n options.textarea.addEventListener('keydown', this.keyDown);\n options.textarea.addEventListener('blur', this.commit);\n }\n\n readonly commit = (): void => {\n const text = this.#textarea.value;\n this.close();\n if (text !== this.#originalText) {\n this.#commit(text);\n }\n };\n\n readonly cancel = (): void => {\n this.close();\n };\n\n private readonly keyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.commit();\n }\n };\n\n private close(): void {\n if (this.#closed) {\n return;\n }\n\n this.#closed = true;\n this.#textarea.removeEventListener('keydown', this.keyDown);\n this.#textarea.removeEventListener('blur', this.commit);\n this.#unbindAutoGrow();\n this.#textarea.remove();\n this.#onClose();\n }\n}\n","import type { TextEditRect } from './geometry';\n\ninterface TextareaOptions {\n text: string;\n rect: TextEditRect;\n fontSize: number;\n fontFamily: string;\n inline?: boolean;\n color?: string;\n fontWeight?: string;\n fontStyle?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nconst ACCENT = '#9b42df';\nconst STYLE_ELEMENT_ATTR = 'data-sf-text-editor-style';\n\nfunction ensureEditorStyles(): void {\n if (document.head.querySelector(`[${STYLE_ELEMENT_ATTR}]`)) {\n return;\n }\n const style = document.createElement('style');\n style.setAttribute(STYLE_ELEMENT_ATTR, '');\n style.textContent = `[data-sf-text-editor]::selection{background:rgba(155,66,223,.22);color:var(--sf-text-editor-color)}`;\n document.head.appendChild(style);\n}\n\nexport function createTextEditor({\n text,\n rect,\n fontSize,\n fontFamily,\n inline = false,\n color = '#0f172a',\n fontWeight,\n fontStyle,\n align = 'left',\n}: TextareaOptions): HTMLTextAreaElement {\n ensureEditorStyles();\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('data-sf-text-editor', '');\n textarea.spellcheck = false;\n if (inline) {\n textarea.setAttribute('data-sf-text-editor-inline', '');\n }\n\n const style = textarea.style;\n style.position = 'fixed';\n style.left = `${rect.left}px`;\n style.top = `${rect.top}px`;\n style.width = `${Math.max(rect.width, 60)}px`;\n style.height = `${Math.max(rect.height, fontSize * 1.6)}px`;\n style.font = `${fontSize}px ${fontFamily}`;\n if (fontWeight) {\n style.fontWeight = fontWeight;\n }\n if (fontStyle) {\n style.fontStyle = fontStyle;\n }\n style.lineHeight = '1.3';\n style.color = color;\n style.setProperty('--sf-text-editor-color', color);\n style.caretColor = ACCENT;\n style.textAlign = align;\n style.outline = 'none';\n style.resize = 'none';\n style.boxSizing = 'border-box';\n style.zIndex = '1000';\n style.overflow = 'hidden';\n\n if (inline) {\n style.background = 'transparent';\n style.border = 'none';\n style.borderRadius = '0';\n style.boxShadow = 'none';\n style.padding = '0 6px';\n } else {\n style.background = '#ffffff';\n style.border = `1px solid ${ACCENT}`;\n style.borderRadius = '8px';\n style.boxShadow = '0 6px 18px rgba(15, 23, 42, 0.18), 0 0 0 3px rgba(155, 66, 223, 0.16)';\n style.padding = '5px 9px';\n }\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n return textarea;\n}\n\nexport function bindTextareaAutoGrow(textarea: HTMLTextAreaElement, minHeight: number): () => void {\n const inline = textarea.hasAttribute('data-sf-text-editor-inline');\n const resize = (): void => {\n if (inline) {\n textarea.style.paddingTop = '0px';\n textarea.style.height = '0px';\n const content = textarea.scrollHeight;\n const height = Math.max(minHeight, Math.min(content, 300));\n textarea.style.height = `${height}px`;\n textarea.style.paddingTop = `${Math.max(0, (height - content) / 2)}px`;\n return;\n }\n textarea.style.height = `${minHeight}px`;\n textarea.style.height = `${Math.max(minHeight, Math.min(textarea.scrollHeight, 300))}px`;\n };\n textarea.addEventListener('input', resize);\n resize();\n return () => {\n textarea.removeEventListener('input', resize);\n };\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { type EditableRules, isEditablePath } from './editable';\n\nexport interface PropertyTarget {\n owner: OwnerRef;\n path: string;\n node: SVGGraphicsElement;\n}\n\nexport function isTextProperty(node: Element): boolean {\n return node.tagName.toLowerCase() === 'text';\n}\n\nfunction textNodeForPath(hit: SVGGraphicsElement, path: string, ownerId: string): SVGGraphicsElement | null {\n const selector = `text[data-sf-prop=\"${CSS.escape(path)}\"][data-sf-id=\"${CSS.escape(ownerId)}\"]`;\n const root: ParentNode | null = hit.ownerSVGElement ?? hit.ownerDocument;\n return root?.querySelector<SVGGraphicsElement>(selector) ?? null;\n}\n\nexport function resolvePropertyTarget(event: MouseEvent, rules: EditableRules | undefined): PropertyTarget | null {\n const hit = (event.target as Element | null)?.closest?.('[data-sf-prop]') as SVGGraphicsElement | null;\n if (!hit) {\n return null;\n }\n\n const path = hit.getAttribute('data-sf-prop');\n const owner = resolveOwner(hit);\n if (!path || !owner || !isEditablePath(path, rules)) {\n return null;\n }\n\n if (!isTextProperty(hit) && hit.getAttribute('data-sf-prop-kind') !== 'value') {\n return null;\n }\n\n const node = isTextProperty(hit) ? hit : textNodeForPath(hit, path, owner.id);\n if (!node) {\n return null;\n }\n return { owner, path, node };\n}\n","import { screenRectOf } from '../../dom';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { bindTextareaAutoGrow, createTextEditor } from '../textEdit/textarea';\nimport type { EditableRules } from './editable';\nimport { type PropertyTarget, resolvePropertyTarget } from './target';\n\nconst MIN_EDIT_WIDTH = 120;\nconst EDIT_WIDTH_MARGIN = 48;\n\nexport class PropertyEditingSession {\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n #activeEditor: ActiveTextEditor | null = null;\n\n constructor(emitter: Emitter, rules: EditableRules | undefined) {\n this.#emitter = emitter;\n this.#rules = rules;\n }\n\n readonly doubleClick = (event: MouseEvent): void => {\n const target = resolvePropertyTarget(event, this.#rules);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.begin(target);\n };\n\n cancel(): void {\n this.#activeEditor?.cancel();\n }\n\n private begin(target: PropertyTarget): void {\n this.cancel();\n\n const { node } = target;\n const rect = screenRectOf(node);\n const fontSize = Number.parseFloat(node.getAttribute('font-size') || '12');\n const originalText = node.textContent ?? '';\n const anchor = node.getAttribute('text-anchor');\n const align = anchor === 'middle' ? 'center' : anchor === 'end' ? 'right' : 'left';\n const fill = node.getAttribute('fill');\n const width = Math.max(rect.width + EDIT_WIDTH_MARGIN, MIN_EDIT_WIDTH);\n const shift = align === 'center' ? (width - rect.width) / 2 : align === 'right' ? width - rect.width : 0;\n const previousVisibility = node.getAttribute('visibility');\n\n const textarea = createTextEditor({\n text: originalText,\n rect: { ...rect, left: rect.left - shift, width },\n fontSize,\n fontFamily: node.getAttribute('font-family') || 'sans-serif',\n inline: true,\n color: fill && fill !== 'none' ? fill : undefined,\n fontWeight: node.getAttribute('font-weight') ?? undefined,\n align,\n });\n node.setAttribute('visibility', 'hidden');\n\n this.#activeEditor = new ActiveTextEditor({\n textarea,\n originalText,\n commit: value => this.#emitter.emit('propertyChange', { owner: target.owner, path: target.path, value }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose: () => {\n if (node.isConnected) {\n if (previousVisibility === null) {\n node.removeAttribute('visibility');\n } else {\n node.setAttribute('visibility', previousVisibility);\n }\n }\n this.#activeEditor = null;\n },\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { ColorPickerThemeOption } from '../colorEdit/theme';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from './editable';\nimport { PropertyEditingSession } from './session';\n\nexport interface PropertyEditingOptions {\n editable?: EditableRules;\n colorPickerTheme?: ColorPickerThemeOption;\n}\n\nexport interface PropertyEditingHandle {\n destroy(): void;\n}\n\nexport function bindPropertyEditing(\n viewer: Viewer,\n emitter: Emitter,\n options: PropertyEditingOptions = {},\n): PropertyEditingHandle {\n const svg = viewer.svg;\n const session = new PropertyEditingSession(emitter, options.editable);\n\n svg.addEventListener('dblclick', session.doubleClick, true);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('dblclick', session.doubleClick, true);\n },\n };\n}\n","import type { Emitter } from '../events';\nimport type { QuickDuplicateDragState } from './state';\n\nexport function emitQuickDuplicateCompletion(emitter: Emitter, drag: QuickDuplicateDragState): void {\n if (!drag.moved) {\n emitter.emit('quickDuplicate', { owner: drag.sourceOwner, direction: drag.direction });\n return;\n }\n if (!drag.hit) {\n return;\n }\n\n emitter.emit('linkTo', {\n owner: drag.sourceOwner,\n direction: drag.direction,\n target: drag.hit.owner,\n side: drag.hit.side,\n fraction: Math.round(drag.hit.offset * 100) / 100,\n });\n}\n","import type { QuickDuplicateDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function duplicatePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedDuplicateDragThreshold(drag: QuickDuplicateDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport { calculateLinkRoute } from '../../../renderScene/artifacts/link/geometry';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\nimport { previewPathData } from '../linkPreview';\nimport { previewLink } from '../linkPreview/geometry';\nimport type { QuickDuplicateDragState } from './state';\n\nconst PREVIEW_STROKE_PX = 2;\nconst NEW_LINK_PATH_TYPE: PathType = 'orthogonal';\n\nexport function createDuplicatePreviewPath(svg: SVGSVGElement): SVGPathElement {\n const path = svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'path');\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-width', String(PREVIEW_STROKE_PX / pxPerUnit(svg)));\n path.style.pointerEvents = 'none';\n return path;\n}\n\nexport function updateDuplicatePreview(\n drag: QuickDuplicateDragState,\n toPoint: { x: number; y: number },\n toSide: Side,\n): void {\n const link = previewLink(drag.direction, toSide);\n const { points, segments } = calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);\n drag.previewPath.setAttribute('d', previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));\n}\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { QuickDuplicateDirection } from '../../dom';\nimport { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { LinkGhost } from '../linkGhost/ghost';\n\nexport interface DuplicateCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport interface QuickDuplicateDragState {\n sourceOwner: OwnerRef;\n direction: QuickDuplicateDirection;\n fixedPoint: { x: number; y: number };\n previewPath: SVGPathElement;\n ghost: LinkGhost;\n candidates: DuplicateCandidate[];\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n hit: { owner: OwnerRef; side: Side; offset: number } | null;\n}\n\nfunction duplicateCandidates(svg: SVGSVGElement, sourceId: string): DuplicateCandidate[] {\n const candidates: DuplicateCandidate[] = [];\n for (const element of svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary]')) {\n if (element.getAttribute('data-sf-role') === 'link') {\n continue;\n }\n const owner = resolveOwner(element);\n if (owner && owner.id !== sourceId) {\n candidates.push({ owner, bounds: element.getBBox() });\n }\n }\n return candidates;\n}\n\nexport function createQuickDuplicateDragState(\n svg: SVGSVGElement,\n event: PointerEvent,\n previewPath: SVGPathElement,\n): QuickDuplicateDragState | null {\n const bubble = (event.target as Element | null)?.closest('[data-sf-quick-duplicate]');\n const direction = bubble?.getAttribute('data-sf-quick-duplicate') as QuickDuplicateDirection | null;\n const sourceId = bubble?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n if (!bubble || !direction || direction.startsWith('iso-') || !sourceId) {\n return null;\n }\n\n const primary = findOwnerNode(svg, sourceId, isPrimary);\n const sourceOwner = primary && resolveOwner(primary);\n if (!primary || !sourceOwner) {\n return null;\n }\n\n (event.target as Element).setPointerCapture?.(event.pointerId);\n return {\n sourceOwner,\n direction,\n fixedPoint: pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),\n previewPath,\n ghost: new LinkGhost(svg, previewPath),\n candidates: duplicateCandidates(svg, sourceId),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n hit: null,\n };\n}\n","import { type LinkTarget, resolveLinkTarget } from '../linkGhost/target';\nimport type { QuickDuplicateDragState } from './state';\n\nexport function resolveDuplicateTarget(\n drag: QuickDuplicateDragState,\n point: { x: number; y: number },\n unitsPerPx: number,\n): LinkTarget {\n const target = resolveLinkTarget(drag.candidates, drag.fixedPoint, point, unitsPerPx);\n drag.hit = target.hit;\n return target;\n}\n","import { isCameraGesture, pxPerUnit } from '../../dom';\nimport type { Emitter } from '../events';\nimport { emitQuickDuplicateCompletion } from './completion';\nimport { crossedDuplicateDragThreshold, duplicatePointerPosition } from './pointer';\nimport { createDuplicatePreviewPath, updateDuplicatePreview } from './preview';\nimport { createQuickDuplicateDragState, type QuickDuplicateDragState } from './state';\nimport { resolveDuplicateTarget } from './target';\n\nexport class QuickDuplicateSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: QuickDuplicateDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createQuickDuplicateDragState(this.#svg, event, createDuplicatePreviewPath(this.#svg));\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedDuplicateDragThreshold(drag, event)) {\n return;\n }\n\n this.beginPreview(drag);\n const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / pxPerUnit(this.#svg));\n updateDuplicatePreview(drag, target.point, target.side);\n drag.ghost.show(target.hit !== null, target.bounds);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n drag.previewPath.remove();\n drag.ghost.hide();\n emitQuickDuplicateCompletion(this.#emitter, drag);\n };\n\n cancel(): void {\n this.#drag?.previewPath.remove();\n this.#drag?.ghost.hide();\n this.#drag = null;\n }\n\n private beginPreview(drag: QuickDuplicateDragState): void {\n if (drag.moved) {\n return;\n }\n\n drag.moved = true;\n this.#svg.appendChild(drag.previewPath);\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { QuickDuplicateSession } from './quickDuplicate/session';\n\nexport interface QuickDuplicateHandle {\n destroy(): void;\n}\n\nexport function bindQuickDuplicate(viewer: Viewer, emitter: Emitter): QuickDuplicateHandle {\n const svg = viewer.svg;\n const session = new QuickDuplicateSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { radarSeriesPath, radarVertexPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport type { RadarVertexDragState } from './types';\n\nfunction seriesVertices(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector =\n `[data-sf-id=\"${CSS.escape(ownerId)}\"]` +\n `[data-sf-series=\"${CSS.escape(series)}\"]` +\n `[data-sf-mark=\"radar-vertex\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].sort(\n (a, b) => Number(a.getAttribute('data-sf-value-index')) - Number(b.getAttribute('data-sf-value-index')),\n );\n}\n\nfunction seriesShapes(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector =\n `path[data-sf-id=\"${CSS.escape(ownerId)}\"]` + `[data-sf-series=\"${CSS.escape(series)}\"]:not([data-sf-mark])`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)];\n}\n\nexport function updateRadarVertexDragPreview(svg: SVGSVGElement, drag: RadarVertexDragState, value: number): void {\n const point = radarVertexPoint(drag.frame, drag.index, value);\n drag.element.setAttribute('cx', String(point.x));\n drag.element.setAttribute('cy', String(point.y));\n\n const points = seriesVertices(svg, drag.owner.id, drag.series).map(vertex => ({\n x: Number(vertex.getAttribute('cx')),\n y: Number(vertex.getAttribute('cy')),\n }));\n const path = radarSeriesPath(points, drag.frame.curved, drag.frame.tension);\n for (const shape of seriesShapes(svg, drag.owner.id, drag.series)) {\n shape.setAttribute('d', path);\n }\n}\n","import type { RadarPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport { createValueReadout, formatReadoutValue, removeValueReadout } from '../chartValue/readout';\n\nconst GAP = 10;\nconst HEIGHT = 18;\nconst FONT_SIZE = 11;\nconst PADDING_X = 7;\n\nexport { createValueReadout, removeValueReadout };\n\nexport function positionRadarReadout(readout: SVGGElement, vertex: RadarPoint, centerY: number, value: number): void {\n const text = readout.querySelector('text');\n const background = readout.querySelector('rect');\n if (!text || !background) {\n return;\n }\n const label = formatReadoutValue(value);\n const width = Math.max(28, (label.length * FONT_SIZE) / 1.7 + PADDING_X * 2);\n const above = vertex.y <= centerY;\n const top = above ? vertex.y - GAP - HEIGHT : vertex.y + GAP;\n\n text.textContent = label;\n background.setAttribute('x', String(vertex.x - width / 2));\n background.setAttribute('y', String(top));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(vertex.x));\n text.setAttribute('y', String(top + HEIGHT / 2));\n}\n","import type { RadarFrame } from '../../../renderScene/charts/primitives/radarShape';\nimport { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport type { RadarVertexDragState } from './types';\n\nfunction parseRadarFrame(node: SVGGraphicsElement | null): RadarFrame | null {\n const raw = node?.getAttribute('data-sf-radar-geometry');\n if (!raw) {\n return null;\n }\n const [centerX, centerY, radius, min, max, count, curved, tension] = raw.split(',').map(Number);\n if (![centerX, centerY, radius, min, max, count].every(Number.isFinite) || count < 3 || max === min) {\n return null;\n }\n return {\n centerX,\n centerY,\n radius,\n min,\n max,\n count,\n curved: curved === 1,\n tension: Number.isFinite(tension) ? tension : undefined,\n };\n}\n\nfunction findVertex(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"radar-vertex\"]') as SVGGraphicsElement | null;\n}\n\nfunction isVertexPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nexport function resolveRadarVertexDrag(svg: SVGSVGElement, event: PointerEvent): RadarVertexDragState | null {\n if (!isVertexPointer(event)) {\n return null;\n }\n const element = findVertex(event);\n if (!element) {\n return null;\n }\n const owner = resolveOwner(element);\n if (owner?.role !== 'chart') {\n return null;\n }\n const series = element.getAttribute('data-sf-series');\n const index = Number(element.getAttribute('data-sf-value-index'));\n if (!series || !Number.isInteger(index) || index < 0) {\n return null;\n }\n const frame = parseRadarFrame(findOwnerNode(svg, owner.id, isPrimary));\n if (!frame || index >= frame.count) {\n return null;\n }\n element.setPointerCapture?.(event.pointerId);\n return { owner, series, index, pointerId: event.pointerId, moved: false, frame, element, lastValue: null };\n}\n","import { radarValueAtPoint, radarVertexPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { updateRadarVertexDragPreview } from './preview';\nimport { createValueReadout, positionRadarReadout, removeValueReadout } from './readout';\nimport { resolveRadarVertexDrag } from './target';\nimport type { RadarVertexDragState } from './types';\n\nfunction valueFrom(svg: SVGSVGElement, event: PointerEvent, drag: RadarVertexDragState): number | null {\n const point = pointerUserPoint(svg, event);\n if (!point) {\n return null;\n }\n return radarValueAtPoint(drag.frame, drag.index, point.x, point.y);\n}\n\nexport class RadarVertexDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: RadarVertexDragState | null = null;\n #readout: SVGGElement | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveRadarVertexDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const value = valueFrom(this.#svg, event, this.#drag);\n if (value === null) {\n return;\n }\n this.#drag.moved = true;\n this.#drag.lastValue = value;\n updateRadarVertexDragPreview(this.#svg, this.#drag, value);\n\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n const vertex = radarVertexPoint(this.#drag.frame, this.#drag.index, value);\n positionRadarReadout(this.#readout, vertex, this.#drag.frame.centerY, value);\n }\n\n cancel(): void {\n this.#drag = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n const value = valueFrom(this.#svg, event, drag) ?? drag.lastValue;\n if (value === null) {\n return;\n }\n this.#emitter.emit('chartValueChange', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value,\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { RadarVertexDragSession } from './session';\n\nexport interface RadarVertexDragHandle {\n destroy(): void;\n}\n\nexport function bindRadarVertexDrag(viewer: Viewer, emitter: Emitter): RadarVertexDragHandle {\n const session = new RadarVertexDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { Emitter } from '../events';\nimport type { ResizeDragState } from './state';\n\nexport function emitResizeCompletion(emitter: Emitter, drag: ResizeDragState, bounds: Rect): void {\n if (!drag.moved) {\n return;\n }\n\n emitter.emit('resizeChange', {\n owner: drag.owner,\n dx: bounds.x - drag.startBounds.x,\n dy: bounds.y - drag.startBounds.y,\n dWidth: bounds.width - drag.startBounds.width,\n dHeight: bounds.height - drag.startBounds.height,\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n });\n}\n","import { estimateTextWidth, wrapText } from '../../../renderScene/scene/textLayout';\nimport type { ResizeTextCapture } from './textCapture';\n\nexport interface TextFit {\n rawText: string;\n fontSize: number;\n lineHeight: number;\n padding: number;\n longestWord: number;\n}\n\nexport function captureTextFit(text: ResizeTextCapture): TextFit {\n const fontSize = Number.parseFloat(text.el.getAttribute('font-size') || '14');\n const bold = text.el.getAttribute('font-weight') === 'bold';\n const lineHeight = Number(text.el.getAttribute('data-sf-line-height')) || 1.3;\n const words = text.rawText.split(/\\s+/).filter(Boolean);\n return {\n rawText: text.rawText,\n fontSize,\n lineHeight,\n padding: Math.max(8, text.strokeWidth * 2),\n longestWord: Math.max(0, ...words.map(word => estimateTextWidth(word, fontSize, bold))),\n };\n}\n\nconst COMMIT_PRECISION = 10;\n\nfunction roundUpForCommit(value: number): number {\n return Math.ceil(value * COMMIT_PRECISION - 1e-9) / COMMIT_PRECISION;\n}\n\nexport function minWidthForText(fit: TextFit): number {\n return roundUpForCommit(fit.longestWord + fit.padding * 2);\n}\n\nexport function minHeightForText(fit: TextFit, width: number): number {\n const lines = wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);\n return roundUpForCommit(lines.length * fit.fontSize * fit.lineHeight + fit.padding * 2);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { ResizeHandle } from '../../dom';\nimport { minHeightForText, minWidthForText, type TextFit } from './textFit';\n\nexport const MIN_SIZE = 10;\n\nexport const HANDLE_AXES: Record<ResizeHandle, { x: 'left' | 'right' | 'none'; y: 'top' | 'bottom' | 'none' }> = {\n 'top-left': { x: 'left', y: 'top' },\n top: { x: 'none', y: 'top' },\n 'top-right': { x: 'right', y: 'top' },\n right: { x: 'right', y: 'none' },\n 'bottom-right': { x: 'right', y: 'bottom' },\n bottom: { x: 'none', y: 'bottom' },\n 'bottom-left': { x: 'left', y: 'bottom' },\n left: { x: 'left', y: 'none' },\n};\n\n// Charts that are drawn round keep their proportions on their own; every shape does while Shift is held.\nconst ROUND_CHARTS: ReadonlySet<string> = new Set(['pie', 'radar', 'radial', 'radialBar', 'polarArea']);\n\nexport function keepsProportions(drag: { owner: { role: string }; kind: string | null }, shift: boolean): boolean {\n return shift || (drag.owner.role === 'chart' && drag.kind !== null && ROUND_CHARTS.has(drag.kind));\n}\n\n// The bounds with the proportions of the start; the edge or corner opposite the handle stays where it is.\nexport function lockAspect(bounds: Rect, start: Rect, handle: ResizeHandle): Rect {\n const ratio = start.width / start.height;\n const axes = HANDLE_AXES[handle];\n let width = bounds.width;\n let height = bounds.height;\n if (axes.x === 'none') {\n width = height * ratio;\n } else if (axes.y === 'none') {\n height = width / ratio;\n } else if (width / start.width > height / start.height) {\n height = width / ratio;\n } else {\n width = height * ratio;\n }\n width = Math.max(MIN_SIZE, width);\n height = Math.max(MIN_SIZE, height);\n const x =\n axes.x === 'left'\n ? start.x + start.width - width\n : axes.x === 'none'\n ? start.x + (start.width - width) / 2\n : start.x;\n const y =\n axes.y === 'top'\n ? start.y + start.height - height\n : axes.y === 'none'\n ? start.y + (start.height - height) / 2\n : start.y;\n return { x, y, width, height };\n}\n\nexport function resizedBounds(start: Rect, handle: ResizeHandle, pointer: { x: number; y: number }): Rect {\n const axes = HANDLE_AXES[handle];\n let x = start.x,\n width = start.width;\n if (axes.x !== 'none') {\n const fixedX = axes.x === 'left' ? start.x + start.width : start.x;\n const x1 = Math.min(fixedX, pointer.x),\n x2 = Math.max(fixedX, pointer.x);\n x = x1;\n width = Math.max(MIN_SIZE, x2 - x1);\n }\n let y = start.y,\n height = start.height;\n if (axes.y !== 'none') {\n const fixedY = axes.y === 'top' ? start.y + start.height : start.y;\n const y1 = Math.min(fixedY, pointer.y),\n y2 = Math.max(fixedY, pointer.y);\n y = y1;\n height = Math.max(MIN_SIZE, y2 - y1);\n }\n return { x, y, width, height };\n}\n\nexport interface BoundsInset {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport const NO_INSET: BoundsInset = { left: 0, top: 0, right: 0, bottom: 0 };\n\nexport function insetWithin(outer: Rect, inner: Rect): BoundsInset {\n return {\n left: inner.x - outer.x,\n top: inner.y - outer.y,\n right: outer.x + outer.width - (inner.x + inner.width),\n bottom: outer.y + outer.height - (inner.y + inner.height),\n };\n}\n\nexport function applyInset(bounds: Rect, inset: BoundsInset): Rect {\n return {\n x: bounds.x + inset.left,\n y: bounds.y + inset.top,\n width: Math.max(1, bounds.width - inset.left - inset.right),\n height: Math.max(1, bounds.height - inset.top - inset.bottom),\n };\n}\n\nexport function keepTextInside(bounds: Rect, start: Rect, handle: ResizeHandle, fit: TextFit | null): Rect {\n if (!fit) {\n return bounds;\n }\n const axes = HANDLE_AXES[handle];\n const width = axes.x === 'none' ? bounds.width : Math.max(bounds.width, Math.min(minWidthForText(fit), start.width));\n const height =\n axes.y === 'none' ? bounds.height : Math.max(bounds.height, Math.min(minHeightForText(fit, width), start.height));\n const fixedX = axes.x === 'left' ? start.x + start.width : start.x;\n const fixedY = axes.y === 'top' ? start.y + start.height : start.y;\n return {\n x: axes.x === 'none' || Math.abs(bounds.x - fixedX) < 1e-6 ? bounds.x : fixedX - width,\n y: axes.y === 'none' || Math.abs(bounds.y - fixedY) < 1e-6 ? bounds.y : fixedY - height,\n width,\n height,\n };\n}\n\nexport function lockDerivedHeight(bounds: Rect, start: Rect, locked: boolean): Rect {\n return locked ? { ...bounds, y: start.y, height: start.height } : bounds;\n}\n\nexport function clampResizeToChildren(bounds: Rect, childrenBounds: Rect | undefined): Rect {\n if (!childrenBounds) {\n return bounds;\n }\n const minX = Math.min(bounds.x, childrenBounds.x);\n const minY = Math.min(bounds.y, childrenBounds.y);\n const maxX = Math.max(bounds.x + bounds.width, childrenBounds.x + childrenBounds.width);\n const maxY = Math.max(bounds.y + bounds.height, childrenBounds.y + childrenBounds.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","export function resizePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n","import type { Rect } from '../../../model/geometry/types';\n\nexport function recenterRotation(element: SVGGraphicsElement, bounds: Rect): void {\n const transform = element.getAttribute('transform');\n const rotation = transform && /rotate\\(([-\\d.]+)/.exec(transform);\n if (!rotation) {\n return;\n }\n\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n element.setAttribute('transform', `rotate(${rotation[1]} ${centerX} ${centerY})`);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { ShapeType } from '../../../model/shape';\nimport { localShapePath, pillCornerRadius } from '../../../renderScene/artifacts/shape/geometry/pathCalculation';\nimport { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { cornersRoundedRectPath, type RectCornerRadii } from '../../../renderScene/scene/roundedRectPath';\nimport {\n CORNER_RADIUS_ATTR,\n SQUARE_CORNER_ATTR,\n SYMBOL_POINTS_ATTR,\n SYMBOL_TENSION_ATTR,\n} from '../../../svg/domContract/attributes';\nimport { recenterRotation } from './rotation';\n\nfunction applyRectBounds(rect: SVGGraphicsElement, kind: string | null, bounds: Rect): void {\n rect.setAttribute('x', String(bounds.x));\n rect.setAttribute('y', String(bounds.y));\n rect.setAttribute('width', String(bounds.width));\n rect.setAttribute('height', String(bounds.height));\n if (kind === 'pill') {\n rect.setAttribute('rx', String(pillCornerRadius(bounds.width, bounds.height)));\n }\n}\n\nfunction applyEllipseBounds(ellipse: SVGGraphicsElement, bounds: Rect): void {\n ellipse.setAttribute('cx', String(bounds.x + bounds.width / 2));\n ellipse.setAttribute('cy', String(bounds.y + bounds.height / 2));\n ellipse.setAttribute('rx', String(bounds.width / 2));\n ellipse.setAttribute('ry', String(bounds.height / 2));\n}\n\nfunction applySymbolBounds(path: SVGGraphicsElement, bounds: Rect): boolean {\n const raw = path.getAttribute(SYMBOL_POINTS_ATTR);\n if (!raw) {\n return false;\n }\n const points = (JSON.parse(raw) as Array<[number, number]>).map(([x, y]) => ({\n x: bounds.x + x * bounds.width,\n y: bounds.y + y * bounds.height,\n }));\n const tension = Number(path.getAttribute(SYMBOL_TENSION_ATTR)) || 0;\n path.setAttribute('d', freeformPathData({ points, tension, closed: true }));\n return true;\n}\n\nfunction applyPathBounds(path: SVGGraphicsElement, kind: string, bounds: Rect): void {\n if (kind === 'symbol' && applySymbolBounds(path, bounds)) {\n return;\n }\n const pathData = localShapePath(kind as ShapeType, bounds.x, bounds.y, bounds.width, bounds.height);\n if (pathData) {\n path.setAttribute('d', pathData);\n }\n}\n\nfunction applyFrameBoundaryBounds(path: SVGGraphicsElement, bounds: Rect): void {\n const cornerRadius = Number(path.getAttribute(CORNER_RADIUS_ATTR) ?? 0);\n const squareCorner = path.getAttribute(SQUARE_CORNER_ATTR) as keyof RectCornerRadii | null;\n const radii: RectCornerRadii = {\n topLeft: cornerRadius,\n topRight: cornerRadius,\n bottomRight: cornerRadius,\n bottomLeft: cornerRadius,\n };\n if (squareCorner) {\n radii[squareCorner] = 0;\n }\n path.setAttribute('d', cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));\n}\n\nexport function applySingleNodeBounds(primary: SVGGraphicsElement, kind: string | null, bounds: Rect): void {\n const tag = primary.tagName.toLowerCase();\n if (tag === 'rect') {\n applyRectBounds(primary, kind, bounds);\n } else if (tag === 'ellipse') {\n applyEllipseBounds(primary, bounds);\n } else if (tag === 'foreignobject') {\n applyRectBounds(primary, null, bounds);\n } else if (tag === 'path' && primary.hasAttribute(CORNER_RADIUS_ATTR)) {\n applyFrameBoundaryBounds(primary, bounds);\n } else if (tag === 'path' && kind) {\n applyPathBounds(primary, kind, bounds);\n }\n recenterRotation(primary, bounds);\n}\n\nfunction applyTextAnchorTranslate(\n node: SVGGraphicsElement,\n startBounds: Rect,\n liveBounds: Rect,\n scaleX: number,\n scaleY: number,\n base: string | null | undefined,\n): void {\n const anchorX = Number(node.getAttribute('x') ?? 0);\n const anchorY = Number(node.getAttribute('y') ?? 0);\n const dx = liveBounds.x + scaleX * (anchorX - startBounds.x) - anchorX;\n const dy = liveBounds.y + scaleY * (anchorY - startBounds.y) - anchorY;\n const transform = `translate(${dx} ${dy})`;\n node.setAttribute('transform', base ? `${transform} ${base}` : transform);\n}\n\nexport function applyCompositeScale(\n nodes: SVGGraphicsElement[],\n startBounds: Rect,\n liveBounds: Rect,\n baseTransforms?: ReadonlyArray<string | null>,\n): void {\n const scaleX = liveBounds.width / startBounds.width;\n const scaleY = liveBounds.height / startBounds.height;\n const transform = `translate(${liveBounds.x} ${liveBounds.y}) scale(${scaleX} ${scaleY}) translate(${-startBounds.x} ${-startBounds.y})`;\n nodes.forEach((node, index) => {\n const base = baseTransforms?.[index];\n if (node.tagName.toLowerCase() === 'text') {\n applyTextAnchorTranslate(node, startBounds, liveBounds, scaleX, scaleY, base);\n return;\n }\n node.setAttribute('transform', base ? `${transform} ${base}` : transform);\n });\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { resizeHandlePositions } from '../../dom';\n\nfunction updateSelectionRing(overlay: SVGGElement, bounds: Rect): void {\n const ring = overlay.querySelector('rect:not([data-sf-resize-handle])');\n ring?.setAttribute('x', String(bounds.x - 1));\n ring?.setAttribute('y', String(bounds.y - 1));\n ring?.setAttribute('width', String(bounds.width + 2));\n ring?.setAttribute('height', String(bounds.height + 2));\n}\n\nexport function updateSelectionOverlay(overlay: SVGGElement, bounds: Rect): void {\n updateSelectionRing(overlay, bounds);\n for (const [centerX, centerY, name] of resizeHandlePositions(bounds)) {\n const handle = overlay.querySelector(`[data-sf-resize-handle=\"${name}\"]`);\n if (!handle) {\n continue;\n }\n const size = Number(handle.getAttribute('width')) || 6;\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { wrapText } from '../../../renderScene/scene/textLayout';\nimport { SVG_NAMESPACE } from '../../dom';\nimport { recenterRotation } from './rotation';\n\nfunction replaceTextLines(textElement: SVGTextElement, lines: string[], x: number, lineHeight: number): void {\n while (textElement.firstChild) {\n textElement.removeChild(textElement.firstChild);\n }\n lines.forEach((line, index) => {\n const tspan = document.createElementNS(SVG_NAMESPACE, 'tspan');\n tspan.setAttribute('x', String(x));\n if (index > 0) {\n tspan.setAttribute('dy', `${lineHeight}px`);\n }\n tspan.textContent = line;\n textElement.appendChild(tspan);\n });\n}\n\nexport function applyLiveText(textElement: SVGTextElement, rawText: string, bounds: Rect, strokeWidth: number): void {\n const fontSize = parseFloat(textElement.getAttribute('font-size') || '14');\n const anchor = textElement.getAttribute('text-anchor');\n const align: 'left' | 'center' | 'right' = anchor === 'start' ? 'left' : anchor === 'end' ? 'right' : 'center';\n const verticalAlign = (textElement.getAttribute('data-sf-valign') as 'top' | 'middle' | 'bottom' | null) ?? 'middle';\n const lineHeight = Number(textElement.getAttribute('data-sf-line-height')) || 1.3;\n const padding = Math.max(8, strokeWidth * 2);\n const width = Math.max(0, bounds.width - padding * 2);\n const height = Math.max(0, bounds.height - padding * 2);\n const boxX = bounds.x + padding;\n const boxY = bounds.y + padding;\n const lines = wrapText(rawText, width, fontSize);\n const linePixels = fontSize * lineHeight;\n const contentHeight = lines.length * linePixels;\n const firstY =\n verticalAlign === 'top'\n ? boxY + fontSize\n : verticalAlign === 'bottom'\n ? boxY + height - contentHeight + fontSize\n : boxY + (height - contentHeight) / 2 + fontSize;\n const x = align === 'left' ? boxX : align === 'right' ? boxX + width : boxX + width / 2;\n\n textElement.setAttribute('x', String(x));\n textElement.setAttribute('y', String(firstY));\n replaceTextLines(textElement, lines, x, linePixels);\n recenterRotation(textElement, bounds);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { personLabelArea } from '../../../renderScene/artifacts/shape/geometry/roundedForms';\nimport { updateQuickDuplicateBubbles } from '../../dom';\nimport { updateLiveLinks } from '../linkPreview';\nimport { applyInset, NO_INSET } from './geometry';\nimport { applyCompositeScale, applySingleNodeBounds } from './geometryPreview';\nimport { updateSelectionOverlay } from './overlayPreview';\nimport type { ResizeDragState } from './state';\nimport { applyLiveText } from './textPreview';\n\nfunction textBoundsFor(kind: string | null, bounds: Rect): Rect {\n return kind === 'person' ? personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;\n}\n\nfunction applyGeometryPreview(drag: ResizeDragState, bounds: Rect): void {\n if (drag.isComposite) {\n applyCompositeScale(drag.geometryNodes, drag.startBounds, bounds, drag.baseTransforms);\n return;\n }\n\n drag.geometryNodes.forEach((node, index) => {\n // A picture is scaled as it is, so that its crop and its clip go along.\n if (node.tagName.toLowerCase() === 'image') {\n applyCompositeScale([node], drag.startBounds, bounds, [drag.baseTransforms[index]]);\n return;\n }\n applySingleNodeBounds(node, drag.kind, applyInset(bounds, drag.insets[index] ?? NO_INSET));\n });\n}\n\nexport function applyResizePreview(drag: ResizeDragState, bounds: Rect): void {\n applyGeometryPreview(drag, bounds);\n if (drag.overlay) {\n updateSelectionOverlay(drag.overlay, bounds);\n }\n if (drag.text) {\n applyLiveText(drag.text.el, drag.text.rawText, textBoundsFor(drag.kind, bounds), drag.text.strokeWidth);\n }\n if (drag.bubbles) {\n updateQuickDuplicateBubbles(drag.bubbles, bounds);\n }\n updateLiveLinks(drag.liveLinks, bounds);\n}\n\nexport { applyCompositeScale, applySingleNodeBounds } from './geometryPreview';\nexport { applyLiveText } from './textPreview';\n","import type { Rect } from '../../../model/geometry/types';\nimport type { GuideLine } from '../../dom';\nimport { findSnapCandidateBounds, pxPerUnit } from '../../dom';\nimport { hasDerivedHeight } from '../geometryRoles';\nimport { applyAxisSnap, computeSnap, nearestCandidates, resizeActivePoints } from '../snapGeometry';\nimport { isSnapDisabled, snapDistancePx } from '../snapGrid';\nimport { HANDLE_AXES, keepTextInside, lockDerivedHeight, MIN_SIZE, resizedBounds } from './geometry';\nimport type { ResizeDragState } from './state';\n\nconst GUIDE_OVERHANG = 10;\n\nexport function snapResize(\n svg: SVGSVGElement,\n drag: ResizeDragState,\n pointer: { x: number; y: number },\n): { bounds: Rect; guides: GuideLine[] } {\n const proposed = resizedBounds(drag.startBounds, drag.handle, pointer);\n if (isSnapDisabled(svg)) {\n return {\n bounds: keepTextInside(\n lockDerivedHeight(proposed, drag.startBounds, hasDerivedHeight(drag.owner)),\n drag.startBounds,\n drag.handle,\n drag.textFit,\n ),\n guides: [],\n };\n }\n const axes = HANDLE_AXES[drag.handle];\n const candidates = nearestCandidates(proposed, findSnapCandidateBounds(svg, new Set([drag.owner.id])));\n const snap = computeSnap(proposed, candidates, {\n threshold: snapDistancePx(svg) / pxPerUnit(svg),\n activeX: resizeActivePoints(axes.x),\n activeY: resizeActivePoints(axes.y),\n guideOverhang: GUIDE_OVERHANG,\n });\n\n const snapped = applyAxisSnap(proposed, axes.x, axes.y, snap, MIN_SIZE);\n return {\n bounds: keepTextInside(\n lockDerivedHeight(snapped, drag.startBounds, hasDerivedHeight(drag.owner)),\n drag.startBounds,\n drag.handle,\n drag.textFit,\n ),\n guides: [snap.x.guide, snap.y.guide].filter(guide => guide !== null),\n };\n}\n","export function findResizeQuickDuplicateBubbles(\n svg: SVGSVGElement,\n ownerId: string,\n selectionOverlay: SVGGElement | null,\n): SVGGElement | null {\n const overlays = svg.querySelectorAll<SVGGElement>(`[data-sf-selection-overlay=\"${CSS.escape(ownerId)}\"]`);\n\n return (\n [...overlays].find(\n overlay => overlay !== selectionOverlay && overlay.querySelector('circle[data-sf-quick-duplicate]'),\n ) ?? null\n );\n}\n","import type { ResizeHandle } from '../../dom';\nimport { findAllOwnerNodes, findOwnerNode, isPrimary, isTextLabel, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { hasEditableGeometry, isCompositeOwner } from '../geometryRoles';\n\nexport interface ResizeSelection {\n captureTarget: SVGGraphicsElement;\n handle: ResizeHandle;\n overlay: SVGGElement | null;\n ownerId: string;\n owner: OwnerRef;\n primary: SVGGraphicsElement;\n nodes: SVGGraphicsElement[];\n geometryNodes: SVGGraphicsElement[];\n}\n\nexport function selectResizeTarget(svg: SVGSVGElement, event: PointerEvent): ResizeSelection | null {\n const captureTarget = (event.target as Element | null)?.closest?.(\n '[data-sf-resize-handle]',\n ) as SVGGraphicsElement | null;\n if (!captureTarget) {\n return null;\n }\n if (captureTarget.getAttribute('data-sf-resize-handle')?.startsWith('iso-')) {\n return null;\n }\n\n const overlay = captureTarget.closest('[data-sf-selection-overlay]') as SVGGElement | null;\n const ownerId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!ownerId) {\n return null;\n }\n\n const primary = findOwnerNode(svg, ownerId, isPrimary);\n const owner = primary && resolveOwner(primary);\n if (!primary || !hasEditableGeometry(owner)) {\n return null;\n }\n\n const nodes = findAllOwnerNodes(svg, ownerId);\n const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter(node => !isTextLabel(node));\n if (!geometryNodes.length) {\n return null;\n }\n\n return {\n captureTarget,\n handle: captureTarget.getAttribute('data-sf-resize-handle') as ResizeHandle,\n overlay,\n ownerId,\n owner,\n primary,\n nodes,\n geometryNodes,\n };\n}\n","import { isTextLabel } from '../../dom';\n\nexport interface ResizeTextCapture {\n el: SVGTextElement;\n rawText: string;\n strokeWidth: number;\n}\n\nexport function captureResizeText(nodes: SVGGraphicsElement[], primary: SVGGraphicsElement): ResizeTextCapture | null {\n const textElement = nodes.find(isTextLabel) as SVGTextElement | undefined;\n const rawText = primary.getAttribute('aria-label');\n if (!textElement || !rawText) {\n return null;\n }\n\n return {\n el: textElement,\n rawText,\n strokeWidth: Number(primary.getAttribute('stroke-width')) || 2,\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { type ResizeHandle, symbolDeclaredBounds } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { CONTAINER_ROLES, childrenUnionBounds } from '../containerGeometry';\nimport { isCompositeOwner } from '../geometryRoles';\nimport { findLiveLinks, type LiveLink } from '../linkPreview';\nimport { findResizeQuickDuplicateBubbles } from './bubbleCapture';\nimport { type BoundsInset, insetWithin, NO_INSET } from './geometry';\nimport { selectResizeTarget } from './selection';\nimport { captureResizeText, type ResizeTextCapture } from './textCapture';\nimport { captureTextFit, type TextFit } from './textFit';\n\nexport interface ResizeDragState {\n owner: OwnerRef;\n handle: ResizeHandle;\n kind: string | null;\n isComposite: boolean;\n geometryNodes: SVGGraphicsElement[];\n insets: BoundsInset[];\n baseTransforms: Array<string | null>;\n overlay: SVGGElement | null;\n bubbles: SVGGElement | null;\n startBounds: Rect;\n childrenBounds?: Rect;\n liveLinks: LiveLink[];\n pointerId: number;\n moved: boolean;\n text: ResizeTextCapture | null;\n textFit: TextFit | null;\n}\n\nexport function createResizeDragState(svg: SVGSVGElement, event: PointerEvent): ResizeDragState | null {\n const selection = selectResizeTarget(svg, event);\n if (!selection) {\n return null;\n }\n\n const startBounds = symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();\n const composite = isCompositeOwner(selection.owner);\n const isContainer = CONTAINER_ROLES.has(selection.owner.role);\n selection.captureTarget.setPointerCapture?.(event.pointerId);\n const kind = selection.primary.getAttribute('data-sf-kind');\n const text = composite || isContainer ? null : captureResizeText(selection.nodes, selection.primary);\n return {\n owner: selection.owner,\n handle: selection.handle,\n kind,\n isComposite: composite,\n geometryNodes: selection.geometryNodes,\n insets: selection.geometryNodes.map(node =>\n node === selection.primary ? NO_INSET : insetWithin(startBounds, symbolDeclaredBounds(node) ?? node.getBBox()),\n ),\n baseTransforms: selection.geometryNodes.map(node => node.getAttribute('transform')),\n overlay: selection.overlay,\n bubbles: findResizeQuickDuplicateBubbles(svg, selection.ownerId, selection.overlay),\n startBounds,\n childrenBounds: isContainer ? childrenUnionBounds(svg, selection.ownerId) : undefined,\n liveLinks: findLiveLinks(svg, selection.ownerId, startBounds),\n pointerId: event.pointerId,\n moved: false,\n text,\n textFit: text && selection.owner.role === 'shape' && kind !== 'person' ? captureTextFit(text) : null,\n };\n}\n","import { clearAlignmentGuides, isCameraGesture, updateAlignmentGuides } from '../../dom';\nimport type { Emitter } from '../events';\nimport { emitResizeCompletion } from './completion';\nimport { clampResizeToChildren, keepsProportions, lockAspect } from './geometry';\nimport { resizePointerPosition } from './pointer';\nimport { applyResizePreview } from './preview';\nimport { snapResize } from './snapping';\nimport { createResizeDragState, type ResizeDragState } from './state';\n\nconst RESIZE_GUIDE_COLOR = '#4CAF50';\n\nexport class ResizeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: ResizeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createResizeDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n drag.moved = true;\n const snapped = snapResize(this.#svg, drag, resizePointerPosition(this.#svg, event));\n const bounds = keepsProportions(drag, event.shiftKey)\n ? lockAspect(snapped.bounds, drag.startBounds, drag.handle)\n : snapped.bounds;\n const { guides } = snapped;\n applyResizePreview(drag, clampResizeToChildren(bounds, drag.childrenBounds));\n updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n clearAlignmentGuides(this.#svg);\n if (!drag.moved) {\n return;\n }\n\n const snapped = snapResize(this.#svg, drag, resizePointerPosition(this.#svg, event)).bounds;\n const bounds = keepsProportions(drag, event.shiftKey)\n ? lockAspect(snapped, drag.startBounds, drag.handle)\n : snapped;\n emitResizeCompletion(this.#emitter, drag, clampResizeToChildren(bounds, drag.childrenBounds));\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { ResizeSession } from './resize/session';\n\nexport { HANDLE_AXES } from './resize/geometry';\n\nexport interface ResizeDragHandle {\n destroy(): void;\n}\n\nexport function bindShapeResize(viewer: Viewer, emitter: Emitter): ResizeDragHandle {\n const svg = viewer.svg;\n const session = new ResizeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { resolveOwner, screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { bindTextareaAutoGrow, createTextEditor } from '../textEdit/textarea';\n\ninterface SankeyNodeLabelTarget {\n owner: OwnerRef;\n nodeId: string;\n labelElement: SVGGraphicsElement;\n}\n\nfunction findLabelMark(event: MouseEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"sankey-node-label\"]') as SVGGraphicsElement | null;\n}\n\nexport function resolveSankeyNodeLabelTarget(event: MouseEvent): SankeyNodeLabelTarget | null {\n const labelElement = findLabelMark(event);\n if (!labelElement) {\n return null;\n }\n const owner = resolveOwner(labelElement);\n if (owner?.role !== 'chart') {\n return null;\n }\n const nodeId = labelElement.getAttribute('data-sf-series');\n if (!nodeId) {\n return null;\n }\n return { owner, nodeId, labelElement };\n}\n\nexport function createSankeyNodeLabelEditor(\n target: SankeyNodeLabelTarget,\n emitter: Emitter,\n onClose: () => void,\n): ActiveTextEditor | null {\n const rect = screenRectOf(target.labelElement);\n if (rect.width <= 0 && rect.height <= 0) {\n return null;\n }\n const originalText = target.labelElement.textContent ?? '';\n const fontSize = Number.parseFloat(target.labelElement.getAttribute('font-size') || '12');\n const textarea = createTextEditor({\n text: originalText,\n rect,\n fontSize,\n fontFamily: target.labelElement.getAttribute('font-family') || 'sans-serif',\n });\n\n return new ActiveTextEditor({\n textarea,\n originalText,\n commit: label => emitter.emit('sankeyNodeRename', { owner: target.owner, nodeId: target.nodeId, label }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose,\n });\n}\n","import type { SankeyNodeDragLink, SankeyNodeDragState } from './types';\n\nfunction redrawLink(link: SankeyNodeDragLink, dx: number, dy: number): void {\n const sx = link.endsAtSource ? link.sx + dx : link.sx;\n const sTop = link.endsAtSource ? link.sTop + dy : link.sTop;\n const sBottom = link.endsAtSource ? link.sBottom + dy : link.sBottom;\n const tx = link.endsAtSource ? link.tx : link.tx + dx;\n const tTop = link.endsAtSource ? link.tTop : link.tTop + dy;\n const tBottom = link.endsAtSource ? link.tBottom : link.tBottom + dy;\n const cx = (sx + tx) / 2;\n const d = [\n `M ${sx} ${sTop}`,\n `C ${cx} ${sTop} ${cx} ${tTop} ${tx} ${tTop}`,\n `L ${tx} ${tBottom}`,\n `C ${cx} ${tBottom} ${cx} ${sBottom} ${sx} ${sBottom}`,\n 'Z',\n ].join(' ');\n link.element.setAttribute('d', d);\n}\n\nexport function updateSankeyNodeDragPreview(drag: SankeyNodeDragState, dx: number, dy: number): void {\n drag.rect.setAttribute('transform', `translate(${dx}, ${dy})`);\n drag.label?.setAttribute('transform', `translate(${dx}, ${dy})`);\n for (const link of drag.links) {\n redrawLink(link, dx, dy);\n }\n}\n\nexport function clearSankeyNodeDragPreview(drag: SankeyNodeDragState): void {\n drag.rect.removeAttribute('transform');\n drag.label?.removeAttribute('transform');\n for (const link of drag.links) {\n link.element.setAttribute('d', link.originalD);\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { isCameraGesture, pointerUserPoint, resolveOwner } from '../../dom';\nimport type { SankeyNodeDragLink, SankeyNodeDragState } from './types';\n\nconst RIBBON_PATH =\n /^M\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+C\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+-?[\\d.]+\\s+L\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+C\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+Z$/;\n\nfunction isNodePointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findNodeRect(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"sankey-node\"]') as SVGGraphicsElement | null;\n}\n\nfunction findNodeLabel(svg: SVGSVGElement, ownerId: string, nodeId: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-mark=\"sankey-node-label\"][data-sf-series=\"${CSS.escape(nodeId)}\"]`;\n return svg.querySelector<SVGGraphicsElement>(selector);\n}\n\nfunction parseRibbonLink(element: SVGGraphicsElement, endsAtSource: boolean): SankeyNodeDragLink | null {\n const d = element.getAttribute('d');\n const match = d?.match(RIBBON_PATH);\n if (!d || !match) {\n return null;\n }\n const [, sx, sTop, tTop, tx, tBottom, sBottom] = match.map(Number) as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ];\n return { element, originalD: d, endsAtSource, sx, sTop, sBottom, tx, tTop, tBottom };\n}\n\nfunction rectOf(element: SVGGraphicsElement): Rect {\n const box = element.getBBox();\n return { x: box.x, y: box.y, width: box.width, height: box.height };\n}\n\nfunction siblingNodeBounds(svg: SVGSVGElement, ownerId: string, rect: SVGGraphicsElement): Rect[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-mark=\"sankey-node\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].filter(element => element !== rect).map(rectOf);\n}\n\nfunction connectedLinks(svg: SVGSVGElement, ownerId: string, nodeId: string): SankeyNodeDragLink[] {\n const escapedOwner = CSS.escape(ownerId);\n const escapedNode = CSS.escape(nodeId);\n const asSource = [\n ...svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-id=\"${escapedOwner}\"][data-sf-from=\"${escapedNode}\"]`),\n ];\n const asTarget = [\n ...svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-id=\"${escapedOwner}\"][data-sf-to=\"${escapedNode}\"]`),\n ];\n const links: SankeyNodeDragLink[] = [];\n for (const element of asSource) {\n const link = parseRibbonLink(element, true);\n if (link) {\n links.push(link);\n }\n }\n for (const element of asTarget) {\n const link = parseRibbonLink(element, false);\n if (link) {\n links.push(link);\n }\n }\n return links;\n}\n\nexport function resolveSankeyNodeDrag(svg: SVGSVGElement, event: PointerEvent): SankeyNodeDragState | null {\n if (!isNodePointer(event)) {\n return null;\n }\n const rect = findNodeRect(event);\n if (!rect) {\n return null;\n }\n const owner = resolveOwner(rect);\n if (owner?.role !== 'chart') {\n return null;\n }\n const nodeId = rect.getAttribute('data-sf-series');\n if (!nodeId) {\n return null;\n }\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n\n rect.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n nodeId,\n rect,\n label: findNodeLabel(svg, owner.id, nodeId),\n startX: start.x,\n startY: start.y,\n originalBounds: rectOf(rect),\n siblingBounds: siblingNodeBounds(svg, owner.id, rect),\n links: connectedLinks(svg, owner.id, nodeId),\n moved: false,\n lastDx: 0,\n lastDy: 0,\n };\n}\n","import { clearAlignmentGuides, pointerUserPoint, pxPerUnit, updateAlignmentGuides } from '../../dom';\nimport type { Emitter } from '../events';\nimport { offsetBounds } from '../move/geometry';\nimport { computeSnap, MOVE_ACTIVE_POINTS, nearestCandidates } from '../snapGeometry';\nimport { clearSankeyNodeDragPreview, updateSankeyNodeDragPreview } from './preview';\nimport { resolveSankeyNodeDrag } from './target';\nimport type { SankeyNodeDragState } from './types';\n\nconst MOVE_NOISE = 2;\nconst SNAP_THRESHOLD_PX = 20;\nconst GUIDE_OVERHANG = 10;\nconst GUIDE_COLOR = '#8b5cf6';\n\nexport class SankeyNodeDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: SankeyNodeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveSankeyNodeDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const rawDx = point.x - drag.startX;\n const rawDy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(rawDx, rawDy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n\n const leadBounds = offsetBounds(drag.originalBounds, rawDx, rawDy);\n const candidates = nearestCandidates(leadBounds, drag.siblingBounds);\n const snap = computeSnap(leadBounds, candidates, {\n threshold: SNAP_THRESHOLD_PX / pxPerUnit(this.#svg),\n activeX: MOVE_ACTIVE_POINTS,\n activeY: MOVE_ACTIVE_POINTS,\n guideOverhang: GUIDE_OVERHANG,\n });\n const dx = rawDx + snap.x.delta;\n const dy = rawDy + snap.y.delta;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updateSankeyNodeDragPreview(drag, dx, dy);\n updateAlignmentGuides(\n this.#svg,\n [snap.x.guide, snap.y.guide].filter(guide => guide !== null),\n GUIDE_COLOR,\n );\n }\n\n cancel(): void {\n if (this.#drag) {\n clearSankeyNodeDragPreview(this.#drag);\n }\n this.#drag = null;\n clearAlignmentGuides(this.#svg);\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearSankeyNodeDragPreview(drag);\n clearAlignmentGuides(this.#svg);\n if (!drag.moved) {\n return;\n }\n this.#emitter.emit('sankeyNodeMove', { owner: drag.owner, nodeId: drag.nodeId, dx: drag.lastDx, dy: drag.lastDy });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { createSankeyNodeLabelEditor, resolveSankeyNodeLabelTarget } from './rename';\nimport { SankeyNodeDragSession } from './session';\n\nexport interface SankeyNodeHandle {\n destroy(): void;\n}\n\nexport function bindSankeyNode(viewer: Viewer, emitter: Emitter): SankeyNodeHandle {\n const svg = viewer.svg;\n const drag = new SankeyNodeDragSession(svg, emitter);\n let activeEditor: ActiveTextEditor | null = null;\n\n const onPointerDown = (event: PointerEvent) => {\n if (drag.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n drag.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n drag.finish(event);\n };\n const onDoubleClick = (event: MouseEvent) => {\n const target = resolveSankeyNodeLabelTarget(event);\n if (!target) {\n return;\n }\n activeEditor?.cancel();\n activeEditor = createSankeyNodeLabelEditor(target, emitter, () => {\n activeEditor = null;\n });\n };\n\n svg.addEventListener('pointerdown', onPointerDown);\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n svg.addEventListener('pointercancel', onPointerUp);\n svg.addEventListener('dblclick', onDoubleClick);\n\n return {\n destroy() {\n drag.cancel();\n activeEditor?.cancel();\n svg.removeEventListener('pointerdown', onPointerDown);\n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n svg.removeEventListener('pointercancel', onPointerUp);\n svg.removeEventListener('dblclick', onDoubleClick);\n },\n };\n}\n","import { screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface TextEditRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nconst FALLBACK_WIDTH = 120;\nconst FALLBACK_HEIGHT = 28;\n\nfunction centeredLabelRect(primaryNode: SVGGraphicsElement): TextEditRect {\n const primaryRect = screenRectOf(primaryNode);\n return {\n left: primaryRect.left + (primaryRect.width - FALLBACK_WIDTH) / 2,\n top: primaryRect.top + (primaryRect.height - FALLBACK_HEIGHT) / 2,\n width: FALLBACK_WIDTH,\n height: FALLBACK_HEIGHT,\n };\n}\n\nexport function resolveTextEditRect(\n owner: OwnerRef,\n textNode: SVGGraphicsElement | null,\n primaryNode: SVGGraphicsElement | null,\n): TextEditRect | null {\n if (owner.role === 'shape') {\n return primaryNode ? screenRectOf(primaryNode) : null;\n }\n if (textNode) {\n return screenRectOf(textNode);\n }\n return primaryNode ? centeredLabelRect(primaryNode) : null;\n}\n","import { findOwnerNode, isPrimary, isTextLabel } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from './activeEditor';\nimport { resolveTextEditRect } from './geometry';\nimport { bindTextareaAutoGrow, createTextEditor } from './textarea';\n\nfunction textFontSize(textNode: SVGGraphicsElement | null): number {\n return Number.parseFloat(textNode?.getAttribute('font-size') || '14');\n}\n\nfunction textAlign(owner: OwnerRef, textNode: SVGGraphicsElement | null): 'left' | 'center' | 'right' {\n if (owner.role === 'shape') {\n return 'center';\n }\n const anchor = textNode?.getAttribute('text-anchor');\n if (anchor === 'middle') {\n return 'center';\n }\n return anchor === 'end' ? 'right' : 'left';\n}\n\nexport function createActiveTextEditor(\n svg: SVGSVGElement,\n owner: OwnerRef,\n emitter: Emitter,\n onClose: () => void,\n): ActiveTextEditor | null {\n const textNode = findOwnerNode(svg, owner.id, isTextLabel);\n const primaryNode = findOwnerNode(svg, owner.id, isPrimary);\n const rect = resolveTextEditRect(owner, textNode, primaryNode);\n if (!rect) {\n return null;\n }\n\n const originalText = textNode?.textContent ?? '';\n const fontSize = textFontSize(textNode);\n const previousVisibility = textNode?.getAttribute('visibility') ?? null;\n const fill = textNode?.getAttribute('fill');\n const textarea = createTextEditor({\n text: originalText,\n rect,\n fontSize,\n fontFamily: textNode?.getAttribute('font-family') || 'sans-serif',\n inline: true,\n color: fill && fill !== 'none' ? fill : undefined,\n fontWeight: textNode?.getAttribute('font-weight') ?? undefined,\n fontStyle: textNode?.getAttribute('font-style') ?? undefined,\n align: textAlign(owner, textNode),\n });\n textNode?.setAttribute('visibility', 'hidden');\n\n return new ActiveTextEditor({\n textarea,\n originalText,\n commit: text => emitter.emit('textChange', { owner, text }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose: () => {\n if (textNode?.isConnected) {\n if (previousVisibility === null) {\n textNode.removeAttribute('visibility');\n } else {\n textNode.setAttribute('visibility', previousVisibility);\n }\n }\n onClose();\n },\n });\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nconst EDITABLE_ROLES = new Set(['shape', 'link', 'isometric']);\n\nfunction isFrameTitle(target: Element | null): boolean {\n return Boolean(target?.closest('text, [id*=\"frame-tab-\"]'));\n}\n\nexport function resolveEditableTextOwner(event: MouseEvent): OwnerRef | null {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!owner) {\n return null;\n }\n if (owner.role === 'frame') {\n return isFrameTitle(target) ? owner : null;\n }\n return EDITABLE_ROLES.has(owner.role) ? owner : null;\n}\n","import type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { ActiveTextEditor } from './activeEditor';\nimport { createActiveTextEditor } from './editorFactory';\nimport { resolveEditableTextOwner } from './target';\n\nexport class TextEditingSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #activeEditor: ActiveTextEditor | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly doubleClick = (event: MouseEvent): void => {\n const owner = resolveEditableTextOwner(event);\n if (owner) {\n this.begin(owner);\n }\n };\n\n cancel(): void {\n this.#activeEditor?.cancel();\n }\n\n private begin(owner: OwnerRef): void {\n this.cancel();\n this.#activeEditor = createActiveTextEditor(this.#svg, owner, this.#emitter, () => {\n this.#activeEditor = null;\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { TextEditingSession } from './session';\n\nexport interface TextEditingHandle {\n destroy(): void;\n}\n\nexport function bindTextEditing(viewer: Viewer, emitter: Emitter): TextEditingHandle {\n const svg = viewer.svg;\n const session = new TextEditingSession(svg, emitter);\n\n svg.addEventListener('dblclick', session.doubleClick);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('dblclick', session.doubleClick);\n },\n };\n}\n","export function indentBlock(body: string, indent: string): string[] {\n return body.split('\\n').map(line => (line.trim() ? `${indent}${line}` : line));\n}\n\nexport const indentOf = (line: string): string => line.match(/^[ \\t]*/)?.[0] ?? '';\nexport const round1 = (n: number): number => Math.round(n * 10) / 10;\nexport const round2 = (n: number): number => Math.round(n * 100) / 100;\nexport const escapeSflString = (value: string): string =>\n value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\r\\n?/g, '\\n').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t');\n","import { indentOf } from './format';\nimport type { LineRange } from './scanner';\n\nconst DEFAULT_UNIT = ' ';\n\nexport function detectIndentUnit(lines: string[], range: LineRange): string {\n const parent = indentOf(lines[range.start]);\n for (let i = range.start + 1; i < range.end; i++) {\n if (!lines[i].trim()) {\n continue;\n }\n const indent = indentOf(lines[i]);\n if (indent.length > parent.length && indent.startsWith(parent)) {\n return indent.slice(parent.length);\n }\n }\n let smallest = '';\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n const indent = indentOf(line);\n if (indent && (!smallest || indent.length < smallest.length)) {\n smallest = indent;\n }\n }\n return smallest || DEFAULT_UNIT;\n}\n\nexport function childIndent(lines: string[], range: LineRange): string {\n return `${indentOf(lines[range.start])}${detectIndentUnit(lines, range)}`;\n}\n\nexport function insertBlockLines(lines: string[], range: LineRange, build: (baseIndent: string) => string[]): void {\n const unit = detectIndentUnit(lines, range);\n const baseIndent = `${indentOf(lines[range.start])}${unit}`;\n const block = build(baseIndent).map(line => {\n if (!line.startsWith(baseIndent)) {\n return line;\n }\n const rest = line.slice(baseIndent.length);\n const steps = (rest.match(/^( {4})*/)?.[0].length ?? 0) / 4;\n return `${baseIndent}${unit.repeat(steps)}${rest.slice(steps * 4)}`;\n });\n let at = range.end;\n while (at > range.start + 1 && !lines[at - 1].trim()) {\n at--;\n }\n lines.splice(at, 0, ...block);\n}\n","import { type Token, tokenize } from '../../../../sflLanguage';\n\nconst STRING_FILLER = '\"';\n\nexport interface MaskedSource {\n lines: string[];\n continuesString: boolean[];\n}\n\nfunction overwrite(masked: string[], row: number, from: number, to: number, text: string): void {\n const line = masked[row];\n if (line === undefined) {\n return;\n }\n masked[row] = line.slice(0, from) + text + line.slice(to);\n}\n\nfunction applyToken(target: MaskedSource, lines: string[], token: Token): void {\n const startRow = token.line - 1;\n const endRow = token.endLine - 1;\n const startCol = token.col - 1;\n const endCol = token.endCol - 1;\n const isString = token.type === 'string';\n\n if (startRow === endRow) {\n const source = lines[startRow];\n if (source === undefined) {\n return;\n }\n const text = isString ? STRING_FILLER.repeat(Math.max(0, endCol - startCol)) : source.slice(startCol, endCol);\n overwrite(target.lines, startRow, startCol, endCol, text);\n return;\n }\n\n const firstLength = lines[startRow]?.length ?? 0;\n overwrite(target.lines, startRow, startCol, firstLength, STRING_FILLER.repeat(Math.max(0, firstLength - startCol)));\n target.continuesString[startRow] = true;\n for (let row = startRow + 1; row < endRow; row++) {\n const length = lines[row]?.length ?? 0;\n overwrite(target.lines, row, 0, length, STRING_FILLER.repeat(length));\n target.continuesString[row] = true;\n }\n overwrite(target.lines, endRow, 0, endCol, STRING_FILLER.repeat(Math.max(0, endCol)));\n}\n\nexport function maskSource(lines: string[]): MaskedSource | null {\n let tokens: Token[];\n try {\n tokens = tokenize(lines.join('\\n'));\n } catch {\n return null;\n }\n\n const target: MaskedSource = {\n lines: lines.map(line => ' '.repeat(line.length)),\n continuesString: lines.map(() => false),\n };\n for (const token of tokens) {\n if (token.type === 'newline' || token.type === 'eof') {\n continue;\n }\n applyToken(target, lines, token);\n }\n return target;\n}\n\nexport function maskLines(lines: string[]): string[] | null {\n return maskSource(lines)?.lines ?? null;\n}\n\nexport function braceDelta(masked: string): number {\n let delta = 0;\n for (const character of masked) {\n if (character === '{') {\n delta++;\n } else if (character === '}') {\n delta--;\n }\n }\n return delta;\n}\n","import { braceDelta, maskLines } from './sourceMask';\n\nconst OWNER_HEADER =\n /^\\s*(Entity|Shape|Text|Image|Container|Chart|Path|Link|Isometric|Widget|Component|Connection|Shader)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/;\nexport const VALID_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport interface LineRange {\n start: number;\n end: number;\n}\n\nfunction blockEndIn(masked: string[], startLine: number): number {\n let depth = 0;\n for (let i = startLine; i < masked.length; i++) {\n for (const character of masked[i]) {\n if (character === '{') {\n depth++;\n } else if (character === '}') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n }\n return masked.length - 1;\n}\n\nexport function blockEndLine(lines: string[], startLine: number): number {\n const masked = maskLines(lines);\n return masked === null ? lines.length - 1 : blockEndIn(masked, startLine);\n}\n\nexport function findOwnerBlock(lines: string[], id: string): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n for (let i = 0; i < masked.length; i++) {\n const header = masked[i].match(OWNER_HEADER);\n if (!header || header[2] !== id) {\n continue;\n }\n return { start: i, end: blockEndIn(masked, i) };\n }\n return null;\n}\n\nexport function findChildBlock(lines: string[], range: LineRange, headerRe: RegExp): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n let depth = 0;\n for (let i = range.start; i <= range.end; i++) {\n if (depth === 1 && i > range.start && headerRe.test(masked[i])) {\n return { start: i, end: blockEndIn(masked, i) };\n }\n depth += braceDelta(masked[i]);\n }\n return null;\n}\n\nconst DATA_BLOCK_HEADER = /^\\s*data\\s*\\{/;\n\nexport function findContentChild(\n lines: string[],\n range: LineRange,\n headerRe: RegExp,\n bareHeaderRe?: RegExp,\n): LineRange | null {\n const direct = findChildBlock(lines, range, headerRe);\n if (direct !== null) {\n return direct;\n }\n const data = findChildBlock(lines, range, DATA_BLOCK_HEADER);\n if (!data) {\n return null;\n }\n return findChildBlock(lines, data, headerRe) ?? (bareHeaderRe ? findChildBlock(lines, data, bareHeaderRe) : null);\n}\n\nexport function findChildBlocks(lines: string[], range: LineRange, headerRe: RegExp): LineRange[] {\n const masked = maskLines(lines);\n if (masked === null) {\n return [];\n }\n const blocks: LineRange[] = [];\n let depth = 0;\n for (let i = range.start; i <= range.end; i++) {\n if (depth === 1 && i > range.start && headerRe.test(masked[i])) {\n blocks.push({ start: i, end: blockEndIn(masked, i) });\n }\n depth += braceDelta(masked[i]);\n }\n return blocks;\n}\n\nexport function findFirstBlockOfKind(lines: string[], kind: string): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n const header = new RegExp(`^\\\\s*${kind}\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\b`);\n for (let i = 0; i < masked.length; i++) {\n if (!header.test(masked[i])) {\n continue;\n }\n return { start: i, end: blockEndIn(masked, i) };\n }\n return null;\n}\n\nexport function nameExists(lines: string[], id: string): boolean {\n const masked = maskLines(lines);\n if (masked === null) {\n return false;\n }\n return masked.some(line => {\n const header = line.match(OWNER_HEADER);\n return header !== null && header[2] === id;\n });\n}\n","import { findContentChild, type LineRange } from './blocks';\n\nconst BLOCK_SEGMENT = /^([A-Za-z_][A-Za-z0-9_]*)(?:\\[([A-Za-z_][A-Za-z0-9_]*)\\])?$/;\nconst PROPERTY_SEGMENT = /^([A-Za-z_][A-Za-z0-9_]*)((?:\\[\\d+\\])*)$/;\n\nexport interface BlockSegment {\n name: string;\n id?: string;\n}\n\nexport interface PropertySegment {\n name: string;\n indices: number[];\n}\n\nexport interface PropertyPath {\n blocks: BlockSegment[];\n property: PropertySegment;\n}\n\nexport function parsePropertyPath(path: string): PropertyPath | null {\n const segments = path.split('.');\n const last = segments[segments.length - 1];\n if (segments.length === 0 || last === undefined) {\n return null;\n }\n\n const property = parsePropertySegment(last);\n if (property === null) {\n return null;\n }\n\n const blocks: BlockSegment[] = [];\n for (const segment of segments.slice(0, -1)) {\n const block = parseBlockSegment(segment);\n if (block === null) {\n return null;\n }\n blocks.push(block);\n }\n return { blocks, property };\n}\n\nfunction parseBlockSegment(segment: string): BlockSegment | null {\n const match = segment.match(BLOCK_SEGMENT);\n if (!match) {\n return null;\n }\n return match[2] === undefined ? { name: match[1] } : { name: match[1], id: match[2] };\n}\n\nfunction parsePropertySegment(segment: string): PropertySegment | null {\n const match = segment.match(PROPERTY_SEGMENT);\n if (!match) {\n return null;\n }\n const indices = [...match[2].matchAll(/\\d+/g)].map(entry => Number(entry[0]));\n return { name: match[1], indices };\n}\n\nexport function resolveBlocks(lines: string[], owner: LineRange, blocks: readonly BlockSegment[]): LineRange | null {\n let range = owner;\n for (const block of blocks) {\n const next = findContentChild(lines, range, blockHeader(block), bareSeriesHeader(block));\n if (next === null) {\n return null;\n }\n range = next;\n }\n return range;\n}\n\nfunction blockHeader(block: BlockSegment): RegExp {\n return block.id === undefined\n ? new RegExp(`^\\\\s*${block.name}\\\\s*(?::[^{]*)?\\\\{`)\n : new RegExp(`^\\\\s*${block.name}\\\\s+${block.id}\\\\s*(?::[^{]*)?\\\\{`);\n}\n\nfunction bareSeriesHeader(block: BlockSegment): RegExp | undefined {\n return block.name === 'Series' && block.id !== undefined\n ? new RegExp(`^\\\\s*${block.id}\\\\s*(?::[^{]*)?\\\\{`)\n : undefined;\n}\n","import type { LineRange } from './blocks';\nimport { type MaskedSource, maskSource } from './sourceMask';\n\nexport interface PropertySpan {\n line: number;\n start: number;\n endLine: number;\n end: number;\n}\n\ninterface Cursor {\n row: number;\n col: number;\n}\n\ninterface LineDepthScan {\n depthAt: number[];\n endDepth: number;\n}\n\ninterface ValueLineScan {\n depth: number;\n endColumn?: number;\n}\n\nexport function findDirectProperty(\n lines: string[],\n range: LineRange,\n key: string,\n targetDepth = 1,\n): PropertySpan | null {\n const source = maskSource(lines);\n if (source === null) {\n return null;\n }\n\n const keyPattern = new RegExp(`\\\\b${key}\\\\b\\\\s*:\\\\s*`, 'g');\n let depth = 0;\n for (let row = range.start; row <= range.end; row++) {\n const line = source.lines[row];\n if (line === undefined) {\n break;\n }\n const depthScan = scanLineDepths(line, depth);\n const valueStart = findPropertyValueStart(line, keyPattern, depthScan.depthAt, targetDepth);\n if (valueStart !== null) {\n return createPropertySpan(source, { row, col: valueStart }, range.end, targetDepth);\n }\n depth = depthScan.endDepth;\n }\n return null;\n}\n\nfunction scanLineDepths(line: string, startDepth: number): LineDepthScan {\n const depthAt = new Array<number>(line.length);\n let depth = startDepth;\n for (let column = 0; column < line.length; column++) {\n depthAt[column] = depth;\n if (line[column] === '{') {\n depth++;\n } else if (line[column] === '}') {\n depth--;\n }\n }\n return { depthAt, endDepth: depth };\n}\n\nfunction findPropertyValueStart(\n line: string,\n keyPattern: RegExp,\n depthAt: number[],\n targetDepth: number,\n): number | null {\n keyPattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: canonical RegExp.exec loop\n while ((match = keyPattern.exec(line))) {\n if (depthAt[match.index] === targetDepth) {\n return match.index + match[0].length;\n }\n keyPattern.lastIndex = match.index + 1;\n }\n return null;\n}\n\nfunction createPropertySpan(source: MaskedSource, from: Cursor, lastRow: number, targetDepth: number): PropertySpan {\n const end = trimBack(source.lines, from, findValueEnd(source, from, lastRow, targetDepth));\n return { line: from.row, start: from.col, endLine: end.row, end: end.col };\n}\n\nfunction findValueEnd(source: MaskedSource, from: Cursor, lastRow: number, targetDepth: number): Cursor {\n let depth = targetDepth;\n for (let row = from.row; row <= lastRow; row++) {\n const line = source.lines[row];\n if (line === undefined) {\n break;\n }\n const lineScan = scanValueLine(line, row === from.row ? from.col : 0, depth, targetDepth);\n if (lineScan.endColumn !== undefined) {\n return { row, col: lineScan.endColumn };\n }\n if (!source.continuesString[row]) {\n return { row, col: line.length };\n }\n depth = lineScan.depth;\n }\n return { row: lastRow, col: source.lines[lastRow]?.length ?? 0 };\n}\n\nfunction scanValueLine(line: string, startColumn: number, startDepth: number, targetDepth: number): ValueLineScan {\n let depth = startDepth;\n for (let column = startColumn; column < line.length; column++) {\n const character = line[column];\n if (character === '{') {\n depth++;\n } else if (character === '}') {\n if (depth <= targetDepth) {\n return { depth, endColumn: column };\n }\n depth--;\n } else if (character === ';' && depth === targetDepth) {\n return { depth, endColumn: column };\n }\n }\n return { depth };\n}\n\nfunction trimBack(masked: string[], from: Cursor, end: Cursor): Cursor {\n let row = end.row;\n let column = end.col;\n for (;;) {\n const line = masked[row] ?? '';\n while (column > 0 && /\\s/.test(line[column - 1])) {\n column--;\n }\n if (column > 0 || row <= from.row) {\n return { row, col: column };\n }\n row--;\n column = masked[row]?.length ?? 0;\n }\n}\n","import { escapeSflString, indentBlock, round1 } from '../format';\nimport type { InsertCanvasObjectOptions } from './types';\n\nfunction canvasObjectBlockKind(\n kind: InsertCanvasObjectOptions['kind'],\n): 'Shape' | 'Text' | 'Image' | 'Isometric' | 'Container' {\n if (kind === 'shape') {\n return 'Shape';\n }\n if (kind === 'text') {\n return 'Text';\n }\n if (kind === 'image') {\n return 'Image';\n }\n if (kind === 'isometric') {\n return 'Isometric';\n }\n return 'Container';\n}\n\nexport function buildCanvasObjectBlock(\n options: InsertCanvasObjectOptions,\n origin: { x: number; y: number },\n baseIndent: string,\n): string[] {\n const bodyIndent = `${baseIndent} `;\n const block: string[] = [`${baseIndent}${canvasObjectBlockKind(options.kind)} ${options.id} {`];\n\n if (options.kind === 'frame' || options.kind === 'swimlane') {\n block.push(`${bodyIndent}kind: ${options.kind}`);\n }\n if (options.text !== undefined) {\n block.push(`${bodyIndent}text: \"${escapeSflString(options.text)}\"`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n const size =\n options.depth === undefined\n ? `${round1(options.width)}, ${round1(options.height)}`\n : `${round1(options.width)}, ${round1(options.height)}, ${round1(options.depth)}`;\n block.push(\n `${bodyIndent}layout {`,\n `${bodyIndent} position: ${round1(options.x - origin.x)}, ${round1(options.y - origin.y)}`,\n `${bodyIndent} size: ${size}`,\n `${bodyIndent}}`,\n `${baseIndent}}`,\n );\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, findOwnerBlock, type LineRange } from '../scanner';\n\nexport interface CanvasObjectInsertionTarget {\n range: LineRange;\n origin: { x: number; y: number };\n}\n\nexport function resolveCanvasObjectInsertionTarget(\n sfl: string,\n lines: string[],\n parentId: string | undefined,\n): CanvasObjectInsertionTarget | null {\n if (!parentId) {\n const modelRange = findFirstBlockOfKind(lines, 'Model');\n return modelRange ? { range: modelRange, origin: { x: 0, y: 0 } } : null;\n }\n\n const parent = sflToCanvasState(sfl).canvasObjects.find(canvasObject => canvasObject.id === parentId);\n if (!parent) {\n return null;\n }\n\n const parentRange = findOwnerBlock(lines, parentId);\n if (!parentRange) {\n return null;\n }\n\n return { range: parentRange, origin: { x: parent.x, y: parent.y } };\n}\n","import { indentBlock, round1 } from '../format';\nimport type { InsertPathOptions } from './types';\n\nexport function buildPathBlock(\n options: InsertPathOptions,\n origin: { x: number; y: number },\n baseIndent: string,\n): string[] {\n const bodyIndent = `${baseIndent} `;\n const points = options.points\n .map(point => {\n const pair = `${round1(point.x - origin.x)}, ${round1(point.y - origin.y)}`;\n return point.tension === undefined ? `[${pair}]` : `[${pair}, ${round1(point.tension)}]`;\n })\n .join(', ');\n const block: string[] = [`${baseIndent}Path ${options.id} {`, `${bodyIndent}points: [${points}]`];\n\n if (options.closed) {\n block.push(`${bodyIndent}closed: true`);\n }\n if (options.tension) {\n block.push(`${bodyIndent}tension: ${options.tension}`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { nameExists, VALID_IDENT } from '../scanner';\nimport { buildCanvasObjectBlock } from './blockText';\nimport { resolveCanvasObjectInsertionTarget } from './insertionTarget';\nimport { buildPathBlock } from './pathBlockText';\nimport type { InsertCanvasObjectOptions, InsertPathOptions } from './types';\n\nexport function insertCanvasObject(sfl: string, options: InsertCanvasObjectOptions): string {\n if (!VALID_IDENT.test(options.id)) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n if (nameExists(lines, options.id)) {\n return sfl;\n }\n\n const target = resolveCanvasObjectInsertionTarget(sfl, lines, options.parentId);\n if (!target) {\n return sfl;\n }\n\n insertBlockLines(lines, target.range, baseIndent => buildCanvasObjectBlock(options, target.origin, baseIndent));\n return lines.join('\\n');\n}\n\nexport function insertPath(sfl: string, options: InsertPathOptions): string {\n if (!VALID_IDENT.test(options.id) || options.points.length < 2) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n if (nameExists(lines, options.id)) {\n return sfl;\n }\n\n const target = resolveCanvasObjectInsertionTarget(sfl, lines, options.parentId);\n if (!target) {\n return sfl;\n }\n\n insertBlockLines(lines, target.range, baseIndent => buildPathBlock(options, target.origin, baseIndent));\n return lines.join('\\n');\n}\n","import { blockEndLine, type LineRange } from '../scanner';\n\nconst LINK_HEADER = /^\\s*(?:Link|Connection)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/;\n\nexport function findReferencingLinkRanges(lines: string[], canvasObjectId: string): LineRange[] {\n const endpointReference = new RegExp(`\\\\b(from|to)\\\\s*:\\\\s*${canvasObjectId}\\\\b`);\n const ranges: LineRange[] = [];\n let lineIndex = 0;\n\n while (lineIndex < lines.length) {\n if (!LINK_HEADER.test(lines[lineIndex])) {\n lineIndex++;\n continue;\n }\n\n const end = blockEndLine(lines, lineIndex);\n if (lines.slice(lineIndex, end + 1).some(line => endpointReference.test(line))) {\n ranges.push({ start: lineIndex, end });\n }\n lineIndex = end + 1;\n }\n\n return ranges;\n}\n","import { blockEndLine } from '../scan/blocks';\nimport { braceDelta, maskLines } from '../scan/sourceMask';\n\nconst REPEAT_HEADER = /^(\\s*)Repeat\\s+[A-Za-z_]\\w*\\s*\\{\\s*$/;\nconst TEMPLATE_HEADER = /^\\s*[A-Z]\\w*\\s+([A-Za-z_]\\w*)\\b[^{]*\\{/;\nconst PROPERTY = /^\\s*[A-Za-z_]\\w*\\s*:/;\nconst WHERE = /^(\\s*)where\\s*:\\s*(.+?)\\s*$/;\n\nconst escaped = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n// A block that a Repeat made has no lines of its own, so it is taken away by keeping its cell out of the Repeat: the cell is added to `where`.\n// The other blocks of that cell go with it, and every other cell stays as it was, as each cell has random numbers of its own.\nexport function excludeRepeatCell(lines: string[], id: string): string[] | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n for (let start = 0; start < masked.length; start++) {\n const header = masked[start].match(REPEAT_HEADER);\n if (!header) {\n continue;\n }\n const end = blockEndLine(lines, start);\n let depth = 0;\n let cell: { col: number; row: number } | null = null;\n let whereLine = -1;\n let lastProperty = start;\n let seenTemplate = false;\n for (let i = start; i <= end; i++) {\n if (depth === 1 && i > start) {\n const template = masked[i].match(TEMPLATE_HEADER);\n if (template) {\n seenTemplate = true;\n const made = id.match(new RegExp(`^${escaped(template[1])}_(\\\\d+)(?:_(\\\\d+))?(?:_[A-Za-z]\\\\w*)?$`));\n if (made) {\n cell = { col: Number(made[1]), row: made[2] === undefined ? 0 : Number(made[2]) };\n }\n } else if (WHERE.test(masked[i])) {\n whereLine = i;\n } else if (!seenTemplate && PROPERTY.test(masked[i])) {\n lastProperty = i;\n }\n }\n depth += braceDelta(masked[i]);\n }\n if (!cell) {\n continue;\n }\n const keep = `(col != ${cell.col} || row != ${cell.row})`;\n const out = [...lines];\n if (whereLine >= 0) {\n const where = lines[whereLine].match(WHERE);\n if (where) {\n out[whereLine] = `${where[1]}where: (${where[2]}) && ${keep}`;\n return out;\n }\n }\n out.splice(lastProperty + 1, 0, `${header[1]} where: ${keep}`);\n return out;\n }\n return null;\n}\n\nconst USE_HEADER = /^\\s*Use\\s+([A-Za-z_]\\w*)\\s*:/;\n\n// The Use that made a block, as the blocks of a Use are named after it: `oak_trunk` is made by `Use oak`.\nexport function findUseBlock(lines: string[], id: string): { start: number; end: number } | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n let found: { start: number; end: number; length: number } | null = null;\n for (let start = 0; start < masked.length; start++) {\n const header = masked[start].match(USE_HEADER);\n if (header && id.startsWith(`${header[1]}_`) && (found === null || header[1].length > found.length)) {\n found = { start, end: blockEndLine(lines, start), length: header[1].length };\n }\n }\n return found && { start: found.start, end: found.end };\n}\n","import type { LineRange } from '../scanner';\n\nfunction containsRange(container: LineRange, candidate: LineRange): boolean {\n const sameRange = container.start === candidate.start && container.end === candidate.end;\n return !sameRange && container.start <= candidate.start && container.end >= candidate.end;\n}\n\nexport function outermostRemovalRanges(ranges: LineRange[]): LineRange[] {\n return ranges.filter(\n candidate => !ranges.some(container => container !== candidate && containsRange(container, candidate)),\n );\n}\n","import { findOwnerBlock, type LineRange } from '../scanner';\nimport { findReferencingLinkRanges } from './linkReferences';\nimport { excludeRepeatCell, findUseBlock } from './madeBlocks';\nimport { outermostRemovalRanges } from './removalRanges';\nimport type { RemoveCanvasObjectOptions } from './types';\n\nexport function removeCanvasObject(sfl: string, id: string, options: RemoveCanvasObjectOptions = {}): string {\n const lines = sfl.split('\\n');\n const canvasObjectRange = findOwnerBlock(lines, id);\n if (!canvasObjectRange) {\n const cell = excludeRepeatCell(lines, id);\n if (cell) {\n return cell.join('\\n');\n }\n const use = findUseBlock(lines, id);\n if (use) {\n lines.splice(use.start, use.end - use.start + 1);\n return lines.join('\\n');\n }\n return sfl;\n }\n\n const ranges: LineRange[] = [canvasObjectRange];\n if (options.alsoRemoveLinks ?? true) {\n ranges.push(...findReferencingLinkRanges(lines, id));\n }\n\n const removalRanges = outermostRemovalRanges(ranges).sort((left, right) => right.start - left.start);\n for (const range of removalRanges) {\n lines.splice(range.start, range.end - range.start + 1);\n }\n\n return lines.join('\\n');\n}\n","interface ListElementSpan {\n start: number;\n end: number;\n}\n\nfunction skipString(text: string, quoteIndex: number): number {\n for (let cursor = quoteIndex + 1; cursor < text.length; cursor++) {\n if (text[cursor] === '\\\\') {\n cursor++;\n } else if (text[cursor] === '\"') {\n return cursor;\n }\n }\n return text.length - 1;\n}\n\nfunction closingBracket(text: string, openIndex: number): number {\n if (openIndex < 0) {\n return -1;\n }\n let depth = 0;\n for (let cursor = openIndex; cursor < text.length; cursor++) {\n if (text[cursor] === '\"') {\n cursor = skipString(text, cursor);\n } else if (text[cursor] === '[') {\n depth++;\n } else if (text[cursor] === ']') {\n depth--;\n if (depth === 0) {\n return cursor;\n }\n }\n }\n return -1;\n}\n\nexport function listElementSpans(text: string): { spans: ListElementSpan[]; start: number; end: number } | null {\n const listStart = text.indexOf('[');\n const listEnd = closingBracket(text, listStart);\n if (listStart < 0 || listEnd < 0) {\n return null;\n }\n const body = text.slice(listStart + 1, listEnd);\n if (!body.trim()) {\n return { spans: [], start: listStart, end: listEnd };\n }\n\n const spans: ListElementSpan[] = [];\n let depth = 0;\n let elementStart = 0;\n for (let cursor = 0; cursor < body.length; cursor++) {\n const character = body[cursor];\n if (character === '\"') {\n cursor = skipString(body, cursor);\n } else if (character === '[') {\n depth++;\n } else if (character === ']') {\n depth--;\n } else if (character === ',' && depth === 0) {\n spans.push({ start: listStart + 1 + elementStart, end: listStart + 1 + cursor });\n elementStart = cursor + 1;\n }\n }\n spans.push({ start: listStart + 1 + elementStart, end: listEnd });\n return { spans, start: listStart, end: listEnd };\n}\n\nexport function replaceListElement(\n text: string,\n index: number,\n replacement: (current: string) => string,\n): string | null {\n const list = listElementSpans(text);\n const span = list?.spans[index];\n if (!span) {\n return null;\n }\n const current = text.slice(span.start, span.end);\n return text.slice(0, span.start) + replacement(current) + text.slice(span.end);\n}\n\nexport function replaceListElementAt(\n text: string,\n matchElement: (element: string) => boolean,\n replacement: (current: string) => string,\n): string | null {\n const list = listElementSpans(text);\n const span = list?.spans.find(candidate => matchElement(text.slice(candidate.start, candidate.end)));\n if (!span) {\n return null;\n }\n const current = text.slice(span.start, span.end);\n return text.slice(0, span.start) + replacement(current) + text.slice(span.end);\n}\n\nexport function growListElement(text: string, index: number, value: string): string | null {\n const list = listElementSpans(text);\n if (!list || list.spans.length > index) {\n return null;\n }\n const existing = list.spans.map(span => text.slice(span.start, span.end).trim());\n const padding = Array.from({ length: index - list.spans.length }, () => 'none');\n const items = [...existing, ...padding, value];\n return `${text.slice(0, list.start + 1)}${items.join(', ')}${text.slice(list.end)}`;\n}\n","import type { ChartValueChangeEvent } from '../../events';\nimport { round1 } from '../format';\nimport { findContentChild, findDirectProperty, findOwnerBlock, VALID_IDENT } from '../scanner';\nimport { replaceListElement } from './listElement';\n\nfunction replaceChartValue(current: string, value: number): string {\n const pair = current.match(/^(\\s*\\[\\s*[-\\d.]+\\s*,\\s*)([-\\d.]+)(\\s*\\]\\s*)$/);\n if (pair) {\n return `${pair[1]}${round1(value)}${pair[3]}`;\n }\n const spacing = current.match(/^(\\s*)(?:.*?)(\\s*)$/);\n return `${spacing?.[1] ?? ''}${round1(value)}${spacing?.[2] ?? ''}`;\n}\n\nexport function applyChartValueChange(sfl: string, event: ChartValueChangeEvent): string {\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart || !VALID_IDENT.test(event.series)) {\n return sfl;\n }\n\n const series = findContentChild(\n lines,\n chart,\n new RegExp(`^\\\\s*Series\\\\s+${event.series}\\\\b`),\n new RegExp(`^\\\\s*${event.series}\\\\s*(?::[^{]*)?\\\\{`),\n );\n if (!series) {\n return sfl;\n }\n const span = findDirectProperty(lines, series, 'values');\n if (!span) {\n return sfl;\n }\n\n const line = lines[span.line];\n const patched = replaceListElement(line.slice(span.start, span.end), event.index, current =>\n replaceChartValue(current, event.value),\n );\n if (patched === null) {\n return sfl;\n }\n lines[span.line] = line.slice(0, span.start) + patched + line.slice(span.end);\n return lines.join('\\n');\n}\n","import type { LineRange } from '../scan/blocks';\nimport type { PropertySpan } from '../scan/properties';\n\nexport function replacePropertyValue(lines: string[], span: PropertySpan, value: string): void {\n const before = lines[span.line].slice(0, span.start);\n const after = lines[span.endLine].slice(span.end);\n lines.splice(span.line, span.endLine - span.line + 1, `${before}${value}${after}`);\n}\n\nexport function insertDirectProperty(\n lines: string[],\n range: LineRange,\n indent: string,\n key: string,\n value: string,\n): void {\n if (range.start === range.end) {\n const line = lines[range.start];\n const closeAt = line.lastIndexOf('}');\n if (closeAt !== -1) {\n const before = line.slice(0, closeAt).replace(/\\s+$/, '');\n const separator = /\\{$/.test(before) ? ' ' : '; ';\n lines[range.start] = `${before}${separator}${key}: ${value} }${line.slice(closeAt + 1)}`;\n return;\n }\n }\n lines.splice(range.start + 1, 0, `${indent}${key}: ${value}`);\n}\n","import { round2 } from '../format';\nimport type { LinkEndpointTextOptions } from './types';\n\nexport function formatLinkEndpoint(options: LinkEndpointTextOptions): string {\n if (!options.side) {\n return options.id;\n }\n\n const fraction = options.fraction !== undefined ? ` (${round2(options.fraction)})` : '';\n return `${options.id}, ${options.side}${fraction}`;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport { childIndent } from './blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from './edits/propertyValues';\nimport { escapeSflString, round1 } from './format';\nimport { formatLinkEndpoint } from './linkPatch/endpointText';\nimport { findChildBlock, findDirectProperty, type LineRange, maskLines } from './scanner';\n\ntype LayoutTuple = readonly [key: string, first: number, second: number, third?: number];\n\nexport interface LinkEndpointPatch {\n end: 'from' | 'to';\n targetName: string;\n side: Side;\n fraction: number;\n}\n\nexport function setOrInsertText(lines: string[], range: LineRange, text: string): void {\n const value = `\"${escapeSflString(text)}\"`;\n const existing = findDirectProperty(lines, range, 'text');\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n return;\n }\n insertDirectProperty(lines, range, childIndent(lines, range), 'text', value);\n}\n\nexport function setOrInsertLayoutTuples(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n const layout = findChildBlock(lines, range, /^\\s*layout\\s*\\{/);\n if (layout) {\n updateLayoutBlock(lines, layout, props);\n return;\n }\n\n if (hasInlineLayout(lines, range)) {\n updateInlineLayout(lines, range, props);\n return;\n }\n\n if (range.start === range.end) {\n insertCompactLayout(lines, range.start, props);\n } else {\n insertMultilineLayout(lines, range, props);\n }\n}\n\nfunction hasInlineLayout(lines: string[], range: LineRange): boolean {\n const maskedStart = maskLines(lines)?.[range.start] ?? '';\n return range.start === range.end && /\\blayout\\s*\\{/.test(maskedStart);\n}\n\nfunction updateInlineLayout(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n for (const tuple of props) {\n const existing = findDirectProperty(lines, range, tuple[0], 2);\n if (existing) {\n replacePropertyValue(lines, existing, layoutTupleValue(tuple));\n }\n }\n}\n\nfunction insertCompactLayout(lines: string[], row: number, props: ReadonlyArray<LayoutTuple>): void {\n const line = lines[row];\n const closeAt = line.lastIndexOf('}');\n const before = line.slice(0, closeAt).replace(/\\s+$/, '');\n const separator = /\\{$/.test(before) ? ' ' : '; ';\n const body = props.map(tuple => `${tuple[0]}: ${layoutTupleValue(tuple)}`).join('; ');\n lines[row] = `${before}${separator}layout { ${body} } }${line.slice(closeAt + 1)}`;\n}\n\nfunction insertMultilineLayout(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n const indent = childIndent(lines, range);\n const body = props.map(tuple => `${indent} ${tuple[0]}: ${layoutTupleValue(tuple)}`);\n lines.splice(range.start + 1, 0, `${indent}layout {`, ...body, `${indent}}`);\n}\n\nfunction updateLayoutBlock(lines: string[], layout: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n let currentLayout = layout;\n for (const tuple of props) {\n currentLayout = setLayoutTuple(lines, currentLayout, tuple);\n }\n}\n\nfunction setLayoutTuple(lines: string[], layout: LineRange, tuple: LayoutTuple): LineRange {\n const existing = findDirectProperty(lines, layout, tuple[0]);\n if (existing !== null) {\n replacePropertyValue(lines, existing, layoutTupleValue(tuple));\n return layout;\n }\n const indent = childIndent(lines, layout);\n const lengthBefore = lines.length;\n insertDirectProperty(lines, layout, indent, tuple[0], layoutTupleValue(tuple));\n return { start: layout.start, end: layout.end + (lines.length - lengthBefore) };\n}\n\nfunction layoutTupleValue(tuple: LayoutTuple): string {\n const base = `${round1(tuple[1])}, ${round1(tuple[2])}`;\n return tuple[3] === undefined ? base : `${base}, ${round1(tuple[3])}`;\n}\n\nexport function setEndpoint(lines: string[], range: LineRange, patch: LinkEndpointPatch): void {\n const value = formatLinkEndpoint({ id: patch.targetName, side: patch.side, fraction: patch.fraction });\n const existing = findDirectProperty(lines, range, patch.end);\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n return;\n }\n const indent = childIndent(lines, range);\n insertDirectProperty(lines, range, indent, patch.end, value);\n}\n","import type { LinkReconnectEvent } from '../../events';\nimport { setEndpoint } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyLinkReconnectChange(sfl: string, event: LinkReconnectEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setEndpoint(lines, range, {\n end: event.end,\n targetName: event.target.id,\n side: event.side,\n fraction: event.fraction,\n });\n return lines.join('\\n');\n}\n","import type { LinkSegmentChangeEvent } from '../../events';\nimport { childIndent } from '../blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from '../edits/propertyValues';\nimport { round1 } from '../format';\nimport { findDirectProperty } from '../scan/properties';\nimport { findOwnerBlock } from '../scanner';\n\nconst SEGMENT_SLOTS = 4;\n\nexport function applyLinkSegmentChange(sfl: string, event: LinkSegmentChangeEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n const existing = findDirectProperty(lines, range, 'segments');\n const offsets = Array.from({ length: SEGMENT_SLOTS }, () => 0);\n if (existing !== null && existing.line === existing.endLine) {\n const current = lines[existing.line].slice(existing.start, existing.end).match(/-?\\d+(?:\\.\\d+)?/g) ?? [];\n current.slice(0, SEGMENT_SLOTS).forEach((value, index) => {\n offsets[index] = Number(value);\n });\n }\n if (event.index >= 0 && event.index < SEGMENT_SLOTS) {\n offsets[event.index] = event.offset;\n }\n const value = `[${offsets.map(round1).join(', ')}]`;\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n } else {\n insertDirectProperty(lines, range, childIndent(lines, range), 'segments', value);\n }\n return lines.join('\\n');\n}\n","import { round1 } from '../format';\nimport { findDirectProperty, type LineRange, type PropertySpan } from '../scanner';\n\nexport function pointsSpan(lines: string[], range: LineRange): PropertySpan | null {\n const start = findDirectProperty(lines, range, 'points');\n if (start === null) {\n return null;\n }\n let depth = 0;\n for (let row = start.line; row <= range.end; row++) {\n const line = lines[row] ?? '';\n for (let column = row === start.line ? start.start : 0; column < line.length; column++) {\n if (line[column] === '[') {\n depth++;\n } else if (line[column] === ']' && --depth === 0) {\n return { line: start.line, start: start.start, endLine: row, end: column + 1 };\n }\n }\n }\n return null;\n}\n\nexport function readSpan(lines: string[], span: PropertySpan): string {\n if (span.line === span.endLine) {\n return lines[span.line].slice(span.start, span.end);\n }\n return [\n lines[span.line].slice(span.start),\n ...lines.slice(span.line + 1, span.endLine),\n lines[span.endLine].slice(0, span.end),\n ].join('\\n');\n}\n\nexport function formatPoints(points: ReadonlyArray<{ x: number; y: number; tension?: number }>): string {\n const one = (point: { x: number; y: number; tension?: number }) =>\n point.tension === undefined\n ? `[${round1(point.x)}, ${round1(point.y)}]`\n : `[${round1(point.x)}, ${round1(point.y)}, ${round1(point.tension)}]`;\n return `[${points.map(one).join(', ')}]`;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { MoveChangeEvent } from '../../events';\nimport { replacePropertyValue } from '../edits/propertyValues';\nimport { round1 } from '../format';\nimport { setOrInsertLayoutTuples } from '../properties';\nimport { findOwnerBlock, type LineRange } from '../scanner';\nimport { pointsSpan, readSpan } from './pathPoints';\n\nconst POINT_PAIR = /\\[\\s*(-?[\\d.]+)\\s*,\\s*(-?[\\d.]+)\\s*(,\\s*-?[\\d.]+\\s*)?\\]/g;\n\nfunction movePathPoints(lines: string[], range: LineRange, dx: number, dy: number): void {\n const span = pointsSpan(lines, range);\n if (span === null) {\n return;\n }\n const shifted = readSpan(lines, span).replace(\n POINT_PAIR,\n (_match, x: string, y: string, rest?: string) =>\n `[${round1(Number(x) + dx)}, ${round1(Number(y) + dy)}${rest ? `, ${rest.replace(/^,\\s*/, '').trim()}` : ''}]`,\n );\n replacePropertyValue(lines, span, shifted);\n}\n\n// Several objects of one drag at once: the document is read one time, however many there are.\n// A position inside a frame is relative to it, so an object whose frame moves along is not moved a second time.\nexport function applyMoveChanges(sfl: string, events: readonly MoveChangeEvent[]): string {\n const state = sflToCanvasState(sfl);\n const lines = sfl.split('\\n');\n const parents = new Map(state.canvasObjects.map(candidate => [candidate.id, candidate.parentFrameId]));\n const moving = new Set(events.map(event => event.owner.id));\n const hasMovingAncestor = (id: string): boolean => {\n const seen = new Set<string>();\n for (let parent = parents.get(id); parent && !seen.has(parent); parent = parents.get(parent)) {\n if (moving.has(parent)) {\n return true;\n }\n seen.add(parent);\n }\n return false;\n };\n for (const event of events) {\n if (hasMovingAncestor(event.owner.id)) {\n continue;\n }\n const canvasObject = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n const range = canvasObject ? findOwnerBlock(lines, event.owner.id) : null;\n if (!canvasObject || !range) {\n continue;\n }\n if (event.owner.role === 'path') {\n movePathPoints(lines, range, event.dx, event.dy);\n continue;\n }\n const parent = canvasObject.parentFrameId\n ? state.canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n setOrInsertLayoutTuples(lines, range, [\n ['position', canvasObject.x - (parent?.x ?? 0) + event.dx, canvasObject.y - (parent?.y ?? 0) + event.dy],\n ]);\n }\n return lines.join('\\n');\n}\n\nexport function applyMoveChange(sfl: string, event: MoveChangeEvent): string {\n return applyMoveChanges(sfl, [event]);\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { PathPointChangeEvent } from '../../events';\nimport { replacePropertyValue } from '../edits/propertyValues';\nimport { findOwnerBlock } from '../scanner';\nimport { formatPoints, pointsSpan } from './pathPoints';\n\nexport function applyPathPointChange(sfl: string, event: PathPointChangeEvent): string {\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const canvasObject = canvasObjects.find(candidate => candidate.id === event.owner.id);\n if (!canvasObject) {\n return sfl;\n }\n const parent = canvasObject.parentFrameId\n ? canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n const origin = parent ? { x: parent.x, y: parent.y } : { x: 0, y: 0 };\n\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n const span = pointsSpan(lines, range);\n if (!span) {\n return sfl;\n }\n const kept = canvasObject.objectType === 'path' ? canvasObject.path?.points : undefined;\n const sameCount = kept?.length === event.points.length;\n const relative = event.points.map((point, index) => {\n const tension = sameCount ? kept?.[index]?.tension : undefined;\n const moved = { x: point.x - origin.x, y: point.y - origin.y };\n return tension === undefined ? moved : { ...moved, tension };\n });\n replacePropertyValue(lines, span, formatPoints(relative));\n return lines.join('\\n');\n}\n","import type { PropertyChangeEvent, PropertyValue } from '../../events';\nimport { childIndent } from '../blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from '../edits/propertyValues';\nimport { escapeSflString } from '../format';\nimport { findDirectProperty, findOwnerBlock, type PropertySpan, parsePropertyPath, resolveBlocks } from '../scanner';\nimport { growListElement, replaceListElement } from './listElement';\n\nconst NESTED_STYLE_DEPTH = 2;\n\nexport function applyPropertyChange(sfl: string, event: PropertyChangeEvent): string {\n const path = parsePropertyPath(event.path);\n if (path === null || !isWritableValue(event.value)) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n const owner = findOwnerBlock(lines, event.owner.id);\n if (owner === null) {\n return sfl;\n }\n\n const range = resolveBlocks(lines, owner, path.blocks);\n if (range === null) {\n return sfl;\n }\n\n const span =\n findDirectProperty(lines, range, path.property.name) ??\n findDirectProperty(lines, range, path.property.name, NESTED_STYLE_DEPTH);\n if (span === null) {\n const indent = childIndent(lines, range);\n if (path.property.indices.length === 1) {\n const [index] = path.property.indices;\n const items = growListElement('[]', index, formatValue(event.value, undefined, event.quote));\n if (items === null) {\n return sfl;\n }\n insertDirectProperty(lines, range, indent, path.property.name, items);\n return lines.join('\\n');\n }\n if (path.property.indices.length > 0) {\n return sfl;\n }\n insertDirectProperty(lines, range, indent, path.property.name, formatValue(event.value, undefined, event.quote));\n return lines.join('\\n');\n }\n\n const current = readSpan(lines, span);\n const next =\n path.property.indices.length > 0\n ? replaceIndexed(current, path.property.indices, event)\n : formatValue(event.value, current, event.quote);\n if (next === null) {\n return sfl;\n }\n\n replacePropertyValue(lines, span, next);\n return lines.join('\\n');\n}\n\nfunction isWritableValue(value: PropertyValue): boolean {\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n if (typeof value === 'object') {\n return value.length > 0 && value.every(entry => Number.isFinite(entry));\n }\n return true;\n}\n\nfunction readSpan(lines: string[], span: PropertySpan): string {\n if (span.line === span.endLine) {\n return lines[span.line].slice(span.start, span.end);\n }\n const first = lines[span.line].slice(span.start);\n const middle = lines.slice(span.line + 1, span.endLine);\n return [first, ...middle, lines[span.endLine].slice(0, span.end)].join('\\n');\n}\n\nfunction replaceIndexed(text: string, indices: readonly number[], event: PropertyChangeEvent): string | null {\n const [head, ...rest] = indices;\n let failed = false;\n\n const result = replaceListElement(text, head, current => {\n if (rest.length === 0) {\n return withSpacing(current, formatValue(event.value, current, event.quote, true));\n }\n const inner = replaceIndexed(current, rest, event);\n if (inner === null) {\n failed = true;\n return current;\n }\n return inner;\n });\n\n if (result !== null) {\n return failed ? null : result;\n }\n return rest.length === 0 ? growListElement(text, head, formatValue(event.value, undefined, event.quote)) : null;\n}\n\nfunction withSpacing(current: string, value: string): string {\n const spacing = current.match(/^(\\s*)[\\s\\S]*?(\\s*)$/);\n return `${spacing?.[1] ?? ''}${value}${spacing?.[2] ?? ''}`;\n}\n\nfunction formatValue(\n value: PropertyValue,\n current: string | undefined,\n quote: boolean | undefined,\n indexed = false,\n): string {\n if (typeof value === 'object') {\n return value.map(String).join(', ');\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n return shouldQuote(current, quote, indexed) ? `\"${escapeSflString(value)}\"` : value;\n}\n\nfunction shouldQuote(current: string | undefined, quote: boolean | undefined, indexed: boolean): boolean {\n if (quote !== undefined) {\n return quote;\n }\n const trimmed = current?.trim();\n if (trimmed === undefined || trimmed.startsWith('\"')) {\n return true;\n }\n return indexed && trimmed === 'none';\n}\n","import { indentBlock } from '../format';\nimport type { InsertConnectionOptions } from './types';\n\nexport function buildConnectionBlock(options: InsertConnectionOptions, baseIndent: string): string[] {\n const bodyIndent = `${baseIndent} `;\n const block: string[] = [\n `${baseIndent}Connection ${options.id} {`,\n `${bodyIndent}from: ${options.fromId}`,\n `${bodyIndent}to: ${options.toId}`,\n `${bodyIndent}fromFace: \"${options.fromFace}\"`,\n `${bodyIndent}toFace: \"${options.toFace}\"`,\n ];\n\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, type LineRange, nameExists, VALID_IDENT } from '../scanner';\nimport type { InsertConnectionOptions } from './types';\n\nexport function resolveConnectionInsertionTarget(\n sfl: string,\n lines: string[],\n options: InsertConnectionOptions,\n): LineRange | null {\n if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {\n return null;\n }\n\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const hasSource = canvasObjects.some(canvasObject => canvasObject.id === options.fromId);\n const hasTarget = canvasObjects.some(canvasObject => canvasObject.id === options.toId);\n if (!hasSource || !hasTarget) {\n return null;\n }\n\n return findFirstBlockOfKind(lines, 'Model');\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { buildConnectionBlock } from './blockText';\nimport { resolveConnectionInsertionTarget } from './insertionTarget';\nimport type { InsertConnectionOptions } from './types';\n\nexport function insertConnection(sfl: string, options: InsertConnectionOptions): string {\n const lines = sfl.split('\\n');\n const modelRange = resolveConnectionInsertionTarget(sfl, lines, options);\n if (!modelRange) {\n return sfl;\n }\n\n insertBlockLines(lines, modelRange, baseIndent => buildConnectionBlock(options, baseIndent));\n return lines.join('\\n');\n}\n","type Props = Record<string, string> | undefined;\n\n// Values that SFL writes as strings; the rest are numbers or bare keywords.\nconst QUOTED_KEYS = new Set(['fill', 'stroke', 'textColor', 'fontFamily', 'shadow', 'labelBackground']);\n\nfunction styleLine(key: string, value: string): string {\n return QUOTED_KEYS.has(key) ? ` ${key}: \"${value.replace(/\"/g, '\\\\\"')}\"` : ` ${key}: ${value}`;\n}\n\n// A `style { ... }` block that repeats the given properties of a resolved object. `leading` lines come first. Without any\n// line there is nothing to copy and the result is undefined.\nexport function styleBlock(props: Props, keys: readonly string[], leading: readonly string[] = []): string | undefined {\n const copied = keys.flatMap(key => {\n const value = props?.[key];\n return value === undefined ? [] : [styleLine(key, value)];\n });\n const lines = [...leading, ...copied];\n return lines.length > 0 ? `style {\\n${lines.join('\\n')}\\n}` : undefined;\n}\n","import type { IsometricFace } from '../../../../../model/isometricObject';\nimport { AXIS_COS, AXIS_SIN } from '../../../../../model/isometricObject';\nimport type { SflIsometricObject } from '../../../../../sflSemantic/canvasObjects/artifacts/isometric/object';\nimport type { IsometricQuickDuplicateDirection, QuickDuplicateEvent } from '../../../events';\nimport { insertCanvasObject } from '../../canvasObjectPatch/insert';\nimport type { InsertCanvasObjectOptions } from '../../canvasObjectPatch/types';\nimport { insertConnection } from '../../connectionPatch/insert';\nimport { styleBlock } from './styleBlock';\nimport type { QuickDuplicateOptions } from './types';\n\nconst ISOMETRIC_GAP = 40;\n\nconst ISOMETRIC_STYLE_KEYS = [\n 'fill',\n 'stroke',\n 'strokeWidth',\n 'cornerRadius',\n 'shadow',\n 'labelOffsetX',\n 'labelOffsetY',\n 'labelBackground',\n];\n\nconst TOUCHING_FACES: Record<IsometricQuickDuplicateDirection, { fromFace: IsometricFace; toFace: IsometricFace }> = {\n 'iso-width-pos': { fromFace: 'right', toFace: 'left' },\n 'iso-width-neg': { fromFace: 'left', toFace: 'right' },\n 'iso-depth-pos': { fromFace: 'front', toFace: 'back' },\n 'iso-depth-neg': { fromFace: 'back', toFace: 'front' },\n 'iso-height-pos': { fromFace: 'bottom', toFace: 'top' },\n 'iso-height-neg': { fromFace: 'top', toFace: 'bottom' },\n};\n\nexport function isIsometricDirection(\n direction: QuickDuplicateEvent['direction'],\n): direction is IsometricQuickDuplicateDirection {\n return direction.startsWith('iso-');\n}\n\n// One edge length plus the gap along the isometric axis of the clicked face, so a chain of copies stays on that axis.\nfunction isometricOffset(\n direction: IsometricQuickDuplicateDirection,\n object: SflIsometricObject,\n gap: number,\n): { dx: number; dy: number } {\n const { width, height } = object;\n const { depth } = object.isometric;\n switch (direction) {\n case 'iso-width-pos':\n return { dx: (width + gap) * AXIS_COS, dy: (width + gap) * AXIS_SIN };\n case 'iso-width-neg':\n return { dx: -(width + gap) * AXIS_COS, dy: -(width + gap) * AXIS_SIN };\n case 'iso-depth-pos':\n return { dx: -(depth + gap) * AXIS_COS, dy: (depth + gap) * AXIS_SIN };\n case 'iso-depth-neg':\n return { dx: (depth + gap) * AXIS_COS, dy: -(depth + gap) * AXIS_SIN };\n case 'iso-height-pos':\n return { dx: 0, dy: height + gap };\n case 'iso-height-neg':\n return { dx: 0, dy: -(height + gap) };\n }\n}\n\n// A copy stacked flush on the object would cast a shadow onto it, so it gets none.\nfunction copyStyle(object: SflIsometricObject, direction: IsometricQuickDuplicateDirection): string | undefined {\n if (!direction.startsWith('iso-height-')) {\n return styleBlock(object.props, ISOMETRIC_STYLE_KEYS);\n }\n return styleBlock(\n object.props,\n ISOMETRIC_STYLE_KEYS.filter(key => key !== 'shadow'),\n [' shadow: \"off\"'],\n );\n}\n\nfunction copyOf(\n object: SflIsometricObject,\n direction: IsometricQuickDuplicateDirection,\n options: QuickDuplicateOptions,\n): InsertCanvasObjectOptions {\n const { dx, dy } = isometricOffset(direction, object, options.gap ?? ISOMETRIC_GAP);\n return {\n id: options.shapeId,\n kind: 'isometric',\n text: object.text ?? '',\n x: object.x + dx,\n y: object.y + dy,\n width: object.width,\n height: object.height,\n depth: object.isometric.depth,\n parentId: object.parentFrameId,\n body: copyStyle(object, direction),\n };\n}\n\nexport function duplicateIsometricObject(\n sfl: string,\n object: SflIsometricObject,\n direction: IsometricQuickDuplicateDirection,\n options: QuickDuplicateOptions,\n): string {\n const withCopy = insertCanvasObject(sfl, copyOf(object, direction, options));\n return insertConnection(withCopy, {\n id: options.linkId,\n fromId: object.id,\n toId: options.shapeId,\n ...TOUCHING_FACES[direction],\n });\n}\n","import { escapeSflString, indentBlock } from '../format';\nimport { formatLinkEndpoint } from './endpointText';\nimport type { InsertLinkOptions } from './types';\n\nexport function buildLinkBlock(options: InsertLinkOptions, baseIndent: string): string[] {\n const bodyIndent = `${baseIndent} `;\n const from = formatLinkEndpoint({ id: options.fromId, side: options.fromSide, fraction: options.fromFraction });\n const to = formatLinkEndpoint({ id: options.toId, side: options.toSide, fraction: options.toFraction });\n const block: string[] = [`${baseIndent}Link ${options.id} {`, `${bodyIndent}from: ${from}`, `${bodyIndent}to: ${to}`];\n\n if (options.text !== undefined) {\n block.push(`${bodyIndent}text: \"${escapeSflString(options.text)}\"`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, type LineRange, nameExists, VALID_IDENT } from '../scanner';\nimport type { InsertLinkOptions } from './types';\n\nexport function resolveLinkInsertionTarget(sfl: string, lines: string[], options: InsertLinkOptions): LineRange | null {\n if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {\n return null;\n }\n\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const hasSource = canvasObjects.some(canvasObject => canvasObject.id === options.fromId);\n const hasTarget = canvasObjects.some(canvasObject => canvasObject.id === options.toId);\n if (!hasSource || !hasTarget) {\n return null;\n }\n\n return findFirstBlockOfKind(lines, 'Model');\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { buildLinkBlock } from './blockText';\nimport { resolveLinkInsertionTarget } from './insertionTarget';\nimport type { InsertLinkOptions } from './types';\n\nexport function insertLink(sfl: string, options: InsertLinkOptions): string {\n const lines = sfl.split('\\n');\n const modelRange = resolveLinkInsertionTarget(sfl, lines, options);\n if (!modelRange) {\n return sfl;\n }\n\n insertBlockLines(lines, modelRange, baseIndent => buildLinkBlock(options, baseIndent));\n return lines.join('\\n');\n}\n","import type { SflLinkOut } from '../../../../../sflSemantic/canvasObjects/artifacts/links/types';\nimport type { SflCanvasObject } from '../../../../../sflSemantic/sflToCanvasState';\nimport { insertCanvasObject } from '../../canvasObjectPatch/insert';\nimport type { InsertCanvasObjectOptions } from '../../canvasObjectPatch/types';\nimport { insertLink } from '../../linkPatch/insert';\nimport type { InsertLinkOptions } from '../../linkPatch/types';\nimport { styleBlock } from './styleBlock';\nimport type { QuickDuplicateOptions, Side } from './types';\n\nconst SHAPE_GAP = 200;\n\nconst OPPOSITE_SIDE: Record<Side, Side> = { top: 'bottom', right: 'left', bottom: 'top', left: 'right' };\n\nconst SHAPE_STYLE_KEYS = [\n 'fill',\n 'stroke',\n 'strokeWidth',\n 'strokeStyle',\n 'textColor',\n 'fontSize',\n 'fontFamily',\n 'cornerRadius',\n 'opacity',\n 'blur',\n 'blend',\n 'shadow',\n];\nconst LINK_STYLE_KEYS = ['stroke', 'strokeWidth', 'strokeStyle', 'markerStart', 'markerEnd', 'route'];\n\nfunction shapeOffset(side: Side, object: SflCanvasObject, gap: number): { dx: number; dy: number } {\n switch (side) {\n case 'top':\n return { dx: 0, dy: -(object.height + gap) };\n case 'bottom':\n return { dx: 0, dy: object.height + gap };\n case 'left':\n return { dx: -(object.width + gap), dy: 0 };\n case 'right':\n return { dx: object.width + gap, dy: 0 };\n }\n}\n\nfunction copyOf(object: SflCanvasObject, side: Side, options: QuickDuplicateOptions): InsertCanvasObjectOptions {\n const { dx, dy } = shapeOffset(side, object, options.gap ?? SHAPE_GAP);\n const shape = object.shapeType ? [` shape: ${object.shapeType}`] : [];\n return {\n id: options.shapeId,\n kind: 'shape',\n text: object.text ?? '',\n x: object.x + dx,\n y: object.y + dy,\n width: object.width,\n height: object.height,\n parentId: object.parentFrameId,\n body: styleBlock(object.props, SHAPE_STYLE_KEYS, shape),\n };\n}\n\n// The new link looks like the other links that leave the object, or else like the first link of the document.\nfunction linkStyleReference(links: SflLinkOut[], objectId: string): SflLinkOut | undefined {\n return links.find(link => link.fromId === objectId) ?? links[0];\n}\n\nfunction linkToCopy(\n object: SflCanvasObject,\n links: SflLinkOut[],\n side: Side,\n options: QuickDuplicateOptions,\n): InsertLinkOptions {\n return {\n id: options.linkId,\n fromId: object.id,\n toId: options.shapeId,\n fromSide: side,\n toSide: OPPOSITE_SIDE[side],\n body: styleBlock(linkStyleReference(links, object.id)?.props, LINK_STYLE_KEYS),\n };\n}\n\nexport function duplicateShape(\n sfl: string,\n input: { object: SflCanvasObject; links: SflLinkOut[]; side: Side; options: QuickDuplicateOptions },\n): string {\n const { object, links, side, options } = input;\n const withCopy = insertCanvasObject(sfl, copyOf(object, side, options));\n return insertLink(withCopy, linkToCopy(object, links, side, options));\n}\n","import { isIsometricObject } from '../../../../sflSemantic/canvasObjects/artifacts/isometric/object';\nimport { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { QuickDuplicateEvent } from '../../events';\nimport { duplicateIsometricObject, isIsometricDirection } from './quickDuplicate/isometricDuplicate';\nimport { duplicateShape } from './quickDuplicate/shapeDuplicate';\nimport type { QuickDuplicateOptions } from './quickDuplicate/types';\n\nexport type { QuickDuplicateOptions } from './quickDuplicate/types';\n\n// Carries out a quick duplicate: a copy of the object with its look beyond the dragged edge, and a link or connection\n// to it. A direction that does not fit the kind of object changes nothing.\nexport function applyQuickDuplicateChange(\n sfl: string,\n event: QuickDuplicateEvent,\n options: QuickDuplicateOptions,\n): string {\n const state = sflToCanvasState(sfl);\n const object = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n if (!object) {\n return sfl;\n }\n const { direction } = event;\n if (isIsometricDirection(direction)) {\n return isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;\n }\n return isIsometricObject(object)\n ? sfl\n : duplicateShape(sfl, { object, links: state.links, side: direction, options });\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { ResizeChangeEvent } from '../../events';\nimport { setOrInsertLayoutTuples } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyResizeChange(sfl: string, event: ResizeChangeEvent): string {\n const state = sflToCanvasState(sfl);\n const canvasObject = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n const parent = canvasObject?.parentFrameId\n ? state.canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n const originX = parent?.x ?? 0;\n const originY = parent?.y ?? 0;\n\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setOrInsertLayoutTuples(lines, range, [\n ['position', event.x - originX, event.y - originY],\n canvasObject?.isometric\n ? ['size', event.width, event.height, event.depth ?? canvasObject.isometric.depth]\n : ['size', event.width, event.height],\n ]);\n return lines.join('\\n');\n}\n","import type { SankeyNodeMoveEvent, SankeyNodeRenameEvent } from '../../events';\nimport { round1 } from '../format';\nimport { findChildBlocks, findDirectProperty, findOwnerBlock, type LineRange } from '../scanner';\nimport { listElementSpans, replaceListElementAt } from './listElement';\n\nconst ZONE_LABEL = /^\\s*\\[\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/;\n\nfunction zoneLabel(element: string): string | null {\n return element.match(ZONE_LABEL)?.[1] ?? null;\n}\n\nfunction escapeSflString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nfunction applyTupleOffset(tuple: string, dx: number, dy: number): string {\n const list = listElementSpans(tuple);\n if (!list) {\n return tuple;\n }\n const items = list.spans.map(span => tuple.slice(span.start, span.end).trim());\n while (items.length < 4) {\n items.push('0');\n }\n const currentX = Number(items[2]) || 0;\n const currentY = Number(items[3]) || 0;\n items[2] = String(round1(currentX + dx));\n items[3] = String(round1(currentY + dy));\n return `${tuple.slice(0, list.start + 1)}${items.join(', ')}${tuple.slice(list.end)}`;\n}\n\nexport function applySankeyNodeMoveChange(sfl: string, event: SankeyNodeMoveEvent): string {\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart) {\n return sfl;\n }\n const span = findDirectProperty(lines, chart, 'zones');\n if (!span) {\n return sfl;\n }\n const line = lines[span.line];\n const moved = replaceListElementAt(\n line.slice(span.start, span.end),\n element => zoneLabel(element) === event.nodeId,\n current => applyTupleOffset(current, event.dx, event.dy),\n );\n if (moved === null) {\n return sfl;\n }\n lines[span.line] = line.slice(0, span.start) + moved + line.slice(span.end);\n return lines.join('\\n');\n}\n\nexport function applySankeyNodeRenameChange(sfl: string, event: SankeyNodeRenameEvent): string {\n const label = event.label.trim();\n if (!label || label === event.nodeId) {\n return sfl;\n }\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart) {\n return sfl;\n }\n const zonesSpan = findDirectProperty(lines, chart, 'zones');\n if (!zonesSpan) {\n return sfl;\n }\n const zonesLine = lines[zonesSpan.line];\n const renamedZones = replaceListElementAt(\n zonesLine.slice(zonesSpan.start, zonesSpan.end),\n element => zoneLabel(element) === event.nodeId,\n current =>\n current.replace(\n ZONE_LABEL,\n (match, group: string) => `${match.slice(0, match.length - group.length - 1)}${escapeSflString(label)}\"`,\n ),\n );\n if (renamedZones === null) {\n return sfl;\n }\n lines[zonesSpan.line] = zonesLine.slice(0, zonesSpan.start) + renamedZones + zonesLine.slice(zonesSpan.end);\n\n const seriesBlocks = findChildBlocks(lines, chart, /^\\s*Series\\s+[A-Za-z_][A-Za-z0-9_]*\\b/);\n for (const series of seriesBlocks) {\n renameEndpoint(lines, series, 'source', event.nodeId, label);\n renameEndpoint(lines, series, 'target', event.nodeId, label);\n }\n return lines.join('\\n');\n}\n\nfunction renameEndpoint(\n lines: string[],\n range: LineRange,\n key: 'source' | 'target',\n oldLabel: string,\n newLabel: string,\n): void {\n const span = findDirectProperty(lines, range, key);\n if (!span) {\n return;\n }\n const line = lines[span.line];\n const current = line.slice(span.start, span.end);\n const match = current.match(/^(\\s*\")((?:[^\"\\\\]|\\\\.)*)(\"\\s*)$/);\n if (!match || match[2] !== oldLabel) {\n return;\n }\n const replaced = `${match[1]}${escapeSflString(newLabel)}${match[3]}`;\n lines[span.line] = line.slice(0, span.start) + replaced + line.slice(span.end);\n}\n","import type { TextChangeEvent } from '../../events';\nimport { setOrInsertText } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyTextChange(sfl: string, event: TextChangeEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setOrInsertText(lines, range, event.text);\n return lines.join('\\n');\n}\n","import { findOwnerBlock } from '../scanner';\n\nexport function removeLink(sfl: string, id: string): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, id);\n if (!range) {\n return sfl;\n }\n\n lines.splice(range.start, range.end - range.start + 1);\n return lines.join('\\n');\n}\n","import type { Unsubscribe } from '../eventing/emitter';\nimport type { Viewer } from '../viewer';\nimport { bindChartValueDrag, type ChartValueDragHandle } from './chartValueDrag';\nimport { bindColorEdit, type ColorEditHandle } from './colorEdit/binding';\nimport { bindDeleteSelection, type DeleteSelectionHandle } from './deleteSelection';\nimport { Emitter, type InteractionEventMap, type InteractionEventName } from './events';\nimport { bindIsometricAxisResize, type IsometricAxisResizeDragHandle } from './isometricAxisResizeDrag';\nimport { bindIsometricLabelDrag, type IsometricLabelDragHandle } from './isometricLabelDrag/binding';\nimport { bindIsometricQuickDuplicate, type IsometricQuickDuplicateHandle } from './isometricQuickDuplicate/binding';\nimport { bindLinkEndpointDrag, type LinkEndpointDragHandle } from './linkEndpointDrag';\nimport { bindLinkSegmentDrag, type LinkSegmentDragHandle } from './linkSegmentDrag';\nimport { bindShapeMovement, type MoveDragHandle } from './moveDrag';\nimport { bindNudgeSelection, type NudgeSelectionHandle } from './nudgeSelection';\nimport { bindPathDraw, type PathDrawDragHandle, type PathDrawOptions } from './pathDrawDrag';\nimport { bindPathReshape, type PathReshapeDragHandle } from './pathReshapeDrag';\nimport { bindPieLabelDrag, type PieLabelDragHandle } from './pieLabelDrag/binding';\nimport { bindPropertyDrag, type PropertyDragHandle } from './propertyDrag/binding';\nimport { bindPropertyEditing, type PropertyEditingHandle, type PropertyEditingOptions } from './propertyEdit';\nimport { bindQuickDuplicate, type QuickDuplicateHandle } from './quickDuplicate';\nimport { bindRadarVertexDrag, type RadarVertexDragHandle } from './radarVertexDrag/binding';\nimport { bindShapeResize, type ResizeDragHandle } from './resizeDrag';\nimport { bindSankeyNode, type SankeyNodeHandle } from './sankeyNode/binding';\nimport { bindTextEditing, type TextEditingHandle } from './textEdit';\n\nexport interface Interaction {\n on<T extends InteractionEventName>(name: T, handler: (event: InteractionEventMap[T]) => void): Unsubscribe;\n startPathDraw(options?: PathDrawOptions): void;\n cancelPathDraw(): void;\n destroy(): void;\n}\n\nexport interface EditingOptions {\n properties?: PropertyEditingOptions;\n}\n\nexport function bindEditing(viewer: Viewer, options: EditingOptions = {}): Interaction {\n const emitter = new Emitter();\n const pathDraw: PathDrawDragHandle = bindPathDraw(viewer, emitter);\n const textEditing: TextEditingHandle = bindTextEditing(viewer, emitter);\n const movement: MoveDragHandle = bindShapeMovement(viewer, emitter);\n const resize: ResizeDragHandle = bindShapeResize(viewer, emitter);\n const isometricAxisResize: IsometricAxisResizeDragHandle = bindIsometricAxisResize(viewer, emitter);\n const pathReshape: PathReshapeDragHandle = bindPathReshape(viewer, emitter);\n const linkEndpoints: LinkEndpointDragHandle = bindLinkEndpointDrag(viewer, emitter);\n const linkSegments: LinkSegmentDragHandle = bindLinkSegmentDrag(viewer, emitter);\n const quickDuplicate: QuickDuplicateHandle = bindQuickDuplicate(viewer, emitter);\n const isometricQuickDuplicate: IsometricQuickDuplicateHandle = bindIsometricQuickDuplicate(viewer, emitter);\n const deleteSelection: DeleteSelectionHandle = bindDeleteSelection(viewer, emitter);\n const nudgeSelection: NudgeSelectionHandle = bindNudgeSelection(viewer, emitter);\n const chartValues: ChartValueDragHandle = bindChartValueDrag(viewer, emitter);\n const pieLabels: PieLabelDragHandle = bindPieLabelDrag(viewer, emitter);\n const isometricLabels: IsometricLabelDragHandle = bindIsometricLabelDrag(viewer, emitter);\n const radarVertices: RadarVertexDragHandle = bindRadarVertexDrag(viewer, emitter);\n const sankeyNodes: SankeyNodeHandle = bindSankeyNode(viewer, emitter);\n const properties: PropertyEditingHandle | null = options.properties\n ? bindPropertyEditing(viewer, emitter, options.properties)\n : null;\n const propertyDrag: PropertyDragHandle | null = options.properties\n ? bindPropertyDrag(viewer, emitter, options.properties.editable)\n : null;\n const colorEdit: ColorEditHandle | null = options.properties\n ? bindColorEdit(viewer, emitter, options.properties.editable, options.properties.colorPickerTheme)\n : null;\n\n return {\n on: (name, handler) => emitter.on(name, handler),\n startPathDraw: startOptions => pathDraw.start(startOptions),\n cancelPathDraw: () => pathDraw.cancel(),\n destroy() {\n pathDraw.destroy();\n textEditing.destroy();\n movement.destroy();\n resize.destroy();\n isometricAxisResize.destroy();\n pathReshape.destroy();\n linkEndpoints.destroy();\n linkSegments.destroy();\n quickDuplicate.destroy();\n isometricQuickDuplicate.destroy();\n deleteSelection.destroy();\n nudgeSelection.destroy();\n chartValues.destroy();\n pieLabels.destroy();\n isometricLabels.destroy();\n radarVertices.destroy();\n sankeyNodes.destroy();\n properties?.destroy();\n propertyDrag?.destroy();\n colorEdit?.destroy();\n emitter.clear();\n },\n };\n}\n\nexport type { Unsubscribe } from '../eventing/emitter';\nexport type { ColorEditHandle } from './colorEdit/binding';\nexport { readGradientValue } from './colorEdit/gradientLookup';\nexport type { ColorPopoverHandle, ColorPopoverOptions } from './colorEdit/popover';\nexport { openColorPopover } from './colorEdit/popover';\nexport type { ColorPickerTheme, ColorPickerThemeOption } from './colorEdit/theme';\nexport { resolveTheme } from './colorEdit/theme';\nexport type { PickerValue } from './colorEdit/value';\nexport { cssBackground, formatPickerValue, seedFrom } from './colorEdit/value';\nexport type {\n ChartValueChangeEvent,\n DeleteEvent,\n InteractionEventMap,\n InteractionEventName,\n IsometricQuickDuplicateDirection,\n LinkReconnectEvent,\n LinkSegmentChangeEvent,\n LinkToEvent,\n MoveChangeEvent,\n PathDrawCompleteEvent,\n PathPoint,\n PathPointChangeEvent,\n PropertyChangeEvent,\n PropertyValue,\n QuickDuplicateEvent,\n ResizeChangeEvent,\n SankeyNodeMoveEvent,\n SankeyNodeRenameEvent,\n TextChangeEvent,\n} from './events';\nexport type {\n InsertCanvasObjectOptions,\n InsertConnectionOptions,\n InsertLinkOptions,\n InsertPathOptions,\n QuickDuplicateOptions,\n RemoveCanvasObjectOptions,\n} from './patchSfl';\nexport {\n applyChartValueChange,\n applyLinkReconnectChange,\n applyLinkSegmentChange,\n applyMoveChange,\n applyMoveChanges,\n applyPathPointChange,\n applyPropertyChange,\n applyQuickDuplicateChange,\n applyResizeChange,\n applySankeyNodeMoveChange,\n applySankeyNodeRenameChange,\n applyTextChange,\n insertCanvasObject,\n insertConnection,\n insertLink,\n insertPath,\n removeCanvasObject,\n removeLink,\n} from './patchSfl';\nexport type { PathDrawOptions } from './pathDrawDrag';\nexport {\n bindPropertyEditing,\n type EditableRules,\n type PropertyEditingHandle,\n type PropertyEditingOptions,\n} from './propertyEdit';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/interaction/chartValue/coordinates.ts","../../src/runtime/interaction/chartValue/lineLookup.ts","../../src/runtime/interaction/chartValue/scale.ts","../../src/runtime/interaction/chartValue/preview.ts","../../src/runtime/interaction/chartValue/readout.ts","../../src/runtime/interaction/chartValue/target.ts","../../src/runtime/interaction/chartValue/session.ts","../../src/runtime/interaction/chartValueDrag.ts","../../src/runtime/interaction/colorEdit/color.ts","../../src/runtime/interaction/colorEdit/gradientValue.ts","../../src/runtime/interaction/colorEdit/gradientLookup.ts","../../src/runtime/interaction/colorEdit/value.ts","../../src/runtime/interaction/colorEdit/popoverActions.ts","../../src/runtime/interaction/colorEdit/popoverDom.ts","../../src/runtime/interaction/colorEdit/popoverView.ts","../../src/runtime/interaction/colorEdit/popoverEvents.ts","../../src/runtime/interaction/colorEdit/popoverRender.ts","../../src/runtime/interaction/colorEdit/styles/base.ts","../../src/runtime/interaction/colorEdit/styles/fields.ts","../../src/runtime/interaction/colorEdit/styles/gradient.ts","../../src/runtime/interaction/colorEdit/styles/tabsAndArea.ts","../../src/runtime/interaction/colorEdit/styles.ts","../../src/runtime/interaction/colorEdit/theme.ts","../../src/runtime/interaction/colorEdit/popover.ts","../../src/runtime/interaction/colorEdit/session.ts","../../src/runtime/interaction/propertyEdit/editable.ts","../../src/runtime/interaction/colorEdit/target.ts","../../src/runtime/interaction/colorEdit/zoneGradientSession.ts","../../src/runtime/interaction/colorEdit/binding.ts","../../src/runtime/interaction/deleteSelection.ts","../../src/runtime/interaction/events.ts","../../src/runtime/interaction/linkPreview/geometry.ts","../../src/runtime/interaction/linkPreview/discovery.ts","../../src/runtime/interaction/linkPreview/faceDiscovery.ts","../../src/runtime/interaction/linkPreview/faceUpdate.ts","../../src/runtime/interaction/linkPreview/update.ts","../../src/runtime/interaction/snapGrid.ts","../../src/runtime/interaction/isometricAxisResize/preview.ts","../../src/runtime/interaction/isometricAxisResize/state.ts","../../src/runtime/interaction/isometricAxisResize/session.ts","../../src/runtime/interaction/isometricAxisResizeDrag.ts","../../src/runtime/interaction/isometricLabelDrag/preview.ts","../../src/runtime/interaction/isometricLabelDrag/target.ts","../../src/runtime/interaction/isometricLabelDrag/session.ts","../../src/runtime/interaction/isometricLabelDrag/binding.ts","../../src/runtime/interaction/isometricQuickDuplicate/binding.ts","../../src/runtime/interaction/linkEndpoint/completion.ts","../../src/runtime/interaction/linkEndpoint/pointer.ts","../../src/runtime/interaction/linkEndpoint/preview.ts","../../src/runtime/interaction/linkGhost/ghost.ts","../../src/runtime/interaction/linkEndpoint/candidates.ts","../../src/runtime/interaction/linkEndpoint/sideSelection.ts","../../src/runtime/interaction/linkEndpoint/fixedEndpoint.ts","../../src/runtime/interaction/linkEndpoint/selection.ts","../../src/runtime/interaction/linkEndpoint/state.ts","../../src/runtime/interaction/linkEndpoint/geometry.ts","../../src/runtime/interaction/linkGhost/target.ts","../../src/runtime/interaction/linkEndpoint/target.ts","../../src/runtime/interaction/linkEndpoint/session.ts","../../src/runtime/interaction/linkEndpointDrag.ts","../../src/runtime/interaction/linkSegment/session.ts","../../src/runtime/interaction/linkSegmentDrag.ts","../../src/runtime/interaction/move/geometry.ts","../../src/runtime/interaction/move/pointer.ts","../../src/runtime/interaction/snapping/alignment.ts","../../src/runtime/interaction/snapping/candidates.ts","../../src/runtime/interaction/snapping/gaps.ts","../../src/runtime/interaction/snapping/isometricDiagonal.ts","../../src/runtime/interaction/snapping/resize.ts","../../src/runtime/interaction/snapping/types.ts","../../src/runtime/interaction/move/snapping.ts","../../src/runtime/interaction/move/completion.ts","../../src/runtime/interaction/move/preview.ts","../../src/runtime/interaction/geometryRoles.ts","../../src/runtime/interaction/move/canvasObjectCapture.ts","../../src/runtime/interaction/move/internalLinkCapture.ts","../../src/runtime/interaction/containerGeometry.ts","../../src/runtime/interaction/move/selection.ts","../../src/runtime/interaction/move/state.ts","../../src/runtime/interaction/move/session.ts","../../src/runtime/interaction/moveDrag.ts","../../src/runtime/interaction/nudgeSelection.ts","../../src/runtime/interaction/pathDraw/geometry.ts","../../src/runtime/interaction/pathDraw/preview.ts","../../src/runtime/interaction/pathDraw/state.ts","../../src/runtime/interaction/pathDraw/session.ts","../../src/runtime/interaction/pathDrawDrag.ts","../../src/runtime/interaction/pathReshape/preview.ts","../../src/runtime/interaction/pathReshape/target.ts","../../src/runtime/interaction/pathReshape/state.ts","../../src/runtime/interaction/pathReshape/session.ts","../../src/runtime/interaction/pathReshapeDrag.ts","../../src/runtime/interaction/pieLabelDrag/preview.ts","../../src/runtime/interaction/pieGeometry.ts","../../src/runtime/interaction/pieLabelDrag/target.ts","../../src/runtime/interaction/pieLabelDrag/session.ts","../../src/runtime/interaction/pieLabelDrag/binding.ts","../../src/runtime/interaction/propertyDrag/target.ts","../../src/runtime/interaction/propertyDrag/session.ts","../../src/runtime/interaction/propertyDrag/binding.ts","../../src/runtime/interaction/textEdit/activeEditor.ts","../../src/runtime/interaction/textEdit/textarea.ts","../../src/runtime/interaction/propertyEdit/target.ts","../../src/runtime/interaction/propertyEdit/session.ts","../../src/runtime/interaction/propertyEdit/binding.ts","../../src/runtime/interaction/quickDuplicate/completion.ts","../../src/runtime/interaction/quickDuplicate/pointer.ts","../../src/runtime/interaction/quickDuplicate/preview.ts","../../src/runtime/interaction/quickDuplicate/state.ts","../../src/runtime/interaction/quickDuplicate/target.ts","../../src/runtime/interaction/quickDuplicate/session.ts","../../src/runtime/interaction/quickDuplicate.ts","../../src/runtime/interaction/radarVertexDrag/preview.ts","../../src/runtime/interaction/radarVertexDrag/readout.ts","../../src/runtime/interaction/radarVertexDrag/target.ts","../../src/runtime/interaction/radarVertexDrag/session.ts","../../src/runtime/interaction/radarVertexDrag/binding.ts","../../src/runtime/interaction/resize/completion.ts","../../src/runtime/interaction/resize/textFit.ts","../../src/runtime/interaction/resize/geometry.ts","../../src/runtime/interaction/resize/pointer.ts","../../src/runtime/interaction/resize/rotation.ts","../../src/runtime/interaction/resize/geometryPreview.ts","../../src/runtime/interaction/resize/overlayPreview.ts","../../src/runtime/interaction/resize/textPreview.ts","../../src/runtime/interaction/resize/preview.ts","../../src/runtime/interaction/resize/snapping.ts","../../src/runtime/interaction/resize/bubbleCapture.ts","../../src/runtime/interaction/resize/selection.ts","../../src/runtime/interaction/resize/textCapture.ts","../../src/runtime/interaction/resize/state.ts","../../src/runtime/interaction/resize/session.ts","../../src/runtime/interaction/resizeDrag.ts","../../src/runtime/interaction/sankeyNode/rename.ts","../../src/runtime/interaction/sankeyNode/preview.ts","../../src/runtime/interaction/sankeyNode/target.ts","../../src/runtime/interaction/sankeyNode/session.ts","../../src/runtime/interaction/sankeyNode/binding.ts","../../src/runtime/interaction/textEdit/geometry.ts","../../src/runtime/interaction/textEdit/editorFactory.ts","../../src/runtime/interaction/textEdit/target.ts","../../src/runtime/interaction/textEdit/session.ts","../../src/runtime/interaction/textEdit/binding.ts","../../src/runtime/interaction/sflPatch/format.ts","../../src/runtime/interaction/sflPatch/blockInsert.ts","../../src/runtime/interaction/sflPatch/scan/sourceMask.ts","../../src/runtime/interaction/sflPatch/scan/blocks.ts","../../src/runtime/interaction/sflPatch/scan/path.ts","../../src/runtime/interaction/sflPatch/scan/properties.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/blockText.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/pathBlockText.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/insert.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/linkReferences.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/madeBlocks.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/removalRanges.ts","../../src/runtime/interaction/sflPatch/canvasObjectPatch/remove.ts","../../src/runtime/interaction/sflPatch/changes/listElement.ts","../../src/runtime/interaction/sflPatch/changes/chartValueChange.ts","../../src/runtime/interaction/sflPatch/edits/propertyValues.ts","../../src/runtime/interaction/sflPatch/linkPatch/endpointText.ts","../../src/runtime/interaction/sflPatch/properties.ts","../../src/runtime/interaction/sflPatch/changes/linkReconnectChange.ts","../../src/runtime/interaction/sflPatch/changes/linkSegmentChange.ts","../../src/runtime/interaction/sflPatch/changes/pathPoints.ts","../../src/runtime/interaction/sflPatch/changes/moveChange.ts","../../src/runtime/interaction/sflPatch/changes/pathPointChange.ts","../../src/runtime/interaction/sflPatch/changes/propertyChange.ts","../../src/runtime/interaction/sflPatch/connectionPatch/blockText.ts","../../src/runtime/interaction/sflPatch/connectionPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/connectionPatch/insert.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/styleBlock.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/isometricDuplicate.ts","../../src/runtime/interaction/sflPatch/linkPatch/blockText.ts","../../src/runtime/interaction/sflPatch/linkPatch/insertionTarget.ts","../../src/runtime/interaction/sflPatch/linkPatch/insert.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicate/shapeDuplicate.ts","../../src/runtime/interaction/sflPatch/changes/quickDuplicateChange.ts","../../src/runtime/interaction/sflPatch/changes/resizeChange.ts","../../src/runtime/interaction/sflPatch/changes/sankeyNodeChange.ts","../../src/runtime/interaction/sflPatch/changes/textChange.ts","../../src/runtime/interaction/sflPatch/linkPatch/remove.ts","../../src/runtime/interaction/index.ts"],"names":["el","element","linePathData","roundedBarPath","barShapePath","barLabelSize","pillPath","formatBarLabel","BAR_LABEL","SVG_NAMESPACE","findOwnerNode","isPrimary","isCameraGesture","resolveOwner","parseHexRgb","rgbToHex","hsvToRgb","rgbToHsv","ratio","screenRectOf","Emitter","pointAtPort","edgePointToward","roundedOrthogonalPathData","calculateLinkRoute","getLineMidpoint","isometricGeometryOf","isometricFaceCenter","labelGapDash","AXIS_COS","AXIS_SIN","isometricFaces","roundedPolygonPath","updateHalo","axisArrowPlacements","updateAxisArrowGroup","isometricTopFaceCenter","findAllOwnerNodes","ISO_HALO_ATTR","ISO_DUPLICATE_BUBBLES_ATTR","pointerUserPoint","CORNER_RADIUS_ATTR","delta","pxPerUnit","SIDES","relativeOffsetOnRectangleSide","segment","SCREEN_DRAG_THRESHOLD","AXES","GUIDE_OVERHANG","findIsometricApexCandidates","findSnapCandidateBounds","DERIVED_HEIGHT_ROLES","updateAlignmentGuides","clearAlignmentGuides","document","freeformPathData","GUIDE_COLOR","PATH_HALO_ATTR","PATH_POINT_INDEX_ATTR","pathGeometryOf","clipSegmentToRect","findLabelMark","isLabelPointer","LEADER_INSET","LABEL_WIDTH","MOVE_NOISE","seriesLabelOffsetXProp","seriesLabelOffsetYProp","radarVertexPoint","radarSeriesPath","GAP","HEIGHT","FONT_SIZE","PADDING_X","radarValueAtPoint","estimateTextWidth","wrapText","MIN_SIZE","pillCornerRadius","SYMBOL_POINTS_ATTR","SYMBOL_TENSION_ATTR","localShapePath","SQUARE_CORNER_ATTR","cornersRoundedRectPath","resizeHandlePositions","personLabelArea","updateQuickDuplicateBubbles","isTextLabel","symbolDeclaredBounds","tokenizeSource","sflToCanvasState","value","readSpan","isIsometricDirection","copyOf","isIsometricObject","escapeSflString"],"mappings":";;;;;;AAAO,SAAS,YAAA,CAAa,KAAoB,KAAA,EAA6B;AAC5E,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,EAAa;AACnC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,CAAA;AACzF;AAEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,EAAa;AACnC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,OAAA,EAAS,CAAA;AAC5F,EAAA,OAAO,UAAA,GAAa,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA;AACtC;;;ACnBO,SAAS,iBAAA,CAAkB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAA2C;AAChH,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAA;AAC5F,EAAA,OACE,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,IACtD,CAAAA,GAAAA,KAAMA,GAAAA,CAAG,OAAA,CAAQ,WAAA,EAAY,KAAM,MAAA,IAAU,CAACA,GAAAA,CAAG,EAAA,CAAG,QAAA,CAAS,kBAAkB;AAAA,GACjF,IAAK,IAAA;AAET;AAEO,SAAS,qBAAA,CAAsB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAA2C;AACpH,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAA,CAAA;AAC5F,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAAA,QAAMA,GAAAA,CAAG,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAC,CAAA,IAAK,IAAA;AACnH;AAEO,SAAS,gBAAA,CAAiB,GAAA,EAAoB,OAAA,EAAiB,MAAA,EAAsC;AAC1G,EAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,mBAAA,EAAsB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,uBAAA,CAAA;AAC5F,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAC1D,MAAA,CAAO,CAAAA,GAAAA,KAAMA,GAAAA,CAAG,OAAA,CAAQ,aAAY,KAAM,SAAS,CAAA,CACnD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,EAAE,YAAA,CAAa,qBAAqB,CAAC,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,YAAA,CAAa,qBAAqB,CAAC,CAAC,CAAA;AACjH;;;ACjBO,SAAS,gBAAgBC,QAAAA,EAA4C;AAC1E,EAAA,MAAM,GAAA,GAAMA,QAAAA,EAAS,YAAA,CAAa,qBAAqB,CAAA;AACvD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,CAAC,OAAO,UAAA,EAAY,GAAA,EAAK,GAAG,CAAA,GAAI,KAAA,CAAM,IAAI,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAA,KAAA,KAAS,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA,IAAc,CAAA,IAAK,GAAA,KAAQ,GAAA,EAAK;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,CAAC,CAAA,KAAM,YAAA,GAChB,EAAE,YAAY,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,KAAI,GAChD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAK,GAAA,EAAI;AACpC;AAEO,SAAS,YAAA,CAAa,UAAkB,KAAA,EAA2B;AACxE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,GAAA,CAClB,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,UAAA,GAAA,CAChC,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,YAAY,KAAA,CAAM,UAAA;AACxD,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,GAAM,QAAA,IAAY,KAAA,CAAM,MAAM,KAAA,CAAM,GAAA,CAAA;AACxD,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA;AACvD;AAEO,SAAS,aAAA,CAAc,OAAe,KAAA,EAA2B;AACtE,EAAA,MAAM,YAAY,KAAA,GAAQ,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,MAAM,KAAA,CAAM,GAAA,CAAA;AAC1D,EAAA,OAAO,KAAA,CAAM,UAAA,GACT,KAAA,CAAM,KAAA,GAAQ,QAAA,GAAW,KAAA,CAAM,UAAA,GAC/B,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,QAAA,GAAW,KAAA,CAAM,UAAA;AACxD;;;AC1BA,SAAS,mBAAA,CAAoB,KAAoB,IAAA,EAAiC;AAChF,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,IAC7E,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,IAClC,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,IAAI,CAAC;AAAA,GACpC,CAAE,CAAA;AACF,EAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,KAAK,KAAA,CAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AAC9D,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,aAAa,GAAA,EAAKC,8BAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAO,qBAAA,CAAsB,GAAA,EAAK,KAAK,KAAA,CAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AAClE,EAAA,IAAI,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,IAAI,CAAA,EAAGA,8BAAA,CAAa,QAAQ,IAAA,CAAK,WAAW,CAAC,CAAA,GAAA,EAAM,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,GAAA,EAAM,MAAM,CAAC,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,EAAA,CAAA;AACxG,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC1B;AACF;AAEA,SAAS,UAAA,CAAW,GAAA,EAAoB,IAAA,EAA2B,CAAA,EAAiB;AAClF,EAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,GAAA,EAAK,CAAC,CAAA;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,CAAQ,YAAA,EAAc,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AACtG,IAAA,IAAA,EAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EAC3B;AACF;AAEO,SAAS,uBAAA,CAAwB,GAAA,EAAoB,IAAA,EAA2B,KAAA,EAAqB;AAC1G,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,OAAO,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA;AACtE,IAAA,UAAA,CAAW,GAAA,EAAK,IAAA,EAAMC,gCAAA,CAAe,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,SAAS,CAAC,CAAA;AACnG,IAAA;AAAA,EACF;AACA,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAK,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AACnD,IAAA,UAAA,CAAW,GAAA,EAAK,IAAA,EAAMC,8BAAA,CAAa,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AACzF,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,EAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AACzC,EAAA,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAC/B;AAgBA,SAAS,YAAA,CAAa,KAAoB,IAAA,EAAoD;AAC5F,EAAA,MAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,CAAQ,cAAc,kBAAkB,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAA8B,CAAA,KAAA,EAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA,GAAA,CAAK,IAAA,EAAM,YAAA,CAAa,cAAc,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA;AACxF,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,aAAA,CAA8B,QAAQ,EAAE,CAAA,OAAA,CAAS,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS;AACnG;AAEA,SAAS,UAAA,CAAW,SAAA,EAAmB,MAAA,EAAmB,GAAA,EAAa,MAAA,EAAwB;AAC7F,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA,KAAc,QAAA,GAAW,GAAA,GAAM,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA,GAAK,GAAA,GAAM,MAAA,CAAO,GAAA;AACrG;AAEA,SAAS,UAAA,CAAW,IAAA,EAAsB,IAAA,EAAsB,KAAA,EAAe,EAAA,EAAkB;AAC/F,EAAA,MAAM,WAAW,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,WAAW,KAAK,IAAI,CAAA;AAClE,EAAA,MAAM,IAAA,GAAOC,8BAAA,CAAa,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAA,CAAY,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA;AACpF,EAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,MAAA;AACvB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAC7C,EAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAKC,0BAAA,CAAS,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAClG,EAAA,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AACrD;AAEA,SAAS,wBAAA,CACP,KAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,OAAA,GAAUC,gCAAA,CAAe,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AACpD,EAAA,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,IAAK,KAAA,CAAM,MAAM,WAAA,GAAc,OAAA;AAChE,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAQ;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,KAAK,YAAA,CAAa,WAAW,KAAK,IAAI,CAAA;AACxE,EAAA,MAAM,OAAOF,8BAAA,CAAa,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,OAAO,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,GAAO,KAAA;AAC1B,EAAA,MAAM,MAAA,GACJ,MAAM,SAAA,KAAc,SAAA,GAChB,MAAMG,2BAAA,CAAU,GAAA,GAAM,KAAK,KAAA,GAAQ,CAAA,GACnC,MAAM,SAAA,KAAc,QAAA,GAClB,MAAMA,2BAAA,CAAU,GAAA,GAAM,KAAK,KAAA,GAAQ,CAAA,GACnC,MAAA,CAAO,IAAA,GAAO,KAAA,GAAQ,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,GAAA;AAC9E,EAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,QAAA,GAAW,MAAA;AAC9B,EAAA,KAAA,CAAM,IAAA,CAAK,aAAa,WAAA,EAAa,CAAA,UAAA,EAAa,SAAS,MAAA,CAAO,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA;AAC9E,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AAC/F,IAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAA,GAAU,KAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,WAAW,CAAA;AACtC,IAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAKF,0BAAA,CAAS,SAAS,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACxG;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAA,CACd,GAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,GAAI,IAAA;AACrD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,MAAM,UAAA,EAAY;AACzB,IAAA,OAAO,wBAAA,CAAyB,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAK,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA;AACtC,EAAA,MAAM,KAAK,UAAA,CAAW,KAAA,CAAM,SAAA,EAAW,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAUC,gCAAA,CAAe,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAEpD,EAAA,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,IAAK,KAAA,CAAM,MAAM,WAAA,GAAc,OAAA;AAChE,EAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AACzD,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,SAAS,EAAE,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAA;AACT;;;ACjJA,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,GAAA,GAAM,CAAA;AACZ,IAAM,UAAA,GAAa,uBAAA;AAEnB,SAAS,OAAA,CAA8C,KAAoB,GAAA,EAAiC;AAC1G,EAAA,OAAO,GAAA,CAAI,aAAA,CAAc,eAAA,CAAgBE,+BAAA,EAAe,GAAG,CAAA;AAC7D;AAEO,SAAS,mBAAmB,GAAA,EAAiC;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC9B,EAAA,KAAA,CAAM,YAAA,CAAa,yBAAyB,EAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,YAAA,CAAa,kBAAkB,MAAM,CAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,UAAA,CAAW,YAAA,CAAa,MAAM,GAAG,CAAA;AACjC,EAAA,UAAA,CAAW,YAAA,CAAa,QAAQ,UAAU,CAAA;AAC1C,EAAA,KAAA,CAAM,YAAY,UAAU,CAAA;AAE5B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACjC,EAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,SAAS,CAAA;AACpC,EAAA,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AACjD,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,8BAA8B,CAAA;AAChE,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,KAAK,CAAA;AACvC,EAAA,KAAA,CAAM,YAAA,CAAa,eAAe,QAAQ,CAAA;AAC1C,EAAA,KAAA,CAAM,YAAA,CAAa,qBAAqB,SAAS,CAAA;AACjD,EAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAEvB,EAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AACrB,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,IAAA,EAAmC;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,GAAY,CAAA;AACxC;AAEO,SAAS,YAAY,IAAA,EAAmC;AAC7D,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AACpC;AAQO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,IAAI,EAAE,CAAA;AAC3C;AAEA,SAAS,aAAa,KAAA,EAA2B;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,kBAAA,CAAmB,SAAS,EAAE,MAAA,GAAS,CAAA;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAK,QAAQ,SAAA,GAAa,GAAA,GAAM,YAAY,CAAC,CAAA;AAC/D;AAEO,SAAS,kBAAA,CAAmB,OAAA,EAAsB,MAAA,EAAuB,KAAA,EAAqB;AACnG,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY;AACxB,IAAA;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAEvC,EAAA,IAAI,MAAA,CAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,UAAA;AAClD,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,GAAM,KAAA,IAAS,UAAU,KAAA,GAAQ,GAAA,GAAM,QAAQ,GAAA,GAAM,KAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,CAAA;AAClC,IAAA,UAAA,CAAW,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACzC,IAAA,UAAA,CAAW,aAAa,GAAA,EAAK,MAAA,CAAO,OAAA,GAAU,MAAA,GAAS,CAAC,CAAC,CAAA;AACzD,IAAA,UAAA,CAAW,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9C,IAAA,UAAA,CAAW,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,aAAa,GAAA,EAAK,MAAA,CAAO,IAAA,GAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,MAAA,IAAU,OAAO,KAAA,CAAM,KAAA;AACnD,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAS,KAAA,GAAQ,GAAA;AACnD,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,EAAA,UAAA,CAAW,aAAa,GAAA,EAAK,MAAA,CAAO,OAAA,GAAU,KAAA,GAAQ,CAAC,CAAC,CAAA;AACxD,EAAA,UAAA,CAAW,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AACxC,EAAA,UAAA,CAAW,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9C,EAAA,UAAA,CAAW,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AAChD,EAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACtC,EAAA,IAAA,CAAK,aAAa,GAAA,EAAK,MAAA,CAAO,GAAA,GAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACjD;AAEO,SAAS,mBAAmB,OAAA,EAAmC;AACpE,EAAA,OAAA,EAAS,MAAA,EAAO;AAClB;;;AC7FA,SAAS,aAAA,CAAc,KAAoB,MAAA,EAAqD;AAC9F,EAAA,MAAM,WACJ,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA,mBAAA,EACvB,GAAA,CAAI,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA,wBAAA,EACpB,OAAO,KAAK,CAAA,EAAA,CAAA;AACvC,EAAA,OACE,CAAC,GAAG,GAAA,CAAI,gBAAA,CAAqC,QAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAAR,QAAAA,KAAW;AACtE,IAAA,MAAM,GAAA,GAAMA,QAAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AACxC,IAAA,OAAO,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,MAAA;AAAA,EACxD,CAAC,CAAA,IAAK,IAAA;AAEV;AAEO,SAAS,qBAAA,CAAsB,KAAoB,KAAA,EAAiD;AACzG,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AACrC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,qBAAqB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,gBAAgBS,+BAAA,CAAc,GAAA,EAAK,OAAO,KAAA,CAAM,EAAA,EAAIC,2BAAS,CAAC,CAAA;AAC5E,EAAA,MAAM,WAAW,KAAA,GAAQ,yBAAA,CAA0B,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AACzE,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,SAAS,CAAA;AACxC,EAAA,OAAO,yBAAA,CAA0B,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,SAAS,CAAA;AAC3E;AAEA,SAAS,yBAAA,CACP,MAAA,EACA,KAAA,EACA,QAAA,EACA,SAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG,QAAA;AAAA,IACH,SAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,oBAAoB,KAAA,EAA8B;AACzD,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAACC,kCAAgB,KAAK,CAAA;AACrD;AAEA,SAAS,mBAAmB,KAAA,EAAgD;AAC1E,EAAA,OAAQ,KAAA,CAAM,MAAA,EAA2B,OAAA,GAAU,uBAAuB,CAAA;AAC5E;AAEA,SAAS,qBAAqB,IAAA,EAAmD;AAC/E,EAAA,MAAM,KAAA,GAAQC,+BAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,EAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,qBAAqB,CAAC,CAAA;AAC7D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;AAEA,SAAS,yBAAA,CACP,GAAA,EACA,MAAA,EACA,KAAA,EAC2B;AAC3B,EAAA,MAAMZ,QAAAA,GAAU,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AACzC,EAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQA,QAAAA,CAAQ,YAAA,CAAa,cAAc,CAAA,KAAM,KAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQA,QAAAA,CAAQ,OAAA,EAAQ,GAAI,IAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA;AAChE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA,EAAG;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,GAAO,iBAAA,CAAkB,KAAK,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,MAAA,CAAO,MAAM,CAAA;AACjF,EAAA,OAAO;AAAA,IACL,OAAA,EAAAA,QAAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,MAAM,CAAA,IAAK,CAAA;AAAA,IACjB,QAAA,EAAU,MAAM,KAAA,IAAS,CAAA;AAAA,IACzB,MAAA,EAAQ,MAAM,CAAA,IAAK,CAAA;AAAA,IACnB,SAAA,EAAW,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3B,SAAA,EAAW,QAAQ,MAAA,CAAOA,QAAAA,CAAQ,aAAa,oBAAoB,CAAC,KAAK,CAAA,GAAI,CAAA;AAAA,IAC7E,aAAa,MAAA,CAAO,IAAA,EAAM,YAAA,CAAa,sBAAsB,CAAC,CAAA,IAAK;AAAA,GACrE;AACF;;;AC1GO,IAAM,wBAAN,MAA4B;AAAA,EACxB,IAAA;AAAA,EACA,QAAA;AAAA,EACT,KAAA,GAAoC,IAAA;AAAA,EACpC,QAAA,GAA+B,IAAA;AAAA,EAC/B,OAAA,GAA4B,IAAA;AAAA,EAE5B,WAAA,CAAY,KAAoB,OAAA,EAAkB;AAChD,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,YAAY,IAAA,EAAiC;AAC3C,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,mBAAA,EAAqB;AAAA,QACtC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,EAA8B;AAClC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ;AACvC,MAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,IACjF;AACA,IAAA,OAAO,KAAK,KAAA,KAAU,IAAA;AAAA,EACxB;AAAA,EAEA,KAAK,KAAA,EAA2B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,MAAM,SAAA,KAAc,IAAA,CAAK,MAAM,SAAA,EAAW;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA,EAAG,IAAA,CAAK,MAAM,KAAK,CAAA;AACjH,IAAA,uBAAA,CAAwB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAEpD,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,mBAAA,EAAqB;AAAA,MACtC,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MAClB,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,MACnB,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MAClB;AAAA,KACD,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,KAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA,EAAG;AAC9E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,kBAAA;AAAA,MACE,IAAA,CAAK,QAAA;AAAA,MACL,EAAE,OAAA,EAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,EAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,MAC9F;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEA,OAAO,KAAA,EAA2B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,MAAM,SAAA,KAAc,IAAA,CAAK,MAAM,SAAA,EAAW;AAC3D,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAC,KAAA,CAAM,MAAA,EAAoB,qBAAA,GAAwB,IAAA,CAAK,SAAS,CAAA;AACjE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,kBAAA,EAAoB;AAAA,MACrC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,KAAA,EAAO,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG,IAAA,CAAK,KAAK;AAAA,KAC/F,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EACvB;AACF,CAAA;;;AC9FO,SAAS,kBAAA,CAAmB,QAAgB,OAAA,EAAwC;AACzF,EAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,CAAsB,MAAA,CAAO,KAAK,OAAO,CAAA;AAC7D,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,IACxB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACpB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAwB;AAC3C,IAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EACtB,CAAA;AACA,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,aAAA,EAAe,aAAa,CAAA;AACxD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,aAAA,EAAe,aAAa,CAAA;AACxD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,WAAW,CAAA;AACpD,EAAA,MAAA,CAAO,GAAA,CAAI,gBAAA,CAAiB,eAAA,EAAiB,WAAW,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,OAAA,GAAU;AACR,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAC3D,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAC3D,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa,WAAW,CAAA;AACvD,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAA,CAAoB,eAAA,EAAiB,WAAW,CAAA;AAAA,IAC7D;AAAA,GACF;AACF;;;ACfO,SAAS,aAAa,KAAA,EAA8B;AACzD,EAAA,MAAM,QAAA,GAAWa,8BAAY,KAAK,CAAA;AAClC,EAAA,OAAO,QAAA,IAAYC,0BAAA,CAAS,GAAG,QAAQ,CAAA;AACzC;AAEA,IAAM,cAAA,GACJ,iGAAA;AACF,IAAM,cAAA,GAAiB,gCAAA;AAOhB,SAAS,gBAAgB,KAAA,EAAkC;AAChE,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,EAAK;AACvB,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAClC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAC,CAAA,KAAM,SAAY,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,IAAI,GAAA,GAAM,CAAA,CAAA;AACvE,IAAA,OAAO;AAAA,MACL,GAAA,EAAKA,UAAS,EAAE,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,OAAO,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,CAAA;AAAA,MACtE,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC;AAAA,KACvC;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AACrC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,EAAO,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,IAAI,GAAA,EAAI;AAAA,EACzF;AACA,EAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,EAAA,OAAO,GAAA,GAAM,EAAE,GAAA,EAAK,KAAA,EAAO,GAAE,GAAI,IAAA;AACnC;AAEO,SAAS,gBAAA,CAAiB,KAAa,KAAA,EAAuB;AACnE,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9C,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,SAAS,GAAG,CAAA;AAChC,EAAA,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA;AAClE;AAEO,SAAS,MAAM,KAAA,EAAuB;AAC3C,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,GAAA,IAAO,SAAA;AACxC;AAEO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,KAAA,IAAS,CAAA;AAC1C;AAMO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAC,CAAA;AACrD;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAID,6BAAA,CAAY,GAAG,CAAA,IAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,SAASC,UAAS,GAAA,EAAkB;AACzC,EAAA,OAAOA,0BAAA,CAAS,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/E;AAGO,SAASC,UAAS,GAAA,EAAe;AACtC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAIA,0BAAA;AAAA,IAAA,CAChB,GAAA,CAAI,CAAA,GAAI,GAAA,GAAO,GAAA,IAAO,GAAA;AAAA,IACxB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IAC9B,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC;AAAA,GAChC;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAEO,SAASC,UAAS,GAAA,EAAe;AACtC,EAAA,OAAOA,0BAAA,CAAc,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AACpF;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,OAAOA,SAAAA,CAAS,QAAA,CAAS,GAAG,CAAC,CAAA;AAC/B;AAEO,SAAS,SAAS,GAAA,EAAkB;AACzC,EAAA,OAAOF,SAAAA,CAASC,SAAAA,CAAS,GAAG,CAAC,CAAA;AAC/B;;;AC7FO,IAAM,sBAAA,GAAyB,EAAA;AAEtC,IAAM,QAAA,GAAW,4CAAA;AACjB,IAAM,IAAA,GAAO,+DAAA;AAEb,SAAS,KAAK,KAAA,EAAuB;AACnC,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChC;AAEO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AACzC;AAEO,SAAS,UAAU,KAAA,EAA0D;AAClF,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAC1D;AAEO,SAAS,cAAc,MAAA,EAAsC;AAClE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,MAAM,QAAQ,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAC/B,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,QAAQ,GAAG,CAAA;AAAA,IACrG;AAAA,EACF;AACA,EAAA,OAAO,MAAM,MAAA,IAAU,CAAA,GAAI,EAAE,KAAA,EAAO,OAAM,GAAI,IAAA;AAChD;AAEO,SAAS,eAAe,KAAA,EAA8B;AAC3D,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,KAAK,EAChC,GAAA,CAAI,CAAA,IAAA,KAAQ,GAAG,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,aAAA,CAAc,KAAK,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CAClE,KAAK,IAAI,CAAA;AACZ,EAAA,OAAO,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AAChD;AAEO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAChC,GAAA,CAAI,UAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,cAAc,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAC5D,KAAK,IAAI,CAAA;AACZ,EAAA,OAAO,mBAAmB,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,CAAC,QAAQ,KAAK,CAAA,CAAA,CAAA;AAC/D;;;AC1DA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,MAAM,cAAc,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,MAAA,CAAO,WAAW,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,IAAK,EAAE,CAAC,CAAA;AACxG,EAAA,IAAI,CAAC,WAAA,CAAY,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,sBAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,WAAA;AACzB,EAAA,MAAM,KAAA,GAAS,KAAK,KAAA,CAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK,EAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAChC;AAEO,SAAS,iBAAA,CAAkB,KAAoB,IAAA,EAA2C;AAC/F,EAAA,MAAM,EAAA,GAAK,IAAA,EAAM,KAAA,CAAM,mBAAmB,IAAI,CAAC,CAAA;AAC/C,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,CAAA,KAAA,EAAQ,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACxD,EAAA,IAAI,GAAA,EAAK,OAAA,CAAQ,WAAA,EAAY,KAAM,gBAAA,EAAkB;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC/C,IAAA,MAAM,SAAS,eAAA,CAAgB,IAAA,CAAK,YAAA,CAAa,YAAY,KAAK,EAAE,CAAA;AACpE,IAAA,MAAM,SAAS,MAAA,CAAO,UAAA,CAAW,KAAK,YAAA,CAAa,QAAQ,KAAK,EAAE,CAAA;AAClE,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,MAAM,GAAG,CAAA;AAAA,IACnG;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,CAAU,GAAG,GAAG,KAAA,EAAM;AACxC;;;ACzBO,IAAM,cAAA,GAAiB,SAAA;AAMvB,SAAS,QAAA,CAAS,MAAqB,QAAA,EAA6C;AACzF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,QAAA,CAAS,OAAO,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAE;AAAA,EACrF;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACjF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,GAAI,IAAA;AAC7C,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,cAAA,EAAgB,KAAA,EAAO,KAAA,EAAO,KAAA,IAAS,CAAA,EAAE;AACxF;AAEO,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA,GAClB,iBAAiB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,IAAS,CAAC,CAAA,GAC9C,cAAA,CAAe,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAC/D;AAEO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,EAAA,OAAO,QAAA,GAAW,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA;AAC5C;AAEO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAW,KAAA,CAAM,SAAS,CAAA,GAAK,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,SAAS,cAAc,CAAA;AACjH;AAEO,SAAS,QAAQ,KAAA,EAA4B;AAClD,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,SAAS,cAAc,CAAA;AACxG;AAEO,SAAS,OAAO,GAAA,EAAqB;AAC1C,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,OAAO,QAAA,CAAS,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA;AAC1D;AAEO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO,EAAE,OAAO,KAAA,CAAM,KAAA,EAAO,OAAO,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EAC7D;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,EAAE,KAAA,EAAO,gBAAA,CAAiB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAA,IAAS,CAAC,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAAA,MACtE,EAAE,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,CAAC,CAAA,EAAG,QAAA,EAAU,GAAA;AAAI;AAClF,GACF;AACF;;;AC1DA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAmBX,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,IAAS,KAAA,CAAM,KAAA;AACtG;AAEO,SAAS,UAAU,MAAA,EAAwB;AAChD,EAAA,OAAO,KAAA,CAAM,WAAA,CAAY,MAAM,CAAC,CAAA;AAClC;AAEO,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AACzF;AAEA,SAAS,mBAAA,CAAoB,MAAA,EAAgB,GAAA,EAAa,KAAA,EAAqB;AAC7E,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AACd,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB,WAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC/C,IAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,GAAI;AAAA,MACrC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAM,QAAQ,CAAA;AAAA,MACtC,KAAA,EAAO,gBAAA,CAAiB,GAAA,EAAK,KAAK;AAAA,KACpC;AAAA,EACF;AACF;AAEO,SAAS,cAAA,CAAe,QAAgB,GAAA,EAAmB;AAChE,EAAA,mBAAA,CAAoB,MAAA,EAAQ,GAAA,EAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACtD;AAEA,SAAS,aAAa,MAAA,EAA6B;AACjD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA,GAClB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,OAAM,GACxD,EAAE,MAAM,UAAA,EAAY,GAAG,MAAM,QAAA,EAAS;AAC5C;AAEO,SAAS,OAAO,MAAA,EAAsB;AAC3C,EAAA,MAAA,CAAO,QAAA,CAAS,iBAAA,CAAkB,YAAA,CAAa,MAAM,CAAC,CAAC,CAAA;AACzD;AAEO,SAAS,QAAA,CAAS,QAAgB,IAAA,EAAiB;AACxD,EAAA,MAAA,CAAO,MAAM,GAAA,GAAM,IAAA;AACnB,EAAA,cAAA,CAAe,MAAA,EAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AACrC,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,QAAA,CAAS,QAAgB,GAAA,EAAmB;AAC1D,EAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,EAAA,cAAA,CAAe,QAAQ,GAAG,CAAA;AAC1B,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,GAAA,EAAmB;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA;AAAA,EACF;AACA,EAAA,mBAAA,CAAoB,MAAA,EAAQ,SAAA,CAAU,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,IAAI,GAAG,CAAA;AACtF,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,GAAA,EAAmB;AAC5D,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA;AAAA,EACF;AACA,EAAA,MAAA,CAAO,MAAM,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,MAAM,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA,EAAE;AAC7F,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,KAAA,EAAqB;AAC9D,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,KAAU,KAAA,CAAM,QAAA,IAAY,CAAC,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AACzF,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,EAAA,KAAA,CAAM,GAAA,GAAM,SAAS,KAAA,CAAM,KAAA,CAAM,SAAS,KAAA,CAAM,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7D,EAAA,MAAA,CAAO,MAAA,EAAO;AAChB;AAEO,SAAS,UAAA,CAAW,QAAgB,KAAA,EAAqB;AAC9D,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,UAAU,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,OAAO,CAAC,KAAA,EAAO,EAAA,KAAO,EAAA,KAAO,KAAK,CAAA,EAAE;AACtG,EAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,UAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzE,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,WAAW,MAAA,EAAsB;AAC/C,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,KAAA,EAAO,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACtE,UAAU,aAAA,CAAA,CAAe,IAAA,CAAK,YAAY,QAAA,EAAU,QAAA,IAAY,MAAM,CAAC;AAAA,GACzE;AACA,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,UAAU,KAAA,EAAO,SAAA,CAAU,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA,EAAE;AAC5F,EAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtD,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,OAAA,CAAQ,QAAgB,IAAA,EAAiC;AACvE,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,KAAA,CAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;AAEO,SAAS,gBAAgB,MAAA,EAAsB;AACpD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,KAAA,CAAM,QAAA,GAAW,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAE;AAC7E,EAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,UAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzE,EAAA,MAAA,CAAO,MAAA,EAAO;AACd,EAAA,MAAA,CAAO,MAAM,CAAA;AACf;;;AClKO,SAAS,EAAA,CACd,GAAA,EACA,SAAA,EACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,EAAA,MAAA,EAAQ,YAAY,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SAAA,CAAU,OAAe,MAAA,EAAwC;AAC/E,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA;AAC/C,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,KAAK,CAAA;AACjC,EAAA,MAAA,CAAO,WAAA,GAAc,KAAA;AACrB,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAA,CAAY,MAAA,EAAqB,GAAA,EAAa,GAAA,EAA+B;AAC3F,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,EAAS,cAAA,EAAgB,MAAM,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,UAAA,CAAW,MAAA,EAAqB,IAAA,EAAc,GAAA,EAAa,GAAA,EAAyB;AAClG,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,aAAA,EAAe,MAAM,CAAA;AAC3C,EAAA,EAAA,CAAG,MAAA,EAAQ,oBAAoB,GAAG,CAAA;AAClC,EAAA,EAAA,CAAG,MAAA,EAAQ,qBAAqB,GAAG,CAAA;AACnC,EAAA,EAAA,CAAG,MAAA,EAAQ,mBAAA,EAAqB,GAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,OAAA,EAAS,mBAAA,EAAqB,GAAG,CAAA;AAClD,EAAA,KAAA,CAAM,IAAA,GAAO,OAAA;AACb,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,KAAA,CAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACxC,EAAA,MAAA,CAAO,SAAA,CAAU,IAAI,oBAAoB,CAAA;AACzC,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAC9B;AAEO,SAAS,UAAU,KAAA,EAA+B;AACvD,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACjD,EAAA,MAAME,MAAAA,GAAQ,IAAA,GAAO,CAAA,GAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,IAAK,IAAA,GAAO,CAAA;AAC5E,EAAA,KAAA,CAAM,aAAA,EAAe,KAAA,CAAM,WAAA,CAAY,YAAA,EAAc,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,MAAK,CAAC,CAAC,CAAC,CAAA;AAC9F;AAEO,SAAS,WAAA,CAAY,QAAqB,IAAA,EAA8B;AAC7E,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,WAAA,EAAa,MAAM,CAAA;AACzC,EAAA,EAAA,CAAG,MAAA,EAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AAC7C,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,KAAA,CAAM,OAAe,IAAA,EAAsB;AACzD,EAAA,OAAO,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,IAAI,CAAC,CAAA,GAAI,CAAA;AAC7D;AAEO,SAAS,SAAA,CAAU,IAAA,EAAmB,MAAA,EAAqC,KAAA,EAA+B;AAC/G,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB,MAAA,CAAO,KAAK,CAAA;AAChD,EAAA,MAAM,KAAK,MAAM;AACf,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAC1C,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB;AAClC,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAA,CAAO,KAAK,CAAA;AACZ,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC3C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,EACzC,CAAA;AACA,EAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACvC,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC1C,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAAA,EAC5C,CAAA;AACF;;;AC/EO,IAAM,QAAA,GAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAItC,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,eAAA,GAAkB,CAAA;AAoExB,SAAS,gBAAgB,MAAA,EAAwC;AAC/D,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,kBAAA,EAAoB,MAAM,CAAA;AACtD,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,KAAA,GAAQ,8BAAA;AACf,EAAA,MAAA,CAAO,YAAA,CAAa,cAAc,8BAA8B,CAAA;AAChE,EAAA,MAAA,CAAO,SAAA,GACL,wUAAA;AACF,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAAkC;AAC5D,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAC7C,EAAA,EAAA,CAAG,KAAA,EAAO,sBAAsB,MAAM,CAAA;AACtC,EAAA,EAAA,CAAG,KAAA,EAAO,sBAAsB,MAAM,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,KAAA,EAAO,qBAAA,EAAuB,MAAM,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,iBAAA,EAAmB,GAAG,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,MAAM,gBAAgB,EAAC;AACvB,EAAA,MAAM,iBAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,EAAM,QAAQ,WAAA,EAAY,EAAG,GAAG,GAAG,CAAA;AAC5D,IAAA,aAAA,CAAc,OAAO,IAAI,KAAA,CAAM,KAAA;AAC/B,IAAA,cAAA,CAAe,OAAO,IAAI,KAAA,CAAM,MAAA;AAAA,EAClC;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,GAAG,GAAG,CAAA;AAC1C,EAAA,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,oBAAoB,CAAA;AAC5C,EAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,UAAA,EAAY,MAAA,EAAQ,aAAY,GAAI,KAAA;AAClE,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,EAAS,YAAA,EAAc,MAAM,CAAA;AACjD,EAAA,QAAA,CAAS,IAAA,GAAO,MAAA;AAChB,EAAA,QAAA,CAAS,UAAA,GAAa,KAAA;AACtB,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,MAAA;AACtE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,qBAAA,CAAsB,MAAmB,SAAA,EAAsC;AACtF,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,KAAA,EAAO,eAAA,EAAiB,IAAI,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,KAAA,EAAO,eAAA,EAAiB,OAAO,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,OAAA,EAAS,GAAG,GAAG,CAAA;AACjD,EAAA,KAAA,CAAM,IAAI,MAAA,GAAS,SAAA;AACnB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,aAAY,GAAI,KAAA;AACnD,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,oBAAA,EAAsB,OAAO,CAAA;AACpD,EAAA,EAAA,CAAG,MAAA,EAAQ,eAAA,EAAiB,IAAI,CAAA,CAAE,WAAA,GAAc,OAAA;AAChD,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,QAAA,EAAU,gBAAA,EAAkB,IAAI,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,EAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AACtB,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA;AAChB,EAAA,OAAA,CAAQ,MAAA,GAAS,SAAA;AACjB,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,EAAO,aAAA,EAAe,OAAO,CAAA;AACjD,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,WAAA,EAAa,SAAS,QAAA,EAAS;AACxE;AAEO,SAAS,gBAAgB,OAAA,EAAkC;AAChE,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAU,GAAI,OAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAC9B,EAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,MAAA;AACxC,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAA,CAAA;AAChC,EAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,GAAA,GAAM,MAAA,CAAO,SAAS,gBAAgB,CAAA,EAAA,CAAA;AAEjE,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AACzC,EAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,SAAS,CAAA;AACnC,EAAA,IAAA,CAAK,SAAS,CAAC,aAAA;AACf,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAI,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,EAAM,SAAS,CAAA;AAEtD,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,WAAA,GAAc,EAAA,CAAG,QAAA,EAAU,aAAA,EAAe,IAAI,CAAA;AAC9C,IAAA,WAAA,CAAY,IAAA,GAAO,QAAA;AACnB,IAAA,WAAA,CAAY,WAAA,GAAc,kBAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,GAAG,KAAA,EAAO,GAAG,QAAA,EAAU,QAAA,EAAU,EAAC,EAAG,WAAA,EAAY;AACzF;AAEO,SAAS,iBAAA,CAAkB,MAAmB,MAAA,EAAsB;AACzE,EAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,eAAA;AAClD,EAAA,IAAI,IAAA,CAAK,MAAM,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,gBAAA;AACzC,IAAA,IAAA,CAAK,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,CAAI,eAAA,EAAiB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,eAAA;AACjD,EAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACvB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,eAAA,EAAiB,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,EACzD;AACF;;;ACvKA,SAAS,UAAU,MAAA,EAAmC;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAA,CAAO,IAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,MACE,MAAA;AAAA,MACA,CAAA,KAAA,KAAS;AACP,QAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,QAAA,QAAA,CAAS,MAAA,EAAQ;AAAA,UACf,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA;AAAA,UACpB,GAAG,KAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,UAC9C,CAAA,EAAG,IAAI,KAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,GAAA,EAAK,KAAK,MAAM;AAAA,SACnD,CAAA;AAAA,MACH,CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA;AAAA,MACE,GAAA;AAAA,MACA,CAAA,KAAA,KAAS;AACP,QAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,QAAA,QAAA,CAAS,QAAQ,EAAE,GAAG,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,KAAK,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,GAAI,KAAK,CAAA;AAAA,MACjG,CAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEA,SAAS,WAAA,CAAY,QAAgB,OAAA,EAAwB;AAC3D,EAAA,MAAM,EAAE,aAAA,EAAe,cAAA,EAAe,GAAI,MAAA,CAAO,IAAA;AACjD,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA,EAAG,CAAC,OAAO,GAAG,KAAA,EAAM;AAChE,IAAA,MAAM,OAAA,GAAUD,UAAS,IAAI,CAAA;AAC7B,IAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,EAAE,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,GAAE,GAAI,OAAA;AAC7E,IAAA,cAAA,CAAe,MAAA,EAAQF,SAAAA,CAAS,IAAI,CAAC,CAAA;AACrC,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,aAAA,CAAc,OAAO,EAAE,gBAAA,CAAiB,OAAA,EAAS,WAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAClF,EAAA,aAAA,CAAc,OAAO,CAAA,CAAE,gBAAA,CAAiB,UAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACtE,EAAA,cAAA,CAAe,OAAO,EAAE,gBAAA,CAAiB,OAAA,EAAS,WAAS,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AACnF,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,gBAAA,CAAiB,UAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AACzE;AAEA,SAAS,UAAU,MAAA,EAAsB;AACvC,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,MAAA,CAAO,IAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC1D,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC9E,EAAA,WAAA,CAAY,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D;AAEA,SAAS,QAAQ,MAAA,EAAsB;AACrC,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAA,CAAO,IAAA;AAC5B,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,MAAM;AACxC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,MAAA,MAAA,CAAO,MAAM,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,MAAA,EAAQ,MAAM,MAAA,CAAO,QAAQ,CAAA;AACzD;AAEA,SAAS,UAAU,MAAA,EAAsB;AACvC,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,MAAA,CAAO,IAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAkB,KAAA,CAAM,MAAA,CAA4B,KAAA;AAClE,EAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC1D,EAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC9E,EAAA,WAAA,CAAY,gBAAA,CAAiB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D;AAEA,SAAS,eAAe,MAAA,EAAsB;AAC5C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAA,CAAO,IAAA;AAC9B,EAAA,UAAA,EAAY,gBAAA,CAAiB,SAAS,YAAY;AAChD,IAAA,MAAM,UAAW,MAAA,CACd,UAAA;AACH,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,cAAc,MAAM,IAAI,SAAQ,CAAE,IAAA,IAAQ,OAAO,CAAA;AAC7D,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AACpB,QAAA,MAAA,CAAO,MAAM,CAAA;AAAA,MACf;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,MAAM,SAAA,GAAY,UAAU,MAAM,CAAA;AAClC,EAAA,IAAA,CAAK,SAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AACtE,EAAA,IAAA,CAAK,YAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC5E,EAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AAC/D,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,WAAA,CAAY,QAAQ,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,SAAA,CAAU,MAAM,CAAA;AAChB,EAAA,OAAA,CAAQ,MAAM,CAAA;AACd,EAAA,cAAA,CAAe,MAAM,CAAA;AACrB,EAAA,SAAA,CAAU,MAAM,CAAA;AAChB,EAAA,OAAO,SAAA;AACT;;;ACtHA,SAAS,aAAA,CAAc,QAAgB,KAAA,EAAwB;AAC7D,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM,GAAI,MAAA;AACnC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,YAAA,EAAc,KAAK,QAAQ,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,EAAQ,mBAAA,EAAqB,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,MAAA,EAAQ,gBAAA,EAAkB,IAAI,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,EAAS,gBAAA,EAAkB,IAAI,CAAA;AACnD,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,GAAA,GAAM,GAAA;AACf,EAAA,QAAA,CAAS,GAAA,GAAM,KAAA;AACf,EAAA,QAAA,CAAS,QAAA,GAAW,SAAA;AACpB,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,EAAU,mBAAA,EAAqB,IAAI,CAAA;AACrD,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,WAAA,GAAc,MAAA;AACrB,EAAA,MAAA,CAAO,KAAA,GAAQ,aAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAEhB,EAAA,IAAA,CAAK,iBAAiB,WAAA,EAAa,MAAM,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AAClE,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,GAAG,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,EAAU,aAAA,CAAc,KAAK,CAAA,EAAE;AAC/F,IAAA,aAAA,CAAc,MAAM,CAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,gBAAA,CAAiB,QAAA,EAAU,MAAM,eAAA,CAAgB,MAAM,CAAC,CAAA;AACjE,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,CAAA,KAAA,KAAS;AACxC,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,EAC1B,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,UAAU,MAAA,EAAO;AAC/C;AAEA,SAAS,YAAY,MAAA,EAAsB;AACzC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACxB,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,EAAQ;AAChD,IAAA,IAAA,CAAK,GAAA,EAAI,EAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,EAAQ;AAChD,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAM,KAAA,KAAU;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,KAAK,CAAA;AACtB,IAAA,GAAA,CAAI,KAAK,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvE,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAChC,IAAA,GAAA,CAAI,IAAI,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,EAAG,KAAA,CAAM,KAAK,KAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AACvG,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,GAAA,CAAI,QAAA,EAAU;AAC3C,MAAA,GAAA,CAAI,SAAS,KAAA,GAAQ,MAAA,CAAO,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,MAAM,MAAA,IAAU,SAAA;AAAA,EACvD,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,MAAA,EAAsB;AAC3C,EAAA,MAAA,CAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,aAAa,WAAA,CAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC1E;AAEO,SAAS,aAAa,MAAA,EAAsB;AACjD,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACxB,EAAA,IAAA,CAAK,SAAS,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,CAAM,IAAA,KAAS,OAAO,CAAC,CAAA;AAC1E,EAAA,IAAA,CAAK,YAAY,YAAA,CAAa,eAAA,EAAiB,OAAO,KAAA,CAAM,IAAA,KAAS,UAAU,CAAC,CAAA;AAChF,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,IAAA,KAAS,UAAA;AAErC,EAAA,MAAM,GAAA,GAAM,UAAU,MAAM,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,IAAA,CAAK,OAAO,KAAA,CAAM,UAAA,GAAa,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAC,CAAA,YAAA,CAAA;AACjD,EAAA,IAAA,CAAK,aAAa,KAAA,CAAM,IAAA,GAAO,GAAG,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA,CAAA,CAAA;AACnD,EAAA,IAAA,CAAK,YAAA,CAAa,MAAM,GAAA,GAAM,CAAA,EAAA,CAAI,IAAI,KAAA,CAAM,GAAA,CAAI,KAAK,GAAG,CAAA,CAAA,CAAA;AACxD,EAAA,IAAA,CAAK,QAAA,CAAS,MAAM,GAAA,GAAM,CAAA,EAAI,MAAM,GAAA,CAAI,CAAA,GAAI,MAAO,GAAG,CAAA,CAAA,CAAA;AAEtD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAA,CAAK,cAAc,OAAO,CAAA,CAAE,QAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AACvD,IAAA,SAAA,CAAU,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AACrC,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3D,MAAA,IAAA,CAAK,eAAe,OAAO,CAAA,CAAE,QAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,IAAI,GAAG,CAAA;AACpD,EAAA,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,MAAA,CAAO,OAAO,CAAA;AACtC,EAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AACzB,EAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,WAAA,EAAa;AAC/C,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,GAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,CAAC,KAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAC/C,EAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,CAAA,+BAAA,EAAkC,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,SAAS,MAAM,CAAA,yIAAA,CAAA;AAC3G,EAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,QAAA,EAAU;AAC5C,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,GAAA;AAAA,EACxB;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAC/D,IAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AACzB,IAAA,IAAI,QAAA,CAAS,aAAA,KAAkB,IAAA,CAAK,WAAA,EAAa;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,aAAA,CAAc,MAAM,CAAA;AACpB,IAAA,WAAA,CAAY,MAAM,CAAA;AAAA,EACpB;AACF;;;AClHA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBb,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,8BAAA,EAqCQ,WAAW,CAAA;;AAAA;AAAA,gCAAA,EAGT,WAAW,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;;;AC7DtC,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;;;ACAnB,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA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","file":"index.cjs","sourcesContent":["export function pointerUserY(svg: SVGSVGElement, event: PointerEvent): number {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return 0;\n }\n return new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse()).y;\n}\n\nexport function pointerAlongValueAxis(\n svg: SVGSVGElement,\n event: PointerEvent,\n horizontal: boolean | undefined,\n): number {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return 0;\n }\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return horizontal ? point.x : point.y;\n}\n","export function findConnectedLine(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"]`;\n return (\n [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(\n el => el.tagName.toLowerCase() === 'path' && !el.id.includes('chart-line-area-'),\n ) ?? null\n );\n}\n\nexport function findConnectedLineArea(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(el => el.id.includes('chart-line-area-')) ?? null;\n}\n\nexport function findSeriesPoints(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(series)}\"][data-sf-value-index]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)]\n .filter(el => el.tagName.toLowerCase() === 'ellipse')\n .sort((a, b) => Number(a.getAttribute('data-sf-value-index')) - Number(b.getAttribute('data-sf-value-index')));\n}\n","import type { ValueScale } from './types';\n\nexport function parseValueScale(element: Element | null): ValueScale | null {\n const raw = element?.getAttribute('data-sf-value-scale');\n if (!raw) {\n return null;\n }\n const parts = raw.split(',');\n const [plotY, plotHeight, min, max] = parts.map(Number);\n if ([plotY, plotHeight, min, max].some(value => !Number.isFinite(value))) {\n return null;\n }\n if (plotHeight <= 0 || max === min) {\n return null;\n }\n return parts[4] === 'horizontal'\n ? { horizontal: true, plotY, plotHeight, min, max }\n : { plotY, plotHeight, min, max };\n}\n\nexport function valueAtPixel(position: number, scale: ValueScale): number {\n const fraction = scale.horizontal\n ? (position - scale.plotY) / scale.plotHeight\n : (scale.plotY + scale.plotHeight - position) / scale.plotHeight;\n const value = scale.min + fraction * (scale.max - scale.min);\n return Math.min(Math.max(value, scale.min), scale.max);\n}\n\nexport function pixelForValue(value: number, scale: ValueScale): number {\n const fraction = (value - scale.min) / (scale.max - scale.min);\n return scale.horizontal\n ? scale.plotY + fraction * scale.plotHeight\n : scale.plotY + scale.plotHeight - fraction * scale.plotHeight;\n}\n","import { BAR_LABEL, barLabelSize, formatBarLabel, pillPath } from '../../../renderScene/charts/primitives/barLabel';\nimport { barShapePath, roundedBarPath } from '../../../renderScene/charts/primitives/barShape';\nimport { linePathData } from '../../../renderScene/charts/primitives/linePath';\nimport { findConnectedLine, findConnectedLineArea, findSeriesPoints } from './lineLookup';\nimport { pixelForValue } from './scale';\nimport type { ChartValueDragState } from './types';\n\nfunction updateConnectedLine(svg: SVGSVGElement, drag: ChartValueDragState): void {\n const points = findSeriesPoints(svg, drag.owner.id, drag.series).map(point => ({\n x: Number(point.getAttribute('cx')),\n y: Number(point.getAttribute('cy')),\n }));\n const line = findConnectedLine(svg, drag.owner.id, drag.series);\n if (line) {\n line.setAttribute('d', linePathData(points, drag.lineTension));\n }\n const area = findConnectedLineArea(svg, drag.owner.id, drag.series);\n if (area && points.length > 1) {\n const first = points[0];\n const last = points[points.length - 1];\n const d = `${linePathData(points, drag.lineTension)} L ${last.x} ${drag.baseY} L ${first.x} ${drag.baseY} Z`;\n area.setAttribute('d', d);\n }\n}\n\nfunction setBarPath(svg: SVGSVGElement, drag: ChartValueDragState, d: string): void {\n drag.element.setAttribute('d', d);\n for (const kind of ['glow', 'shadow']) {\n const copy = svg.querySelector(`[id=\"${drag.element.id.replace('chart-bar-', `chart-bar-${kind}-`)}\"]`);\n copy?.setAttribute('d', d);\n }\n}\n\nexport function updateChartValuePreview(svg: SVGSVGElement, drag: ChartValueDragState, value: number): void {\n if (drag.isBar && drag.scale.horizontal) {\n const width = Math.max(0, pixelForValue(value, drag.scale) - drag.barX);\n setBarPath(svg, drag, roundedBarPath(drag.barX, drag.barTop, width, drag.barHeight, drag.barRadius));\n return;\n }\n const y = pixelForValue(value, drag.scale);\n if (drag.isBar) {\n const top = Math.min(y, drag.baseY);\n const height = Math.max(0, Math.abs(drag.baseY - y));\n setBarPath(svg, drag, barShapePath(drag.barX, top, drag.barWidth, height, drag.barRadius));\n return;\n }\n drag.element.setAttribute('cy', String(y));\n updateConnectedLine(svg, drag);\n}\n\nexport interface BarOrigin {\n top: number;\n height: number;\n left: number;\n width: number;\n}\n\ninterface BarLabelElements {\n text: SVGTextElement;\n pill: SVGPathElement | null;\n placement: string;\n template: string;\n}\n\nfunction findBarLabel(svg: SVGSVGElement, drag: ChartValueDragState): BarLabelElements | null {\n const id = drag.element.id.replace('chart-bar-', 'chart-bar-label-');\n const text = svg.querySelector<SVGTextElement>(`[id=\"${id}\"]`);\n const [kind, placement, template] = (text?.getAttribute('data-sf-mark') ?? '').split('|');\n if (!text || kind !== 'bar-label') {\n return null;\n }\n return { text, pill: svg.querySelector<SVGPathElement>(`[id=\"${id}-pill\"]`), placement, template };\n}\n\nfunction labelShift(placement: string, origin: BarOrigin, top: number, height: number): number {\n if (placement === 'axis') {\n return 0;\n }\n return placement === 'center' ? top + height / 2 - (origin.top + origin.height / 2) : top - origin.top;\n}\n\nfunction resizePill(pill: SVGPathElement, text: SVGTextElement, label: string, dy: number): void {\n const fontSize = parseFloat(text.getAttribute('font-size') ?? '12');\n const size = barLabelSize(label, fontSize, true);\n const stored = pill.dataset.sfPillY ?? (pill.getAttribute('d') ?? '').split(/\\s+/)[2];\n pill.dataset.sfPillY = stored;\n const centerX = Number(text.getAttribute('x'));\n pill.setAttribute('d', pillPath(centerX - size.width / 2, Number(stored), size.width, size.height));\n pill.setAttribute('transform', `translate(0 ${dy})`);\n}\n\nfunction updateHorizontalBarLabel(\n label: BarLabelElements,\n drag: ChartValueDragState,\n origin: BarOrigin,\n value: number,\n): boolean {\n const content = formatBarLabel(value, label.template);\n (label.text.querySelector('tspan') ?? label.text).textContent = content;\n if (label.placement === 'axis') {\n return true;\n }\n const fontSize = parseFloat(label.text.getAttribute('font-size') ?? '12');\n const size = barLabelSize(content, fontSize, label.pill !== null);\n const width = Math.max(0, pixelForValue(value, drag.scale) - origin.left);\n const end = origin.left + width;\n const center =\n label.placement === 'outside'\n ? end + BAR_LABEL.gap + size.width / 2\n : label.placement === 'inside'\n ? end - BAR_LABEL.gap - size.width / 2\n : origin.left + width / 2;\n const stored = label.text.dataset.sfLabelX ?? label.text.getAttribute('x') ?? '0';\n label.text.dataset.sfLabelX = stored;\n label.text.setAttribute('transform', `translate(${center - Number(stored)} 0)`);\n if (label.pill) {\n const pillY = label.pill.dataset.sfPillY ?? (label.pill.getAttribute('d') ?? '').split(/\\s+/)[2];\n label.pill.dataset.sfPillY = pillY;\n label.pill.removeAttribute('transform');\n label.pill.setAttribute('d', pillPath(center - size.width / 2, Number(pillY), size.width, size.height));\n }\n return true;\n}\n\nexport function updateBarLabel(\n svg: SVGSVGElement,\n drag: ChartValueDragState,\n origin: BarOrigin,\n value: number,\n): boolean {\n const label = drag.isBar ? findBarLabel(svg, drag) : null;\n if (!label) {\n return false;\n }\n if (drag.scale.horizontal) {\n return updateHorizontalBarLabel(label, drag, origin, value);\n }\n const y = pixelForValue(value, drag.scale);\n const top = Math.min(y, drag.baseY);\n const height = Math.abs(drag.baseY - y);\n const dy = labelShift(label.placement, origin, top, height);\n const content = formatBarLabel(value, label.template);\n\n (label.text.querySelector('tspan') ?? label.text).textContent = content;\n label.text.setAttribute('transform', `translate(0 ${dy})`);\n if (label.pill) {\n resizePill(label.pill, label.text, content, dy);\n }\n return true;\n}\n","import { SVG_NAMESPACE } from '../../dom';\nimport { pixelForValue } from './scale';\nimport type { ChartValueDragState, ValueScale } from './types';\n\nconst FONT_SIZE = 11;\nconst PADDING_X = 7;\nconst HEIGHT = 18;\nconst GAP = 8;\nconst BACKGROUND = 'rgba(15, 23, 42, 0.9)';\n\nfunction element<K extends keyof SVGElementTagNameMap>(svg: SVGSVGElement, tag: K): SVGElementTagNameMap[K] {\n return svg.ownerDocument.createElementNS(SVG_NAMESPACE, tag) as SVGElementTagNameMap[K];\n}\n\nexport function createValueReadout(svg: SVGSVGElement): SVGGElement {\n const group = element(svg, 'g');\n group.setAttribute('data-sf-value-readout', '');\n group.setAttribute('pointer-events', 'none');\n\n const background = element(svg, 'rect');\n background.setAttribute('rx', '4');\n background.setAttribute('fill', BACKGROUND);\n group.appendChild(background);\n\n const label = element(svg, 'text');\n label.setAttribute('fill', '#ffffff');\n label.setAttribute('font-size', String(FONT_SIZE));\n label.setAttribute('font-family', 'Inter, system-ui, sans-serif');\n label.setAttribute('font-weight', '600');\n label.setAttribute('text-anchor', 'middle');\n label.setAttribute('dominant-baseline', 'central');\n group.appendChild(label);\n\n svg.appendChild(group);\n return group;\n}\n\nexport function markAnchorY(drag: ChartValueDragState): number {\n return drag.barTop + drag.barHeight / 2;\n}\n\nexport function markAnchorX(drag: ChartValueDragState): number {\n if (drag.isBar) {\n return drag.barX + drag.barWidth / 2;\n }\n const cx = Number(drag.element.getAttribute('cx'));\n return Number.isFinite(cx) ? cx : 0;\n}\n\nexport interface ReadoutAnchor {\n centerX: number;\n centerY?: number;\n scale: ValueScale;\n}\n\nexport function formatReadoutValue(value: number): string {\n return String(Math.round(value * 10) / 10);\n}\n\nfunction readoutWidth(scale: ValueScale): number {\n const magnitude = Math.max(Math.abs(scale.min), Math.abs(scale.max));\n const sign = scale.min < 0 ? 1 : 0;\n const chars = sign + formatReadoutValue(magnitude).length + 2;\n return Math.max(28, (chars * FONT_SIZE) / 1.7 + PADDING_X * 2);\n}\n\nexport function updateValueReadout(readout: SVGGElement, anchor: ReadoutAnchor, value: number): void {\n const text = readout.querySelector('text');\n const background = readout.querySelector('rect');\n if (!text || !background) {\n return;\n }\n\n text.textContent = formatReadoutValue(value);\n const width = readoutWidth(anchor.scale);\n\n if (anchor.scale.horizontal) {\n const markX = pixelForValue(value, anchor.scale);\n const plotEnd = anchor.scale.plotY + anchor.scale.plotHeight;\n const left = markX + GAP + width <= plotEnd ? markX + GAP : markX - GAP - width;\n const centerY = anchor.centerY ?? 0;\n background.setAttribute('x', String(left));\n background.setAttribute('y', String(centerY - HEIGHT / 2));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(left + width / 2));\n text.setAttribute('y', String(centerY));\n return;\n }\n\n const markY = pixelForValue(value, anchor.scale);\n const above = markY - GAP - HEIGHT >= anchor.scale.plotY;\n const top = above ? markY - GAP - HEIGHT : markY + GAP;\n const centerX = anchor.centerX;\n\n background.setAttribute('x', String(centerX - width / 2));\n background.setAttribute('y', String(top));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(centerX));\n text.setAttribute('y', String(top + HEIGHT / 2));\n}\n\nexport function removeValueReadout(readout: SVGGElement | null): void {\n readout?.remove();\n}\n","import { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport { findConnectedLine } from './lineLookup';\nimport { parseValueScale } from './scale';\nimport type { ChartValueDragState, ValueScale } from './types';\n\ntype ChartValueTarget = Pick<ChartValueDragState, 'owner' | 'series' | 'index'>;\n\ntype ChartValueGeometry = Pick<\n ChartValueDragState,\n 'element' | 'baseY' | 'isBar' | 'barX' | 'barWidth' | 'barTop' | 'barHeight' | 'barRadius' | 'lineTension'\n>;\n\nfunction chartGeometry(svg: SVGSVGElement, target: ChartValueTarget): SVGGraphicsElement | null {\n const selector =\n `[data-sf-id=\"${CSS.escape(target.owner.id)}\"]` +\n `[data-sf-series=\"${CSS.escape(target.series)}\"]` +\n `[data-sf-value-index=\"${target.index}\"]`;\n return (\n [...svg.querySelectorAll<SVGGraphicsElement>(selector)].find(element => {\n const tag = element.tagName.toLowerCase();\n return tag === 'rect' || tag === 'ellipse' || tag === 'path';\n }) ?? null\n );\n}\n\nexport function resolveChartValueDrag(svg: SVGSVGElement, event: PointerEvent): ChartValueDragState | null {\n if (!isChartValuePointer(event)) {\n return null;\n }\n const mark = findChartValueMark(event);\n if (!mark) {\n return null;\n }\n const target = readChartValueTarget(mark);\n if (!target) {\n return null;\n }\n const scale = parseValueScale(findOwnerNode(svg, target.owner.id, isPrimary));\n const geometry = scale ? resolveChartValueGeometry(svg, target, scale) : null;\n if (!scale || !geometry) {\n return null;\n }\n mark.setPointerCapture?.(event.pointerId);\n return createChartValueDragState(target, scale, geometry, event.pointerId);\n}\n\nfunction createChartValueDragState(\n target: ChartValueTarget,\n scale: ValueScale,\n geometry: ChartValueGeometry,\n pointerId: number,\n): ChartValueDragState {\n return {\n owner: target.owner,\n series: target.series,\n index: target.index,\n scale,\n ...geometry,\n pointerId,\n moved: false,\n };\n}\n\nfunction isChartValuePointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findChartValueMark(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-value-index]') as SVGGraphicsElement | null;\n}\n\nfunction readChartValueTarget(mark: SVGGraphicsElement): ChartValueTarget | null {\n const owner = resolveOwner(mark);\n if (owner?.role !== 'chart') {\n return null;\n }\n const series = mark.getAttribute('data-sf-series');\n const index = Number(mark.getAttribute('data-sf-value-index'));\n if (!series || !Number.isInteger(index)) {\n return null;\n }\n return { owner, series, index };\n}\n\nfunction resolveChartValueGeometry(\n svg: SVGSVGElement,\n target: ChartValueTarget,\n scale: ValueScale,\n): ChartValueGeometry | null {\n const element = chartGeometry(svg, target);\n if (!element) {\n return null;\n }\n const isBar = element.getAttribute('data-sf-mark') === 'bar';\n const bbox = isBar ? element.getBBox() : null;\n const baseY = bbox ? bbox.y + bbox.height : scale.plotY + scale.plotHeight;\n if (!Number.isFinite(baseY)) {\n return null;\n }\n if (bbox && scale.horizontal && Math.abs(bbox.x - scale.plotY) > 1) {\n return null;\n }\n const line = isBar ? null : findConnectedLine(svg, target.owner.id, target.series);\n return {\n element,\n baseY,\n isBar,\n barX: bbox?.x ?? 0,\n barWidth: bbox?.width ?? 0,\n barTop: bbox?.y ?? 0,\n barHeight: bbox?.height ?? 0,\n barRadius: isBar ? Number(element.getAttribute('data-sf-bar-radius')) || 0 : 0,\n lineTension: Number(line?.getAttribute('data-sf-line-tension')) || 0,\n };\n}\n","import type { Emitter } from '../events';\nimport { pointerAlongValueAxis } from './coordinates';\nimport { type BarOrigin, updateBarLabel, updateChartValuePreview } from './preview';\nimport { createValueReadout, markAnchorX, markAnchorY, removeValueReadout, updateValueReadout } from './readout';\nimport { valueAtPixel } from './scale';\nimport { resolveChartValueDrag } from './target';\nimport type { ChartValueDragState } from './types';\n\nexport class ChartValueDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: ChartValueDragState | null = null;\n #readout: SVGGElement | null = null;\n #origin: BarOrigin | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n #endPreview(drag: ChartValueDragState): void {\n if (drag.moved) {\n this.#emitter.emit('chartValuePreview', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value: null,\n });\n }\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveChartValueDrag(this.#svg, event);\n if (this.#drag?.isBar) {\n const box = this.#drag.element.getBBox();\n this.#origin = { top: box.y, height: box.height, left: box.x, width: box.width };\n }\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n this.#drag.moved = true;\n const value = valueAtPixel(pointerAlongValueAxis(this.#svg, event, this.#drag.scale.horizontal), this.#drag.scale);\n updateChartValuePreview(this.#svg, this.#drag, value);\n\n this.#emitter.emit('chartValuePreview', {\n owner: this.#drag.owner,\n series: this.#drag.series,\n index: this.#drag.index,\n value,\n });\n\n if (this.#origin && updateBarLabel(this.#svg, this.#drag, this.#origin, value)) {\n return;\n }\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n updateValueReadout(\n this.#readout,\n { centerX: markAnchorX(this.#drag), centerY: markAnchorY(this.#drag), scale: this.#drag.scale },\n value,\n );\n }\n\n cancel(): void {\n if (this.#drag) {\n this.#endPreview(this.#drag);\n }\n this.#drag = null;\n this.#origin = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n this.#origin = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n this.#emitter.emit('chartValueChange', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value: valueAtPixel(pointerAlongValueAxis(this.#svg, event, drag.scale.horizontal), drag.scale),\n });\n this.#endPreview(drag);\n }\n}\n","import type { Viewer } from '../viewer';\nimport { ChartValueDragSession } from './chartValue/session';\nimport type { Emitter } from './events';\n\nexport interface ChartValueDragHandle {\n destroy(): void;\n}\n\nexport function bindChartValueDrag(viewer: Viewer, emitter: Emitter): ChartValueDragHandle {\n const session = new ChartValueDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import {\n rgbToHex as modelHex,\n hsvToRgb as modelHsvToRgb,\n rgbToHsv as modelRgbToHsv,\n parseHexRgb,\n} from '../../../model/color';\n\nexport interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface Hsv {\n h: number;\n s: number;\n v: number;\n}\n\nexport function normalizeHex(value: string): string | null {\n const channels = parseHexRgb(value);\n return channels && modelHex(...channels);\n}\n\nconst COLOR_FUNCTION =\n /^rgba?\\(\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*(?:[,/]\\s*(\\d*\\.?\\d+)(%?)\\s*)?\\)$/i;\nconst HEX_WITH_ALPHA = /^#([0-9a-f]{6})([0-9a-f]{2})$/i;\n\nexport interface ColorAlpha {\n hex: string;\n alpha: number;\n}\n\nexport function parseColorAlpha(value: string): ColorAlpha | null {\n const raw = value.trim();\n const fn = COLOR_FUNCTION.exec(raw);\n if (fn) {\n const alpha = fn[4] === undefined ? 1 : Number(fn[4]) / (fn[5] ? 100 : 1);\n return {\n hex: rgbToHex({ r: Number(fn[1]), g: Number(fn[2]), b: Number(fn[3]) }),\n alpha: Math.max(0, Math.min(1, alpha)),\n };\n }\n const eight = HEX_WITH_ALPHA.exec(raw);\n if (eight) {\n return { hex: `#${eight[1].toLowerCase()}`, alpha: Number.parseInt(eight[2], 16) / 255 };\n }\n const hex = normalizeHex(raw);\n return hex ? { hex, alpha: 1 } : null;\n}\n\nexport function formatColorAlpha(hex: string, alpha: number): string {\n const clamped = Math.max(0, Math.min(1, alpha));\n if (clamped >= 1) {\n return hex;\n }\n const { r, g, b } = hexToRgb(hex);\n return `rgba(${r}, ${g}, ${b}, ${Math.round(clamped * 100) / 100})`;\n}\n\nexport function hexOf(value: string): string {\n return parseColorAlpha(value)?.hex ?? '#000000';\n}\n\nexport function alphaOf(value: string): number {\n return parseColorAlpha(value)?.alpha ?? 1;\n}\n\nexport function isHexColor(value: string): boolean {\n return normalizeHex(value) !== null;\n}\n\nexport function clampChannel(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nexport function hexToRgb(hex: string): Rgb {\n const [r, g, b] = parseHexRgb(hex) ?? [0, 0, 0];\n return { r, g, b };\n}\n\nexport function rgbToHex(rgb: Rgb): string {\n return modelHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));\n}\n\n// The picker may be given a hue that has turned around or a part that is out of its range, which the conversion of the model does not take.\nexport function hsvToRgb(hsv: Hsv): Rgb {\n const { r, g, b } = modelHsvToRgb(\n ((hsv.h % 360) + 360) % 360,\n Math.max(0, Math.min(1, hsv.s)),\n Math.max(0, Math.min(1, hsv.v)),\n );\n return { r, g, b };\n}\n\nexport function rgbToHsv(rgb: Rgb): Hsv {\n return modelRgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));\n}\n\nexport function hexToHsv(hex: string): Hsv {\n return rgbToHsv(hexToRgb(hex));\n}\n\nexport function hsvToHex(hsv: Hsv): string {\n return rgbToHex(hsvToRgb(hsv));\n}\n","import { formatColorAlpha, parseColorAlpha } from './color';\n\nexport interface GradientStopValue {\n color: string;\n position: number;\n}\n\nexport interface GradientValue {\n angle: number;\n stops: GradientStopValue[];\n}\n\nexport const DEFAULT_GRADIENT_ANGLE = 90;\n\nconst GRADIENT = /^gradient\\(\\s*(-?[\\d.]+)\\s*,\\s*(.+)\\)\\s*$/i;\nconst STOP = /(rgba?\\([^)]*\\)|#[0-9a-f]{3}(?:[0-9a-f]{3})?)\\s+(-?[\\d.]+)%/gi;\n\nfunction trim(value: number): number {\n return Number(value.toFixed(1));\n}\n\nexport function clampPosition(value: number): number {\n return Math.max(0, Math.min(100, value));\n}\n\nexport function sortStops(stops: readonly GradientStopValue[]): GradientStopValue[] {\n return [...stops].sort((a, b) => a.position - b.position);\n}\n\nexport function parseGradient(source: string): GradientValue | null {\n const match = source.trim().match(GRADIENT);\n if (!match) {\n return null;\n }\n const angle = Number(match[1]);\n if (!Number.isFinite(angle)) {\n return null;\n }\n const stops: GradientStopValue[] = [];\n for (const stop of match[2].matchAll(STOP)) {\n const parsed = parseColorAlpha(stop[1]);\n const position = Number(stop[2]);\n if (parsed && Number.isFinite(position)) {\n stops.push({ color: formatColorAlpha(parsed.hex, parsed.alpha), position: clampPosition(position) });\n }\n }\n return stops.length >= 2 ? { angle, stops } : null;\n}\n\nexport function formatGradient(value: GradientValue): string {\n const stops = sortStops(value.stops)\n .map(stop => `${stop.color} ${trim(clampPosition(stop.position))}%`)\n .join(', ');\n return `gradient(${trim(value.angle)}, ${stops})`;\n}\n\nexport function gradientCss(value: GradientValue): string {\n const stops = sortStops(value.stops)\n .map(stop => `${stop.color} ${clampPosition(stop.position)}%`)\n .join(', ');\n return `linear-gradient(${trim(value.angle + 90)}deg, ${stops})`;\n}\n","import { formatColorAlpha, parseColorAlpha } from './color';\nimport { clampPosition, DEFAULT_GRADIENT_ANGLE, type GradientStopValue, type GradientValue } from './gradientValue';\n\nfunction readAngle(def: Element): number {\n const coordinates = ['x1', 'y1', 'x2', 'y2'].map(name => Number.parseFloat(def.getAttribute(name) ?? ''));\n if (!coordinates.every(Number.isFinite)) {\n return DEFAULT_GRADIENT_ANGLE;\n }\n const [x1, y1, x2, y2] = coordinates;\n const angle = (Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI;\n return Number(angle.toFixed(1));\n}\n\nexport function readGradientValue(svg: SVGSVGElement, fill: string | null): GradientValue | null {\n const id = fill?.match(/^url\\(#([^)]+)\\)$/)?.[1];\n if (!id) {\n return null;\n }\n const def = svg.querySelector(`[id=\"${CSS.escape(id)}\"]`);\n if (def?.tagName.toLowerCase() !== 'lineargradient') {\n return null;\n }\n\n const stops: GradientStopValue[] = [];\n for (const stop of def.querySelectorAll('stop')) {\n const parsed = parseColorAlpha(stop.getAttribute('stop-color') ?? '');\n const offset = Number.parseFloat(stop.getAttribute('offset') ?? '');\n if (parsed && Number.isFinite(offset)) {\n stops.push({ color: formatColorAlpha(parsed.hex, parsed.alpha), position: clampPosition(offset) });\n }\n }\n if (stops.length < 2) {\n return null;\n }\n return { angle: readAngle(def), stops };\n}\n","import { alphaOf, formatColorAlpha, hexOf, hexToHsv, hsvToHex, parseColorAlpha } from './color';\nimport {\n DEFAULT_GRADIENT_ANGLE,\n formatGradient,\n type GradientValue,\n gradientCss,\n parseGradient,\n sortStops,\n} from './gradientValue';\n\nexport const FALLBACK_COLOR = '#888888';\n\nexport type PickerValue =\n | { mode: 'solid'; color: string; alpha?: number }\n | { mode: 'gradient'; angle: number; stops: GradientValue['stops'] };\n\nexport function seedFrom(fill: string | null, gradient: GradientValue | null): PickerValue {\n if (gradient) {\n return { mode: 'gradient', angle: gradient.angle, stops: sortStops(gradient.stops) };\n }\n const parsed = fill ? parseGradient(fill) : null;\n if (parsed) {\n return { mode: 'gradient', angle: parsed.angle, stops: sortStops(parsed.stops) };\n }\n const solid = fill ? parseColorAlpha(fill) : null;\n return { mode: 'solid', color: solid?.hex ?? FALLBACK_COLOR, alpha: solid?.alpha ?? 1 };\n}\n\nexport function formatPickerValue(value: PickerValue): string {\n return value.mode === 'solid'\n ? formatColorAlpha(value.color, value.alpha ?? 1)\n : formatGradient({ angle: value.angle, stops: value.stops });\n}\n\nexport function cssBackground(color: string): string {\n const gradient = parseGradient(color);\n return gradient ? gradientCss(gradient) : color;\n}\n\nexport function toAlpha(value: PickerValue): number {\n return value.mode === 'solid' ? (value.alpha ?? 1) : alphaOf(sortStops(value.stops)[0]?.color ?? FALLBACK_COLOR);\n}\n\nexport function toSolid(value: PickerValue): string {\n return value.mode === 'solid' ? value.color : hexOf(sortStops(value.stops)[0]?.color ?? FALLBACK_COLOR);\n}\n\nexport function darken(hex: string): string {\n const hsv = hexToHsv(hex);\n return hsvToHex({ ...hsv, v: Math.max(0, hsv.v * 0.55) });\n}\n\nexport function toGradient(value: PickerValue): GradientValue {\n if (value.mode === 'gradient') {\n return { angle: value.angle, stops: sortStops(value.stops) };\n }\n return {\n angle: DEFAULT_GRADIENT_ANGLE,\n stops: [\n { color: formatColorAlpha(value.color, value.alpha ?? 1), position: 0 },\n { color: formatColorAlpha(darken(value.color), value.alpha ?? 1), position: 100 },\n ],\n };\n}\n","import { alphaOf, formatColorAlpha, type Hsv, hexOf, hexToHsv, hsvToHex } from './color';\nimport { clampPosition, type GradientValue, sortStops } from './gradientValue';\nimport type { PickerView } from './popoverView';\nimport { darken, formatPickerValue, type PickerValue, toAlpha, toGradient, toSolid } from './value';\n\nconst MIN_STOPS = 2;\nconst MAX_STOPS = 8;\n\nexport interface PickerState {\n mode: PickerValue['mode'];\n solid: string;\n alpha: number;\n gradient: GradientValue;\n selected: number;\n hsv: Hsv;\n}\n\nexport interface Picker {\n view: PickerView;\n state: PickerState;\n lockStops: boolean;\n onCommit(value: string): void;\n render(): void;\n}\n\nexport function activeColor(picker: Picker): string {\n const { state } = picker;\n return state.mode === 'solid' ? state.solid : (state.gradient.stops[state.selected]?.color ?? state.solid);\n}\n\nexport function activeHex(picker: Picker): string {\n return hexOf(activeColor(picker));\n}\n\nexport function activeAlpha(picker: Picker): number {\n return picker.state.mode === 'solid' ? picker.state.alpha : alphaOf(activeColor(picker));\n}\n\nfunction setActiveColorAlpha(picker: Picker, hex: string, alpha: number): void {\n const { state } = picker;\n if (state.mode === 'solid') {\n state.solid = hex;\n state.alpha = alpha;\n } else if (state.gradient.stops[state.selected]) {\n state.gradient.stops[state.selected] = {\n ...state.gradient.stops[state.selected],\n color: formatColorAlpha(hex, alpha),\n };\n }\n}\n\nexport function setActiveColor(picker: Picker, hex: string): void {\n setActiveColorAlpha(picker, hex, activeAlpha(picker));\n}\n\nfunction currentValue(picker: Picker): PickerValue {\n const { state } = picker;\n return state.mode === 'solid'\n ? { mode: 'solid', color: state.solid, alpha: state.alpha }\n : { mode: 'gradient', ...state.gradient };\n}\n\nexport function commit(picker: Picker): void {\n picker.onCommit(formatPickerValue(currentValue(picker)));\n}\n\nexport function applyHsv(picker: Picker, next: Hsv): void {\n picker.state.hsv = next;\n setActiveColor(picker, hsvToHex(next));\n picker.render();\n}\n\nexport function applyHex(picker: Picker, hex: string): void {\n picker.state.hsv = hexToHsv(hex);\n setActiveColor(picker, hex);\n picker.render();\n}\n\nexport function applyAlpha(picker: Picker, raw: string): void {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n setActiveColorAlpha(picker, activeHex(picker), Math.max(0, Math.min(100, value)) / 100);\n picker.render();\n}\n\nexport function applyAngle(picker: Picker, raw: string): void {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n picker.state.gradient = { ...picker.state.gradient, angle: Math.max(0, Math.min(360, value)) };\n picker.render();\n}\n\nexport function selectStop(picker: Picker, index: number): void {\n const { state } = picker;\n if (state.mode !== 'gradient' || index === state.selected || !state.gradient.stops[index]) {\n return;\n }\n state.selected = index;\n state.hsv = hexToHsv(hexOf(state.gradient.stops[index].color));\n picker.render();\n}\n\nexport function removeStop(picker: Picker, index: number): void {\n const { state } = picker;\n if (state.gradient.stops.length <= MIN_STOPS) {\n return;\n }\n state.gradient = { ...state.gradient, stops: state.gradient.stops.filter((_stop, at) => at !== index) };\n state.selected = Math.min(state.selected, state.gradient.stops.length - 1);\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function appendStop(picker: Picker): void {\n const { state } = picker;\n if (state.gradient.stops.length >= MAX_STOPS) {\n return;\n }\n const sorted = sortStops(state.gradient.stops);\n const last = sorted[sorted.length - 1];\n const previous = sorted[sorted.length - 2];\n const inserted = {\n color: formatColorAlpha(darken(hexOf(last.color)), alphaOf(last.color)),\n position: clampPosition((last.position + (previous?.position ?? 0)) / 2),\n };\n state.gradient = { ...state.gradient, stops: sortStops([...state.gradient.stops, inserted]) };\n state.selected = state.gradient.stops.indexOf(inserted);\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function setMode(picker: Picker, next: PickerValue['mode']): void {\n const { state } = picker;\n if (state.mode === next) {\n return;\n }\n const value = currentValue(picker);\n state.mode = next;\n if (next === 'gradient') {\n state.gradient = toGradient(value);\n state.selected = 0;\n } else {\n state.solid = toSolid(value);\n state.alpha = toAlpha(value);\n }\n state.hsv = hexToHsv(activeHex(picker));\n picker.render();\n commit(picker);\n}\n\nexport function commitStopOrder(picker: Picker): void {\n const { state } = picker;\n state.gradient = { ...state.gradient, stops: sortStops(state.gradient.stops) };\n state.selected = Math.min(state.selected, state.gradient.stops.length - 1);\n picker.render();\n commit(picker);\n}\n\nexport { MIN_STOPS };\n","export function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n parent?: HTMLElement,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n parent?.appendChild(node);\n return node;\n}\n\nexport function tabButton(label: string, parent: HTMLElement): HTMLButtonElement {\n const button = el('button', 'sf-cp-tab', parent);\n button.type = 'button';\n button.setAttribute('role', 'tab');\n button.textContent = label;\n return button;\n}\n\nexport function numberField(parent: HTMLElement, min: number, max: number): HTMLInputElement {\n const input = el('input', 'sf-cp-number', parent);\n input.type = 'number';\n input.min = String(min);\n input.max = String(max);\n return input;\n}\n\nexport interface FluidField {\n row: HTMLDivElement;\n range: HTMLInputElement;\n number: HTMLInputElement;\n}\n\nexport function fluidField(parent: HTMLElement, text: string, min: number, max: number): FluidField {\n const row = el('div', 'sf-cp-fluid', parent);\n el('span', 'sf-cp-fluid-fill', row);\n el('span', 'sf-cp-fluid-thumb', row);\n el('span', 'sf-cp-fluid-label', row).textContent = text;\n const range = el('input', 'sf-cp-fluid-range', row);\n range.type = 'range';\n range.min = String(min);\n range.max = String(max);\n const number = numberField(row, min, max);\n number.classList.add('sf-cp-fluid-number');\n return { row, range, number };\n}\n\nexport function showRatio(range: HTMLInputElement): void {\n const span = Number(range.max) - Number(range.min);\n const ratio = span > 0 ? (Number(range.value) - Number(range.min)) / span : 0;\n range.parentElement?.style.setProperty('--sf-ratio', String(Math.max(0, Math.min(1, ratio))));\n}\n\nexport function labelledRow(parent: HTMLElement, text: string): HTMLDivElement {\n const row = el('div', 'sf-cp-row', parent);\n el('span', 'sf-cp-label', row).textContent = text;\n return row;\n}\n\nexport function ratio(value: number, size: number): number {\n return size > 0 ? Math.max(0, Math.min(1, value / size)) : 0;\n}\n\nexport function trackDrag(node: HTMLElement, onMove: (event: MouseEvent) => void, onEnd: () => void): () => void {\n const move = (event: MouseEvent) => onMove(event);\n const up = () => {\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', up);\n onEnd();\n };\n const down = (event: MouseEvent) => {\n event.preventDefault();\n onMove(event);\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', up);\n };\n node.addEventListener('mousedown', down);\n return () => {\n node.removeEventListener('mousedown', down);\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', up);\n };\n}\n","import { el, fluidField, labelledRow, tabButton } from './popoverDom';\nimport type { ColorPickerTheme } from './theme';\n\nexport const CHANNELS = ['r', 'g', 'b'] as const;\n\nexport type Channel = (typeof CHANNELS)[number];\n\nconst GAP_BELOW_ANCHOR = 6;\nconst VIEWPORT_MARGIN = 8;\n\nexport interface Anchor {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface StopRow {\n root: HTMLDivElement;\n swatch: HTMLSpanElement;\n hex: HTMLSpanElement;\n position: HTMLInputElement;\n remove: HTMLButtonElement;\n}\n\nexport interface PickerView {\n root: HTMLDivElement;\n solidTab: HTMLButtonElement;\n gradientTab: HTMLButtonElement;\n matrix: HTMLDivElement;\n matrixCursor: HTMLDivElement;\n hue: HTMLDivElement;\n hueThumb: HTMLDivElement;\n channelRanges: Record<Channel, HTMLInputElement>;\n channelNumbers: Record<Channel, HTMLInputElement>;\n alphaRow: HTMLDivElement;\n alphaRange: HTMLInputElement;\n alphaNumber: HTMLInputElement;\n hexInput: HTMLInputElement;\n eyedropper?: HTMLButtonElement;\n section: HTMLDivElement;\n preview: HTMLDivElement;\n angleRange: HTMLInputElement;\n angleNumber: HTMLInputElement;\n addStop: HTMLButtonElement;\n stopList: HTMLDivElement;\n stopRows: StopRow[];\n resetButton?: HTMLButtonElement;\n}\n\nexport interface ViewOptions {\n anchor: Anchor;\n theme?: ColorPickerTheme;\n allowGradient: boolean;\n lockStops: boolean;\n withReset: boolean;\n}\n\ntype SolidControls = Pick<\n PickerView,\n | 'matrix'\n | 'matrixCursor'\n | 'hue'\n | 'hueThumb'\n | 'channelRanges'\n | 'channelNumbers'\n | 'alphaRow'\n | 'alphaRange'\n | 'alphaNumber'\n | 'hexInput'\n | 'eyedropper'\n>;\n\ntype GradientControls = Pick<PickerView, 'section' | 'preview' | 'angleRange' | 'angleNumber' | 'addStop' | 'stopList'>;\n\n// The pipette takes a color from anywhere on the screen. Only some browsers can do that, the others do not show it.\nfunction buildEyedropper(parent: HTMLElement): HTMLButtonElement {\n const button = el('button', 'sf-cp-eyedropper', parent);\n button.type = 'button';\n button.title = 'Pick a color from the screen';\n button.setAttribute('aria-label', 'Pick a color from the screen');\n button.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 22l1-1h3l9-9\"/><path d=\"M3 21v-3l9-9\"/><path d=\"M15 6l3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4z\"/></svg>';\n return button;\n}\n\nfunction buildSolidControls(root: HTMLElement): SolidControls {\n const area = el('div', 'sf-cp-area', root);\n const matrix = el('div', 'sf-cp-matrix', area);\n el('div', 'sf-cp-matrix-white', matrix);\n el('div', 'sf-cp-matrix-black', matrix);\n const matrixCursor = el('div', 'sf-cp-matrix-cursor', matrix);\n const hue = el('div', 'sf-cp-hue', area);\n const hueThumb = el('div', 'sf-cp-hue-thumb', hue);\n\n const rows = el('div', 'sf-cp-rows', root);\n const channelRanges = {} as Record<Channel, HTMLInputElement>;\n const channelNumbers = {} as Record<Channel, HTMLInputElement>;\n for (const channel of CHANNELS) {\n const field = fluidField(rows, channel.toUpperCase(), 0, 255);\n channelRanges[channel] = field.range;\n channelNumbers[channel] = field.number;\n }\n const alpha = fluidField(rows, 'A', 0, 100);\n alpha.row.classList.add('sf-cp-fluid--alpha');\n const { row: alphaRow, range: alphaRange, number: alphaNumber } = alpha;\n const hexRow = labelledRow(rows, 'Hex');\n const hexInput = el('input', 'sf-cp-text', hexRow);\n hexInput.type = 'text';\n hexInput.spellcheck = false;\n const eyedropper = 'EyeDropper' in window ? buildEyedropper(hexRow) : undefined;\n return {\n matrix,\n matrixCursor,\n hue,\n hueThumb,\n channelRanges,\n channelNumbers,\n alphaRow,\n alphaRange,\n alphaNumber,\n hexInput,\n eyedropper,\n };\n}\n\nfunction buildGradientControls(root: HTMLElement, lockStops: boolean): GradientControls {\n const section = el('div', 'sf-cp-section', root);\n const preview = el('div', 'sf-cp-preview', section);\n const angle = fluidField(section, 'Angle', 0, 360);\n angle.row.hidden = lockStops;\n const { range: angleRange, number: angleNumber } = angle;\n const head = el('div', 'sf-cp-section-head', section);\n el('span', 'sf-cp-heading', head).textContent = 'Stops';\n const addStop = el('button', 'sf-cp-icon-btn', head);\n addStop.type = 'button';\n addStop.textContent = '+';\n addStop.title = 'Add stop';\n addStop.hidden = lockStops;\n const stopList = el('div', 'sf-cp-stops', section);\n return { section, preview, angleRange, angleNumber, addStop, stopList };\n}\n\nexport function buildPickerView(options: ViewOptions): PickerView {\n const { anchor, allowGradient, lockStops } = options;\n const root = el('div', 'sf-cp');\n root.dataset.sfTheme = options.theme ?? 'auto';\n root.style.left = `${anchor.left}px`;\n root.style.top = `${anchor.top + anchor.height + GAP_BELOW_ANCHOR}px`;\n\n const tabs = el('div', 'sf-cp-tabs', root);\n tabs.setAttribute('role', 'tablist');\n tabs.hidden = !allowGradient;\n const solidTab = tabButton('Solid', tabs);\n const gradientTab = tabButton('Gradient', tabs);\n\n const solid = buildSolidControls(root);\n const gradient = buildGradientControls(root, lockStops);\n\n let resetButton: HTMLButtonElement | undefined;\n if (options.withReset) {\n resetButton = el('button', 'sf-cp-reset', root);\n resetButton.type = 'button';\n resetButton.textContent = 'Use series color';\n }\n\n return { root, solidTab, gradientTab, ...solid, ...gradient, stopRows: [], resetButton };\n}\n\nexport function clampIntoViewport(root: HTMLElement, anchor: Anchor): void {\n const rect = root.getBoundingClientRect();\n if (rect.height === 0 && rect.width === 0) {\n return;\n }\n const maxTop = window.innerHeight - rect.height - VIEWPORT_MARGIN;\n if (rect.top > maxTop) {\n const above = anchor.top - rect.height - GAP_BELOW_ANCHOR;\n root.style.top = `${Math.max(VIEWPORT_MARGIN, above)}px`;\n }\n const maxLeft = window.innerWidth - rect.width - VIEWPORT_MARGIN;\n if (rect.left > maxLeft) {\n root.style.left = `${Math.max(VIEWPORT_MARGIN, maxLeft)}px`;\n }\n}\n","import { hexToRgb, normalizeHex, rgbToHex, rgbToHsv } from './color';\nimport {\n activeHex,\n appendStop,\n applyAlpha,\n applyAngle,\n applyHex,\n applyHsv,\n commit,\n type Picker,\n setActiveColor,\n setMode,\n} from './popoverActions';\nimport { ratio, trackDrag } from './popoverDom';\nimport { CHANNELS, type Channel } from './popoverView';\n\nfunction bindAreas(picker: Picker): Array<() => void> {\n const { matrix, hue } = picker.view;\n const done = () => commit(picker);\n return [\n trackDrag(\n matrix,\n event => {\n const rect = matrix.getBoundingClientRect();\n applyHsv(picker, {\n h: picker.state.hsv.h,\n s: ratio(event.clientX - rect.left, rect.width),\n v: 1 - ratio(event.clientY - rect.top, rect.height),\n });\n },\n done,\n ),\n trackDrag(\n hue,\n event => {\n const rect = hue.getBoundingClientRect();\n applyHsv(picker, { ...picker.state.hsv, h: ratio(event.clientY - rect.top, rect.height) * 360 });\n },\n done,\n ),\n ];\n}\n\nfunction bindChannel(picker: Picker, channel: Channel): void {\n const { channelRanges, channelNumbers } = picker.view;\n const fromChannel = (raw: string) => {\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n return;\n }\n const next = { ...hexToRgb(activeHex(picker)), [channel]: value };\n const nextHsv = rgbToHsv(next);\n picker.state.hsv = nextHsv.s === 0 ? { ...nextHsv, h: picker.state.hsv.h } : nextHsv;\n setActiveColor(picker, rgbToHex(next));\n picker.render();\n };\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n channelRanges[channel].addEventListener('input', event => fromChannel(read(event)));\n channelRanges[channel].addEventListener('change', () => commit(picker));\n channelNumbers[channel].addEventListener('input', event => fromChannel(read(event)));\n channelNumbers[channel].addEventListener('change', () => commit(picker));\n}\n\nfunction bindAlpha(picker: Picker): void {\n const { alphaRange, alphaNumber } = picker.view;\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n alphaRange.addEventListener('input', event => applyAlpha(picker, read(event)));\n alphaRange.addEventListener('change', () => commit(picker));\n alphaNumber.addEventListener('input', event => applyAlpha(picker, read(event)));\n alphaNumber.addEventListener('change', () => commit(picker));\n}\n\nfunction bindHex(picker: Picker): void {\n const { hexInput } = picker.view;\n hexInput.addEventListener('input', () => {\n const hex = normalizeHex(hexInput.value);\n if (hex) {\n applyHex(picker, hex);\n }\n });\n hexInput.addEventListener('change', () => {\n const hex = normalizeHex(hexInput.value);\n if (hex) {\n applyHex(picker, hex);\n commit(picker);\n } else {\n picker.render();\n }\n });\n hexInput.addEventListener('blur', () => picker.render());\n}\n\nfunction bindAngle(picker: Picker): void {\n const { angleRange, angleNumber } = picker.view;\n const read = (event: Event) => (event.target as HTMLInputElement).value;\n angleRange.addEventListener('input', event => applyAngle(picker, read(event)));\n angleRange.addEventListener('change', () => commit(picker));\n angleNumber.addEventListener('input', event => applyAngle(picker, read(event)));\n angleNumber.addEventListener('change', () => commit(picker));\n}\n\nfunction bindEyedropper(picker: Picker): void {\n const { eyedropper } = picker.view;\n eyedropper?.addEventListener('click', async () => {\n const Dropper = (window as unknown as { EyeDropper: new () => { open(): Promise<{ sRGBHex: string }> } })\n .EyeDropper;\n try {\n const hex = normalizeHex((await new Dropper().open()).sRGBHex);\n if (hex) {\n applyHex(picker, hex);\n commit(picker);\n }\n } catch {\n // Escape ends the picking, which leaves the color as it is.\n }\n });\n}\n\nexport function bindPickerEvents(picker: Picker): Array<() => void> {\n const { view } = picker;\n const disposers = bindAreas(picker);\n view.solidTab.addEventListener('click', () => setMode(picker, 'solid'));\n view.gradientTab.addEventListener('click', () => setMode(picker, 'gradient'));\n view.addStop.addEventListener('click', () => appendStop(picker));\n for (const channel of CHANNELS) {\n bindChannel(picker, channel);\n }\n bindAlpha(picker);\n bindHex(picker);\n bindEyedropper(picker);\n bindAngle(picker);\n return disposers;\n}\n","import { alphaOf, hexOf, hexToRgb } from './color';\nimport { clampPosition, gradientCss } from './gradientValue';\nimport {\n activeAlpha,\n activeHex,\n commitStopOrder,\n MIN_STOPS,\n type Picker,\n removeStop,\n selectStop,\n} from './popoverActions';\nimport { el, showRatio } from './popoverDom';\nimport { CHANNELS, type StopRow } from './popoverView';\n\nfunction createStopRow(picker: Picker, index: number): StopRow {\n const { view, lockStops, state } = picker;\n const root = el('div', 'sf-cp-stop', view.stopList);\n const swatch = el('span', 'sf-cp-stop-swatch', root);\n const hex = el('span', 'sf-cp-stop-hex', root);\n const position = el('input', 'sf-cp-stop-pos', root);\n position.type = 'number';\n position.min = '0';\n position.max = '100';\n position.disabled = lockStops;\n const remove = el('button', 'sf-cp-stop-remove', root);\n remove.type = 'button';\n remove.textContent = '×';\n remove.title = 'Remove stop';\n remove.hidden = lockStops;\n\n root.addEventListener('mousedown', () => selectStop(picker, index));\n position.addEventListener('input', () => {\n const value = Number(position.value);\n if (!Number.isFinite(value)) {\n return;\n }\n state.gradient.stops[index] = { ...state.gradient.stops[index], position: clampPosition(value) };\n renderPreview(picker);\n });\n position.addEventListener('change', () => commitStopOrder(picker));\n remove.addEventListener('click', event => {\n event.stopPropagation();\n removeStop(picker, index);\n });\n return { root, swatch, hex, position, remove };\n}\n\nfunction renderStops(picker: Picker): void {\n const { view, state } = picker;\n const rows = view.stopRows;\n while (rows.length > state.gradient.stops.length) {\n rows.pop()?.root.remove();\n }\n while (rows.length < state.gradient.stops.length) {\n rows.push(createStopRow(picker, rows.length));\n }\n state.gradient.stops.forEach((stop, index) => {\n const row = rows[index];\n row.root.setAttribute('aria-selected', String(index === state.selected));\n row.swatch.style.background = stop.color;\n const alpha = alphaOf(stop.color);\n row.hex.textContent = alpha < 1 ? `${hexOf(stop.color)} ${Math.round(alpha * 100)}%` : hexOf(stop.color);\n if (document.activeElement !== row.position) {\n row.position.value = String(Math.round(stop.position));\n }\n row.remove.disabled = state.gradient.stops.length <= MIN_STOPS;\n });\n}\n\nfunction renderPreview(picker: Picker): void {\n picker.view.preview.style.background = gradientCss(picker.state.gradient);\n}\n\nexport function renderPicker(picker: Picker): void {\n const { view, state } = picker;\n view.solidTab.setAttribute('aria-selected', String(state.mode === 'solid'));\n view.gradientTab.setAttribute('aria-selected', String(state.mode === 'gradient'));\n view.section.hidden = state.mode !== 'gradient';\n\n const hex = activeHex(picker);\n const rgb = hexToRgb(hex);\n view.matrix.style.background = `hsl(${state.hsv.h}, 100%, 50%)`;\n view.matrixCursor.style.left = `${state.hsv.s * 100}%`;\n view.matrixCursor.style.top = `${(1 - state.hsv.v) * 100}%`;\n view.hueThumb.style.top = `${(state.hsv.h / 360) * 100}%`;\n\n for (const channel of CHANNELS) {\n view.channelRanges[channel].value = String(rgb[channel]);\n showRatio(view.channelRanges[channel]);\n if (document.activeElement !== view.channelNumbers[channel]) {\n view.channelNumbers[channel].value = String(rgb[channel]);\n }\n }\n const percent = Math.round(activeAlpha(picker) * 100);\n view.alphaRange.value = String(percent);\n showRatio(view.alphaRange);\n if (document.activeElement !== view.alphaNumber) {\n view.alphaNumber.value = String(percent);\n }\n const opaque = `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n view.alphaRow.style.background = `linear-gradient(to right, rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0), ${opaque}), conic-gradient(var(--sf-cp-check-a) 25%, var(--sf-cp-check-b) 0 50%, var(--sf-cp-check-a) 0 75%, var(--sf-cp-check-b) 0) 0 0 / 8px 8px`;\n if (document.activeElement !== view.hexInput) {\n view.hexInput.value = hex;\n }\n\n if (state.mode === 'gradient') {\n view.angleRange.value = String(Math.round(state.gradient.angle));\n showRatio(view.angleRange);\n if (document.activeElement !== view.angleNumber) {\n view.angleNumber.value = String(Math.round(state.gradient.angle));\n }\n renderPreview(picker);\n renderStops(picker);\n }\n}\n","const DARK_TOKENS = `\n --sf-cp-bg: #1a1a1a;\n --sf-cp-border: rgba(255, 255, 255, 0.08);\n --sf-cp-shadow: 0 8px 24px rgba(0, 0, 0, 0.6);\n --sf-cp-fg: rgba(255, 255, 255, 0.92);\n --sf-cp-muted: rgba(255, 255, 255, 0.6);\n --sf-cp-tabs-bg: rgba(255, 255, 255, 0.05);\n --sf-cp-tab-active-bg: rgba(255, 255, 255, 0.1);\n --sf-cp-field-bg: rgba(255, 255, 255, 0.04);\n --sf-cp-field-border: rgba(255, 255, 255, 0.08);\n --sf-cp-row-bg: rgba(255, 255, 255, 0.04);\n --sf-cp-hover: rgba(255, 255, 255, 0.08);\n --sf-cp-track: linear-gradient(to right, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.4));\n --sf-cp-thumb-bg: #e8e8e8;\n --sf-cp-thumb-border: #555;\n --sf-cp-danger: #ff7a77;\n --sf-cp-accent: rgba(255, 255, 255, 0.85);\n --sf-cp-check-a: #3b3b3f;\n --sf-cp-check-b: #2a2a2d;\n`;\n\nexport const BASE_CSS = `\n.sf-cp {\n --sf-cp-bg: #ffffff;\n --sf-cp-border: #e0e0e0;\n --sf-cp-shadow: 0 8px 24px rgba(15, 23, 42, 0.16);\n --sf-cp-fg: #333333;\n --sf-cp-muted: #666666;\n --sf-cp-tabs-bg: #f1f5f9;\n --sf-cp-tab-active-bg: #ffffff;\n --sf-cp-field-bg: #f8f8f8;\n --sf-cp-field-border: #e0e0e0;\n --sf-cp-row-bg: #f8f8f8;\n --sf-cp-hover: rgba(0, 0, 0, 0.05);\n --sf-cp-track: linear-gradient(to right, #e0e0e0, #606060);\n --sf-cp-thumb-bg: #ffffff;\n --sf-cp-thumb-border: #666666;\n --sf-cp-danger: #e53935;\n --sf-cp-accent: #0f172a;\n --sf-cp-check-a: #c8c8c8;\n --sf-cp-check-b: #ffffff;\n\n position: fixed;\n z-index: 10000;\n box-sizing: border-box;\n width: 268px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n border: 1px solid var(--sf-cp-border);\n border-radius: 12px;\n background: var(--sf-cp-bg);\n box-shadow: var(--sf-cp-shadow);\n color: var(--sf-cp-fg);\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.sf-cp[data-sf-theme=\"dark\"] {${DARK_TOKENS}}\n\n@media (prefers-color-scheme: dark) {\n .sf-cp[data-sf-theme=\"auto\"] {${DARK_TOKENS}}\n}\n\n.sf-cp *,\n.sf-cp *::before,\n.sf-cp *::after {\n box-sizing: border-box;\n}\n\n`;\n","export const FIELDS_CSS = `\n.sf-cp-rows {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.sf-cp-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.sf-cp-label {\n flex: none;\n width: 34px;\n color: var(--sf-cp-muted);\n font-weight: 600;\n}\n\n.sf-cp-fluid {\n --sf-ratio: 0;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n height: 26px;\n padding: 0 8px;\n border-radius: 8px;\n background: var(--sf-cp-row-bg);\n overflow: hidden;\n user-select: none;\n}\n\n.sf-cp-fluid[hidden] {\n display: none;\n}\n\n.sf-cp-fluid-fill {\n position: absolute;\n inset: 0 auto 0 0;\n width: calc(var(--sf-ratio) * 100%);\n border-radius: 8px;\n background: linear-gradient(90deg, color-mix(in srgb, currentColor 5%, transparent), color-mix(in srgb, currentColor 18%, transparent));\n pointer-events: none;\n}\n\n.sf-cp-fluid--alpha .sf-cp-fluid-fill {\n display: none;\n}\n\n.sf-cp-fluid-thumb {\n position: absolute;\n top: 50%;\n left: calc(var(--sf-ratio) * 100% - var(--sf-ratio) * 5px);\n width: 5px;\n height: 14px;\n border-radius: 999px;\n background: var(--sf-cp-fg);\n box-shadow: 0 0 0 1px var(--sf-cp-bg);\n transform: translateY(-50%);\n pointer-events: none;\n transition: height 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease;\n}\n\n.sf-cp-fluid:hover .sf-cp-fluid-thumb,\n.sf-cp-fluid:focus-within .sf-cp-fluid-thumb {\n height: 20px;\n}\n\n.sf-cp-fluid:has(.sf-cp-fluid-range:active) .sf-cp-fluid-thumb {\n height: 26px;\n box-shadow: 0 0 0 1px var(--sf-cp-bg), 0 0 0 5px color-mix(in srgb, var(--sf-cp-fg) 15%, transparent);\n}\n\n.sf-cp-fluid-label {\n position: relative;\n color: var(--sf-cp-muted);\n font-size: 11px;\n font-weight: 600;\n pointer-events: none;\n}\n\n.sf-cp-fluid-range {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: ew-resize;\n}\n\n.sf-cp-number.sf-cp-fluid-number {\n position: relative;\n z-index: 2;\n width: 44px;\n padding: 1px 6px;\n border: none;\n background: transparent;\n text-align: right;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n -moz-appearance: textfield;\n appearance: textfield;\n}\n\n.sf-cp-fluid-number::-webkit-inner-spin-button,\n.sf-cp-fluid-number::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.sf-cp-fluid-number:hover {\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-number.sf-cp-fluid-number:focus {\n background: var(--sf-cp-field-bg);\n box-shadow: 0 0 0 1px var(--sf-cp-accent);\n}\n\n.sf-cp-number,\n.sf-cp-eyedropper {\n flex: none;\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n margin-left: auto;\n padding: 0;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 6px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-fg);\n cursor: pointer;\n}\n\n.sf-cp-eyedropper:hover {\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-text {\n flex: none;\n width: 52px;\n padding: 3px 8px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 6px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-fg);\n font: inherit;\n font-weight: 500;\n text-align: center;\n}\n\n.sf-cp-text {\n flex: 1;\n width: auto;\n min-width: 0;\n text-align: left;\n font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n text-transform: uppercase;\n}\n\n.sf-cp-number:focus,\n.sf-cp-text:focus {\n outline: none;\n border-color: var(--sf-cp-accent);\n}\n\n`;\n","export const GRADIENT_CSS = `\n.sf-cp-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding-top: 12px;\n border-top: 1px solid var(--sf-cp-border);\n}\n\n.sf-cp-section[hidden] {\n display: none;\n}\n\n.sf-cp-preview {\n height: 34px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 8px;\n}\n\n.sf-cp-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.sf-cp-heading {\n color: var(--sf-cp-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.5px;\n text-transform: uppercase;\n}\n\n.sf-cp-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 5px;\n background: var(--sf-cp-field-bg);\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 15px;\n line-height: 1;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n}\n\n.sf-cp-icon-btn:hover:not(:disabled) {\n background: var(--sf-cp-hover);\n color: var(--sf-cp-fg);\n}\n\n.sf-cp-icon-btn:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.sf-cp-stops {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 132px;\n overflow-y: auto;\n}\n\n.sf-cp-stop {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 8px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: var(--sf-cp-row-bg);\n cursor: pointer;\n}\n\n.sf-cp-stop[aria-selected=\"true\"] {\n border-color: var(--sf-cp-accent);\n}\n\n.sf-cp-stop-swatch {\n flex: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 1px 2px rgba(0, 0, 0, 0.2);\n}\n\n.sf-cp-stop-hex {\n flex: 1;\n min-width: 0;\n color: var(--sf-cp-fg);\n font-family: ui-monospace, \"SF Mono\", Menlo, Consolas, monospace;\n text-transform: uppercase;\n}\n\n.sf-cp-stop-pos {\n flex: none;\n width: 46px;\n padding: 2px 4px;\n border: 1px solid var(--sf-cp-field-border);\n border-radius: 4px;\n background: var(--sf-cp-bg);\n color: var(--sf-cp-muted);\n font: inherit;\n text-align: center;\n}\n\n.sf-cp-stop-pos:focus {\n outline: none;\n border-color: var(--sf-cp-accent);\n}\n\n.sf-cp-stop-remove {\n flex: none;\n width: 20px;\n height: 20px;\n padding: 0;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 15px;\n line-height: 1;\n cursor: pointer;\n}\n\n.sf-cp-stop-remove:hover:not(:disabled) {\n background: var(--sf-cp-hover);\n color: var(--sf-cp-danger);\n}\n\n.sf-cp-stop-remove:disabled {\n opacity: 0.3;\n cursor: default;\n}\n\n.sf-cp-reset {\n padding: 4px 0 0;\n border: none;\n border-top: 1px solid var(--sf-cp-border);\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sf-cp-reset:hover {\n color: var(--sf-cp-accent);\n}\n`;\n","export const TABS_AND_AREA_CSS = `\n.sf-cp-tabs {\n display: flex;\n gap: 2px;\n height: 28px;\n padding: 2px;\n border-radius: 8px;\n background: var(--sf-cp-tabs-bg);\n}\n\n.sf-cp-tabs[hidden] {\n display: none;\n}\n\n.sf-cp-tab {\n flex: 1;\n padding: 0 12px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sf-cp-muted);\n font: inherit;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.sf-cp-tab:hover {\n color: var(--sf-cp-fg);\n background: var(--sf-cp-hover);\n}\n\n.sf-cp-tab[aria-selected=\"true\"] {\n background: var(--sf-cp-tab-active-bg);\n color: var(--sf-cp-fg);\n box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08);\n}\n\n.sf-cp-area {\n display: flex;\n gap: 12px;\n height: 148px;\n}\n\n.sf-cp-matrix {\n position: relative;\n flex: 1;\n border-radius: 8px;\n overflow: hidden;\n cursor: crosshair;\n user-select: none;\n}\n\n.sf-cp-matrix-white,\n.sf-cp-matrix-black {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n.sf-cp-matrix-white {\n background: linear-gradient(to right, #ffffff, rgba(255, 255, 255, 0));\n}\n\n.sf-cp-matrix-black {\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0), #000000);\n}\n\n.sf-cp-matrix-cursor {\n position: absolute;\n width: 14px;\n height: 14px;\n border: 2px solid #ffffff;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.sf-cp-hue {\n position: relative;\n width: 12px;\n border-radius: 6px;\n cursor: pointer;\n user-select: none;\n background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n}\n\n.sf-cp-hue-thumb {\n position: absolute;\n left: 50%;\n width: 18px;\n height: 5px;\n border: 2px solid #ffffff;\n border-radius: 3px;\n background: transparent;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.35);\n}\n\n`;\n","import { BASE_CSS } from './styles/base';\nimport { FIELDS_CSS } from './styles/fields';\nimport { GRADIENT_CSS } from './styles/gradient';\nimport { TABS_AND_AREA_CSS } from './styles/tabsAndArea';\n\nexport const COLOR_PICKER_CSS = `${BASE_CSS}${TABS_AND_AREA_CSS}${FIELDS_CSS}${GRADIENT_CSS}`;\n","import { COLOR_PICKER_CSS } from './styles';\n\nexport type ColorPickerTheme = 'light' | 'dark' | 'auto';\n\nexport type ColorPickerThemeOption = ColorPickerTheme | (() => ColorPickerTheme);\n\nexport function resolveTheme(option: ColorPickerThemeOption | undefined): ColorPickerTheme {\n return (typeof option === 'function' ? option() : option) ?? 'auto';\n}\n\nconst STYLE_ID = 'sf-color-picker-styles';\n\nexport function ensureColorPickerStyles(doc: Document): void {\n if (doc.getElementById(STYLE_ID)) {\n return;\n }\n const style = doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = COLOR_PICKER_CSS;\n doc.head.appendChild(style);\n}\n","import { hexToHsv } from './color';\nimport type { Picker } from './popoverActions';\nimport { bindPickerEvents } from './popoverEvents';\nimport { renderPicker } from './popoverRender';\nimport { type Anchor, buildPickerView, clampIntoViewport } from './popoverView';\nimport { type ColorPickerTheme, ensureColorPickerStyles } from './theme';\nimport { type PickerValue, toAlpha, toGradient, toSolid } from './value';\n\nexport interface ColorPopoverOptions {\n seed: PickerValue;\n anchor: Anchor;\n theme?: ColorPickerTheme;\n allowGradient?: boolean;\n lockStops?: boolean;\n onCommit(value: string): void;\n onReset?(): void;\n}\n\nexport interface ColorPopoverHandle {\n close(): void;\n}\n\nexport function openColorPopover(options: ColorPopoverOptions): ColorPopoverHandle {\n const { seed, anchor, onCommit, onReset } = options;\n const allowGradient = options.allowGradient ?? true;\n const lockStops = options.lockStops ?? false;\n ensureColorPickerStyles(document);\n\n const solid = toSolid(seed);\n const view = buildPickerView({ anchor, theme: options.theme, allowGradient, lockStops, withReset: Boolean(onReset) });\n const picker: Picker = {\n view,\n lockStops,\n onCommit,\n state: {\n mode: allowGradient ? seed.mode : 'solid',\n solid,\n alpha: toAlpha(seed),\n gradient: toGradient(seed),\n selected: 0,\n hsv: hexToHsv(solid),\n },\n render: () => renderPicker(picker),\n };\n\n const root = view.root;\n document.body.appendChild(root);\n clampIntoViewport(root, anchor);\n\n const disposers = bindPickerEvents(picker);\n view.resetButton?.addEventListener('click', () => {\n onReset?.();\n close();\n });\n\n const onOutsideClick = (event: MouseEvent) => {\n if (!root.contains(event.target as Node)) {\n close();\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n close();\n }\n };\n\n const attach = window.setTimeout(() => {\n document.addEventListener('mousedown', onOutsideClick, true);\n document.addEventListener('keydown', onKeyDown);\n }, 0);\n\n function close(): void {\n window.clearTimeout(attach);\n document.removeEventListener('mousedown', onOutsideClick, true);\n document.removeEventListener('keydown', onKeyDown);\n for (const dispose of disposers) {\n dispose();\n }\n root.remove();\n }\n\n picker.render();\n\n return { close };\n}\n","import { screenRectOf } from '../../dom';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { readGradientValue } from './gradientLookup';\nimport { type ColorPopoverHandle, openColorPopover } from './popover';\nimport type { ColorEditTarget } from './target';\nimport { type ColorPickerThemeOption, resolveTheme } from './theme';\nimport { seedFrom } from './value';\n\nexport type ColorEditResolver = (event: Event, rules: EditableRules | undefined) => ColorEditTarget | null;\n\nexport class ColorEditSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n readonly #theme: ColorPickerThemeOption | undefined;\n readonly #resolve: ColorEditResolver;\n #open: ColorPopoverHandle | null = null;\n\n constructor(\n svg: SVGSVGElement,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme: ColorPickerThemeOption | undefined,\n resolve: ColorEditResolver,\n ) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n this.#theme = theme;\n this.#resolve = resolve;\n }\n\n readonly trigger = (event: Event): void => {\n const target = this.#resolve(event, this.#rules);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.#open?.close();\n\n const fill = target.node.getAttribute('fill');\n const hasOverride = target.node.getAttribute('data-sf-color-override') === 'true';\n this.#open = openColorPopover({\n seed: seedFrom(fill, readGradientValue(this.#svg, fill)),\n anchor: screenRectOf(target.node),\n theme: resolveTheme(this.#theme),\n allowGradient: !target.solidOnly,\n onCommit: color => {\n this.#emitter.emit('propertyChange', { owner: target.owner, path: target.path, value: color });\n },\n onReset: hasOverride\n ? () => {\n this.#emitter.emit('propertyChange', {\n owner: target.owner,\n path: target.path,\n value: 'none',\n quote: false,\n });\n }\n : undefined,\n });\n };\n\n cancel(): void {\n this.#open?.close();\n this.#open = null;\n }\n}\n","export type EditableRules = Record<string, boolean> | ((path: string) => boolean);\n\nconst SEGMENT = '[^.\\\\[\\\\]]+';\n\nfunction patternPart(part: string): string {\n if (part === '**') {\n return '.+';\n }\n if (part === '*') {\n return SEGMENT;\n }\n return part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction patternToRegExp(pattern: string): RegExp {\n return new RegExp(\n `^${pattern\n .split(/(\\*\\*|\\*)/)\n .map(patternPart)\n .join('')}$`,\n );\n}\n\nconst cache = new Map<string, RegExp>();\n\nfunction matches(pattern: string, path: string): boolean {\n let expression = cache.get(pattern);\n if (expression === undefined) {\n expression = patternToRegExp(pattern);\n cache.set(pattern, expression);\n }\n return expression.test(path);\n}\n\nexport function isEditablePath(path: string, rules: EditableRules | undefined): boolean {\n if (rules === undefined) {\n return true;\n }\n if (typeof rules === 'function') {\n return rules(path);\n }\n\n const entries = Object.entries(rules);\n if (entries.some(([pattern, allowed]) => !allowed && matches(pattern, path))) {\n return false;\n }\n return entries.some(([pattern, allowed]) => allowed && matches(pattern, path));\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { type EditableRules, isEditablePath } from '../propertyEdit/editable';\n\nexport interface ColorEditTarget {\n owner: OwnerRef;\n path: string;\n node: SVGGraphicsElement;\n solidOnly: boolean;\n}\n\nlet selectedBeforeGesture: ReadonlySet<string> = new Set();\n\nexport function snapshotSelectionBeforeGesture(svg: SVGSVGElement): void {\n selectedBeforeGesture = new Set(\n [...svg.querySelectorAll('[data-sf-selection-overlay]')].map(\n el => el.getAttribute('data-sf-selection-overlay') ?? '',\n ),\n );\n}\n\nfunction requiresPriorSelection(node: SVGGraphicsElement, owner: { id: string }): boolean {\n if (node.getAttribute('data-sf-role') !== 'isometric') {\n return false;\n }\n return !selectedBeforeGesture.has(owner.id);\n}\n\nfunction resolveTarget(\n event: Event,\n selector: string,\n pathOf: (node: SVGGraphicsElement) => string | null,\n rules: EditableRules | undefined,\n): ColorEditTarget | null {\n const node = (event.target as Element | null)?.closest?.(selector) as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n\n const path = pathOf(node);\n const owner = resolveOwner(node);\n if (!path || !owner || !isEditablePath(path, rules) || requiresPriorSelection(node, owner)) {\n return null;\n }\n const solidOnly = node.getAttribute('data-sf-prop-solid-only') === 'true';\n return { owner, path, node, solidOnly };\n}\n\nexport function resolveColorEditTarget(event: Event, rules: EditableRules | undefined): ColorEditTarget | null {\n return resolveTarget(event, '[data-sf-prop-kind=\"color\"]', node => node.getAttribute('data-sf-prop'), rules);\n}\n\nexport function resolveBarColorEditTarget(event: Event, rules: EditableRules | undefined): ColorEditTarget | null {\n return resolveTarget(event, '[data-sf-color-prop]', node => node.getAttribute('data-sf-color-prop'), rules);\n}\n","import { resolveOwner, screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { isEditablePath } from '../propertyEdit/editable';\nimport { readGradientValue } from './gradientLookup';\nimport { parseGradient, sortStops } from './gradientValue';\nimport { type ColorPopoverHandle, openColorPopover } from './popover';\nimport { type ColorPickerThemeOption, resolveTheme } from './theme';\nimport { seedFrom } from './value';\n\ninterface ZoneGradientTarget {\n owner: OwnerRef;\n node: SVGGraphicsElement;\n}\n\nfunction resolveZoneGradientTarget(event: Event): ZoneGradientTarget | null {\n const node = (event.target as Element | null)?.closest?.(\n '[data-sf-zone-gradient=\"true\"]',\n ) as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n const owner = resolveOwner(node);\n if (!owner) {\n return null;\n }\n return { owner, node };\n}\n\nexport class ZoneGradientSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n readonly #theme: ColorPickerThemeOption | undefined;\n #open: ColorPopoverHandle | null = null;\n\n constructor(\n svg: SVGSVGElement,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme: ColorPickerThemeOption | undefined,\n ) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n this.#theme = theme;\n }\n\n readonly trigger = (event: Event): void => {\n if (!isEditablePath('zones[0][1]', this.#rules)) {\n return;\n }\n const target = resolveZoneGradientTarget(event);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.#open?.close();\n\n const fill = target.node.getAttribute('fill');\n const gradient = readGradientValue(this.#svg, fill);\n if (!gradient) {\n return;\n }\n const beforeStops = sortStops(gradient.stops);\n\n this.#open = openColorPopover({\n seed: seedFrom(fill, gradient),\n anchor: screenRectOf(target.node),\n theme: resolveTheme(this.#theme),\n allowGradient: true,\n lockStops: true,\n onCommit: value => {\n const next = parseGradient(value);\n if (!next) {\n return;\n }\n const afterStops = sortStops(next.stops);\n afterStops.forEach((stop, index) => {\n const before = beforeStops[index];\n const path = `zones[${index}][1]`;\n if (before && stop.color !== before.color && isEditablePath(path, this.#rules)) {\n this.#emitter.emit('propertyChange', { owner: target.owner, path, value: stop.color });\n }\n });\n },\n });\n };\n\n cancel(): void {\n this.#open?.close();\n this.#open = null;\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { ColorEditSession } from './session';\nimport { resolveBarColorEditTarget, resolveColorEditTarget, snapshotSelectionBeforeGesture } from './target';\nimport type { ColorPickerThemeOption } from './theme';\nimport { ZoneGradientSession } from './zoneGradientSession';\n\nexport interface ColorEditHandle {\n destroy(): void;\n}\n\nexport function bindColorEdit(\n viewer: Viewer,\n emitter: Emitter,\n rules: EditableRules | undefined,\n theme?: ColorPickerThemeOption,\n): ColorEditHandle {\n const svg = viewer.svg;\n const swatch = new ColorEditSession(svg, emitter, rules, theme, resolveColorEditTarget);\n const mark = new ColorEditSession(svg, emitter, rules, theme, resolveBarColorEditTarget);\n const zoneGradient = new ZoneGradientSession(svg, emitter, rules, theme);\n const onPointerDown = () => snapshotSelectionBeforeGesture(svg);\n\n svg.addEventListener('pointerdown', onPointerDown, true);\n svg.addEventListener('click', swatch.trigger, true);\n svg.addEventListener('click', zoneGradient.trigger, true);\n svg.addEventListener('dblclick', mark.trigger, true);\n\n return {\n destroy() {\n swatch.cancel();\n mark.cancel();\n zoneGradient.cancel();\n svg.removeEventListener('pointerdown', onPointerDown, true);\n svg.removeEventListener('click', swatch.trigger, true);\n svg.removeEventListener('click', zoneGradient.trigger, true);\n svg.removeEventListener('dblclick', mark.trigger, true);\n },\n };\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\n\nexport interface DeleteSelectionHandle {\n destroy(): void;\n}\n\nexport function bindDeleteSelection(viewer: Viewer, emitter: Emitter): DeleteSelectionHandle {\n const svg = viewer.svg;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Backspace' && e.key !== 'Delete') {\n return;\n }\n const owners = viewer.getSelection();\n if (!owners.length) {\n return;\n }\n e.preventDefault();\n emitter.emit('delete', { owners });\n };\n\n svg.addEventListener('keydown', onKeyDown);\n\n return {\n destroy() {\n svg.removeEventListener('keydown', onKeyDown);\n },\n };\n}\n","import type { Side } from '../../model/geometry/types';\nimport { Emitter as GenericEmitter } from '../eventing/emitter';\nimport type { OwnerRef } from '../viewer';\n\nexport interface TextChangeEvent {\n owner: OwnerRef;\n text: string;\n}\n\nexport interface MoveChangeEvent {\n owner: OwnerRef;\n dx: number;\n dy: number;\n}\n\nexport interface ResizeChangeEvent {\n owner: OwnerRef;\n dx: number;\n dy: number;\n dWidth: number;\n dHeight: number;\n x: number;\n y: number;\n width: number;\n height: number;\n depth?: number;\n}\n\nexport interface LinkReconnectEvent {\n owner: OwnerRef;\n end: 'from' | 'to';\n target: OwnerRef;\n side: Side;\n fraction: number;\n}\n\nexport interface LinkSegmentChangeEvent {\n owner: OwnerRef;\n index: number;\n offset: number;\n}\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\nexport interface QuickDuplicateEvent {\n owner: OwnerRef;\n direction: 'top' | 'right' | 'bottom' | 'left' | IsometricQuickDuplicateDirection;\n}\n\nexport interface DeleteEvent {\n owners: OwnerRef[];\n}\n\nexport interface LinkToEvent {\n owner: OwnerRef;\n direction: 'top' | 'right' | 'bottom' | 'left';\n target: OwnerRef;\n side: Side;\n fraction: number;\n}\n\nexport interface ChartValueChangeEvent {\n owner: OwnerRef;\n series: string;\n index: number;\n value: number;\n}\n\nexport interface ChartValuePreviewEvent {\n owner: OwnerRef;\n series: string;\n index: number;\n value: number | null;\n}\n\nexport type PropertyValue = string | number | boolean | readonly number[];\n\nexport interface PropertyChangeEvent {\n owner: OwnerRef;\n path: string;\n value: PropertyValue;\n quote?: boolean;\n}\n\nexport interface PathPoint {\n x: number;\n y: number;\n}\n\nexport interface PathPointChangeEvent {\n owner: OwnerRef;\n points: PathPoint[];\n}\n\nexport interface PathDrawCompleteEvent {\n points: PathPoint[];\n closed: boolean;\n tension: number;\n}\n\nexport interface SankeyNodeMoveEvent {\n owner: OwnerRef;\n nodeId: string;\n dx: number;\n dy: number;\n}\n\nexport interface SankeyNodeRenameEvent {\n owner: OwnerRef;\n nodeId: string;\n label: string;\n}\n\nexport interface InteractionEventMap {\n textChange: TextChangeEvent;\n moveChange: MoveChangeEvent;\n resizeChange: ResizeChangeEvent;\n linkReconnect: LinkReconnectEvent;\n linkSegmentChange: LinkSegmentChangeEvent;\n quickDuplicate: QuickDuplicateEvent;\n linkTo: LinkToEvent;\n delete: DeleteEvent;\n chartValueChange: ChartValueChangeEvent;\n chartValuePreview: ChartValuePreviewEvent;\n propertyChange: PropertyChangeEvent;\n pathPointChange: PathPointChangeEvent;\n pathDrawComplete: PathDrawCompleteEvent;\n sankeyNodeMove: SankeyNodeMoveEvent;\n sankeyNodeRename: SankeyNodeRenameEvent;\n}\n\nexport type InteractionEventName = keyof InteractionEventMap;\nexport class Emitter extends GenericEmitter<InteractionEventMap> {}\nexport type { Unsubscribe } from '../eventing/emitter';\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport { edgePointToward, elementCenter } from '../../../model/geometry/rectangle';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { Link, PathType } from '../../../model/link';\nimport { calculateLinkRoute, getLineMidpoint } from '../../../renderScene/artifacts/link/geometry';\nimport type { PathSegment } from '../../../renderScene/artifacts/link/geometry/routing/types';\nimport { roundedOrthogonalPathData } from '../../../renderScene/artifacts/link/roundedOrthogonalPathData';\n\nexport function centerOf(bounds: Rect): { x: number; y: number } {\n return elementCenter(bounds);\n}\n\nexport function anchorPoint(bounds: Rect, side: Side | null, other: Rect): { x: number; y: number } {\n if (side) {\n return pointAtPort(bounds, { side, offset: 0.5 });\n }\n return edgePointToward(bounds, other);\n}\n\nfunction polylinePathData(points: number[]): string {\n if (points.length < 4) {\n return '';\n }\n let path = `M ${points[0]} ${points[1]}`;\n for (let index = 2; index < points.length; index += 2) {\n path += ` L ${points[index]} ${points[index + 1]}`;\n }\n return path;\n}\n\nexport function previewPathData(\n points: number[],\n segments: PathSegment[],\n pathType: PathType,\n strokeWidth: number,\n): string {\n if (pathType === 'curved' && points.length >= 8) {\n return `M ${points[0]} ${points[1]} C ${points[2]} ${points[3]} ${points[4]} ${points[5]} ${points[6]} ${points[7]}`;\n }\n if (pathType === 'orthogonal' && segments.length > 0) {\n return roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));\n }\n return polylinePathData(points);\n}\n\n// The link that stands in for the one being drawn, with its ends on a side of a block or loose in the air when there is no side yet.\nexport function previewLink(fromSide: Side | null, toSide: Side | null): Link {\n return {\n id: 'preview',\n fromId: '',\n toId: '',\n layerGroup: '',\n orderKey: '',\n isVisible: true,\n isLocked: false,\n fromPoint: fromSide ? { kind: 'side', side: fromSide, offset: 0.5 } : undefined,\n toPoint: toSide ? { kind: 'side', side: toSide, offset: 0.5 } : undefined,\n };\n}\n\nexport function routePreviewLink(\n fromBounds: Rect,\n toBounds: Rect,\n fromSide: Side | null,\n toSide: Side | null,\n pathType: PathType,\n) {\n const from = anchorPoint(fromBounds, fromSide, toBounds);\n const to = anchorPoint(toBounds, toSide, fromBounds);\n const { points, segments } = calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);\n return { points, segments, midpoint: getLineMidpoint(points, pathType, from, to) };\n}\n","import type { Rect, Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport { findOwnerNode, isPrimary } from '../../dom';\nimport { routePreviewLink } from './geometry';\nimport type { LiveLink } from './types';\n\ninterface OppositeEndpoint {\n draggedIsFrom: boolean;\n bounds: Rect;\n}\n\ninterface LiveLinkDraft {\n path: SVGPathElement;\n pathType: PathType;\n fromSide: Side | null;\n toSide: Side | null;\n otherBounds: Rect;\n draggedIsFrom: boolean;\n strokeWidth: number;\n}\n\ninterface LiveLinkLabelCapture {\n labelText: SVGTextElement | null;\n initialMidpoint: { x: number; y: number } | null;\n labelGapSize: { width: number; height: number } | null;\n}\n\nfunction discoverLiveLink(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n draggedBounds: Rect,\n): LiveLink | null {\n const draft = createLiveLinkDraft(svg, path, canvasObjectId);\n if (!draft) {\n return null;\n }\n return { ...draft, ...captureLiveLinkLabel(svg, draft, draggedBounds) };\n}\n\nfunction createLiveLinkDraft(svg: SVGSVGElement, path: SVGPathElement, canvasObjectId: string): LiveLinkDraft | null {\n const oppositeEndpoint = resolveOppositeEndpoint(svg, path, canvasObjectId);\n if (!oppositeEndpoint) {\n return null;\n }\n return {\n path,\n pathType: (path.getAttribute('data-sf-route') as PathType | null) ?? 'straight',\n fromSide: path.getAttribute('data-sf-from-side') as Side | null,\n toSide: path.getAttribute('data-sf-to-side') as Side | null,\n otherBounds: oppositeEndpoint.bounds,\n draggedIsFrom: oppositeEndpoint.draggedIsFrom,\n strokeWidth: Number(path.getAttribute('stroke-width')) || 2,\n };\n}\n\nfunction resolveOppositeEndpoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n): OppositeEndpoint | null {\n const draggedIsFrom = path.getAttribute('data-sf-from') === canvasObjectId;\n const otherId = path.getAttribute(draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n if (!otherId) {\n return null;\n }\n const otherPrimary = findOwnerNode(svg, otherId, isPrimary);\n return otherPrimary ? { draggedIsFrom, bounds: otherPrimary.getBBox() } : null;\n}\n\nfunction captureLiveLinkLabel(svg: SVGSVGElement, draft: LiveLinkDraft, draggedBounds: Rect): LiveLinkLabelCapture {\n const labelText = findLinkLabel(svg, draft.path);\n if (!labelText) {\n return { labelText: null, initialMidpoint: null, labelGapSize: null };\n }\n return {\n labelText,\n initialMidpoint: initialLinkMidpoint(draft, draggedBounds),\n labelGapSize: draft.path.getAttribute('data-sf-label-gap') === 'true' ? labelText.getBBox() : null,\n };\n}\n\nfunction findLinkLabel(svg: SVGSVGElement, path: SVGPathElement): SVGTextElement | null {\n const linkId = path.getAttribute('data-sf-id');\n return linkId ? svg.querySelector<SVGTextElement>(`text[data-sf-id=\"${CSS.escape(linkId)}\"]`) : null;\n}\n\nfunction initialLinkMidpoint(draft: LiveLinkDraft, draggedBounds: Rect): { x: number; y: number } {\n const fromBounds = draft.draggedIsFrom ? draggedBounds : draft.otherBounds;\n const toBounds = draft.draggedIsFrom ? draft.otherBounds : draggedBounds;\n return routePreviewLink(fromBounds, toBounds, draft.fromSide, draft.toSide, draft.pathType).midpoint;\n}\n\nexport function findLiveLinks(svg: SVGSVGElement, canvasObjectId: string, draggedBounds: Rect): LiveLink[] {\n const escapedId = CSS.escape(canvasObjectId);\n const candidates = svg.querySelectorAll<SVGPathElement>(\n `path[data-sf-from=\"${escapedId}\"], path[data-sf-to=\"${escapedId}\"]`,\n );\n const links: LiveLink[] = [];\n for (const path of candidates) {\n const link = discoverLiveLink(svg, path, canvasObjectId, draggedBounds);\n if (link) {\n links.push(link);\n }\n }\n return links;\n}\n","import { type IsometricFace, isometricFaceCenter } from '../../../model/isometricObject';\nimport { findOwnerNode, isometricGeometryOf, isPrimary } from '../../dom';\nimport type { LiveFaceLink } from './types';\n\ntype IsometricObjectSize = Parameters<typeof isometricFaceCenter>[0];\n\nfunction resolveOtherFacePoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n canvasObjectId: string,\n): { otherPoint: ReturnType<typeof isometricFaceCenter>; draggedIsFrom: boolean; face: IsometricFace } | null {\n const draggedIsFrom = path.getAttribute('data-sf-from') === canvasObjectId;\n const otherId = path.getAttribute(draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n const face = path.getAttribute(draggedIsFrom ? 'data-sf-from-face' : 'data-sf-to-face') as IsometricFace | null;\n const otherFace = path.getAttribute(draggedIsFrom ? 'data-sf-to-face' : 'data-sf-from-face') as IsometricFace | null;\n if (!otherId || !face || !otherFace) {\n return null;\n }\n const otherPrimary = findOwnerNode(svg, otherId, isPrimary);\n const otherGeometry = otherPrimary && isometricGeometryOf(otherPrimary);\n if (!otherGeometry?.bounds) {\n return null;\n }\n const otherObject: IsometricObjectSize = {\n x: otherGeometry.bounds.x,\n y: otherGeometry.bounds.y,\n width: otherGeometry.width,\n height: otherGeometry.height,\n depth: otherGeometry.depth,\n };\n return { otherPoint: isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };\n}\n\nexport function findLiveFaceLinks(svg: SVGSVGElement, canvasObjectId: string): LiveFaceLink[] {\n const escapedId = CSS.escape(canvasObjectId);\n const candidates = svg.querySelectorAll<SVGPathElement>(\n `path[data-sf-kind=\"connection\"][data-sf-from=\"${escapedId}\"], path[data-sf-kind=\"connection\"][data-sf-to=\"${escapedId}\"]`,\n );\n const links: LiveFaceLink[] = [];\n for (const path of candidates) {\n const resolved = resolveOtherFacePoint(svg, path, canvasObjectId);\n if (resolved) {\n links.push({ path, ...resolved });\n }\n }\n return links;\n}\n","import { isometricFaceCenter } from '../../../model/isometricObject';\nimport type { LiveFaceLink } from './types';\n\ntype IsometricObjectSize = Parameters<typeof isometricFaceCenter>[0];\n\nfunction updateLiveFaceLink(link: LiveFaceLink, liveObject: IsometricObjectSize): void {\n const draggedPoint = isometricFaceCenter(liveObject, link.face);\n const from = link.draggedIsFrom ? draggedPoint : link.otherPoint;\n const to = link.draggedIsFrom ? link.otherPoint : draggedPoint;\n link.path.setAttribute('d', `M ${from.x} ${from.y} L ${to.x} ${to.y}`);\n}\n\nexport function updateLiveFaceLinks(links: LiveFaceLink[], liveObject: IsometricObjectSize): void {\n for (const link of links) {\n updateLiveFaceLink(link, liveObject);\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { labelGapDash } from '../../../renderScene/artifacts/link/geometry';\nimport { previewPathData, routePreviewLink } from './geometry';\nimport type { LiveLink } from './types';\n\nfunction updateLabelPosition(link: LiveLink, midpoint: { x: number; y: number }): void {\n if (!link.labelText || !link.initialMidpoint) {\n return;\n }\n const dx = midpoint.x - link.initialMidpoint.x;\n const dy = midpoint.y - link.initialMidpoint.y;\n link.labelText.setAttribute('transform', `translate(${dx} ${dy})`);\n}\n\nfunction updateLabelGap(link: LiveLink, points: number[]): void {\n if (!link.labelGapSize) {\n return;\n }\n const gap = labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);\n if (gap) {\n link.path.setAttribute('stroke-dasharray', `${gap.dashBefore} ${gap.gapLength} 1000000`);\n } else {\n link.path.removeAttribute('stroke-dasharray');\n }\n}\n\nfunction updateLiveLink(link: LiveLink, draggedBounds: Rect): void {\n const fromBounds = link.draggedIsFrom ? draggedBounds : link.otherBounds;\n const toBounds = link.draggedIsFrom ? link.otherBounds : draggedBounds;\n const { points, segments, midpoint } = routePreviewLink(\n fromBounds,\n toBounds,\n link.fromSide,\n link.toSide,\n link.pathType,\n );\n link.path.setAttribute('d', previewPathData(points, segments, link.pathType, link.strokeWidth));\n updateLabelPosition(link, midpoint);\n updateLabelGap(link, points);\n}\n\nexport function updateLiveLinks(liveLinks: LiveLink[], draggedBounds: Rect): void {\n for (const link of liveLinks) {\n updateLiveLink(link, draggedBounds);\n }\n}\n","import { AXIS_COS, AXIS_SIN } from '../../model/isometricObject';\n\nexport const SNAP_GRID_ATTR = 'data-sf-snap-grid';\nexport const SNAP_ATTR = 'data-sf-snap';\n\nexport function isSnapDisabled(svg: SVGSVGElement): boolean {\n return svg.getAttribute(SNAP_ATTR) === 'off';\n}\n\nexport const SNAP_DISTANCE_ATTR = 'data-sf-snap-distance';\nconst DEFAULT_SNAP_DISTANCE_PX = 20;\n\n// How close, in screen pixels, a shape has to come to another before it snaps. The host can set it as a number on the svg.\nexport function snapDistancePx(svg: SVGSVGElement): number {\n const value = Number(svg.getAttribute(SNAP_DISTANCE_ATTR));\n return value > 0 ? value : DEFAULT_SNAP_DISTANCE_PX;\n}\n\nconst ISOMETRIC_GRID = /^isometric:(\\d+(?:\\.\\d+)?)$/;\n\nexport function readIsometricSnapStep(svg: SVGSVGElement): number | null {\n const match = ISOMETRIC_GRID.exec(svg.getAttribute(SNAP_GRID_ATTR) ?? '');\n const step = match ? Number(match[1]) : 0;\n return step > 0 ? step : null;\n}\n\nexport function nearestIsometricLatticePoint(point: { x: number; y: number }, step: number): { x: number; y: number } {\n const u = point.x / (AXIS_COS * step);\n const v = point.y / (AXIS_SIN * step);\n const i = Math.round((u + v) / 2);\n const j = Math.round((u - v) / 2);\n return { x: (i + j) * AXIS_COS * step, y: (i - j) * AXIS_SIN * step };\n}\n\nexport function snapToStep(value: number, step: number, min: number): number {\n return Math.max(min, Math.round(value / step) * step);\n}\n","import { isometricFaces, isometricTopFaceCenter } from '../../../model/isometricObject';\nimport { roundedPolygonPath } from '../../../renderScene/scene/roundedPolygonPath';\nimport { axisArrowPlacements, updateAxisArrowGroup, updateHalo } from '../../dom';\nimport type { IsometricAxis } from '../../dom/selectionOverlay/isometric';\nimport type { IsometricGeometryNodes, IsometricObjectSize } from './state';\n\nconst LABEL_GAP = 12;\nconst LABEL_HEIGHT = 20;\nconst LABEL_FONT_SIZE = 12;\nconst LABEL_LINE_HEIGHT = 1.2;\nconst LABEL_BASELINE_OFFSET =\n -LABEL_GAP - LABEL_HEIGHT + (LABEL_HEIGHT - LABEL_FONT_SIZE * LABEL_LINE_HEIGHT) / 2 + LABEL_FONT_SIZE;\n\nexport function applyIsometricAxisPreview(\n nodes: IsometricGeometryNodes,\n object: IsometricObjectSize,\n cornerRadius: number,\n overlay: { halo: SVGPathElement | null; arrows: Record<IsometricAxis, SVGGElement | null> },\n svg: SVGSVGElement,\n): void {\n const faces = isometricFaces(object);\n\n nodes.top?.setAttribute('d', roundedPolygonPath(faces.top, 0));\n nodes.front?.setAttribute('d', roundedPolygonPath(faces.front, 0));\n nodes.side?.setAttribute('d', roundedPolygonPath(faces.right, 0));\n\n const silhouette = [faces.top[0], faces.top[1], faces.right[2], faces.front[2], faces.front[3], faces.top[3]];\n const hullPath = roundedPolygonPath(silhouette, cornerRadius);\n nodes.hull?.setAttribute('d', hullPath);\n if (overlay.halo) {\n updateHalo(overlay.halo, hullPath);\n }\n\n const placements = axisArrowPlacements(object);\n (Object.keys(placements) as IsometricAxis[]).forEach(axis => {\n const group = overlay.arrows[axis];\n if (group) {\n updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);\n }\n });\n\n nodes.seams?.setAttribute(\n 'd',\n `M ${faces.top[3].x} ${faces.top[3].y} L ${faces.top[2].x} ${faces.top[2].y} L ${faces.top[1].x} ${faces.top[1].y} M ${faces.top[2].x} ${faces.top[2].y} L ${faces.front[2].x} ${faces.front[2].y}`,\n );\n\n if (nodes.groundShadow) {\n const contactFootprint = faces.top.map(point => ({ x: point.x, y: point.y + object.height }));\n const footprintCenter = {\n x: contactFootprint.reduce((sum, point) => sum + point.x, 0) / contactFootprint.length,\n y: contactFootprint.reduce((sum, point) => sum + point.y, 0) / contactFootprint.length,\n };\n const shadowSpread = 1.3;\n const footprint = contactFootprint.map(point => ({\n x: footprintCenter.x + (point.x - footprintCenter.x) * shadowSpread,\n y: footprintCenter.y + (point.y - footprintCenter.y) * shadowSpread,\n }));\n nodes.groundShadow.setAttribute('d', roundedPolygonPath(footprint, 0));\n }\n\n const anchor = isometricTopFaceCenter(object);\n if (nodes.labelGuide) {\n nodes.labelGuide.setAttribute('d', `M ${anchor.x} ${anchor.y - LABEL_GAP} L ${anchor.x} ${anchor.y}`);\n }\n if (nodes.label) {\n nodes.label.setAttribute('x', String(anchor.x));\n nodes.label.setAttribute('y', String(anchor.y + LABEL_BASELINE_OFFSET));\n nodes.label.querySelectorAll('tspan').forEach(tspan => {\n tspan.setAttribute('x', String(anchor.x));\n });\n }\n}\n","import { CORNER_RADIUS_ATTR } from '../../../svg/domContract/attributes';\nimport {\n findAllOwnerNodes,\n findOwnerNode,\n ISO_DUPLICATE_BUBBLES_ATTR,\n ISO_HALO_ATTR,\n isometricGeometryOf,\n isPrimary,\n pointerUserPoint,\n resolveOwner,\n} from '../../dom';\nimport type { IsometricAxis } from '../../dom/selectionOverlay/isometric';\nimport type { OwnerRef } from '../../viewer';\nimport { findLiveFaceLinks, type LiveFaceLink } from '../linkPreview';\n\nconst AXES: readonly IsometricAxis[] = ['width', 'height', 'depth'];\n\nexport interface IsometricGeometryNodes {\n top: SVGGraphicsElement | null;\n front: SVGGraphicsElement | null;\n side: SVGGraphicsElement | null;\n hull: SVGGraphicsElement | null;\n seams: SVGGraphicsElement | null;\n groundShadow: SVGGraphicsElement | null;\n label: SVGGraphicsElement | null;\n labelGuide: SVGGraphicsElement | null;\n}\n\nexport interface IsometricObjectSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport interface IsometricAxisDragState {\n owner: OwnerRef;\n axis: IsometricAxis;\n pointerId: number;\n startUser: { x: number; y: number };\n start: IsometricObjectSize;\n cornerRadius: number;\n nodes: IsometricGeometryNodes;\n overlayHalo: SVGPathElement | null;\n overlayArrows: Record<IsometricAxis, SVGGElement | null>;\n overlayDuplicateBubbles: SVGGElement | null;\n liveFaceLinks: LiveFaceLink[];\n moved: boolean;\n current: IsometricObjectSize;\n}\n\nfunction collectNodes(svg: SVGSVGElement, ownerId: string): IsometricGeometryNodes {\n const all = findAllOwnerNodes(svg, ownerId);\n const bySuffix = (suffix: string) => all.find(el => el.id.endsWith(suffix)) ?? null;\n return {\n top: bySuffix('-top'),\n front: bySuffix('-front'),\n side: bySuffix('-side'),\n hull: bySuffix('-hull'),\n seams: bySuffix('-seams'),\n groundShadow: bySuffix('-ground-shadow'),\n label: bySuffix('-label'),\n labelGuide: bySuffix('-label-guide'),\n };\n}\n\ninterface ResizeHandle {\n captureTarget: SVGGraphicsElement;\n axis: IsometricAxis;\n overlay: Element;\n ownerId: string;\n}\n\n// The arrow of the selection overlay that the pointer went down on, with the axis it stands for and the object the overlay belongs to.\nfunction findResizeHandle(event: PointerEvent): ResizeHandle | null {\n const target = event.target as Element | null;\n const captureTarget = target?.closest?.('[data-sf-resize-handle]') as SVGGraphicsElement | null;\n const handleAttr = captureTarget?.getAttribute('data-sf-resize-handle');\n if (!captureTarget || !handleAttr?.startsWith('iso-')) {\n return null;\n }\n const overlay = captureTarget.closest('[data-sf-selection-overlay]');\n const ownerId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!overlay || !ownerId) {\n return null;\n }\n return { captureTarget, axis: handleAttr.slice(4) as IsometricAxis, overlay, ownerId };\n}\n\n// The parts of the overlay that follow the drag. The bubbles that duplicate the object are hidden while it is dragged.\nfunction overlayPartsOf(\n overlay: Element,\n): Pick<IsometricAxisDragState, 'overlayHalo' | 'overlayArrows' | 'overlayDuplicateBubbles'> {\n const overlayHalo = (overlay.querySelector(`[${ISO_HALO_ATTR}]`) as SVGPathElement | null) ?? null;\n const overlayArrows = Object.fromEntries(\n AXES.map(axis => [\n axis,\n (overlay.querySelector(`[data-sf-resize-handle=\"iso-${axis}\"]`) as SVGGElement | null) ?? null,\n ]),\n ) as Record<IsometricAxis, SVGGElement | null>;\n const overlayDuplicateBubbles =\n (overlay.querySelector(`[${ISO_DUPLICATE_BUBBLES_ATTR}]`) as SVGGElement | null) ?? null;\n if (overlayDuplicateBubbles) {\n overlayDuplicateBubbles.style.display = 'none';\n }\n return { overlayHalo, overlayArrows, overlayDuplicateBubbles };\n}\n\nexport function createIsometricAxisDragState(svg: SVGSVGElement, event: PointerEvent): IsometricAxisDragState | null {\n const handle = findResizeHandle(event);\n if (!handle) {\n return null;\n }\n const { captureTarget, axis, overlay, ownerId } = handle;\n\n const primary = findOwnerNode(svg, ownerId, isPrimary);\n const owner = primary && resolveOwner(primary);\n if (!primary || owner?.role !== 'isometric') {\n return null;\n }\n\n const startUser = pointerUserPoint(svg, event);\n if (!startUser) {\n return null;\n }\n\n const geometry = isometricGeometryOf(primary);\n const bounds = geometry?.bounds ?? primary.getBBox();\n const nodes = collectNodes(svg, ownerId);\n [nodes.top, nodes.front, nodes.side].forEach(node => {\n node?.removeAttribute('clip-path');\n });\n\n captureTarget.setPointerCapture?.(event.pointerId);\n\n const start: IsometricObjectSize = {\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\n return {\n owner,\n axis,\n pointerId: event.pointerId,\n startUser,\n start,\n cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(CORNER_RADIUS_ATTR)) ?? 0,\n nodes,\n ...overlayPartsOf(overlay),\n liveFaceLinks: findLiveFaceLinks(svg, ownerId),\n moved: false,\n current: start,\n };\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport { isCameraGesture, pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { updateLiveFaceLinks } from '../linkPreview';\nimport { readIsometricSnapStep, snapToStep } from '../snapGrid';\nimport { applyIsometricAxisPreview } from './preview';\nimport { createIsometricAxisDragState, type IsometricAxisDragState, type IsometricObjectSize } from './state';\n\nconst MIN_SIZE = 10;\n\nfunction nextGeometry(\n drag: IsometricAxisDragState,\n point: { x: number; y: number },\n step: number | null,\n): IsometricObjectSize {\n const { start, axis } = drag;\n const length = (value: number, min: number): number => (step ? snapToStep(value, step, step) : Math.max(min, value));\n const dx = point.x - drag.startUser.x;\n const dy = point.y - drag.startUser.y;\n\n if (axis === 'width') {\n const delta = dx * AXIS_COS + dy * AXIS_SIN;\n return { ...start, width: length(start.width + delta, MIN_SIZE) };\n }\n if (axis === 'height') {\n return { ...start, height: length(start.height + dy, MIN_SIZE) };\n }\n const delta = -dx * AXIS_COS + dy * AXIS_SIN;\n const depth = length(start.depth + delta, 0);\n const x = start.x + (start.depth - depth) * AXIS_COS;\n return { ...start, x, depth };\n}\n\nexport class IsometricAxisResizeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: IsometricAxisDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n this.#drag = createIsometricAxisDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n drag.moved = true;\n drag.current = nextGeometry(drag, point, readIsometricSnapStep(this.#svg));\n updateLiveFaceLinks(drag.liveFaceLinks, drag.current);\n applyIsometricAxisPreview(\n drag.nodes,\n drag.current,\n drag.cornerRadius,\n { halo: drag.overlayHalo, arrows: drag.overlayArrows },\n this.#svg,\n );\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n if (drag.overlayDuplicateBubbles) {\n drag.overlayDuplicateBubbles.style.display = '';\n }\n if (!drag.moved) {\n return;\n }\n const next = drag.current;\n this.#emitter.emit('resizeChange', {\n owner: drag.owner,\n dx: 0,\n dy: 0,\n dWidth: next.width - drag.start.width,\n dHeight: next.height - drag.start.height,\n x: next.x,\n y: next.y,\n width: next.width,\n height: next.height,\n depth: next.depth,\n });\n };\n\n cancel(): void {\n if (this.#drag?.overlayDuplicateBubbles) {\n this.#drag.overlayDuplicateBubbles.style.display = '';\n }\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { IsometricAxisResizeSession } from './isometricAxisResize/session';\n\nexport interface IsometricAxisResizeDragHandle {\n destroy(): void;\n}\n\nexport function bindIsometricAxisResize(viewer: Viewer, emitter: Emitter): IsometricAxisResizeDragHandle {\n const svg = viewer.svg;\n const session = new IsometricAxisResizeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import type { IsometricLabelDragState } from './types';\n\nexport function updateIsometricLabelDragPreview(drag: IsometricLabelDragState, dx: number, dy: number): void {\n for (const element of drag.labelElements) {\n element.setAttribute('transform', `translate(${dx}, ${dy})`);\n }\n if (!drag.guideElement) {\n return;\n }\n drag.guideElement.setAttribute('d', `M ${drag.anchorX} ${drag.anchorY} L ${drag.restX + dx} ${drag.restY + dy}`);\n}\n\nexport function clearIsometricLabelDragPreview(drag: IsometricLabelDragState): void {\n for (const element of drag.labelElements) {\n element.removeAttribute('transform');\n }\n if (!drag.guideElement) {\n return;\n }\n if (drag.guideOriginalD === null) {\n drag.guideElement.removeAttribute('d');\n } else {\n drag.guideElement.setAttribute('d', drag.guideOriginalD);\n }\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport { isCameraGesture, isometricGeometryOf, pointerUserPoint, resolveOwner } from '../../dom';\nimport type { IsometricLabelDragState } from './types';\n\nfunction findLabelMark(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.(\n '[id$=\"-label\"], [id$=\"-label-background\"]',\n ) as SVGGraphicsElement | null;\n}\n\nfunction isLabelPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findHull(svg: SVGSVGElement, ownerId: string): SVGGraphicsElement | null {\n return svg.querySelector<SVGGraphicsElement>(`[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-primary=\"true\"]`);\n}\n\nfunction findBySuffix(svg: SVGSVGElement, suffix: string): SVGGraphicsElement | null {\n return svg.querySelector<SVGGraphicsElement>(`[id$=\"${CSS.escape(suffix)}\"]`);\n}\n\nexport function resolveIsometricLabelDrag(svg: SVGSVGElement, event: PointerEvent): IsometricLabelDragState | null {\n if (!isLabelPointer(event)) {\n return null;\n }\n const clicked = findLabelMark(event);\n if (!clicked) {\n return null;\n }\n const owner = resolveOwner(clicked);\n if (owner?.role !== 'isometric') {\n return null;\n }\n const hull = findHull(svg, owner.id);\n const geometry = hull ? isometricGeometryOf(hull) : null;\n if (!geometry?.bounds) {\n return null;\n }\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n const anchorX = geometry.bounds.x + geometry.bounds.width / 2;\n const anchorY = geometry.bounds.y + (geometry.bounds.width * (AXIS_SIN / AXIS_COS)) / 2;\n const text = findBySuffix(svg, `-${owner.id}-label`);\n if (!text) {\n return null;\n }\n const background = findBySuffix(svg, `-${owner.id}-label-background`);\n const guideElement = findBySuffix(svg, `-${owner.id}-label-guide`);\n const box = text.getBBox();\n const restX = box.x + box.width / 2;\n const restY = box.y + box.height;\n clicked.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n anchorX,\n anchorY,\n restX,\n restY,\n startX: start.x,\n startY: start.y,\n baseOffsetX: geometry.labelOffsetX,\n baseOffsetY: geometry.labelOffsetY,\n moved: false,\n lastDx: 0,\n lastDy: 0,\n labelElements: background ? [text, background] : [text],\n guideElement,\n guideOriginalD: guideElement?.getAttribute('d') ?? null,\n };\n}\n","import { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { clearIsometricLabelDragPreview, updateIsometricLabelDragPreview } from './preview';\nimport { resolveIsometricLabelDrag } from './target';\nimport type { IsometricLabelDragState } from './types';\n\nconst MOVE_NOISE = 2;\n\nexport class IsometricLabelDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: IsometricLabelDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveIsometricLabelDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const dx = point.x - drag.startX;\n const dy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(dx, dy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updateIsometricLabelDragPreview(drag, dx, dy);\n }\n\n cancel(): void {\n if (this.#drag) {\n clearIsometricLabelDragPreview(this.#drag);\n }\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearIsometricLabelDragPreview(drag);\n if (!drag.moved) {\n return;\n }\n const offsetX = Math.round(drag.baseOffsetX + drag.lastDx);\n const offsetY = Math.round(drag.baseOffsetY + drag.lastDy);\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: 'style.labelOffsetX', value: offsetX });\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: 'style.labelOffsetY', value: offsetY });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { IsometricLabelDragSession } from './session';\n\nexport interface IsometricLabelDragHandle {\n destroy(): void;\n}\n\nexport function bindIsometricLabelDrag(viewer: Viewer, emitter: Emitter): IsometricLabelDragHandle {\n const session = new IsometricLabelDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import { isCameraGesture, resolveOwner } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport type { Emitter, IsometricQuickDuplicateDirection } from '../events';\n\nfunction isIsometricDirection(value: string): value is IsometricQuickDuplicateDirection {\n return value.startsWith('iso-');\n}\n\nexport interface IsometricQuickDuplicateHandle {\n destroy(): void;\n}\n\nexport function bindIsometricQuickDuplicate(viewer: Viewer, emitter: Emitter): IsometricQuickDuplicateHandle {\n const svg = viewer.svg;\n\n const onPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || isCameraGesture(event)) {\n return;\n }\n const bubble = (event.target as Element | null)?.closest('[data-sf-quick-duplicate]');\n const direction = bubble?.getAttribute('data-sf-quick-duplicate');\n if (!bubble || !direction || !isIsometricDirection(direction)) {\n return;\n }\n const overlay = bubble.closest('[data-sf-selection-overlay]');\n const sourceId = overlay?.getAttribute('data-sf-selection-overlay');\n const primary = sourceId\n ? svg.querySelector(`[data-sf-id=\"${CSS.escape(sourceId)}\"][data-sf-primary=\"true\"]`)\n : null;\n const owner = primary && resolveOwner(primary);\n if (!owner) {\n return;\n }\n event.stopPropagation();\n emitter.emit('quickDuplicate', { owner, direction });\n };\n\n svg.addEventListener('pointerdown', onPointerDown);\n return {\n destroy() {\n svg.removeEventListener('pointerdown', onPointerDown);\n },\n };\n}\n","import type { Emitter } from '../events';\nimport type { LinkEndpointDragState } from './state';\n\nexport function completeLinkEndpointDrag(emitter: Emitter, drag: LinkEndpointDragState): void {\n if (!drag.moved) {\n return;\n }\n if (!drag.hit) {\n drag.path.setAttribute('d', drag.originalD);\n return;\n }\n\n emitter.emit('linkReconnect', {\n owner: drag.linkOwner,\n end: drag.end,\n target: drag.hit.owner,\n side: drag.hit.side,\n fraction: Math.round(drag.hit.offset * 100) / 100,\n });\n}\n","import type { LinkEndpointDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function endpointPointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedEndpointDragThreshold(drag: LinkEndpointDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport { calculateLinkRoute } from '../../../renderScene/artifacts/link/geometry';\nimport { previewPathData } from '../linkPreview';\nimport { previewLink } from '../linkPreview/geometry';\nimport type { LinkEndpointDragState } from './state';\n\nexport function updateEndpointPreview(\n drag: LinkEndpointDragState,\n draggedPoint: { x: number; y: number },\n draggedSide: Side,\n): void {\n const fromPoint = drag.end === 'from' ? draggedPoint : drag.fixedPoint;\n const toPoint = drag.end === 'to' ? draggedPoint : drag.fixedPoint;\n const fromSide = drag.end === 'from' ? draggedSide : drag.fixedSide;\n const toSide = drag.end === 'to' ? draggedSide : drag.fixedSide;\n const { points, segments } = calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);\n drag.path.setAttribute('d', previewPathData(points, segments, drag.pathType, drag.strokeWidth));\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\n\nexport const GHOST_FREE_STROKE = '#727272';\nexport const GHOST_SNAPPED_STROKE = '#992dff';\nconst GHOST_OPACITY = '0.7';\nconst GHOST_DASH_PX = 6;\nconst ANCHOR_RADIUS_PX = 6;\nconst ANCHOR_OUTLINE_PX = 2;\nconst ANCHOR_OPACITY = '0.9';\nconst RESTORED_ATTRIBUTES = ['stroke', 'stroke-dasharray', 'stroke-linecap', 'opacity'] as const;\n\nexport class LinkGhost {\n readonly #svg: SVGSVGElement;\n readonly #path: SVGPathElement;\n readonly #saved = new Map<string, string | null>();\n readonly #anchors: SVGGElement;\n #shown = false;\n\n constructor(svg: SVGSVGElement, path: SVGPathElement) {\n this.#svg = svg;\n this.#path = path;\n this.#anchors = svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'g');\n this.#anchors.setAttribute('data-sf-link-target', '');\n this.#anchors.setAttribute('pointer-events', 'none');\n }\n\n show(snapped: boolean, targetBounds: Rect | null): void {\n if (!this.#shown) {\n this.#shown = true;\n for (const name of RESTORED_ATTRIBUTES) {\n this.#saved.set(name, this.#path.getAttribute(name));\n }\n const dash = GHOST_DASH_PX / pxPerUnit(this.#svg);\n this.#path.setAttribute('stroke-dasharray', `${dash} ${dash}`);\n this.#path.setAttribute('stroke-linecap', 'round');\n this.#path.setAttribute('opacity', GHOST_OPACITY);\n this.#svg.appendChild(this.#anchors);\n }\n this.#path.setAttribute('stroke', snapped ? GHOST_SNAPPED_STROKE : GHOST_FREE_STROKE);\n this.#drawAnchors(targetBounds);\n }\n\n hide(): void {\n this.#anchors.remove();\n if (!this.#shown) {\n return;\n }\n this.#shown = false;\n for (const [name, value] of this.#saved) {\n if (value === null) {\n this.#path.removeAttribute(name);\n } else {\n this.#path.setAttribute(name, value);\n }\n }\n this.#saved.clear();\n }\n\n #drawAnchors(bounds: Rect | null): void {\n this.#anchors.replaceChildren();\n if (!bounds) {\n return;\n }\n const unit = 1 / pxPerUnit(this.#svg);\n const centers: Array<[number, number]> = [\n [bounds.x + bounds.width / 2, bounds.y],\n [bounds.x + bounds.width, bounds.y + bounds.height / 2],\n [bounds.x + bounds.width / 2, bounds.y + bounds.height],\n [bounds.x, bounds.y + bounds.height / 2],\n ];\n for (const [cx, cy] of centers) {\n const dot = this.#svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'circle');\n dot.setAttribute('cx', String(cx));\n dot.setAttribute('cy', String(cy));\n dot.setAttribute('r', String(ANCHOR_RADIUS_PX * unit));\n dot.setAttribute('fill', GHOST_SNAPPED_STROKE);\n dot.setAttribute('stroke', '#ffffff');\n dot.setAttribute('stroke-width', String(ANCHOR_OUTLINE_PX * unit));\n dot.setAttribute('opacity', ANCHOR_OPACITY);\n this.#anchors.appendChild(dot);\n }\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface EndpointCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport function collectEndpointCandidates(svg: SVGSVGElement): EndpointCandidate[] {\n const candidates: EndpointCandidate[] = [];\n\n for (const element of svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary]')) {\n if (element.getAttribute('data-sf-role') === 'link') {\n continue;\n }\n\n const owner = resolveOwner(element);\n if (owner) {\n candidates.push({ owner, bounds: element.getBBox() });\n }\n }\n\n return candidates;\n}\n","import type { Rect, Side } from '../../../model/geometry/types';\n\nconst SIDES: Side[] = ['left', 'right', 'top', 'bottom'];\nconst SIDE_CHANGE_HYSTERESIS = 40;\n\nfunction sideNormal(side: Side): [number, number] {\n switch (side) {\n case 'top':\n return [0, -1];\n case 'right':\n return [1, 0];\n case 'bottom':\n return [0, 1];\n case 'left':\n return [-1, 0];\n }\n}\n\nfunction sideScore(side: Side, vector: { x: number; y: number }): number {\n const normal = sideNormal(side);\n const dotProduct = normal[0] * vector.x + normal[1] * vector.y;\n const horizontalMagnitude = Math.abs(vector.x);\n const verticalMagnitude = Math.abs(vector.y);\n const axisBias =\n side === 'left' || side === 'right'\n ? horizontalMagnitude - verticalMagnitude\n : verticalMagnitude - horizontalMagnitude;\n return dotProduct + 0.5 * axisBias;\n}\n\nfunction localDirection(from: Rect, to: Rect): { x: number; y: number } {\n const fromCenter = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n const toCenter = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n const radians = (-(from.rotation ?? 0) * Math.PI) / 180;\n const cosine = Math.cos(radians);\n const sine = Math.sin(radians);\n const deltaX = toCenter.x - fromCenter.x;\n const deltaY = toCenter.y - fromCenter.y;\n return { x: deltaX * cosine - deltaY * sine, y: deltaX * sine + deltaY * cosine };\n}\n\nexport function chooseSide(from: Rect, to: Rect, stickySide?: Side): Side {\n const direction = localDirection(from, to);\n const bestSide = SIDES.reduce((best, candidate) => {\n return sideScore(candidate, direction) > sideScore(best, direction) ? candidate : best;\n }, 'right');\n if (!stickySide) {\n return bestSide;\n }\n const improvement = sideScore(bestSide, direction) - sideScore(stickySide, direction);\n return improvement > SIDE_CHANGE_HYSTERESIS ? bestSide : stickySide;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { LinkEndpoint } from '../../dom';\nimport { findOwnerNode, isPrimary } from '../../dom';\nimport { chooseSide } from './sideSelection';\n\nexport interface FixedEndpoint {\n point: { x: number; y: number };\n side: Side;\n}\n\ninterface FixedEndpointReference {\n fixedId: string | null;\n draggedId: string | null;\n pathPoint: DOMPoint;\n declaredSide: Side | null;\n}\n\nfunction referenceWhenDraggingFrom(path: SVGPathElement): FixedEndpointReference {\n return {\n fixedId: path.getAttribute('data-sf-to'),\n draggedId: path.getAttribute('data-sf-from'),\n pathPoint: path.getPointAtLength(path.getTotalLength()),\n declaredSide: path.getAttribute('data-sf-to-side') as Side | null,\n };\n}\n\nfunction referenceWhenDraggingTo(path: SVGPathElement): FixedEndpointReference {\n return {\n fixedId: path.getAttribute('data-sf-from'),\n draggedId: path.getAttribute('data-sf-to'),\n pathPoint: path.getPointAtLength(0),\n declaredSide: path.getAttribute('data-sf-from-side') as Side | null,\n };\n}\n\nfunction fixedEndpointReference(path: SVGPathElement, draggedEnd: LinkEndpoint): FixedEndpointReference {\n if (draggedEnd === 'from') {\n return referenceWhenDraggingFrom(path);\n }\n\n return referenceWhenDraggingTo(path);\n}\n\nfunction inferFixedSide(svg: SVGSVGElement, reference: FixedEndpointReference, fixedPrimary: SVGGraphicsElement): Side {\n if (reference.declaredSide) {\n return reference.declaredSide;\n }\n\n const draggedPrimary = reference.draggedId ? findOwnerNode(svg, reference.draggedId, isPrimary) : null;\n if (!draggedPrimary) {\n return 'right';\n }\n\n return chooseSide(fixedPrimary.getBBox(), draggedPrimary.getBBox());\n}\n\nexport function resolveFixedEndpoint(\n svg: SVGSVGElement,\n path: SVGPathElement,\n draggedEnd: LinkEndpoint,\n): FixedEndpoint | null {\n const reference = fixedEndpointReference(path, draggedEnd);\n const fixedPrimary = reference.fixedId ? findOwnerNode(svg, reference.fixedId, isPrimary) : null;\n if (!fixedPrimary) {\n return null;\n }\n\n return {\n point: { x: reference.pathPoint.x, y: reference.pathPoint.y },\n side: inferFixedSide(svg, reference, fixedPrimary),\n };\n}\n","import type { LinkEndpoint } from '../../dom';\nimport { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface SelectedLinkEndpoint {\n captureTarget: Element;\n end: LinkEndpoint;\n path: SVGPathElement;\n linkOwner: OwnerRef;\n}\n\nexport function selectLinkEndpoint(svg: SVGSVGElement, event: PointerEvent): SelectedLinkEndpoint | null {\n const target = event.target as Element | null;\n const end = target?.closest('[data-sf-link-endpoint]')?.getAttribute('data-sf-link-endpoint') as\n | LinkEndpoint\n | null\n | undefined;\n const overlay = target?.closest('[data-sf-selection-overlay]');\n const linkId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!target || !end || !linkId) {\n return null;\n }\n\n const path = findOwnerNode<SVGPathElement>(svg, linkId, isPrimary);\n const linkOwner = path && resolveOwner(path);\n if (!path || !linkOwner) {\n return null;\n }\n\n return { captureTarget: target, end, path, linkOwner };\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport type { LinkEndpoint } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { LinkGhost } from '../linkGhost/ghost';\nimport { collectEndpointCandidates, type EndpointCandidate } from './candidates';\nimport { resolveFixedEndpoint } from './fixedEndpoint';\nimport { selectLinkEndpoint } from './selection';\n\nexport interface LinkEndpointDragState {\n linkOwner: OwnerRef;\n end: LinkEndpoint;\n path: SVGPathElement;\n pathType: PathType;\n strokeWidth: number;\n originalD: string;\n fixedPoint: { x: number; y: number };\n fixedSide: Side;\n candidates: EndpointCandidate[];\n ghost: LinkGhost;\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n hit: { owner: OwnerRef; side: Side; offset: number } | null;\n}\n\nexport function createLinkEndpointDragState(svg: SVGSVGElement, event: PointerEvent): LinkEndpointDragState | null {\n const selection = selectLinkEndpoint(svg, event);\n if (!selection) {\n return null;\n }\n\n const fixedEndpoint = resolveFixedEndpoint(svg, selection.path, selection.end);\n if (!fixedEndpoint) {\n return null;\n }\n\n selection.captureTarget.setPointerCapture?.(event.pointerId);\n return {\n linkOwner: selection.linkOwner,\n end: selection.end,\n path: selection.path,\n pathType: (selection.path.getAttribute('data-sf-route') as PathType | null) ?? 'straight',\n strokeWidth: Number(selection.path.getAttribute('stroke-width')) || 2,\n originalD: selection.path.getAttribute('d') ?? '',\n fixedPoint: fixedEndpoint.point,\n fixedSide: fixedEndpoint.side,\n candidates: collectEndpointCandidates(svg),\n ghost: new LinkGhost(svg, selection.path),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n hit: null,\n };\n}\n","import { pointAtPort, relativeOffsetOnRectangleSide } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\n\nconst SIDES: readonly Side[] = ['top', 'right', 'bottom', 'left'];\n\nexport function nearestPort(bounds: Rect, point: { x: number; y: number }): { side: Side; offset: number } {\n let nearest = { side: 'right' as Side, offset: 0.5 };\n let nearestDistance = Infinity;\n\n for (const side of SIDES) {\n const offset = Math.max(0, Math.min(1, relativeOffsetOnRectangleSide(bounds, side, point)));\n const candidate = pointAtPort(bounds, { side, offset });\n const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = { side, offset };\n }\n }\n return nearest;\n}\n\nexport function sideFromDirection(from: { x: number; y: number }, to: { x: number; y: number }): Side {\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n if (angle >= -Math.PI / 4 && angle < Math.PI / 4) {\n return 'right';\n }\n if (angle >= Math.PI / 4 && angle < (3 * Math.PI) / 4) {\n return 'bottom';\n }\n if (angle >= (-3 * Math.PI) / 4 && angle < -Math.PI / 4) {\n return 'top';\n }\n return 'left';\n}\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { OwnerRef } from '../../viewer';\nimport { nearestPort, sideFromDirection } from '../linkEndpoint/geometry';\n\nconst HOVER_MARGIN_PX = 15;\nconst MAGNET_RADIUS_PX = 16;\n\nexport interface LinkCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport interface LinkHit {\n owner: OwnerRef;\n side: Side;\n offset: number;\n}\n\nexport interface LinkTarget {\n point: { x: number; y: number };\n side: Side;\n hit: LinkHit | null;\n bounds: Rect | null;\n}\n\nfunction distanceToRect(bounds: Rect, point: { x: number; y: number }): number {\n const dx = Math.max(bounds.x - point.x, 0, point.x - (bounds.x + bounds.width));\n const dy = Math.max(bounds.y - point.y, 0, point.y - (bounds.y + bounds.height));\n return Math.hypot(dx, dy);\n}\n\nfunction pickCandidate(\n candidates: readonly LinkCandidate[],\n point: { x: number; y: number },\n margin: number,\n): LinkCandidate | null {\n let containing: LinkCandidate | null = null;\n let nearby: LinkCandidate | null = null;\n let nearbyDistance = Infinity;\n for (const candidate of candidates) {\n const distance = distanceToRect(candidate.bounds, point);\n if (distance === 0) {\n containing = candidate;\n } else if (distance <= margin && distance < nearbyDistance) {\n nearby = candidate;\n nearbyDistance = distance;\n }\n }\n return containing ?? nearby;\n}\n\nexport function snapPort(\n bounds: Rect,\n point: { x: number; y: number },\n unitsPerPx: number,\n): { side: Side; offset: number } {\n const port = nearestPort(bounds, point);\n const sideLength = port.side === 'top' || port.side === 'bottom' ? bounds.width : bounds.height;\n const distanceFromCenter = Math.abs(port.offset - 0.5) * sideLength;\n return distanceFromCenter <= MAGNET_RADIUS_PX * unitsPerPx ? { side: port.side, offset: 0.5 } : port;\n}\n\nexport function resolveLinkTarget(\n candidates: readonly LinkCandidate[],\n fixedPoint: { x: number; y: number },\n point: { x: number; y: number },\n unitsPerPx: number,\n): LinkTarget {\n const candidate = pickCandidate(candidates, point, HOVER_MARGIN_PX * unitsPerPx);\n if (!candidate) {\n return { point, side: sideFromDirection(point, fixedPoint), hit: null, bounds: null };\n }\n const port = snapPort(candidate.bounds, point, unitsPerPx);\n return {\n point: pointAtPort(candidate.bounds, port),\n side: port.side,\n hit: { owner: candidate.owner, side: port.side, offset: port.offset },\n bounds: candidate.bounds,\n };\n}\n","import { type LinkTarget, resolveLinkTarget } from '../linkGhost/target';\nimport type { LinkEndpointDragState } from './state';\n\nexport type EndpointTarget = LinkTarget;\n\nexport function resolveEndpointTarget(\n drag: LinkEndpointDragState,\n point: { x: number; y: number },\n unitsPerPx: number,\n): EndpointTarget {\n const target = resolveLinkTarget(drag.candidates, drag.fixedPoint, point, unitsPerPx);\n drag.hit = target.hit;\n return target;\n}\n","import { isCameraGesture, pxPerUnit } from '../../dom';\nimport type { Emitter } from '../events';\nimport { completeLinkEndpointDrag } from './completion';\nimport { crossedEndpointDragThreshold, endpointPointerPosition } from './pointer';\nimport { updateEndpointPreview } from './preview';\nimport { createLinkEndpointDragState, type LinkEndpointDragState } from './state';\nimport { resolveEndpointTarget } from './target';\n\nexport class LinkEndpointSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: LinkEndpointDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createLinkEndpointDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedEndpointDragThreshold(drag, event)) {\n return;\n }\n\n drag.moved = true;\n const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / pxPerUnit(this.#svg));\n updateEndpointPreview(drag, target.point, target.side);\n drag.ghost.show(target.hit !== null, target.bounds);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n drag.ghost.hide();\n completeLinkEndpointDrag(this.#emitter, drag);\n };\n\n cancel(): void {\n this.#drag?.ghost.hide();\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { LinkEndpointSession } from './linkEndpoint/session';\n\nexport { nearestPort, sideFromDirection } from './linkEndpoint/geometry';\n\nexport interface LinkEndpointDragHandle {\n destroy(): void;\n}\n\nexport function bindLinkEndpointDrag(viewer: Viewer, emitter: Emitter): LinkEndpointDragHandle {\n const svg = viewer.svg;\n const session = new LinkEndpointSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { roundedOrthogonalPathData } from '../../../renderScene/artifacts/link/roundedOrthogonalPathData';\nimport { findOwnerNode, isCameraGesture, isPrimary, pointerUserPoint, pxPerUnit, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { isSnapDisabled } from '../snapGrid';\n\nconst SNAP_PX = 6;\nconst DRAG_THRESHOLD_PX = 3;\nconst GUIDE_COLOR = '#9b42df';\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\ninterface SegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n ox: number;\n oy: number;\n movable: boolean;\n}\n\ninterface SegmentDrag {\n owner: OwnerRef;\n path: SVGPathElement;\n overlay: Element;\n handle: SVGRectElement;\n segments: SegmentData[];\n index: number;\n axis: 'x' | 'y';\n base: number;\n start: number;\n origin: number;\n originalD: string;\n candidates: number[];\n guide: SVGLineElement;\n pointerId: number;\n startClient: { x: number; y: number };\n moved: boolean;\n value: number;\n}\n\nfunction parseSegments(path: SVGPathElement): SegmentData[] {\n try {\n return JSON.parse(path.getAttribute('data-sf-link-segments') ?? '[]') as SegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction snapCandidates(svg: SVGSVGElement, axis: 'x' | 'y', excludeIds: Set<string>): number[] {\n const values: number[] = [];\n svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary][data-sf-id]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n if (!id || node.getAttribute('data-sf-role') === 'link' || excludeIds.has(id)) {\n return;\n }\n const box = node.getBBox();\n if (axis === 'y') {\n values.push(box.y, box.y + box.height / 2, box.y + box.height);\n } else {\n values.push(box.x, box.x + box.width / 2, box.x + box.width);\n }\n });\n return values;\n}\n\nfunction movedSegments(drag: SegmentDrag, value: number): SegmentData[] {\n const next = drag.segments.map(segment => ({ ...segment }));\n const target = next[drag.index];\n const before = next[drag.index - 1];\n const after = next[drag.index + 1];\n if (drag.axis === 'y') {\n target.ay = value;\n target.by = value;\n if (before) {\n before.by = value;\n }\n if (after) {\n after.ay = value;\n }\n } else {\n target.ax = value;\n target.bx = value;\n if (before) {\n before.bx = value;\n }\n if (after) {\n after.ax = value;\n }\n }\n return next;\n}\n\nfunction pathSegments(segments: SegmentData[]) {\n return segments.map(segment => {\n const start = { x: segment.ax, y: segment.ay };\n const end = { x: segment.bx, y: segment.by };\n return {\n start,\n end,\n midpoint: { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 },\n originalMidpoint: { x: segment.ox, y: segment.oy },\n isHorizontal: Math.abs(end.x - start.x) > Math.abs(end.y - start.y),\n canMove: segment.movable,\n };\n });\n}\n\nexport class LinkSegmentSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: SegmentDrag | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n const target = event.target as Element | null;\n const handle = target?.closest('[data-sf-link-segment]') as SVGRectElement | null;\n const overlay = handle?.closest('[data-sf-selection-overlay]');\n const linkId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!handle || !overlay || !linkId) {\n return;\n }\n const path = findOwnerNode<SVGPathElement>(this.#svg, linkId, isPrimary);\n const owner = path && resolveOwner(path);\n const index = Number(handle.getAttribute('data-sf-link-segment'));\n const segments = path ? parseSegments(path) : [];\n const segment = segments[index];\n const point = pointerUserPoint(this.#svg, event);\n if (!path || !owner || !segment || !point) {\n return;\n }\n const axis = handle.getAttribute('data-sf-link-segment-axis') === 'x' ? 'x' : 'y';\n const guide = document.createElementNS(SVG_NAMESPACE, 'line');\n guide.setAttribute('stroke', GUIDE_COLOR);\n guide.setAttribute('stroke-dasharray', '4 4');\n guide.setAttribute('stroke-width', String(1 / pxPerUnit(this.#svg)));\n guide.setAttribute('visibility', 'hidden');\n overlay.appendChild(guide);\n handle.setPointerCapture?.(event.pointerId);\n const current = axis === 'y' ? segment.ay : segment.ax;\n this.#drag = {\n owner,\n path,\n overlay,\n handle,\n segments,\n index,\n axis,\n base: axis === 'y' ? segment.oy : segment.ox,\n start: axis === 'y' ? point.y : point.x,\n origin: current,\n originalD: path.getAttribute('d') ?? '',\n candidates: snapCandidates(this.#svg, axis, new Set([linkId])),\n guide,\n pointerId: event.pointerId,\n startClient: { x: event.clientX, y: event.clientY },\n moved: false,\n value: current,\n };\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n const travelled = Math.hypot(event.clientX - drag.startClient.x, event.clientY - drag.startClient.y);\n if (!drag.moved && travelled < DRAG_THRESHOLD_PX) {\n return;\n }\n drag.moved = true;\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const raw = drag.origin + ((drag.axis === 'y' ? point.y : point.x) - drag.start);\n const { value, snapped } = this.#snap(drag, raw);\n drag.value = value;\n this.#preview(drag, snapped);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n drag.handle.releasePointerCapture?.(drag.pointerId);\n drag.guide.remove();\n if (!drag.moved) {\n return;\n }\n const offset = Math.round((drag.value - drag.base) * 10) / 10;\n this.#emitter.emit('linkSegmentChange', { owner: drag.owner, index: drag.index, offset });\n };\n\n readonly doubleClick = (event: MouseEvent): void => {\n const handle = (event.target as Element | null)?.closest('[data-sf-link-segment]');\n const linkId = handle?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n const path = linkId ? findOwnerNode<SVGPathElement>(this.#svg, linkId, isPrimary) : null;\n const owner = path && resolveOwner(path);\n if (!handle || !owner) {\n return;\n }\n this.#emitter.emit('linkSegmentChange', {\n owner,\n index: Number(handle.getAttribute('data-sf-link-segment')),\n offset: 0,\n });\n };\n\n cancel(): void {\n const drag = this.#drag;\n if (!drag) {\n return;\n }\n drag.path.setAttribute('d', drag.originalD);\n drag.guide.remove();\n this.#drag = null;\n }\n\n #snap(drag: SegmentDrag, raw: number): { value: number; snapped: number | null } {\n if (isSnapDisabled(this.#svg)) {\n return { value: raw, snapped: null };\n }\n const threshold = SNAP_PX / pxPerUnit(this.#svg);\n let best: number | null = null;\n for (const candidate of [drag.base, ...drag.candidates]) {\n const closer = best === null || Math.abs(candidate - raw) < Math.abs(best - raw);\n if (Math.abs(candidate - raw) <= threshold && closer) {\n best = candidate;\n }\n }\n return best === null ? { value: raw, snapped: null } : { value: best, snapped: best };\n }\n\n #preview(drag: SegmentDrag, snapped: number | null): void {\n const next = movedSegments(drag, drag.value);\n const strokeWidth = Number(drag.path.getAttribute('stroke-width')) || 2;\n const data = roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));\n drag.path.setAttribute('d', data);\n drag.overlay.querySelector('path')?.setAttribute('d', data);\n const segment = next[drag.index];\n const width = Number(drag.handle.getAttribute('width'));\n const height = Number(drag.handle.getAttribute('height'));\n drag.handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n drag.handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n const view = this.#svg.viewBox.baseVal;\n if (snapped === null) {\n drag.guide.setAttribute('visibility', 'hidden');\n return;\n }\n drag.guide.setAttribute('visibility', 'visible');\n if (drag.axis === 'y') {\n drag.guide.setAttribute('x1', String(view.x));\n drag.guide.setAttribute('x2', String(view.x + view.width));\n drag.guide.setAttribute('y1', String(snapped));\n drag.guide.setAttribute('y2', String(snapped));\n } else {\n drag.guide.setAttribute('y1', String(view.y));\n drag.guide.setAttribute('y2', String(view.y + view.height));\n drag.guide.setAttribute('x1', String(snapped));\n drag.guide.setAttribute('x2', String(snapped));\n }\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { LinkSegmentSession } from './linkSegment/session';\n\nexport interface LinkSegmentDragHandle {\n destroy(): void;\n}\n\nexport function bindLinkSegmentDrag(viewer: Viewer, emitter: Emitter): LinkSegmentDragHandle {\n const svg = viewer.svg;\n const session = new LinkSegmentSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n svg.addEventListener('dblclick', session.doubleClick);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n svg.removeEventListener('dblclick', session.doubleClick);\n },\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { DraggedCanvasObject } from './types';\n\nexport function offsetBounds(bounds: Rect, dx: number, dy: number): Rect {\n return {\n x: bounds.x + dx,\n y: bounds.y + dy,\n width: bounds.width,\n height: bounds.height,\n };\n}\n\nexport function clampMoveDelta(\n canvasObjects: DraggedCanvasObject[],\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n let minDx = Number.NEGATIVE_INFINITY;\n let maxDx = Number.POSITIVE_INFINITY;\n let minDy = Number.NEGATIVE_INFINITY;\n let maxDy = Number.POSITIVE_INFINITY;\n for (const canvasObject of canvasObjects) {\n const container = canvasObject.containerBounds;\n if (!container) {\n continue;\n }\n const bounds = canvasObject.draggedBounds;\n minDx = Math.max(minDx, container.x - bounds.x);\n maxDx = Math.min(maxDx, container.x + container.width - (bounds.x + bounds.width));\n minDy = Math.max(minDy, container.y - bounds.y);\n maxDy = Math.min(maxDy, container.y + container.height - (bounds.y + bounds.height));\n }\n return {\n dx: minDx <= maxDx ? Math.min(Math.max(dx, minDx), maxDx) : dx,\n dy: minDy <= maxDy ? Math.min(Math.max(dy, minDy), maxDy) : dy,\n };\n}\n","import type { MoveDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function movePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedMoveDragThreshold(drag: MoveDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n\nexport function movePointerDelta(\n svg: SVGSVGElement,\n drag: MoveDragState,\n event: PointerEvent,\n): { dx: number; dy: number } {\n const point = movePointerPosition(svg, event);\n return { dx: point.x - drag.startUser.x, dy: point.y - drag.startUser.y };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { AxisSnap, EdgePoint, RectGuideLine, SnapConfig, SnapResult } from './types';\n\ninterface SnapMatch {\n distance: number;\n delta: number;\n guide: RectGuideLine;\n}\n\nconst TARGET_POINTS: EdgePoint[] = ['min', 'center', 'max'];\n\nfunction edgePoints(minimum: number, size: number): Record<EdgePoint, number> {\n return { min: minimum, center: minimum + size / 2, max: minimum + size };\n}\n\nfunction findHorizontalSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): AxisSnap {\n const sourcePoints = edgePoints(bounds.x, bounds.width);\n let bestMatch: SnapMatch | null = null;\n\n for (const candidate of candidates) {\n const targetPoints = edgePoints(candidate.x, candidate.width);\n for (const sourcePoint of config.activeX) {\n for (const targetPoint of TARGET_POINTS) {\n const distance = Math.abs(sourcePoints[sourcePoint] - targetPoints[targetPoint]);\n if (distance < config.threshold && (!bestMatch || distance < bestMatch.distance)) {\n bestMatch = {\n distance,\n delta: targetPoints[targetPoint] - sourcePoints[sourcePoint],\n guide: {\n orientation: 'vertical',\n position: targetPoints[targetPoint],\n from: Math.min(bounds.y, candidate.y) - config.guideOverhang,\n to: Math.max(bounds.y + bounds.height, candidate.y + candidate.height) + config.guideOverhang,\n },\n };\n }\n }\n }\n }\n\n return { delta: bestMatch?.delta ?? 0, guide: bestMatch?.guide ?? null };\n}\n\nfunction findVerticalSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): AxisSnap {\n const sourcePoints = edgePoints(bounds.y, bounds.height);\n let bestMatch: SnapMatch | null = null;\n\n for (const candidate of candidates) {\n const targetPoints = edgePoints(candidate.y, candidate.height);\n for (const sourcePoint of config.activeY) {\n for (const targetPoint of TARGET_POINTS) {\n const distance = Math.abs(sourcePoints[sourcePoint] - targetPoints[targetPoint]);\n if (distance < config.threshold && (!bestMatch || distance < bestMatch.distance)) {\n bestMatch = {\n distance,\n delta: targetPoints[targetPoint] - sourcePoints[sourcePoint],\n guide: {\n orientation: 'horizontal',\n position: targetPoints[targetPoint],\n from: Math.min(bounds.x, candidate.x) - config.guideOverhang,\n to: Math.max(bounds.x + bounds.width, candidate.x + candidate.width) + config.guideOverhang,\n },\n };\n }\n }\n }\n }\n\n return { delta: bestMatch?.delta ?? 0, guide: bestMatch?.guide ?? null };\n}\n\nexport function computeSnap(bounds: Rect, candidates: Rect[], config: SnapConfig): SnapResult {\n return {\n x: findHorizontalSnap(bounds, candidates, config),\n y: findVerticalSnap(bounds, candidates, config),\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\n\nfunction centerDistance(from: Rect, to: Rect): number {\n const fromCenterX = from.x + from.width / 2;\n const fromCenterY = from.y + from.height / 2;\n const toCenterX = to.x + to.width / 2;\n const toCenterY = to.y + to.height / 2;\n return Math.hypot(toCenterX - fromCenterX, toCenterY - fromCenterY);\n}\n\nexport function nearestCandidates(bounds: Rect, candidates: Rect[], limit = 50): Rect[] {\n return [...candidates]\n .sort((first, second) => centerDistance(bounds, first) - centerDistance(bounds, second))\n .slice(0, limit);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { GuideLine } from '../../dom';\n\ntype Axis = 'x' | 'y';\n\nexport interface GapSnap {\n delta: number;\n guides: GuideLine[];\n}\n\ninterface Span {\n start: number;\n end: number;\n cross: number;\n}\n\n// The objects that lie in one row with the moved one on this axis, in order. An object in the row overlaps it across the axis.\nfunction rowOf(bounds: Rect, candidates: Rect[], axis: Axis): Span[] {\n const [crossStart, crossSize] = axis === 'x' ? (['y', 'height'] as const) : (['x', 'width'] as const);\n const [start, size] = axis === 'x' ? (['x', 'width'] as const) : (['y', 'height'] as const);\n return candidates\n .filter(\n candidate =>\n candidate[crossStart] < bounds[crossStart] + bounds[crossSize] &&\n bounds[crossStart] < candidate[crossStart] + candidate[crossSize],\n )\n .map(candidate => ({\n start: candidate[start],\n end: candidate[start] + candidate[size],\n cross: candidate[crossStart] + candidate[crossSize] / 2,\n }))\n .sort((first, second) => first.start - second.start);\n}\n\nfunction segment(axis: Axis, from: number, to: number, cross: number): GuideLine {\n return axis === 'x'\n ? { orientation: 'segment', x1: from, y1: cross, x2: to, y2: cross }\n : { orientation: 'segment', x1: cross, y1: from, x2: cross, y2: to };\n}\n\nfunction axisGapSnap(bounds: Rect, candidates: Rect[], axis: Axis, threshold: number): GapSnap | null {\n const row = rowOf(bounds, candidates, axis);\n const start = axis === 'x' ? bounds.x : bounds.y;\n const size = axis === 'x' ? bounds.width : bounds.height;\n const center = start + size / 2;\n const before = row.filter(span => (span.start + span.end) / 2 < center).at(-1);\n const after = row.find(span => (span.start + span.end) / 2 >= center);\n const pairs = row\n .slice(1)\n .map((span, index) => ({ first: row[index], second: span, gap: span.start - row[index].end }));\n\n let best: GapSnap | null = null;\n const consider = (target: number, guides: GuideLine[]) => {\n const delta = target - start;\n if (Math.abs(delta) < threshold && (!best || Math.abs(delta) < Math.abs(best.delta))) {\n best = { delta, guides };\n }\n };\n\n // Halfway between its two neighbors.\n if (before && after) {\n const target = (before.end + after.start - size) / 2;\n if (target >= before.end) {\n consider(target, [\n segment(axis, before.end, target, before.cross),\n segment(axis, target + size, after.start, after.cross),\n ]);\n }\n }\n // As far from a neighbor as two other objects of the row are from each other.\n for (const { first, second, gap } of pairs) {\n if (gap <= 0) {\n continue;\n }\n const existing = segment(axis, first.end, second.start, first.cross);\n if (before) {\n consider(before.end + gap, [existing, segment(axis, before.end, before.end + gap, before.cross)]);\n }\n if (after) {\n consider(after.start - gap - size, [existing, segment(axis, after.start - gap, after.start, after.cross)]);\n }\n }\n return best;\n}\n\nexport function computeGapSnap(\n bounds: Rect,\n candidates: Rect[],\n threshold: number,\n): { x: GapSnap | null; y: GapSnap | null } {\n return {\n x: axisGapSnap(bounds, candidates, 'x', threshold),\n y: axisGapSnap(bounds, candidates, 'y', threshold),\n };\n}\n","import { AXIS_COS, AXIS_SIN } from '../../../model/isometricObject';\nimport type { GuideLine } from '../../dom';\n\nexport interface IsometricApexCandidate {\n apex: { x: number; y: number };\n}\n\nexport interface IsometricDiagonalSnap {\n dx: number;\n dy: number;\n guide: GuideLine;\n}\n\nconst AXES: ReadonlyArray<{ x: number; y: number }> = [\n { x: AXIS_COS, y: AXIS_SIN },\n { x: -AXIS_COS, y: AXIS_SIN },\n];\n\nconst GUIDE_OVERHANG = 40;\n\nexport function snapIsometricDiagonal(\n apex: { x: number; y: number },\n rawDx: number,\n rawDy: number,\n candidates: readonly IsometricApexCandidate[],\n threshold: number,\n): IsometricDiagonalSnap | null {\n const moved = { x: apex.x + rawDx, y: apex.y + rawDy };\n let best: { distance: number; corrected: { x: number; y: number }; guide: GuideLine } | null = null;\n\n for (const candidate of candidates) {\n for (const dir of AXES) {\n const rel = { x: moved.x - candidate.apex.x, y: moved.y - candidate.apex.y };\n const along = rel.x * dir.x + rel.y * dir.y;\n const perpX = rel.x - along * dir.x;\n const perpY = rel.y - along * dir.y;\n const distance = Math.hypot(perpX, perpY);\n if (distance < threshold && (!best || distance < best.distance)) {\n const corrected = { x: moved.x - perpX, y: moved.y - perpY };\n const from = { x: candidate.apex.x - dir.x * GUIDE_OVERHANG, y: candidate.apex.y - dir.y * GUIDE_OVERHANG };\n const to = { x: corrected.x + dir.x * GUIDE_OVERHANG, y: corrected.y + dir.y * GUIDE_OVERHANG };\n best = {\n distance,\n corrected,\n guide: { orientation: 'segment', x1: from.x, y1: from.y, x2: to.x, y2: to.y },\n };\n }\n }\n }\n\n if (!best) {\n return null;\n }\n return { dx: rawDx + (best.corrected.x - moved.x), dy: rawDy + (best.corrected.y - moved.y), guide: best.guide };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { EdgePoint, SnapResult } from './types';\n\nexport function resizeActivePoints(axisMove: 'left' | 'right' | 'top' | 'bottom' | 'none'): EdgePoint[] {\n if (axisMove === 'none') {\n return [];\n }\n return axisMove === 'left' || axisMove === 'top' ? ['min'] : ['max'];\n}\n\nexport function applyAxisSnap(\n bounds: Rect,\n moveX: 'left' | 'right' | 'none',\n moveY: 'top' | 'bottom' | 'none',\n snap: SnapResult,\n minSize: number,\n): Rect {\n let { x, y, width, height } = bounds;\n if (moveX === 'left' && snap.x.delta) {\n x += snap.x.delta;\n width -= snap.x.delta;\n } else if (moveX === 'right' && snap.x.delta) {\n width += snap.x.delta;\n }\n if (moveY === 'top' && snap.y.delta) {\n y += snap.y.delta;\n height -= snap.y.delta;\n } else if (moveY === 'bottom' && snap.y.delta) {\n height += snap.y.delta;\n }\n return { x, y, width: Math.max(minSize, width), height: Math.max(minSize, height) };\n}\n","import type { GuideLine } from '../../dom';\n\nexport type EdgePoint = 'min' | 'center' | 'max';\n\nexport type RectGuideLine = Extract<GuideLine, { orientation: 'vertical' | 'horizontal' }>;\n\nexport interface AxisSnap {\n delta: number;\n guide: RectGuideLine | null;\n}\n\nexport interface SnapResult {\n x: AxisSnap;\n y: AxisSnap;\n}\n\nexport interface SnapConfig {\n threshold: number;\n activeX: EdgePoint[];\n activeY: EdgePoint[];\n guideOverhang: number;\n}\n\nexport const MOVE_ACTIVE_POINTS: EdgePoint[] = ['min', 'center', 'max'];\n","import { AXIS_COS } from '../../../model/isometricObject';\nimport type { GuideLine } from '../../dom';\nimport {\n findIsometricApexCandidates,\n findOwnerNode,\n findSnapCandidateBounds,\n isometricGeometryOf,\n isPrimary,\n pxPerUnit,\n} from '../../dom';\nimport type { AxisSnap, GapSnap } from '../snapGeometry';\nimport {\n computeGapSnap,\n computeSnap,\n MOVE_ACTIVE_POINTS,\n nearestCandidates,\n snapIsometricDiagonal,\n} from '../snapGeometry';\nimport { isSnapDisabled, nearestIsometricLatticePoint, readIsometricSnapStep, snapDistancePx } from '../snapGrid';\nimport { offsetBounds } from './geometry';\nimport type { MoveDragState } from './state';\n\nconst GUIDE_OVERHANG = 10;\n\nexport interface MoveDelta {\n dx: number;\n dy: number;\n guides: GuideLine[];\n}\n\nfunction isometricApexOf(svg: SVGSVGElement, drag: MoveDragState, declared = false): { x: number; y: number } | null {\n if (drag.canvasObjects.length !== 1) {\n return null;\n }\n const lead = drag.canvasObjects[0];\n if (lead.owner.role !== 'isometric') {\n return null;\n }\n const primary = findOwnerNode(svg, lead.owner.id, isPrimary);\n const geometry = primary && isometricGeometryOf(primary);\n if (!geometry) {\n return null;\n }\n const frame = declared && geometry.bounds ? geometry.bounds : lead.draggedBounds;\n return { x: frame.x + geometry.depth * AXIS_COS, y: frame.y };\n}\n\nfunction snapIsometricGrid(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta | null {\n const step = readIsometricSnapStep(svg);\n const apex = step ? isometricApexOf(svg, drag, true) : null;\n if (!step || !apex) {\n return null;\n }\n const lattice = nearestIsometricLatticePoint({ x: apex.x + rawDx, y: apex.y + rawDy }, step);\n return { dx: lattice.x - apex.x, dy: lattice.y - apex.y, guides: [] };\n}\n\nfunction snapIsometricMove(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta | null {\n const apex = isometricApexOf(svg, drag);\n if (!apex) {\n return null;\n }\n const excludedIds = new Set(drag.canvasObjects.map(canvasObject => canvasObject.owner.id));\n const candidates = findIsometricApexCandidates(svg, excludedIds);\n const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / pxPerUnit(svg));\n return snap ? { dx: snap.dx, dy: snap.dy, guides: [snap.guide] } : null;\n}\n\nexport function snapMove(svg: SVGSVGElement, drag: MoveDragState, rawDx: number, rawDy: number): MoveDelta {\n if (isSnapDisabled(svg)) {\n return { dx: rawDx, dy: rawDy, guides: [] };\n }\n const isometricSnap = snapIsometricMove(svg, drag, rawDx, rawDy);\n if (isometricSnap) {\n return isometricSnap;\n }\n const gridSnap = snapIsometricGrid(svg, drag, rawDx, rawDy);\n if (gridSnap) {\n return gridSnap;\n }\n\n const leadBounds = offsetBounds(drag.canvasObjects[0].draggedBounds, rawDx, rawDy);\n const excludedIds = new Set(drag.canvasObjects.map(canvasObject => canvasObject.owner.id));\n const candidates = nearestCandidates(leadBounds, findSnapCandidateBounds(svg, excludedIds));\n const threshold = snapDistancePx(svg) / pxPerUnit(svg);\n const snap = computeSnap(leadBounds, candidates, {\n threshold,\n activeX: MOVE_ACTIVE_POINTS,\n activeY: MOVE_ACTIVE_POINTS,\n guideOverhang: GUIDE_OVERHANG,\n });\n // On each axis the nearer of the two wins: lining up with an edge, or keeping the gaps of a row equal.\n const gaps = computeGapSnap(leadBounds, candidates, threshold);\n const pick = (align: AxisSnap, gap: GapSnap | null): GapSnap => {\n if (gap && (!align.guide || Math.abs(gap.delta) < Math.abs(align.delta))) {\n return gap;\n }\n return { delta: align.delta, guides: align.guide ? [align.guide] : [] };\n };\n const x = pick(snap.x, gaps.x);\n const y = pick(snap.y, gaps.y);\n return { dx: rawDx + x.delta, dy: rawDy + y.delta, guides: [...x.guides, ...y.guides] };\n}\n","import type { Emitter } from '../events';\nimport { clampMoveDelta } from './geometry';\nimport { movePointerDelta } from './pointer';\nimport { snapMove } from './snapping';\nimport type { MoveDragState } from './state';\n\nexport function emitMoveCompletion(\n svg: SVGSVGElement,\n emitter: Emitter,\n drag: MoveDragState,\n event: PointerEvent,\n): void {\n if (!drag.moved) {\n return;\n }\n\n const rawDelta = movePointerDelta(svg, drag, event);\n const snapped = snapMove(svg, drag, rawDelta.dx, rawDelta.dy);\n const { dx, dy } = clampMoveDelta(drag.canvasObjects, snapped.dx, snapped.dy);\n for (const canvasObject of drag.canvasObjects) {\n emitter.emit('moveChange', { owner: canvasObject.owner, dx, dy });\n }\n}\n","import { updateLiveFaceLinks, updateLiveLinks } from '../linkPreview';\nimport { offsetBounds } from './geometry';\nimport type { MoveDragState } from './state';\n\nfunction translateNodes(nodes: SVGGraphicsElement[], baseTransforms: (string | null)[], dx: number, dy: number): void {\n nodes.forEach((node, index) => {\n const base = baseTransforms[index];\n node.setAttribute('transform', base ? `translate(${dx} ${dy}) ${base}` : `translate(${dx} ${dy})`);\n });\n}\n\nexport function applyMovePreview(drag: MoveDragState, dx: number, dy: number): void {\n for (const canvasObject of drag.canvasObjects) {\n translateNodes(canvasObject.nodes, canvasObject.baseTransforms, dx, dy);\n translateNodes(canvasObject.overlays, canvasObject.overlayBaseTransforms, dx, dy);\n const bounds = offsetBounds(canvasObject.draggedBounds, dx, dy);\n updateLiveLinks(canvasObject.liveLinks, bounds);\n if (canvasObject.isometricSize) {\n updateLiveFaceLinks(canvasObject.liveFaceLinks, { x: bounds.x, y: bounds.y, ...canvasObject.isometricSize });\n }\n }\n for (const link of drag.internalLinks) {\n translateNodes(link.nodes, link.baseTransforms, dx, dy);\n }\n}\n","import { DERIVED_HEIGHT_ROLES } from '../dom';\nimport type { OwnerRef } from '../viewer';\n\nconst GEOMETRY_ROLES: ReadonlySet<string> = new Set(['shape', 'chart', 'frame', 'swimlane', 'isometric', 'widget']);\nconst COMPOSITE_ROLES: ReadonlySet<string> = new Set(['chart']);\nconst MOVABLE_ROLES: ReadonlySet<string> = new Set([...GEOMETRY_ROLES, 'path']);\n\nexport function hasEditableGeometry(owner: OwnerRef | null | undefined): owner is OwnerRef {\n return owner !== null && owner !== undefined && GEOMETRY_ROLES.has(owner.role);\n}\n\nexport function hasMovableGeometry(owner: OwnerRef | null | undefined): owner is OwnerRef {\n return owner !== null && owner !== undefined && MOVABLE_ROLES.has(owner.role);\n}\n\nexport function isCompositeOwner(owner: OwnerRef | null | undefined): boolean {\n return owner !== null && owner !== undefined && COMPOSITE_ROLES.has(owner.role);\n}\n\nexport function hasDerivedHeight(owner: OwnerRef | null | undefined): boolean {\n return owner !== null && owner !== undefined && DERIVED_HEIGHT_ROLES.has(owner.role);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { findAllOwnerNodes, findOwnerNode, isometricGeometryOf, isPrimary } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { findLiveFaceLinks, findLiveLinks } from '../linkPreview';\nimport type { DraggedCanvasObject, IsometricLiveSize } from './types';\n\nfunction externalLiveLinks(svg: SVGSVGElement, ownerId: string, groupIds: Set<string>, bounds: Rect) {\n return findLiveLinks(svg, ownerId, bounds).filter(link => {\n const otherId = link.path.getAttribute(link.draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n return !otherId || !groupIds.has(otherId);\n });\n}\n\nfunction externalLiveFaceLinks(svg: SVGSVGElement, ownerId: string, groupIds: Set<string>) {\n return findLiveFaceLinks(svg, ownerId).filter(link => {\n const otherId = link.path.getAttribute(link.draggedIsFrom ? 'data-sf-to' : 'data-sf-from');\n return !otherId || !groupIds.has(otherId);\n });\n}\n\nfunction parentContainerBounds(\n svg: SVGSVGElement,\n primary: SVGGraphicsElement,\n groupIds: Set<string>,\n): Rect | undefined {\n const parentId = primary.getAttribute('data-sf-parent-frame');\n if (!parentId || groupIds.has(parentId)) {\n return undefined;\n }\n const container = findOwnerNode(svg, parentId, isPrimary);\n if (!container || container.getAttribute('data-sf-kind') === 'screen') {\n return undefined;\n }\n const bbox = container.getBBox();\n return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n}\n\nfunction captureCanvasObject(svg: SVGSVGElement, owner: OwnerRef, groupIds: Set<string>): DraggedCanvasObject | null {\n const nodes = findAllOwnerNodes(svg, owner.id);\n const primary = findOwnerNode(svg, owner.id, isPrimary);\n if (!nodes.length || !primary) {\n return null;\n }\n\n const overlays = [...svg.querySelectorAll<SVGGElement>(`[data-sf-selection-overlay=\"${CSS.escape(owner.id)}\"]`)];\n const draggedBounds = primary.getBBox();\n const isometricGeometry = owner.role === 'isometric' ? isometricGeometryOf(primary) : null;\n const isometricSize: IsometricLiveSize | undefined = isometricGeometry\n ? { width: isometricGeometry.width, height: isometricGeometry.height, depth: isometricGeometry.depth }\n : undefined;\n return {\n owner,\n nodes,\n baseTransforms: nodes.map(node => node.getAttribute('transform')),\n overlays,\n overlayBaseTransforms: overlays.map(overlay => overlay.getAttribute('transform')),\n draggedBounds,\n liveLinks: externalLiveLinks(svg, owner.id, groupIds, draggedBounds),\n liveFaceLinks: isometricSize ? externalLiveFaceLinks(svg, owner.id, groupIds) : [],\n isometricSize,\n containerBounds: parentContainerBounds(svg, primary, groupIds),\n };\n}\n\nexport function captureDraggedCanvasObjects(\n svg: SVGSVGElement,\n group: OwnerRef[],\n groupIds: Set<string>,\n): DraggedCanvasObject[] {\n const canvasObjects: DraggedCanvasObject[] = [];\n for (const owner of group) {\n const canvasObject = captureCanvasObject(svg, owner, groupIds);\n if (canvasObject) {\n canvasObjects.push(canvasObject);\n }\n }\n return canvasObjects;\n}\n","import { findAllOwnerNodes } from '../../dom';\nimport type { TransformedNodes } from './types';\n\nfunction belongsToMoveGroup(path: SVGPathElement, groupIds: Set<string>): boolean {\n const from = path.getAttribute('data-sf-from');\n const to = path.getAttribute('data-sf-to');\n return Boolean(from && to && groupIds.has(from) && groupIds.has(to));\n}\n\nexport function captureInternalLinks(svg: SVGSVGElement, groupIds: Set<string>): TransformedNodes[] {\n if (groupIds.size < 2) {\n return [];\n }\n\n const links: TransformedNodes[] = [];\n for (const path of svg.querySelectorAll<SVGPathElement>('path[data-sf-from][data-sf-to]')) {\n const linkId = path.getAttribute('data-sf-id');\n if (!linkId || !belongsToMoveGroup(path, groupIds)) {\n continue;\n }\n const nodes = findAllOwnerNodes(svg, linkId);\n if (nodes.length) {\n links.push({ nodes, baseTransforms: nodes.map(node => node.getAttribute('transform')) });\n }\n }\n return links;\n}\n","import type { Rect } from '../../model/geometry/types';\n\nexport const CONTAINER_ROLES: ReadonlySet<string> = new Set(['frame', 'swimlane']);\n\nexport function childrenUnionBounds(svg: SVGSVGElement, containerId: string): Rect | undefined {\n const nodes = svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-parent-frame=\"${CSS.escape(containerId)}\"]`);\n let result: Rect | undefined;\n nodes.forEach(node => {\n const bbox = node.getBBox();\n if (!result) {\n result = { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };\n return;\n }\n const minX = Math.min(result.x, bbox.x);\n const minY = Math.min(result.y, bbox.y);\n const maxX = Math.max(result.x + result.width, bbox.x + bbox.width);\n const maxY = Math.max(result.y + result.height, bbox.y + bbox.height);\n result = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n });\n return result;\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef, Viewer } from '../../viewer';\nimport { CONTAINER_ROLES } from '../containerGeometry';\nimport { hasMovableGeometry } from '../geometryRoles';\n\nfunction containedChildren(viewer: Viewer, owner: OwnerRef): OwnerRef[] {\n if (!CONTAINER_ROLES.has(owner.role)) {\n return [];\n }\n const nodes = viewer.svg.querySelectorAll(`[data-sf-parent-frame=\"${CSS.escape(owner.id)}\"]`);\n return [...nodes].map(node => resolveOwner(node)).filter((ref): ref is OwnerRef => ref !== null);\n}\n\nexport function selectedMoveGroup(viewer: Viewer, owner: OwnerRef): OwnerRef[] {\n const selection = viewer.getSelection();\n const isMultiSelect = selection.length > 1 && selection.some(selected => selected.id === owner.id);\n if (isMultiSelect) {\n return selection.filter(hasMovableGeometry);\n }\n return [owner, ...containedChildren(viewer, owner)];\n}\n","import { resolveOwner } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport { hasMovableGeometry } from '../geometryRoles';\nimport { captureDraggedCanvasObjects } from './canvasObjectCapture';\nimport { captureInternalLinks } from './internalLinkCapture';\nimport { selectedMoveGroup } from './selection';\nimport type { MoveDragState } from './types';\n\nfunction isChartInteractiveMark(target: Element | null): boolean {\n return target?.closest?.('[data-sf-value-index], [data-sf-prop-kind=\"value\"], [data-sf-mark]') != null;\n}\n\nexport function createMoveDragState(\n viewer: Viewer,\n event: PointerEvent,\n startUser: { x: number; y: number },\n): MoveDragState | null {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!hasMovableGeometry(owner) || isChartInteractiveMark(target)) {\n return null;\n }\n\n const group = selectedMoveGroup(viewer, owner);\n const groupIds = new Set(group.map(member => member.id));\n const canvasObjects = captureDraggedCanvasObjects(viewer.svg, group, groupIds);\n if (!canvasObjects.length) {\n return null;\n }\n\n (target as SVGGraphicsElement)?.setPointerCapture?.(event.pointerId);\n return {\n canvasObjects,\n internalLinks: captureInternalLinks(viewer.svg, groupIds),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n startUser,\n moved: false,\n };\n}\n\nexport type { DraggedCanvasObject, MoveDragState } from './types';\n","import { clearAlignmentGuides, isCameraGesture, updateAlignmentGuides } from '../../dom';\nimport type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { emitMoveCompletion } from './completion';\nimport { clampMoveDelta } from './geometry';\nimport { crossedMoveDragThreshold, movePointerDelta, movePointerPosition } from './pointer';\nimport { applyMovePreview } from './preview';\nimport { snapMove } from './snapping';\nimport { createMoveDragState, type MoveDragState } from './state';\n\nconst MOVE_GUIDE_COLOR = '#8b5cf6';\n\nexport class MoveSession {\n readonly #viewer: Viewer;\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: MoveDragState | null = null;\n\n constructor(viewer: Viewer, emitter: Emitter) {\n this.#viewer = viewer;\n this.#svg = viewer.svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createMoveDragState(this.#viewer, event, movePointerPosition(this.#svg, event));\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedMoveDragThreshold(drag, event)) {\n return;\n }\n\n drag.moved = true;\n const rawDelta = movePointerDelta(this.#svg, drag, event);\n const delta = snapMove(this.#svg, drag, rawDelta.dx, rawDelta.dy);\n const clamped = clampMoveDelta(drag.canvasObjects, delta.dx, delta.dy);\n applyMovePreview(drag, clamped.dx, clamped.dy);\n updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n clearAlignmentGuides(this.#svg);\n emitMoveCompletion(this.#svg, this.#emitter, drag, event);\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { MoveSession } from './move/session';\n\nexport interface MoveDragHandle {\n destroy(): void;\n}\n\nexport function bindShapeMovement(viewer: Viewer, emitter: Emitter): MoveDragHandle {\n const svg = viewer.svg;\n const session = new MoveSession(viewer, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { hasMovableGeometry } from './geometryRoles';\n\nexport interface NudgeSelectionHandle {\n destroy(): void;\n}\n\nconst STEP = 1;\nconst SHIFT_STEP = 10;\n\nconst DIRECTIONS: Record<string, { x: number; y: number }> = {\n ArrowLeft: { x: -1, y: 0 },\n ArrowRight: { x: 1, y: 0 },\n ArrowUp: { x: 0, y: -1 },\n ArrowDown: { x: 0, y: 1 },\n};\n\nfunction typingInField(event: KeyboardEvent): boolean {\n return event.target instanceof Element && event.target.closest('input, textarea, [contenteditable=\"true\"]') !== null;\n}\n\nexport function bindNudgeSelection(viewer: Viewer, emitter: Emitter): NudgeSelectionHandle {\n const svg = viewer.svg;\n\n const onKeyDown = (e: KeyboardEvent) => {\n const direction = DIRECTIONS[e.key];\n if (!direction || e.altKey || e.ctrlKey || e.metaKey || typingInField(e)) {\n return;\n }\n const owners = viewer.getSelection().filter(hasMovableGeometry);\n if (!owners.length) {\n return;\n }\n e.preventDefault();\n const step = e.shiftKey ? SHIFT_STEP : STEP;\n for (const owner of owners) {\n emitter.emit('moveChange', { owner, dx: direction.x * step, dy: direction.y * step });\n }\n };\n\n svg.addEventListener('keydown', onKeyDown);\n\n return {\n destroy() {\n svg.removeEventListener('keydown', onKeyDown);\n },\n };\n}\n","import type { RectGuideLine } from '../snapGeometry';\n\nexport interface DrawPoint {\n x: number;\n y: number;\n}\n\nexport const MIN_POINTS_TO_CLOSE = 3;\nexport const MIN_POINTS_OPEN = 2;\n\nexport function isCloseToStart(points: readonly DrawPoint[], cursor: DrawPoint, snapDistanceUnits: number): boolean {\n if (points.length < MIN_POINTS_TO_CLOSE) {\n return false;\n }\n const start = points[0];\n return Math.hypot(cursor.x - start.x, cursor.y - start.y) <= snapDistanceUnits;\n}\n\nconst EIGHTH_TURN = Math.PI / 4;\n\nexport function snapTo45Degrees(reference: DrawPoint, point: DrawPoint): DrawPoint {\n const dx = point.x - reference.x;\n const dy = point.y - reference.y;\n const distance = Math.hypot(dx, dy);\n if (distance === 0) {\n return point;\n }\n const angle = Math.round(Math.atan2(dy, dx) / EIGHTH_TURN) * EIGHTH_TURN;\n return { x: reference.x + Math.cos(angle) * distance, y: reference.y + Math.sin(angle) * distance };\n}\n\nexport interface SessionGuideSnap {\n point: DrawPoint;\n guide: RectGuideLine | null;\n}\n\nexport function snapToSessionGuides(\n last: DrawPoint,\n angleSnapped: DrawPoint,\n priorPoints: readonly DrawPoint[],\n raw: DrawPoint,\n snapRadiusUnits: number,\n): SessionGuideSnap {\n const rayX = angleSnapped.x - last.x;\n const rayY = angleSnapped.y - last.y;\n const length = Math.hypot(rayX, rayY);\n if (length === 0) {\n return { point: angleSnapped, guide: null };\n }\n const ux = rayX / length;\n const uy = rayY / length;\n\n let best: { point: DrawPoint; guide: RectGuideLine; distance: number } | null = null;\n for (const prior of priorPoints) {\n if (Math.abs(ux) > 1e-8) {\n const t = (prior.x - last.x) / ux;\n if (t >= 0) {\n const point = { x: prior.x, y: last.y + uy * t };\n const distance = Math.hypot(point.x - raw.x, point.y - raw.y);\n if (distance <= snapRadiusUnits && (!best || distance < best.distance)) {\n best = {\n point,\n guide: {\n orientation: 'vertical',\n position: prior.x,\n from: Math.min(prior.y, point.y),\n to: Math.max(prior.y, point.y),\n },\n distance,\n };\n }\n }\n }\n if (Math.abs(uy) > 1e-8) {\n const t = (prior.y - last.y) / uy;\n if (t >= 0) {\n const point = { x: last.x + ux * t, y: prior.y };\n const distance = Math.hypot(point.x - raw.x, point.y - raw.y);\n if (distance <= snapRadiusUnits && (!best || distance < best.distance)) {\n best = {\n point,\n guide: {\n orientation: 'horizontal',\n position: prior.y,\n from: Math.min(prior.x, point.x),\n to: Math.max(prior.x, point.x),\n },\n distance,\n };\n }\n }\n }\n }\n return best ? { point: best.point, guide: best.guide } : { point: angleSnapped, guide: null };\n}\n","import { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\nimport type { PathDrawState } from './state';\n\nconst PREVIEW_COLOR = '#9b42df';\nconst LINE_WIDTH_PX = 2;\nconst DASH_PX = 6;\nconst GAP_PX = 4;\nconst POINT_RADIUS_PX = 4;\nconst START_POINT_RADIUS_PX = 6;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport function createPathDrawPreview(svg: SVGSVGElement): { group: SVGGElement; line: SVGPathElement } {\n const document = svg.ownerDocument;\n const group = document.createElementNS(SVG_NAMESPACE, 'g') as SVGGElement;\n group.setAttribute('pointer-events', 'none');\n const line = document.createElementNS(SVG_NAMESPACE, 'path') as SVGPathElement;\n line.setAttribute('fill', 'none');\n line.setAttribute('stroke', PREVIEW_COLOR);\n line.setAttribute('stroke-linecap', 'round');\n line.setAttribute('stroke-linejoin', 'round');\n group.appendChild(line);\n return { group, line };\n}\n\nfunction pointMarker(svg: SVGSVGElement, point: { x: number; y: number }, highlighted: boolean): SVGCircleElement {\n const document = svg.ownerDocument;\n const unit = 1 / pxPerUnit(svg);\n const circle = document.createElementNS(SVG_NAMESPACE, 'circle') as SVGCircleElement;\n circle.setAttribute('cx', String(point.x));\n circle.setAttribute('cy', String(point.y));\n circle.setAttribute('r', String((highlighted ? START_POINT_RADIUS_PX : POINT_RADIUS_PX) * unit));\n circle.setAttribute('fill', highlighted ? PREVIEW_COLOR : '#ffffff');\n circle.setAttribute('stroke', PREVIEW_COLOR);\n circle.setAttribute('stroke-width', String(POINT_STROKE_WIDTH_PX * unit));\n return circle;\n}\n\nexport function updatePathDrawPreview(svg: SVGSVGElement, state: PathDrawState): void {\n const { previewLine, previewGroup } = state;\n if (!previewLine || !previewGroup) {\n return;\n }\n const unit = 1 / pxPerUnit(svg);\n previewLine.setAttribute('stroke-width', String(LINE_WIDTH_PX * unit));\n previewLine.setAttribute('stroke-dasharray', `${DASH_PX * unit} ${GAP_PX * unit}`);\n\n const live = state.cursor ? [...state.points, state.cursor] : state.points;\n previewLine.setAttribute('d', freeformPathData({ points: live, tension: state.tension, closed: false }));\n\n while (previewGroup.childNodes.length > 1) {\n previewGroup.lastChild?.remove();\n }\n state.points.forEach((point, index) => {\n previewGroup.appendChild(pointMarker(svg, point, index === 0 && state.willClose));\n });\n}\n","import type { DrawPoint } from './geometry';\n\nexport interface PathDrawState {\n active: boolean;\n points: DrawPoint[];\n cursor: DrawPoint | null;\n willClose: boolean;\n tension: number;\n onExit: (() => void) | null;\n previewGroup: SVGGElement | null;\n previewLine: SVGPathElement | null;\n lastDown: { time: number; x: number; y: number } | null;\n}\n\nexport function createIdlePathDrawState(): PathDrawState {\n return {\n active: false,\n points: [],\n cursor: null,\n willClose: false,\n tension: 0,\n onExit: null,\n previewGroup: null,\n previewLine: null,\n lastDown: null,\n };\n}\n","import {\n clearAlignmentGuides,\n type GuideLine,\n isCameraGesture,\n pointerUserPoint,\n pxPerUnit,\n updateAlignmentGuides,\n} from '../../dom';\nimport type { Emitter } from '../events';\nimport {\n type DrawPoint,\n isCloseToStart,\n MIN_POINTS_OPEN,\n MIN_POINTS_TO_CLOSE,\n snapTo45Degrees,\n snapToSessionGuides,\n} from './geometry';\nimport { createPathDrawPreview, updatePathDrawPreview } from './preview';\nimport { createIdlePathDrawState, type PathDrawState } from './state';\n\nexport interface PathDrawOptions {\n tension?: number;\n onExit?: () => void;\n}\n\nconst CLOSE_SNAP_PX = 12;\nconst GUIDE_SNAP_PX = 14;\nconst GUIDE_COLOR = '#4CAF50';\nconst DOUBLE_CLICK_MS = 400;\nconst DOUBLE_CLICK_PX = 10;\n\nexport class PathDrawSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #state: PathDrawState = createIdlePathDrawState();\n #shiftHeld = false;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(options: PathDrawOptions = {}): void {\n if (this.#state.active) {\n this.#reset(false);\n }\n const { group, line } = createPathDrawPreview(this.#svg);\n this.#svg.appendChild(group);\n this.#state = {\n ...createIdlePathDrawState(),\n active: true,\n tension: options.tension ?? 0,\n onExit: options.onExit ?? null,\n previewGroup: group,\n previewLine: line,\n };\n }\n\n cancel(): void {\n if (this.#state.active) {\n this.#reset(true);\n }\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (!this.#state.active || event.button !== 0 || isCameraGesture(event)) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n\n const now = Date.now();\n const last = this.#state.lastDown;\n this.#state.lastDown = { time: now, x: event.clientX, y: event.clientY };\n if (\n last &&\n now - last.time < DOUBLE_CLICK_MS &&\n Math.hypot(event.clientX - last.x, event.clientY - last.y) < DOUBLE_CLICK_PX\n ) {\n return;\n }\n\n const resolved = this.#resolvePoint(point);\n if (resolved.willClose) {\n this.#commit(true);\n return;\n }\n\n this.#state.points = [...this.#state.points, resolved.point];\n this.#state.cursor = resolved.point;\n this.#state.willClose = false;\n updatePathDrawPreview(this.#svg, this.#state);\n clearAlignmentGuides(this.#svg);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const resolved = this.#resolvePoint(point);\n this.#state.cursor = resolved.point;\n this.#state.willClose = resolved.willClose;\n updatePathDrawPreview(this.#svg, this.#state);\n if (resolved.guide) {\n updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR);\n } else {\n clearAlignmentGuides(this.#svg);\n }\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n };\n\n readonly dblClick = (event: MouseEvent): void => {\n if (!this.#state.active) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n if (this.#state.points.length >= MIN_POINTS_OPEN) {\n this.#commit(false);\n }\n };\n\n readonly keyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Shift') {\n this.#shiftHeld = true;\n }\n if (!this.#state.active) {\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.#reset(true);\n } else if (event.key === 'Enter' && this.#state.points.length >= MIN_POINTS_OPEN) {\n event.preventDefault();\n this.#commit(false);\n } else if (event.key === 'Backspace' && this.#state.points.length > 0) {\n event.preventDefault();\n this.#state.points = this.#state.points.slice(0, -1);\n const closeSnapUnits = CLOSE_SNAP_PX / pxPerUnit(this.#svg);\n this.#state.willClose = this.#state.cursor\n ? isCloseToStart(this.#state.points, this.#state.cursor, closeSnapUnits)\n : false;\n updatePathDrawPreview(this.#svg, this.#state);\n clearAlignmentGuides(this.#svg);\n }\n };\n\n readonly keyUp = (event: KeyboardEvent): void => {\n if (event.key === 'Shift') {\n this.#shiftHeld = false;\n }\n };\n\n #resolvePoint(raw: DrawPoint): { point: DrawPoint; willClose: boolean; guide: GuideLine | null } {\n const closeSnapUnits = CLOSE_SNAP_PX / pxPerUnit(this.#svg);\n if (isCloseToStart(this.#state.points, raw, closeSnapUnits)) {\n return { point: this.#state.points[0], willClose: true, guide: null };\n }\n const points = this.#state.points;\n const last = points[points.length - 1];\n if (!this.#shiftHeld || !last) {\n return { point: raw, willClose: false, guide: null };\n }\n const angleSnapped = snapTo45Degrees(last, raw);\n const guideSnapUnits = GUIDE_SNAP_PX / pxPerUnit(this.#svg);\n const { point, guide } = snapToSessionGuides(last, angleSnapped, points.slice(0, -1), raw, guideSnapUnits);\n return { point, willClose: false, guide };\n }\n\n #commit(closed: boolean): void {\n const points = this.#state.points;\n const minPoints = closed ? MIN_POINTS_TO_CLOSE : MIN_POINTS_OPEN;\n if (points.length >= minPoints) {\n this.#emitter.emit('pathDrawComplete', { points: [...points], closed, tension: this.#state.tension });\n }\n this.#reset(true);\n }\n\n #reset(callExit: boolean): void {\n this.#state.previewGroup?.remove();\n clearAlignmentGuides(this.#svg);\n const exit = this.#state.onExit;\n this.#state = createIdlePathDrawState();\n this.#shiftHeld = false;\n if (callExit) {\n exit?.();\n }\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { type PathDrawOptions, PathDrawSession } from './pathDraw/session';\n\nexport type { PathDrawOptions } from './pathDraw/session';\n\nexport interface PathDrawDragHandle {\n start(options?: PathDrawOptions): void;\n cancel(): void;\n destroy(): void;\n}\n\nexport function bindPathDraw(viewer: Viewer, emitter: Emitter): PathDrawDragHandle {\n const svg = viewer.svg;\n const session = new PathDrawSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown, true);\n svg.addEventListener('pointermove', session.pointerMove, true);\n svg.addEventListener('pointerup', session.pointerUp, true);\n svg.addEventListener('dblclick', session.dblClick, true);\n window.addEventListener('keydown', session.keyDown);\n window.addEventListener('keyup', session.keyUp);\n\n return {\n start: options => {\n viewer.select([]);\n session.start(options);\n },\n cancel: () => session.cancel(),\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown, true);\n svg.removeEventListener('pointermove', session.pointerMove, true);\n svg.removeEventListener('pointerup', session.pointerUp, true);\n svg.removeEventListener('dblclick', session.dblClick, true);\n window.removeEventListener('keydown', session.keyDown);\n window.removeEventListener('keyup', session.keyUp);\n },\n };\n}\n","import { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { PATH_HALO_ATTR } from '../../dom';\nimport type { PathReshapeDragState } from './state';\n\nexport function applyPathReshapePreview(\n drag: PathReshapeDragState,\n point: { x: number; y: number },\n): Array<[number, number]> {\n const points = drag.points.map((existing, index) =>\n index === drag.pointIndex ? [point.x, point.y] : existing,\n ) as Array<[number, number]>;\n const d = freeformPathData({\n points: points.map(([x, y]) => ({ x, y })),\n tension: drag.tension,\n closed: drag.closed,\n });\n drag.pathNode.setAttribute('d', d);\n drag.handle.setAttribute('cx', String(point.x));\n drag.handle.setAttribute('cy', String(point.y));\n drag.overlay?.querySelector(`[${PATH_HALO_ATTR}]`)?.setAttribute('d', d);\n return points;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { findOwnerNode, isPrimary, pathGeometryOf, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface PathReshapeTarget {\n owner: OwnerRef;\n pathNode: SVGPathElement;\n handle: Element;\n pointIndex: number;\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n}\n\nexport function resolvePathReshapeTarget(svg: SVGSVGElement, event: PointerEvent): PathReshapeTarget | null {\n const handle = (event.target as Element | null)?.closest?.(`[${PATH_POINT_INDEX_ATTR}]`) ?? null;\n const indexAttr = handle?.getAttribute(PATH_POINT_INDEX_ATTR) ?? null;\n const pointIndex = indexAttr !== null ? Number(indexAttr) : Number.NaN;\n const ownerId = handle?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n if (!handle || !Number.isInteger(pointIndex) || !ownerId) {\n return null;\n }\n\n const pathNode = findOwnerNode<SVGPathElement>(svg, ownerId, isPrimary);\n const owner = pathNode && resolveOwner(pathNode);\n const geometry = pathNode && pathGeometryOf(pathNode);\n if (!pathNode || !owner || !geometry || pointIndex < 0 || pointIndex >= geometry.points.length) {\n return null;\n }\n\n return {\n owner,\n pathNode,\n handle,\n pointIndex,\n points: geometry.points,\n tension: geometry.tension,\n closed: geometry.closed,\n };\n}\n","import type { OwnerRef } from '../../viewer';\nimport { resolvePathReshapeTarget } from './target';\n\nexport interface PathReshapeDragState {\n owner: OwnerRef;\n pathNode: SVGPathElement;\n handle: Element;\n overlay: Element | null;\n pointIndex: number;\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n}\n\nexport function createPathReshapeDragState(svg: SVGSVGElement, event: PointerEvent): PathReshapeDragState | null {\n const target = resolvePathReshapeTarget(svg, event);\n if (!target) {\n return null;\n }\n\n (target.handle as SVGGraphicsElement & { setPointerCapture?: (id: number) => void }).setPointerCapture?.(\n event.pointerId,\n );\n return {\n ...target,\n overlay: target.handle.closest('[data-sf-selection-overlay]'),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n };\n}\n","import { isCameraGesture, pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { applyPathReshapePreview } from './preview';\nimport { createPathReshapeDragState, type PathReshapeDragState } from './state';\n\nexport class PathReshapeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: PathReshapeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n this.#drag = createPathReshapeDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n drag.moved = true;\n const point = pointerUserPoint(this.#svg, event);\n if (point) {\n applyPathReshapePreview(drag, point);\n }\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event) ?? {\n x: drag.points[drag.pointIndex][0],\n y: drag.points[drag.pointIndex][1],\n };\n const points = applyPathReshapePreview(drag, point);\n this.#emitter.emit('pathPointChange', { owner: drag.owner, points: points.map(([x, y]) => ({ x, y })) });\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { PathReshapeSession } from './pathReshape/session';\n\nexport interface PathReshapeDragHandle {\n destroy(): void;\n}\n\nexport function bindPathReshape(viewer: Viewer, emitter: Emitter): PathReshapeDragHandle {\n const svg = viewer.svg;\n const session = new PathReshapeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { clipSegmentToRect } from '../../../renderScene/charts/primitives';\nimport type { PieLabelDragState } from './types';\n\nconst PREVIEW_TICK_COLOR = '#334155';\nconst PREVIEW_TICK_STROKE_WIDTH = '1.5';\n\nexport function updatePieLabelDragPreview(drag: PieLabelDragState, dx: number, dy: number): void {\n for (const element of drag.labelElements) {\n element.setAttribute('transform', `translate(${dx}, ${dy})`);\n }\n if (!drag.tickElement) {\n return;\n }\n const from = { x: drag.tickStartX, y: drag.tickStartY };\n const to = { x: drag.restX + dx, y: drag.restY + dy };\n const clipped = clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);\n drag.tickElement.setAttribute('d', `M ${from.x} ${from.y} L ${clipped.x} ${clipped.y}`);\n drag.tickElement.setAttribute('stroke', PREVIEW_TICK_COLOR);\n drag.tickElement.setAttribute('stroke-width', PREVIEW_TICK_STROKE_WIDTH);\n}\n\nexport function clearPieLabelDragPreview(drag: PieLabelDragState): void {\n for (const element of drag.labelElements) {\n element.removeAttribute('transform');\n }\n if (!drag.tickElement) {\n return;\n }\n restoreAttribute(drag.tickElement, 'd', drag.tickOriginalD);\n restoreAttribute(drag.tickElement, 'stroke', drag.tickOriginalStroke);\n restoreAttribute(drag.tickElement, 'stroke-width', drag.tickOriginalStrokeWidth);\n}\n\nfunction restoreAttribute(element: SVGGraphicsElement, name: string, value: string | null): void {\n if (value === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value);\n }\n}\n","import { findOwnerNode, isPrimary } from '../dom';\n\nexport interface ParsedPieGeometry {\n centerX: number;\n centerY: number;\n outerRadius: number;\n innerRadius: number;\n cornerRadius: number;\n}\n\nexport function readPieGeometry(svg: SVGSVGElement, ownerId: string): ParsedPieGeometry | null {\n const raw = findOwnerNode(svg, ownerId, isPrimary)?.getAttribute('data-sf-pie-geometry');\n if (!raw) {\n return null;\n }\n const [centerX, centerY, outerRadius, innerRadius, cornerRadius = 0] = raw.split(',').map(Number);\n return [centerX, centerY, outerRadius, innerRadius].every(Number.isFinite)\n ? { centerX, centerY, outerRadius, innerRadius, cornerRadius: Number.isFinite(cornerRadius) ? cornerRadius : 0 }\n : null;\n}\n","import { LABEL_WIDTH, LEADER_INSET } from '../../../renderScene/charts/renderers/pie/labels';\nimport { isCameraGesture, pointerUserPoint, resolveOwner } from '../../dom';\nimport { readPieGeometry } from '../pieGeometry';\nimport type { PieLabelDragState } from './types';\n\nconst LABEL_MARKS = ['pie-label', 'polar-area-label'];\nconst TICK_MARKS: Record<string, string> = {\n 'pie-label': 'pie-label-tick',\n 'polar-area-label': 'polar-area-label-tick',\n};\n\nfunction findLabelMark(event: PointerEvent): SVGGraphicsElement | null {\n const selector = LABEL_MARKS.map(mark => `[data-sf-mark=\"${mark}\"]`).join(', ');\n return (event.target as Element | null)?.closest?.(selector) as SVGGraphicsElement | null;\n}\n\nfunction isLabelPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findLabelSiblings(svg: SVGSVGElement, ownerId: string, seriesId: string, mark: string): SVGGraphicsElement[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(seriesId)}\"][data-sf-mark=\"${mark}\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)];\n}\n\nfunction findTickElement(\n svg: SVGSVGElement,\n ownerId: string,\n seriesId: string,\n tickMark: string,\n): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-series=\"${CSS.escape(seriesId)}\"][data-sf-mark=\"${tickMark}\"]`;\n return svg.querySelector<SVGGraphicsElement>(selector);\n}\n\nfunction combinedCenter(elements: SVGGraphicsElement[]): { x: number; y: number } {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const element of elements) {\n const box = element.getBBox();\n minX = Math.min(minX, box.x);\n minY = Math.min(minY, box.y);\n maxX = Math.max(maxX, box.x + box.width);\n maxY = Math.max(maxY, box.y + box.height);\n }\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n}\n\nexport function resolvePieLabelDrag(svg: SVGSVGElement, event: PointerEvent): PieLabelDragState | null {\n if (!isLabelPointer(event)) {\n return null;\n }\n const clicked = findLabelMark(event);\n if (!clicked) {\n return null;\n }\n const owner = resolveOwner(clicked);\n if (owner?.role !== 'chart') {\n return null;\n }\n const seriesId = clicked.getAttribute('data-sf-series');\n if (!seriesId) {\n return null;\n }\n const midAngle = Number(clicked.getAttribute('data-sf-pie-mid-angle'));\n if (!Number.isFinite(midAngle)) {\n return null;\n }\n const geometry = readPieGeometry(svg, owner.id);\n if (!geometry) {\n return null;\n }\n const wedgeRadius = clicked.getAttribute('data-sf-pie-wedge-radius');\n const explicitRadius = wedgeRadius === null ? Number.NaN : Number(wedgeRadius);\n const outerRadius = Number.isFinite(explicitRadius) ? explicitRadius : geometry.outerRadius;\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n const mark = clicked.getAttribute('data-sf-mark') ?? 'pie-label';\n const labelElements = findLabelSiblings(svg, owner.id, seriesId, mark);\n if (!labelElements.length) {\n return null;\n }\n const fontSize = Number.parseFloat(clicked.getAttribute('font-size') ?? '12') || 12;\n const { x: restX, y: restY } = combinedCenter(labelElements);\n const tickElement = findTickElement(svg, owner.id, seriesId, TICK_MARKS[mark] ?? 'pie-label-tick');\n clicked.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n seriesId,\n centerX: geometry.centerX,\n centerY: geometry.centerY,\n outerRadius,\n anchorX: geometry.centerX + outerRadius * Math.cos(midAngle),\n anchorY: geometry.centerY + outerRadius * Math.sin(midAngle),\n tickStartX: geometry.centerX + (outerRadius + LEADER_INSET) * Math.cos(midAngle),\n tickStartY: geometry.centerY + (outerRadius + LEADER_INSET) * Math.sin(midAngle),\n restX,\n restY,\n startX: start.x,\n startY: start.y,\n halfWidth: LABEL_WIDTH / 2,\n halfHeight: fontSize * 1.2,\n moved: false,\n lastDx: 0,\n lastDy: 0,\n labelElements,\n tickElement,\n tickOriginalD: tickElement?.getAttribute('d') ?? null,\n tickOriginalStroke: tickElement?.getAttribute('stroke') ?? null,\n tickOriginalStrokeWidth: tickElement?.getAttribute('stroke-width') ?? null,\n };\n}\n","import { seriesLabelOffsetXProp, seriesLabelOffsetYProp } from '../../../renderScene/charts/propPath';\nimport { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { clearPieLabelDragPreview, updatePieLabelDragPreview } from './preview';\nimport { resolvePieLabelDrag } from './target';\nimport type { PieLabelDragState } from './types';\n\nconst PULL_THRESHOLD = 14;\nconst MOVE_NOISE = 2;\nconst MAX_PULL_FACTOR = 1.5;\n\nexport class PieLabelDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: PieLabelDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolvePieLabelDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const dx = point.x - drag.startX;\n const dy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(dx, dy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updatePieLabelDragPreview(drag, dx, dy);\n }\n\n cancel(): void {\n if (this.#drag) {\n clearPieLabelDragPreview(this.#drag);\n }\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearPieLabelDragPreview(drag);\n if (!drag.moved) {\n return;\n }\n const pathX = seriesLabelOffsetXProp(drag.seriesId);\n const pathY = seriesLabelOffsetYProp(drag.seriesId);\n if (!pathX || !pathY) {\n return;\n }\n const newX = drag.restX + drag.lastDx;\n const newY = drag.restY + drag.lastDy;\n const distanceFromCenter = Math.hypot(newX - drag.centerX, newY - drag.centerY);\n const pulled = distanceFromCenter > drag.outerRadius + PULL_THRESHOLD;\n const maxOffset = drag.outerRadius * MAX_PULL_FACTOR;\n const offsetX = pulled ? clampOffset(newX - drag.anchorX, maxOffset) : 0;\n const offsetY = pulled ? clampOffset(newY - drag.anchorY, maxOffset) : 0;\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: pathX, value: Math.round(offsetX) });\n this.#emitter.emit('propertyChange', { owner: drag.owner, path: pathY, value: Math.round(offsetY) });\n }\n}\n\nfunction clampOffset(value: number, max: number): number {\n return Math.max(-max, Math.min(max, value));\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { PieLabelDragSession } from './session';\n\nexport interface PieLabelDragHandle {\n destroy(): void;\n}\n\nexport function bindPieLabelDrag(viewer: Viewer, emitter: Emitter): PieLabelDragHandle {\n const session = new PieLabelDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { parseValueScale } from '../chartValue/scale';\nimport type { ValueScale } from '../chartValue/types';\nimport { type EditableRules, isEditablePath } from '../propertyEdit/editable';\n\nexport interface PropertyDragTarget {\n owner: OwnerRef;\n path: string;\n scale: ValueScale;\n nodes: SVGGraphicsElement[];\n pointerId: number;\n}\n\nexport function blockPrefixOf(path: string): string {\n const lastDot = path.lastIndexOf('.');\n return lastDot === -1 ? '' : path.slice(0, lastDot + 1);\n}\n\nfunction siblingNodes(svg: SVGSVGElement, owner: OwnerRef, path: string): SVGGraphicsElement[] {\n const prefix = blockPrefixOf(path);\n const selector = `[data-sf-id=\"${CSS.escape(owner.id)}\"][data-sf-prop]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].filter(node => {\n const candidate = node.getAttribute('data-sf-prop') ?? '';\n return prefix === '' ? candidate === path : candidate.startsWith(prefix);\n });\n}\n\nexport function resolvePropertyDrag(\n svg: SVGSVGElement,\n event: PointerEvent,\n rules: EditableRules | undefined,\n): PropertyDragTarget | null {\n if (event.button !== 0 || isCameraGesture(event)) {\n return null;\n }\n\n const node = (event.target as Element | null)?.closest?.('[data-sf-prop-kind=\"value\"]') as SVGGraphicsElement | null;\n if (!node) {\n return null;\n }\n\n const path = node.getAttribute('data-sf-prop');\n const owner = resolveOwner(node);\n if (!path || owner?.role !== 'chart' || !isEditablePath(path, rules)) {\n return null;\n }\n\n const scale = parseValueScale(findOwnerNode(svg, owner.id, isPrimary));\n if (!scale) {\n return null;\n }\n\n node.setPointerCapture?.(event.pointerId);\n return { owner, path, scale, nodes: siblingNodes(svg, owner, path), pointerId: event.pointerId };\n}\n","import { pointerUserY } from '../chartValue/coordinates';\nimport { createValueReadout, removeValueReadout, updateValueReadout } from '../chartValue/readout';\nimport { pixelForValue, valueAtPixel } from '../chartValue/scale';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { type PropertyDragTarget, resolvePropertyDrag } from './target';\n\nexport class PropertyDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n #drag: PropertyDragTarget | null = null;\n #startY = 0;\n #readout: SVGGElement | null = null;\n #moved = false;\n\n constructor(svg: SVGSVGElement, emitter: Emitter, rules: EditableRules | undefined) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#rules = rules;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n const drag = resolvePropertyDrag(this.#svg, event, this.#rules);\n if (!drag) {\n return false;\n }\n this.#drag = drag;\n this.#startY = pixelForValue(valueAtPixel(pointerUserY(this.#svg, event), drag.scale), drag.scale);\n this.#moved = false;\n return true;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n this.#moved = true;\n\n const value = valueAtPixel(pointerUserY(this.#svg, event), this.#drag.scale);\n const offset = pixelForValue(value, this.#drag.scale) - this.#startY;\n for (const node of this.#drag.nodes) {\n node.setAttribute('transform', `translate(0 ${offset})`);\n }\n\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n updateValueReadout(this.#readout, { centerX: this.#centerX(), scale: this.#drag.scale }, value);\n }\n\n cancel(): void {\n this.#clearPreview();\n this.#drag = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n const moved = this.#moved;\n this.#clearPreview();\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!moved) {\n return;\n }\n this.#emitter.emit('propertyChange', {\n owner: drag.owner,\n path: drag.path,\n value: valueAtPixel(pointerUserY(this.#svg, event), drag.scale),\n });\n }\n\n #centerX(): number {\n const plot = this.#drag?.nodes[0]?.getBBox?.();\n return plot ? plot.x + plot.width / 2 : 0;\n }\n\n #clearPreview(): void {\n for (const node of this.#drag?.nodes ?? []) {\n node.removeAttribute('transform');\n }\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from '../propertyEdit/editable';\nimport { PropertyDragSession } from './session';\n\nexport interface PropertyDragHandle {\n destroy(): void;\n}\n\nexport function bindPropertyDrag(\n viewer: Viewer,\n emitter: Emitter,\n rules: EditableRules | undefined,\n): PropertyDragHandle {\n const svg = viewer.svg;\n const session = new PropertyDragSession(svg, emitter, rules);\n\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => session.move(event);\n const onPointerUp = (event: PointerEvent) => session.finish(event);\n\n svg.addEventListener('pointerdown', onPointerDown);\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n svg.addEventListener('pointercancel', onPointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', onPointerDown);\n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","interface ActiveTextEditorOptions {\n textarea: HTMLTextAreaElement;\n originalText: string;\n commit: (text: string) => void;\n unbindAutoGrow: () => void;\n onClose: () => void;\n}\n\nexport class ActiveTextEditor {\n readonly #textarea: HTMLTextAreaElement;\n readonly #originalText: string;\n readonly #commit: (text: string) => void;\n readonly #unbindAutoGrow: () => void;\n readonly #onClose: () => void;\n #closed = false;\n\n constructor(options: ActiveTextEditorOptions) {\n this.#textarea = options.textarea;\n this.#originalText = options.originalText;\n this.#commit = options.commit;\n this.#unbindAutoGrow = options.unbindAutoGrow;\n this.#onClose = options.onClose;\n options.textarea.addEventListener('keydown', this.keyDown);\n options.textarea.addEventListener('blur', this.commit);\n }\n\n readonly commit = (): void => {\n const text = this.#textarea.value;\n this.close();\n if (text !== this.#originalText) {\n this.#commit(text);\n }\n };\n\n readonly cancel = (): void => {\n this.close();\n };\n\n private readonly keyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.commit();\n }\n };\n\n private close(): void {\n if (this.#closed) {\n return;\n }\n\n this.#closed = true;\n this.#textarea.removeEventListener('keydown', this.keyDown);\n this.#textarea.removeEventListener('blur', this.commit);\n this.#unbindAutoGrow();\n this.#textarea.remove();\n this.#onClose();\n }\n}\n","import type { TextEditRect } from './geometry';\n\ninterface TextareaOptions {\n text: string;\n rect: TextEditRect;\n fontSize: number;\n fontFamily: string;\n inline?: boolean;\n color?: string;\n fontWeight?: string;\n fontStyle?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nconst ACCENT = '#9b42df';\nconst STYLE_ELEMENT_ATTR = 'data-sf-text-editor-style';\n\nfunction ensureEditorStyles(): void {\n if (document.head.querySelector(`[${STYLE_ELEMENT_ATTR}]`)) {\n return;\n }\n const style = document.createElement('style');\n style.setAttribute(STYLE_ELEMENT_ATTR, '');\n style.textContent = `[data-sf-text-editor]::selection{background:rgba(155,66,223,.22);color:var(--sf-text-editor-color)}`;\n document.head.appendChild(style);\n}\n\nexport function createTextEditor({\n text,\n rect,\n fontSize,\n fontFamily,\n inline = false,\n color = '#0f172a',\n fontWeight,\n fontStyle,\n align = 'left',\n}: TextareaOptions): HTMLTextAreaElement {\n ensureEditorStyles();\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('data-sf-text-editor', '');\n textarea.spellcheck = false;\n if (inline) {\n textarea.setAttribute('data-sf-text-editor-inline', '');\n }\n\n const style = textarea.style;\n style.position = 'fixed';\n style.left = `${rect.left}px`;\n style.top = `${rect.top}px`;\n style.width = `${Math.max(rect.width, 60)}px`;\n style.height = `${Math.max(rect.height, fontSize * 1.6)}px`;\n style.font = `${fontSize}px ${fontFamily}`;\n if (fontWeight) {\n style.fontWeight = fontWeight;\n }\n if (fontStyle) {\n style.fontStyle = fontStyle;\n }\n style.lineHeight = '1.3';\n style.color = color;\n style.setProperty('--sf-text-editor-color', color);\n style.caretColor = ACCENT;\n style.textAlign = align;\n style.outline = 'none';\n style.resize = 'none';\n style.boxSizing = 'border-box';\n style.zIndex = '1000';\n style.overflow = 'hidden';\n\n if (inline) {\n style.background = 'transparent';\n style.border = 'none';\n style.borderRadius = '0';\n style.boxShadow = 'none';\n style.padding = '0 6px';\n } else {\n style.background = '#ffffff';\n style.border = `1px solid ${ACCENT}`;\n style.borderRadius = '8px';\n style.boxShadow = '0 6px 18px rgba(15, 23, 42, 0.18), 0 0 0 3px rgba(155, 66, 223, 0.16)';\n style.padding = '5px 9px';\n }\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n return textarea;\n}\n\nexport function bindTextareaAutoGrow(textarea: HTMLTextAreaElement, minHeight: number): () => void {\n const inline = textarea.hasAttribute('data-sf-text-editor-inline');\n const resize = (): void => {\n if (inline) {\n textarea.style.paddingTop = '0px';\n textarea.style.height = '0px';\n const content = textarea.scrollHeight;\n const height = Math.max(minHeight, Math.min(content, 300));\n textarea.style.height = `${height}px`;\n textarea.style.paddingTop = `${Math.max(0, (height - content) / 2)}px`;\n return;\n }\n textarea.style.height = `${minHeight}px`;\n textarea.style.height = `${Math.max(minHeight, Math.min(textarea.scrollHeight, 300))}px`;\n };\n textarea.addEventListener('input', resize);\n resize();\n return () => {\n textarea.removeEventListener('input', resize);\n };\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { type EditableRules, isEditablePath } from './editable';\n\nexport interface PropertyTarget {\n owner: OwnerRef;\n path: string;\n node: SVGGraphicsElement;\n}\n\nexport function isTextProperty(node: Element): boolean {\n return node.tagName.toLowerCase() === 'text';\n}\n\nfunction textNodeForPath(hit: SVGGraphicsElement, path: string, ownerId: string): SVGGraphicsElement | null {\n const selector = `text[data-sf-prop=\"${CSS.escape(path)}\"][data-sf-id=\"${CSS.escape(ownerId)}\"]`;\n const root: ParentNode | null = hit.ownerSVGElement ?? hit.ownerDocument;\n return root?.querySelector<SVGGraphicsElement>(selector) ?? null;\n}\n\nexport function resolvePropertyTarget(event: MouseEvent, rules: EditableRules | undefined): PropertyTarget | null {\n const hit = (event.target as Element | null)?.closest?.('[data-sf-prop]') as SVGGraphicsElement | null;\n if (!hit) {\n return null;\n }\n\n const path = hit.getAttribute('data-sf-prop');\n const owner = resolveOwner(hit);\n if (!path || !owner || !isEditablePath(path, rules)) {\n return null;\n }\n\n if (!isTextProperty(hit) && hit.getAttribute('data-sf-prop-kind') !== 'value') {\n return null;\n }\n\n const node = isTextProperty(hit) ? hit : textNodeForPath(hit, path, owner.id);\n if (!node) {\n return null;\n }\n return { owner, path, node };\n}\n","import { screenRectOf } from '../../dom';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { bindTextareaAutoGrow, createTextEditor } from '../textEdit/textarea';\nimport type { EditableRules } from './editable';\nimport { type PropertyTarget, resolvePropertyTarget } from './target';\n\nconst MIN_EDIT_WIDTH = 120;\nconst EDIT_WIDTH_MARGIN = 48;\n\nexport class PropertyEditingSession {\n readonly #emitter: Emitter;\n readonly #rules: EditableRules | undefined;\n #activeEditor: ActiveTextEditor | null = null;\n\n constructor(emitter: Emitter, rules: EditableRules | undefined) {\n this.#emitter = emitter;\n this.#rules = rules;\n }\n\n readonly doubleClick = (event: MouseEvent): void => {\n const target = resolvePropertyTarget(event, this.#rules);\n if (!target) {\n return;\n }\n event.stopPropagation();\n this.begin(target);\n };\n\n cancel(): void {\n this.#activeEditor?.cancel();\n }\n\n private begin(target: PropertyTarget): void {\n this.cancel();\n\n const { node } = target;\n const rect = screenRectOf(node);\n const fontSize = Number.parseFloat(node.getAttribute('font-size') || '12');\n const originalText = node.textContent ?? '';\n const anchor = node.getAttribute('text-anchor');\n const align = anchor === 'middle' ? 'center' : anchor === 'end' ? 'right' : 'left';\n const fill = node.getAttribute('fill');\n const width = Math.max(rect.width + EDIT_WIDTH_MARGIN, MIN_EDIT_WIDTH);\n const shift = align === 'center' ? (width - rect.width) / 2 : align === 'right' ? width - rect.width : 0;\n const previousVisibility = node.getAttribute('visibility');\n\n const textarea = createTextEditor({\n text: originalText,\n rect: { ...rect, left: rect.left - shift, width },\n fontSize,\n fontFamily: node.getAttribute('font-family') || 'sans-serif',\n inline: true,\n color: fill && fill !== 'none' ? fill : undefined,\n fontWeight: node.getAttribute('font-weight') ?? undefined,\n align,\n });\n node.setAttribute('visibility', 'hidden');\n\n this.#activeEditor = new ActiveTextEditor({\n textarea,\n originalText,\n commit: value => this.#emitter.emit('propertyChange', { owner: target.owner, path: target.path, value }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose: () => {\n if (node.isConnected) {\n if (previousVisibility === null) {\n node.removeAttribute('visibility');\n } else {\n node.setAttribute('visibility', previousVisibility);\n }\n }\n this.#activeEditor = null;\n },\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { ColorPickerThemeOption } from '../colorEdit/theme';\nimport type { Emitter } from '../events';\nimport type { EditableRules } from './editable';\nimport { PropertyEditingSession } from './session';\n\nexport interface PropertyEditingOptions {\n editable?: EditableRules;\n colorPickerTheme?: ColorPickerThemeOption;\n}\n\nexport interface PropertyEditingHandle {\n destroy(): void;\n}\n\nexport function bindPropertyEditing(\n viewer: Viewer,\n emitter: Emitter,\n options: PropertyEditingOptions = {},\n): PropertyEditingHandle {\n const svg = viewer.svg;\n const session = new PropertyEditingSession(emitter, options.editable);\n\n svg.addEventListener('dblclick', session.doubleClick, true);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('dblclick', session.doubleClick, true);\n },\n };\n}\n","import type { Emitter } from '../events';\nimport type { QuickDuplicateDragState } from './state';\n\nexport function emitQuickDuplicateCompletion(emitter: Emitter, drag: QuickDuplicateDragState): void {\n if (!drag.moved) {\n emitter.emit('quickDuplicate', { owner: drag.sourceOwner, direction: drag.direction });\n return;\n }\n if (!drag.hit) {\n return;\n }\n\n emitter.emit('linkTo', {\n owner: drag.sourceOwner,\n direction: drag.direction,\n target: drag.hit.owner,\n side: drag.hit.side,\n fraction: Math.round(drag.hit.offset * 100) / 100,\n });\n}\n","import type { QuickDuplicateDragState } from './state';\n\nconst SCREEN_DRAG_THRESHOLD = 3;\n\nexport function duplicatePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function crossedDuplicateDragThreshold(drag: QuickDuplicateDragState, event: PointerEvent): boolean {\n const horizontalDistance = event.clientX - drag.startScreen.x;\n const verticalDistance = event.clientY - drag.startScreen.y;\n return Math.hypot(horizontalDistance, verticalDistance) >= SCREEN_DRAG_THRESHOLD;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport type { PathType } from '../../../model/link';\nimport { calculateLinkRoute } from '../../../renderScene/artifacts/link/geometry';\nimport { pxPerUnit, SVG_NAMESPACE } from '../../dom';\nimport { previewPathData } from '../linkPreview';\nimport { previewLink } from '../linkPreview/geometry';\nimport type { QuickDuplicateDragState } from './state';\n\nconst PREVIEW_STROKE_PX = 2;\nconst NEW_LINK_PATH_TYPE: PathType = 'orthogonal';\n\nexport function createDuplicatePreviewPath(svg: SVGSVGElement): SVGPathElement {\n const path = svg.ownerDocument.createElementNS(SVG_NAMESPACE, 'path');\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-width', String(PREVIEW_STROKE_PX / pxPerUnit(svg)));\n path.style.pointerEvents = 'none';\n return path;\n}\n\nexport function updateDuplicatePreview(\n drag: QuickDuplicateDragState,\n toPoint: { x: number; y: number },\n toSide: Side,\n): void {\n const link = previewLink(drag.direction, toSide);\n const { points, segments } = calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);\n drag.previewPath.setAttribute('d', previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));\n}\n","import { pointAtPort } from '../../../model/geometry/ports';\nimport type { Rect, Side } from '../../../model/geometry/types';\nimport type { QuickDuplicateDirection } from '../../dom';\nimport { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { LinkGhost } from '../linkGhost/ghost';\n\nexport interface DuplicateCandidate {\n owner: OwnerRef;\n bounds: Rect;\n}\n\nexport interface QuickDuplicateDragState {\n sourceOwner: OwnerRef;\n direction: QuickDuplicateDirection;\n fixedPoint: { x: number; y: number };\n previewPath: SVGPathElement;\n ghost: LinkGhost;\n candidates: DuplicateCandidate[];\n pointerId: number;\n startScreen: { x: number; y: number };\n moved: boolean;\n hit: { owner: OwnerRef; side: Side; offset: number } | null;\n}\n\nfunction duplicateCandidates(svg: SVGSVGElement, sourceId: string): DuplicateCandidate[] {\n const candidates: DuplicateCandidate[] = [];\n for (const element of svg.querySelectorAll<SVGGraphicsElement>('[data-sf-primary]')) {\n if (element.getAttribute('data-sf-role') === 'link') {\n continue;\n }\n const owner = resolveOwner(element);\n if (owner && owner.id !== sourceId) {\n candidates.push({ owner, bounds: element.getBBox() });\n }\n }\n return candidates;\n}\n\nexport function createQuickDuplicateDragState(\n svg: SVGSVGElement,\n event: PointerEvent,\n previewPath: SVGPathElement,\n): QuickDuplicateDragState | null {\n const bubble = (event.target as Element | null)?.closest('[data-sf-quick-duplicate]');\n const direction = bubble?.getAttribute('data-sf-quick-duplicate') as QuickDuplicateDirection | null;\n const sourceId = bubble?.closest('[data-sf-selection-overlay]')?.getAttribute('data-sf-selection-overlay');\n if (!bubble || !direction || direction.startsWith('iso-') || !sourceId) {\n return null;\n }\n\n const primary = findOwnerNode(svg, sourceId, isPrimary);\n const sourceOwner = primary && resolveOwner(primary);\n if (!primary || !sourceOwner) {\n return null;\n }\n\n (event.target as Element).setPointerCapture?.(event.pointerId);\n return {\n sourceOwner,\n direction,\n fixedPoint: pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),\n previewPath,\n ghost: new LinkGhost(svg, previewPath),\n candidates: duplicateCandidates(svg, sourceId),\n pointerId: event.pointerId,\n startScreen: { x: event.clientX, y: event.clientY },\n moved: false,\n hit: null,\n };\n}\n","import { type LinkTarget, resolveLinkTarget } from '../linkGhost/target';\nimport type { QuickDuplicateDragState } from './state';\n\nexport function resolveDuplicateTarget(\n drag: QuickDuplicateDragState,\n point: { x: number; y: number },\n unitsPerPx: number,\n): LinkTarget {\n const target = resolveLinkTarget(drag.candidates, drag.fixedPoint, point, unitsPerPx);\n drag.hit = target.hit;\n return target;\n}\n","import { isCameraGesture, pxPerUnit } from '../../dom';\nimport type { Emitter } from '../events';\nimport { emitQuickDuplicateCompletion } from './completion';\nimport { crossedDuplicateDragThreshold, duplicatePointerPosition } from './pointer';\nimport { createDuplicatePreviewPath, updateDuplicatePreview } from './preview';\nimport { createQuickDuplicateDragState, type QuickDuplicateDragState } from './state';\nimport { resolveDuplicateTarget } from './target';\n\nexport class QuickDuplicateSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: QuickDuplicateDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createQuickDuplicateDragState(this.#svg, event, createDuplicatePreviewPath(this.#svg));\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n if (!drag.moved && !crossedDuplicateDragThreshold(drag, event)) {\n return;\n }\n\n this.beginPreview(drag);\n const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / pxPerUnit(this.#svg));\n updateDuplicatePreview(drag, target.point, target.side);\n drag.ghost.show(target.hit !== null, target.bounds);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element).releasePointerCapture?.(drag.pointerId);\n drag.previewPath.remove();\n drag.ghost.hide();\n emitQuickDuplicateCompletion(this.#emitter, drag);\n };\n\n cancel(): void {\n this.#drag?.previewPath.remove();\n this.#drag?.ghost.hide();\n this.#drag = null;\n }\n\n private beginPreview(drag: QuickDuplicateDragState): void {\n if (drag.moved) {\n return;\n }\n\n drag.moved = true;\n this.#svg.appendChild(drag.previewPath);\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { QuickDuplicateSession } from './quickDuplicate/session';\n\nexport interface QuickDuplicateHandle {\n destroy(): void;\n}\n\nexport function bindQuickDuplicate(viewer: Viewer, emitter: Emitter): QuickDuplicateHandle {\n const svg = viewer.svg;\n const session = new QuickDuplicateSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { radarSeriesPath, radarVertexPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport type { RadarVertexDragState } from './types';\n\nfunction seriesVertices(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector =\n `[data-sf-id=\"${CSS.escape(ownerId)}\"]` +\n `[data-sf-series=\"${CSS.escape(series)}\"]` +\n `[data-sf-mark=\"radar-vertex\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].sort(\n (a, b) => Number(a.getAttribute('data-sf-value-index')) - Number(b.getAttribute('data-sf-value-index')),\n );\n}\n\nfunction seriesShapes(svg: SVGSVGElement, ownerId: string, series: string): SVGGraphicsElement[] {\n const selector =\n `path[data-sf-id=\"${CSS.escape(ownerId)}\"]` + `[data-sf-series=\"${CSS.escape(series)}\"]:not([data-sf-mark])`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)];\n}\n\nexport function updateRadarVertexDragPreview(svg: SVGSVGElement, drag: RadarVertexDragState, value: number): void {\n const point = radarVertexPoint(drag.frame, drag.index, value);\n drag.element.setAttribute('cx', String(point.x));\n drag.element.setAttribute('cy', String(point.y));\n\n const points = seriesVertices(svg, drag.owner.id, drag.series).map(vertex => ({\n x: Number(vertex.getAttribute('cx')),\n y: Number(vertex.getAttribute('cy')),\n }));\n const path = radarSeriesPath(points, drag.frame.curved, drag.frame.tension);\n for (const shape of seriesShapes(svg, drag.owner.id, drag.series)) {\n shape.setAttribute('d', path);\n }\n}\n","import type { RadarPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport { createValueReadout, formatReadoutValue, removeValueReadout } from '../chartValue/readout';\n\nconst GAP = 10;\nconst HEIGHT = 18;\nconst FONT_SIZE = 11;\nconst PADDING_X = 7;\n\nexport { createValueReadout, removeValueReadout };\n\nexport function positionRadarReadout(readout: SVGGElement, vertex: RadarPoint, centerY: number, value: number): void {\n const text = readout.querySelector('text');\n const background = readout.querySelector('rect');\n if (!text || !background) {\n return;\n }\n const label = formatReadoutValue(value);\n const width = Math.max(28, (label.length * FONT_SIZE) / 1.7 + PADDING_X * 2);\n const above = vertex.y <= centerY;\n const top = above ? vertex.y - GAP - HEIGHT : vertex.y + GAP;\n\n text.textContent = label;\n background.setAttribute('x', String(vertex.x - width / 2));\n background.setAttribute('y', String(top));\n background.setAttribute('width', String(width));\n background.setAttribute('height', String(HEIGHT));\n text.setAttribute('x', String(vertex.x));\n text.setAttribute('y', String(top + HEIGHT / 2));\n}\n","import type { RadarFrame } from '../../../renderScene/charts/primitives/radarShape';\nimport { findOwnerNode, isCameraGesture, isPrimary, resolveOwner } from '../../dom';\nimport type { RadarVertexDragState } from './types';\n\nfunction parseRadarFrame(node: SVGGraphicsElement | null): RadarFrame | null {\n const raw = node?.getAttribute('data-sf-radar-geometry');\n if (!raw) {\n return null;\n }\n const [centerX, centerY, radius, min, max, count, curved, tension] = raw.split(',').map(Number);\n if (![centerX, centerY, radius, min, max, count].every(Number.isFinite) || count < 3 || max === min) {\n return null;\n }\n return {\n centerX,\n centerY,\n radius,\n min,\n max,\n count,\n curved: curved === 1,\n tension: Number.isFinite(tension) ? tension : undefined,\n };\n}\n\nfunction findVertex(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"radar-vertex\"]') as SVGGraphicsElement | null;\n}\n\nfunction isVertexPointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nexport function resolveRadarVertexDrag(svg: SVGSVGElement, event: PointerEvent): RadarVertexDragState | null {\n if (!isVertexPointer(event)) {\n return null;\n }\n const element = findVertex(event);\n if (!element) {\n return null;\n }\n const owner = resolveOwner(element);\n if (owner?.role !== 'chart') {\n return null;\n }\n const series = element.getAttribute('data-sf-series');\n const index = Number(element.getAttribute('data-sf-value-index'));\n if (!series || !Number.isInteger(index) || index < 0) {\n return null;\n }\n const frame = parseRadarFrame(findOwnerNode(svg, owner.id, isPrimary));\n if (!frame || index >= frame.count) {\n return null;\n }\n element.setPointerCapture?.(event.pointerId);\n return { owner, series, index, pointerId: event.pointerId, moved: false, frame, element, lastValue: null };\n}\n","import { radarValueAtPoint, radarVertexPoint } from '../../../renderScene/charts/primitives/radarShape';\nimport { pointerUserPoint } from '../../dom';\nimport type { Emitter } from '../events';\nimport { updateRadarVertexDragPreview } from './preview';\nimport { createValueReadout, positionRadarReadout, removeValueReadout } from './readout';\nimport { resolveRadarVertexDrag } from './target';\nimport type { RadarVertexDragState } from './types';\n\nfunction valueFrom(svg: SVGSVGElement, event: PointerEvent, drag: RadarVertexDragState): number | null {\n const point = pointerUserPoint(svg, event);\n if (!point) {\n return null;\n }\n return radarValueAtPoint(drag.frame, drag.index, point.x, point.y);\n}\n\nexport class RadarVertexDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: RadarVertexDragState | null = null;\n #readout: SVGGElement | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveRadarVertexDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const value = valueFrom(this.#svg, event, this.#drag);\n if (value === null) {\n return;\n }\n this.#drag.moved = true;\n this.#drag.lastValue = value;\n updateRadarVertexDragPreview(this.#svg, this.#drag, value);\n\n if (!this.#readout) {\n this.#readout = createValueReadout(this.#svg);\n }\n const vertex = radarVertexPoint(this.#drag.frame, this.#drag.index, value);\n positionRadarReadout(this.#readout, vertex, this.#drag.frame.centerY, value);\n }\n\n cancel(): void {\n this.#drag = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n removeValueReadout(this.#readout);\n this.#readout = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n if (!drag.moved) {\n return;\n }\n const value = valueFrom(this.#svg, event, drag) ?? drag.lastValue;\n if (value === null) {\n return;\n }\n this.#emitter.emit('chartValueChange', {\n owner: drag.owner,\n series: drag.series,\n index: drag.index,\n value,\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { RadarVertexDragSession } from './session';\n\nexport interface RadarVertexDragHandle {\n destroy(): void;\n}\n\nexport function bindRadarVertexDrag(viewer: Viewer, emitter: Emitter): RadarVertexDragHandle {\n const session = new RadarVertexDragSession(viewer.svg, emitter);\n const onPointerDown = (event: PointerEvent) => {\n if (session.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n session.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n session.finish(event);\n };\n viewer.svg.addEventListener('pointerdown', onPointerDown);\n viewer.svg.addEventListener('pointermove', onPointerMove);\n viewer.svg.addEventListener('pointerup', onPointerUp);\n viewer.svg.addEventListener('pointercancel', onPointerUp);\n return {\n destroy() {\n session.cancel();\n viewer.svg.removeEventListener('pointerdown', onPointerDown);\n viewer.svg.removeEventListener('pointermove', onPointerMove);\n viewer.svg.removeEventListener('pointerup', onPointerUp);\n viewer.svg.removeEventListener('pointercancel', onPointerUp);\n },\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { Emitter } from '../events';\nimport type { ResizeDragState } from './state';\n\nexport function emitResizeCompletion(emitter: Emitter, drag: ResizeDragState, bounds: Rect): void {\n if (!drag.moved) {\n return;\n }\n\n emitter.emit('resizeChange', {\n owner: drag.owner,\n dx: bounds.x - drag.startBounds.x,\n dy: bounds.y - drag.startBounds.y,\n dWidth: bounds.width - drag.startBounds.width,\n dHeight: bounds.height - drag.startBounds.height,\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n });\n}\n","import { estimateTextWidth, wrapText } from '../../../renderScene/scene/textLayout';\nimport type { ResizeTextCapture } from './textCapture';\n\nexport interface TextFit {\n rawText: string;\n fontSize: number;\n lineHeight: number;\n padding: number;\n longestWord: number;\n}\n\nexport function captureTextFit(text: ResizeTextCapture): TextFit {\n const fontSize = Number.parseFloat(text.el.getAttribute('font-size') || '14');\n const bold = text.el.getAttribute('font-weight') === 'bold';\n const lineHeight = Number(text.el.getAttribute('data-sf-line-height')) || 1.3;\n const words = text.rawText.split(/\\s+/).filter(Boolean);\n return {\n rawText: text.rawText,\n fontSize,\n lineHeight,\n padding: Math.max(8, text.strokeWidth * 2),\n longestWord: Math.max(0, ...words.map(word => estimateTextWidth(word, fontSize, bold))),\n };\n}\n\nconst COMMIT_PRECISION = 10;\n\nfunction roundUpForCommit(value: number): number {\n return Math.ceil(value * COMMIT_PRECISION - 1e-9) / COMMIT_PRECISION;\n}\n\nexport function minWidthForText(fit: TextFit): number {\n return roundUpForCommit(fit.longestWord + fit.padding * 2);\n}\n\nexport function minHeightForText(fit: TextFit, width: number): number {\n const lines = wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);\n return roundUpForCommit(lines.length * fit.fontSize * fit.lineHeight + fit.padding * 2);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { ResizeHandle } from '../../dom';\nimport { minHeightForText, minWidthForText, type TextFit } from './textFit';\n\nexport const MIN_SIZE = 10;\n\nexport const HANDLE_AXES: Record<ResizeHandle, { x: 'left' | 'right' | 'none'; y: 'top' | 'bottom' | 'none' }> = {\n 'top-left': { x: 'left', y: 'top' },\n top: { x: 'none', y: 'top' },\n 'top-right': { x: 'right', y: 'top' },\n right: { x: 'right', y: 'none' },\n 'bottom-right': { x: 'right', y: 'bottom' },\n bottom: { x: 'none', y: 'bottom' },\n 'bottom-left': { x: 'left', y: 'bottom' },\n left: { x: 'left', y: 'none' },\n};\n\n// Charts that are drawn round keep their proportions on their own; every shape does while Shift is held.\nconst ROUND_CHARTS: ReadonlySet<string> = new Set(['pie', 'radar', 'radial', 'radialBar', 'polarArea']);\n\nexport function keepsProportions(drag: { owner: { role: string }; kind: string | null }, shift: boolean): boolean {\n return shift || (drag.owner.role === 'chart' && drag.kind !== null && ROUND_CHARTS.has(drag.kind));\n}\n\n// The bounds with the proportions of the start; the edge or corner opposite the handle stays where it is.\nexport function lockAspect(bounds: Rect, start: Rect, handle: ResizeHandle): Rect {\n const ratio = start.width / start.height;\n const axes = HANDLE_AXES[handle];\n let width = bounds.width;\n let height = bounds.height;\n if (axes.x === 'none') {\n width = height * ratio;\n } else if (axes.y === 'none') {\n height = width / ratio;\n } else if (width / start.width > height / start.height) {\n height = width / ratio;\n } else {\n width = height * ratio;\n }\n width = Math.max(MIN_SIZE, width);\n height = Math.max(MIN_SIZE, height);\n const x =\n axes.x === 'left'\n ? start.x + start.width - width\n : axes.x === 'none'\n ? start.x + (start.width - width) / 2\n : start.x;\n const y =\n axes.y === 'top'\n ? start.y + start.height - height\n : axes.y === 'none'\n ? start.y + (start.height - height) / 2\n : start.y;\n return { x, y, width, height };\n}\n\nexport function resizedBounds(start: Rect, handle: ResizeHandle, pointer: { x: number; y: number }): Rect {\n const axes = HANDLE_AXES[handle];\n let x = start.x,\n width = start.width;\n if (axes.x !== 'none') {\n const fixedX = axes.x === 'left' ? start.x + start.width : start.x;\n const x1 = Math.min(fixedX, pointer.x),\n x2 = Math.max(fixedX, pointer.x);\n x = x1;\n width = Math.max(MIN_SIZE, x2 - x1);\n }\n let y = start.y,\n height = start.height;\n if (axes.y !== 'none') {\n const fixedY = axes.y === 'top' ? start.y + start.height : start.y;\n const y1 = Math.min(fixedY, pointer.y),\n y2 = Math.max(fixedY, pointer.y);\n y = y1;\n height = Math.max(MIN_SIZE, y2 - y1);\n }\n return { x, y, width, height };\n}\n\nexport interface BoundsInset {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport const NO_INSET: BoundsInset = { left: 0, top: 0, right: 0, bottom: 0 };\n\nexport function insetWithin(outer: Rect, inner: Rect): BoundsInset {\n return {\n left: inner.x - outer.x,\n top: inner.y - outer.y,\n right: outer.x + outer.width - (inner.x + inner.width),\n bottom: outer.y + outer.height - (inner.y + inner.height),\n };\n}\n\nexport function applyInset(bounds: Rect, inset: BoundsInset): Rect {\n return {\n x: bounds.x + inset.left,\n y: bounds.y + inset.top,\n width: Math.max(1, bounds.width - inset.left - inset.right),\n height: Math.max(1, bounds.height - inset.top - inset.bottom),\n };\n}\n\nexport function keepTextInside(bounds: Rect, start: Rect, handle: ResizeHandle, fit: TextFit | null): Rect {\n if (!fit) {\n return bounds;\n }\n const axes = HANDLE_AXES[handle];\n const width = axes.x === 'none' ? bounds.width : Math.max(bounds.width, Math.min(minWidthForText(fit), start.width));\n const height =\n axes.y === 'none' ? bounds.height : Math.max(bounds.height, Math.min(minHeightForText(fit, width), start.height));\n const fixedX = axes.x === 'left' ? start.x + start.width : start.x;\n const fixedY = axes.y === 'top' ? start.y + start.height : start.y;\n return {\n x: axes.x === 'none' || Math.abs(bounds.x - fixedX) < 1e-6 ? bounds.x : fixedX - width,\n y: axes.y === 'none' || Math.abs(bounds.y - fixedY) < 1e-6 ? bounds.y : fixedY - height,\n width,\n height,\n };\n}\n\nexport function lockDerivedHeight(bounds: Rect, start: Rect, locked: boolean): Rect {\n return locked ? { ...bounds, y: start.y, height: start.height } : bounds;\n}\n\nexport function clampResizeToChildren(bounds: Rect, childrenBounds: Rect | undefined): Rect {\n if (!childrenBounds) {\n return bounds;\n }\n const minX = Math.min(bounds.x, childrenBounds.x);\n const minY = Math.min(bounds.y, childrenBounds.y);\n const maxX = Math.max(bounds.x + bounds.width, childrenBounds.x + childrenBounds.width);\n const maxY = Math.max(bounds.y + bounds.height, childrenBounds.y + childrenBounds.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","export function resizePointerPosition(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } {\n const transform = svg.getScreenCTM();\n if (!transform) {\n return { x: 0, y: 0 };\n }\n\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(transform.inverse());\n return { x: point.x, y: point.y };\n}\n","import type { Rect } from '../../../model/geometry/types';\n\nexport function recenterRotation(element: SVGGraphicsElement, bounds: Rect): void {\n const transform = element.getAttribute('transform');\n const rotation = transform && /rotate\\(([-\\d.]+)/.exec(transform);\n if (!rotation) {\n return;\n }\n\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n element.setAttribute('transform', `rotate(${rotation[1]} ${centerX} ${centerY})`);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport type { ShapeType } from '../../../model/shape';\nimport { localShapePath, pillCornerRadius } from '../../../renderScene/artifacts/shape/geometry/pathCalculation';\nimport { freeformPathData } from '../../../renderScene/scene/freeformPath';\nimport { cornersRoundedRectPath, type RectCornerRadii } from '../../../renderScene/scene/roundedRectPath';\nimport {\n CORNER_RADIUS_ATTR,\n SQUARE_CORNER_ATTR,\n SYMBOL_POINTS_ATTR,\n SYMBOL_TENSION_ATTR,\n} from '../../../svg/domContract/attributes';\nimport { recenterRotation } from './rotation';\n\nfunction applyRectBounds(rect: SVGGraphicsElement, kind: string | null, bounds: Rect): void {\n rect.setAttribute('x', String(bounds.x));\n rect.setAttribute('y', String(bounds.y));\n rect.setAttribute('width', String(bounds.width));\n rect.setAttribute('height', String(bounds.height));\n if (kind === 'pill') {\n rect.setAttribute('rx', String(pillCornerRadius(bounds.width, bounds.height)));\n }\n}\n\nfunction applyEllipseBounds(ellipse: SVGGraphicsElement, bounds: Rect): void {\n ellipse.setAttribute('cx', String(bounds.x + bounds.width / 2));\n ellipse.setAttribute('cy', String(bounds.y + bounds.height / 2));\n ellipse.setAttribute('rx', String(bounds.width / 2));\n ellipse.setAttribute('ry', String(bounds.height / 2));\n}\n\nfunction applySymbolBounds(path: SVGGraphicsElement, bounds: Rect): boolean {\n const raw = path.getAttribute(SYMBOL_POINTS_ATTR);\n if (!raw) {\n return false;\n }\n const points = (JSON.parse(raw) as Array<[number, number]>).map(([x, y]) => ({\n x: bounds.x + x * bounds.width,\n y: bounds.y + y * bounds.height,\n }));\n const tension = Number(path.getAttribute(SYMBOL_TENSION_ATTR)) || 0;\n path.setAttribute('d', freeformPathData({ points, tension, closed: true }));\n return true;\n}\n\nfunction applyPathBounds(path: SVGGraphicsElement, kind: string, bounds: Rect): void {\n if (kind === 'symbol' && applySymbolBounds(path, bounds)) {\n return;\n }\n const pathData = localShapePath(kind as ShapeType, bounds.x, bounds.y, bounds.width, bounds.height);\n if (pathData) {\n path.setAttribute('d', pathData);\n }\n}\n\nfunction applyFrameBoundaryBounds(path: SVGGraphicsElement, bounds: Rect): void {\n const cornerRadius = Number(path.getAttribute(CORNER_RADIUS_ATTR) ?? 0);\n const squareCorner = path.getAttribute(SQUARE_CORNER_ATTR) as keyof RectCornerRadii | null;\n const radii: RectCornerRadii = {\n topLeft: cornerRadius,\n topRight: cornerRadius,\n bottomRight: cornerRadius,\n bottomLeft: cornerRadius,\n };\n if (squareCorner) {\n radii[squareCorner] = 0;\n }\n path.setAttribute('d', cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));\n}\n\nexport function applySingleNodeBounds(primary: SVGGraphicsElement, kind: string | null, bounds: Rect): void {\n const tag = primary.tagName.toLowerCase();\n if (tag === 'rect') {\n applyRectBounds(primary, kind, bounds);\n } else if (tag === 'ellipse') {\n applyEllipseBounds(primary, bounds);\n } else if (tag === 'foreignobject') {\n applyRectBounds(primary, null, bounds);\n } else if (tag === 'path' && primary.hasAttribute(CORNER_RADIUS_ATTR)) {\n applyFrameBoundaryBounds(primary, bounds);\n } else if (tag === 'path' && kind) {\n applyPathBounds(primary, kind, bounds);\n }\n recenterRotation(primary, bounds);\n}\n\nfunction applyTextAnchorTranslate(\n node: SVGGraphicsElement,\n startBounds: Rect,\n liveBounds: Rect,\n scaleX: number,\n scaleY: number,\n base: string | null | undefined,\n): void {\n const anchorX = Number(node.getAttribute('x') ?? 0);\n const anchorY = Number(node.getAttribute('y') ?? 0);\n const dx = liveBounds.x + scaleX * (anchorX - startBounds.x) - anchorX;\n const dy = liveBounds.y + scaleY * (anchorY - startBounds.y) - anchorY;\n const transform = `translate(${dx} ${dy})`;\n node.setAttribute('transform', base ? `${transform} ${base}` : transform);\n}\n\nexport function applyCompositeScale(\n nodes: SVGGraphicsElement[],\n startBounds: Rect,\n liveBounds: Rect,\n baseTransforms?: ReadonlyArray<string | null>,\n): void {\n const scaleX = liveBounds.width / startBounds.width;\n const scaleY = liveBounds.height / startBounds.height;\n const transform = `translate(${liveBounds.x} ${liveBounds.y}) scale(${scaleX} ${scaleY}) translate(${-startBounds.x} ${-startBounds.y})`;\n nodes.forEach((node, index) => {\n const base = baseTransforms?.[index];\n if (node.tagName.toLowerCase() === 'text') {\n applyTextAnchorTranslate(node, startBounds, liveBounds, scaleX, scaleY, base);\n return;\n }\n node.setAttribute('transform', base ? `${transform} ${base}` : transform);\n });\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { resizeHandlePositions } from '../../dom';\n\nfunction updateSelectionRing(overlay: SVGGElement, bounds: Rect): void {\n const ring = overlay.querySelector('rect:not([data-sf-resize-handle])');\n ring?.setAttribute('x', String(bounds.x - 1));\n ring?.setAttribute('y', String(bounds.y - 1));\n ring?.setAttribute('width', String(bounds.width + 2));\n ring?.setAttribute('height', String(bounds.height + 2));\n}\n\nexport function updateSelectionOverlay(overlay: SVGGElement, bounds: Rect): void {\n updateSelectionRing(overlay, bounds);\n for (const [centerX, centerY, name] of resizeHandlePositions(bounds)) {\n const handle = overlay.querySelector(`[data-sf-resize-handle=\"${name}\"]`);\n if (!handle) {\n continue;\n }\n const size = Number(handle.getAttribute('width')) || 6;\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { wrapText } from '../../../renderScene/scene/textLayout';\nimport { SVG_NAMESPACE } from '../../dom';\nimport { recenterRotation } from './rotation';\n\nfunction replaceTextLines(textElement: SVGTextElement, lines: string[], x: number, lineHeight: number): void {\n while (textElement.firstChild) {\n textElement.removeChild(textElement.firstChild);\n }\n lines.forEach((line, index) => {\n const tspan = document.createElementNS(SVG_NAMESPACE, 'tspan');\n tspan.setAttribute('x', String(x));\n if (index > 0) {\n tspan.setAttribute('dy', `${lineHeight}px`);\n }\n tspan.textContent = line;\n textElement.appendChild(tspan);\n });\n}\n\nexport function applyLiveText(textElement: SVGTextElement, rawText: string, bounds: Rect, strokeWidth: number): void {\n const fontSize = parseFloat(textElement.getAttribute('font-size') || '14');\n const anchor = textElement.getAttribute('text-anchor');\n const align: 'left' | 'center' | 'right' = anchor === 'start' ? 'left' : anchor === 'end' ? 'right' : 'center';\n const verticalAlign = (textElement.getAttribute('data-sf-valign') as 'top' | 'middle' | 'bottom' | null) ?? 'middle';\n const lineHeight = Number(textElement.getAttribute('data-sf-line-height')) || 1.3;\n const padding = Math.max(8, strokeWidth * 2);\n const width = Math.max(0, bounds.width - padding * 2);\n const height = Math.max(0, bounds.height - padding * 2);\n const boxX = bounds.x + padding;\n const boxY = bounds.y + padding;\n const lines = wrapText(rawText, width, fontSize);\n const linePixels = fontSize * lineHeight;\n const contentHeight = lines.length * linePixels;\n const firstY =\n verticalAlign === 'top'\n ? boxY + fontSize\n : verticalAlign === 'bottom'\n ? boxY + height - contentHeight + fontSize\n : boxY + (height - contentHeight) / 2 + fontSize;\n const x = align === 'left' ? boxX : align === 'right' ? boxX + width : boxX + width / 2;\n\n textElement.setAttribute('x', String(x));\n textElement.setAttribute('y', String(firstY));\n replaceTextLines(textElement, lines, x, linePixels);\n recenterRotation(textElement, bounds);\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { personLabelArea } from '../../../renderScene/artifacts/shape/geometry/roundedForms';\nimport { updateQuickDuplicateBubbles } from '../../dom';\nimport { updateLiveLinks } from '../linkPreview';\nimport { applyInset, NO_INSET } from './geometry';\nimport { applyCompositeScale, applySingleNodeBounds } from './geometryPreview';\nimport { updateSelectionOverlay } from './overlayPreview';\nimport type { ResizeDragState } from './state';\nimport { applyLiveText } from './textPreview';\n\nfunction textBoundsFor(kind: string | null, bounds: Rect): Rect {\n return kind === 'person' ? personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;\n}\n\nfunction applyGeometryPreview(drag: ResizeDragState, bounds: Rect): void {\n if (drag.isComposite) {\n applyCompositeScale(drag.geometryNodes, drag.startBounds, bounds, drag.baseTransforms);\n return;\n }\n\n drag.geometryNodes.forEach((node, index) => {\n // A picture is scaled as it is, so that its crop and its clip go along.\n if (node.tagName.toLowerCase() === 'image') {\n applyCompositeScale([node], drag.startBounds, bounds, [drag.baseTransforms[index]]);\n return;\n }\n applySingleNodeBounds(node, drag.kind, applyInset(bounds, drag.insets[index] ?? NO_INSET));\n });\n}\n\nexport function applyResizePreview(drag: ResizeDragState, bounds: Rect): void {\n applyGeometryPreview(drag, bounds);\n if (drag.overlay) {\n updateSelectionOverlay(drag.overlay, bounds);\n }\n if (drag.text) {\n applyLiveText(drag.text.el, drag.text.rawText, textBoundsFor(drag.kind, bounds), drag.text.strokeWidth);\n }\n if (drag.bubbles) {\n updateQuickDuplicateBubbles(drag.bubbles, bounds);\n }\n updateLiveLinks(drag.liveLinks, bounds);\n}\n\nexport { applyCompositeScale, applySingleNodeBounds } from './geometryPreview';\nexport { applyLiveText } from './textPreview';\n","import type { Rect } from '../../../model/geometry/types';\nimport type { GuideLine } from '../../dom';\nimport { findSnapCandidateBounds, pxPerUnit } from '../../dom';\nimport { hasDerivedHeight } from '../geometryRoles';\nimport { applyAxisSnap, computeSnap, nearestCandidates, resizeActivePoints } from '../snapGeometry';\nimport { isSnapDisabled, snapDistancePx } from '../snapGrid';\nimport { HANDLE_AXES, keepTextInside, lockDerivedHeight, MIN_SIZE, resizedBounds } from './geometry';\nimport type { ResizeDragState } from './state';\n\nconst GUIDE_OVERHANG = 10;\n\nexport function snapResize(\n svg: SVGSVGElement,\n drag: ResizeDragState,\n pointer: { x: number; y: number },\n): { bounds: Rect; guides: GuideLine[] } {\n const proposed = resizedBounds(drag.startBounds, drag.handle, pointer);\n if (isSnapDisabled(svg)) {\n return {\n bounds: keepTextInside(\n lockDerivedHeight(proposed, drag.startBounds, hasDerivedHeight(drag.owner)),\n drag.startBounds,\n drag.handle,\n drag.textFit,\n ),\n guides: [],\n };\n }\n const axes = HANDLE_AXES[drag.handle];\n const candidates = nearestCandidates(proposed, findSnapCandidateBounds(svg, new Set([drag.owner.id])));\n const snap = computeSnap(proposed, candidates, {\n threshold: snapDistancePx(svg) / pxPerUnit(svg),\n activeX: resizeActivePoints(axes.x),\n activeY: resizeActivePoints(axes.y),\n guideOverhang: GUIDE_OVERHANG,\n });\n\n const snapped = applyAxisSnap(proposed, axes.x, axes.y, snap, MIN_SIZE);\n return {\n bounds: keepTextInside(\n lockDerivedHeight(snapped, drag.startBounds, hasDerivedHeight(drag.owner)),\n drag.startBounds,\n drag.handle,\n drag.textFit,\n ),\n guides: [snap.x.guide, snap.y.guide].filter(guide => guide !== null),\n };\n}\n","export function findResizeQuickDuplicateBubbles(\n svg: SVGSVGElement,\n ownerId: string,\n selectionOverlay: SVGGElement | null,\n): SVGGElement | null {\n const overlays = svg.querySelectorAll<SVGGElement>(`[data-sf-selection-overlay=\"${CSS.escape(ownerId)}\"]`);\n\n return (\n [...overlays].find(\n overlay => overlay !== selectionOverlay && overlay.querySelector('circle[data-sf-quick-duplicate]'),\n ) ?? null\n );\n}\n","import type { ResizeHandle } from '../../dom';\nimport { findAllOwnerNodes, findOwnerNode, isPrimary, isTextLabel, resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { hasEditableGeometry, isCompositeOwner } from '../geometryRoles';\n\nexport interface ResizeSelection {\n captureTarget: SVGGraphicsElement;\n handle: ResizeHandle;\n overlay: SVGGElement | null;\n ownerId: string;\n owner: OwnerRef;\n primary: SVGGraphicsElement;\n nodes: SVGGraphicsElement[];\n geometryNodes: SVGGraphicsElement[];\n}\n\nexport function selectResizeTarget(svg: SVGSVGElement, event: PointerEvent): ResizeSelection | null {\n const captureTarget = (event.target as Element | null)?.closest?.(\n '[data-sf-resize-handle]',\n ) as SVGGraphicsElement | null;\n if (!captureTarget) {\n return null;\n }\n if (captureTarget.getAttribute('data-sf-resize-handle')?.startsWith('iso-')) {\n return null;\n }\n\n const overlay = captureTarget.closest('[data-sf-selection-overlay]') as SVGGElement | null;\n const ownerId = overlay?.getAttribute('data-sf-selection-overlay');\n if (!ownerId) {\n return null;\n }\n\n const primary = findOwnerNode(svg, ownerId, isPrimary);\n const owner = primary && resolveOwner(primary);\n if (!primary || !hasEditableGeometry(owner)) {\n return null;\n }\n\n const nodes = findAllOwnerNodes(svg, ownerId);\n const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter(node => !isTextLabel(node));\n if (!geometryNodes.length) {\n return null;\n }\n\n return {\n captureTarget,\n handle: captureTarget.getAttribute('data-sf-resize-handle') as ResizeHandle,\n overlay,\n ownerId,\n owner,\n primary,\n nodes,\n geometryNodes,\n };\n}\n","import { isTextLabel } from '../../dom';\n\nexport interface ResizeTextCapture {\n el: SVGTextElement;\n rawText: string;\n strokeWidth: number;\n}\n\nexport function captureResizeText(nodes: SVGGraphicsElement[], primary: SVGGraphicsElement): ResizeTextCapture | null {\n const textElement = nodes.find(isTextLabel) as SVGTextElement | undefined;\n const rawText = primary.getAttribute('aria-label');\n if (!textElement || !rawText) {\n return null;\n }\n\n return {\n el: textElement,\n rawText,\n strokeWidth: Number(primary.getAttribute('stroke-width')) || 2,\n };\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { type ResizeHandle, symbolDeclaredBounds } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport { CONTAINER_ROLES, childrenUnionBounds } from '../containerGeometry';\nimport { isCompositeOwner } from '../geometryRoles';\nimport { findLiveLinks, type LiveLink } from '../linkPreview';\nimport { findResizeQuickDuplicateBubbles } from './bubbleCapture';\nimport { type BoundsInset, insetWithin, NO_INSET } from './geometry';\nimport { selectResizeTarget } from './selection';\nimport { captureResizeText, type ResizeTextCapture } from './textCapture';\nimport { captureTextFit, type TextFit } from './textFit';\n\nexport interface ResizeDragState {\n owner: OwnerRef;\n handle: ResizeHandle;\n kind: string | null;\n isComposite: boolean;\n geometryNodes: SVGGraphicsElement[];\n insets: BoundsInset[];\n baseTransforms: Array<string | null>;\n overlay: SVGGElement | null;\n bubbles: SVGGElement | null;\n startBounds: Rect;\n childrenBounds?: Rect;\n liveLinks: LiveLink[];\n pointerId: number;\n moved: boolean;\n text: ResizeTextCapture | null;\n textFit: TextFit | null;\n}\n\nexport function createResizeDragState(svg: SVGSVGElement, event: PointerEvent): ResizeDragState | null {\n const selection = selectResizeTarget(svg, event);\n if (!selection) {\n return null;\n }\n\n const startBounds = symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();\n const composite = isCompositeOwner(selection.owner);\n const isContainer = CONTAINER_ROLES.has(selection.owner.role);\n selection.captureTarget.setPointerCapture?.(event.pointerId);\n const kind = selection.primary.getAttribute('data-sf-kind');\n const text = composite || isContainer ? null : captureResizeText(selection.nodes, selection.primary);\n return {\n owner: selection.owner,\n handle: selection.handle,\n kind,\n isComposite: composite,\n geometryNodes: selection.geometryNodes,\n insets: selection.geometryNodes.map(node =>\n node === selection.primary ? NO_INSET : insetWithin(startBounds, symbolDeclaredBounds(node) ?? node.getBBox()),\n ),\n baseTransforms: selection.geometryNodes.map(node => node.getAttribute('transform')),\n overlay: selection.overlay,\n bubbles: findResizeQuickDuplicateBubbles(svg, selection.ownerId, selection.overlay),\n startBounds,\n childrenBounds: isContainer ? childrenUnionBounds(svg, selection.ownerId) : undefined,\n liveLinks: findLiveLinks(svg, selection.ownerId, startBounds),\n pointerId: event.pointerId,\n moved: false,\n text,\n textFit: text && selection.owner.role === 'shape' && kind !== 'person' ? captureTextFit(text) : null,\n };\n}\n","import { clearAlignmentGuides, isCameraGesture, updateAlignmentGuides } from '../../dom';\nimport type { Emitter } from '../events';\nimport { emitResizeCompletion } from './completion';\nimport { clampResizeToChildren, keepsProportions, lockAspect } from './geometry';\nimport { resizePointerPosition } from './pointer';\nimport { applyResizePreview } from './preview';\nimport { snapResize } from './snapping';\nimport { createResizeDragState, type ResizeDragState } from './state';\n\nconst RESIZE_GUIDE_COLOR = '#4CAF50';\n\nexport class ResizeSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: ResizeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly pointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || this.#drag || isCameraGesture(event)) {\n return;\n }\n\n this.#drag = createResizeDragState(this.#svg, event);\n };\n\n readonly pointerMove = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n drag.moved = true;\n const snapped = snapResize(this.#svg, drag, resizePointerPosition(this.#svg, event));\n const bounds = keepsProportions(drag, event.shiftKey)\n ? lockAspect(snapped.bounds, drag.startBounds, drag.handle)\n : snapped.bounds;\n const { guides } = snapped;\n applyResizePreview(drag, clampResizeToChildren(bounds, drag.childrenBounds));\n updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);\n };\n\n readonly pointerUp = (event: PointerEvent): void => {\n const drag = this.#drag;\n if (!drag || event.pointerId !== drag.pointerId) {\n return;\n }\n\n this.#drag = null;\n (event.target as Element | null)?.releasePointerCapture?.(drag.pointerId);\n clearAlignmentGuides(this.#svg);\n if (!drag.moved) {\n return;\n }\n\n const snapped = snapResize(this.#svg, drag, resizePointerPosition(this.#svg, event)).bounds;\n const bounds = keepsProportions(drag, event.shiftKey)\n ? lockAspect(snapped, drag.startBounds, drag.handle)\n : snapped;\n emitResizeCompletion(this.#emitter, drag, clampResizeToChildren(bounds, drag.childrenBounds));\n };\n\n cancel(): void {\n this.#drag = null;\n }\n}\n","import type { Viewer } from '../viewer';\nimport type { Emitter } from './events';\nimport { ResizeSession } from './resize/session';\n\nexport { HANDLE_AXES } from './resize/geometry';\n\nexport interface ResizeDragHandle {\n destroy(): void;\n}\n\nexport function bindShapeResize(viewer: Viewer, emitter: Emitter): ResizeDragHandle {\n const svg = viewer.svg;\n const session = new ResizeSession(svg, emitter);\n\n svg.addEventListener('pointerdown', session.pointerDown);\n svg.addEventListener('pointermove', session.pointerMove);\n svg.addEventListener('pointerup', session.pointerUp);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('pointerdown', session.pointerDown);\n svg.removeEventListener('pointermove', session.pointerMove);\n svg.removeEventListener('pointerup', session.pointerUp);\n },\n };\n}\n","import { resolveOwner, screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { bindTextareaAutoGrow, createTextEditor } from '../textEdit/textarea';\n\ninterface SankeyNodeLabelTarget {\n owner: OwnerRef;\n nodeId: string;\n labelElement: SVGGraphicsElement;\n}\n\nfunction findLabelMark(event: MouseEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"sankey-node-label\"]') as SVGGraphicsElement | null;\n}\n\nexport function resolveSankeyNodeLabelTarget(event: MouseEvent): SankeyNodeLabelTarget | null {\n const labelElement = findLabelMark(event);\n if (!labelElement) {\n return null;\n }\n const owner = resolveOwner(labelElement);\n if (owner?.role !== 'chart') {\n return null;\n }\n const nodeId = labelElement.getAttribute('data-sf-series');\n if (!nodeId) {\n return null;\n }\n return { owner, nodeId, labelElement };\n}\n\nexport function createSankeyNodeLabelEditor(\n target: SankeyNodeLabelTarget,\n emitter: Emitter,\n onClose: () => void,\n): ActiveTextEditor | null {\n const rect = screenRectOf(target.labelElement);\n if (rect.width <= 0 && rect.height <= 0) {\n return null;\n }\n const originalText = target.labelElement.textContent ?? '';\n const fontSize = Number.parseFloat(target.labelElement.getAttribute('font-size') || '12');\n const textarea = createTextEditor({\n text: originalText,\n rect,\n fontSize,\n fontFamily: target.labelElement.getAttribute('font-family') || 'sans-serif',\n });\n\n return new ActiveTextEditor({\n textarea,\n originalText,\n commit: label => emitter.emit('sankeyNodeRename', { owner: target.owner, nodeId: target.nodeId, label }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose,\n });\n}\n","import type { SankeyNodeDragLink, SankeyNodeDragState } from './types';\n\nfunction redrawLink(link: SankeyNodeDragLink, dx: number, dy: number): void {\n const sx = link.endsAtSource ? link.sx + dx : link.sx;\n const sTop = link.endsAtSource ? link.sTop + dy : link.sTop;\n const sBottom = link.endsAtSource ? link.sBottom + dy : link.sBottom;\n const tx = link.endsAtSource ? link.tx : link.tx + dx;\n const tTop = link.endsAtSource ? link.tTop : link.tTop + dy;\n const tBottom = link.endsAtSource ? link.tBottom : link.tBottom + dy;\n const cx = (sx + tx) / 2;\n const d = [\n `M ${sx} ${sTop}`,\n `C ${cx} ${sTop} ${cx} ${tTop} ${tx} ${tTop}`,\n `L ${tx} ${tBottom}`,\n `C ${cx} ${tBottom} ${cx} ${sBottom} ${sx} ${sBottom}`,\n 'Z',\n ].join(' ');\n link.element.setAttribute('d', d);\n}\n\nexport function updateSankeyNodeDragPreview(drag: SankeyNodeDragState, dx: number, dy: number): void {\n drag.rect.setAttribute('transform', `translate(${dx}, ${dy})`);\n drag.label?.setAttribute('transform', `translate(${dx}, ${dy})`);\n for (const link of drag.links) {\n redrawLink(link, dx, dy);\n }\n}\n\nexport function clearSankeyNodeDragPreview(drag: SankeyNodeDragState): void {\n drag.rect.removeAttribute('transform');\n drag.label?.removeAttribute('transform');\n for (const link of drag.links) {\n link.element.setAttribute('d', link.originalD);\n }\n}\n","import type { Rect } from '../../../model/geometry/types';\nimport { isCameraGesture, pointerUserPoint, resolveOwner } from '../../dom';\nimport type { SankeyNodeDragLink, SankeyNodeDragState } from './types';\n\nconst RIBBON_PATH =\n /^M\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+C\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)\\s+-?[\\d.]+\\s+L\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+C\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+(-?[\\d.]+)\\s+-?[\\d.]+\\s+-?[\\d.]+\\s+Z$/;\n\nfunction isNodePointer(event: PointerEvent): boolean {\n return event.button === 0 && !isCameraGesture(event);\n}\n\nfunction findNodeRect(event: PointerEvent): SVGGraphicsElement | null {\n return (event.target as Element | null)?.closest?.('[data-sf-mark=\"sankey-node\"]') as SVGGraphicsElement | null;\n}\n\nfunction findNodeLabel(svg: SVGSVGElement, ownerId: string, nodeId: string): SVGGraphicsElement | null {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-mark=\"sankey-node-label\"][data-sf-series=\"${CSS.escape(nodeId)}\"]`;\n return svg.querySelector<SVGGraphicsElement>(selector);\n}\n\nfunction parseRibbonLink(element: SVGGraphicsElement, endsAtSource: boolean): SankeyNodeDragLink | null {\n const d = element.getAttribute('d');\n const match = d?.match(RIBBON_PATH);\n if (!d || !match) {\n return null;\n }\n const [, sx, sTop, tTop, tx, tBottom, sBottom] = match.map(Number) as [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n ];\n return { element, originalD: d, endsAtSource, sx, sTop, sBottom, tx, tTop, tBottom };\n}\n\nfunction rectOf(element: SVGGraphicsElement): Rect {\n const box = element.getBBox();\n return { x: box.x, y: box.y, width: box.width, height: box.height };\n}\n\nfunction siblingNodeBounds(svg: SVGSVGElement, ownerId: string, rect: SVGGraphicsElement): Rect[] {\n const selector = `[data-sf-id=\"${CSS.escape(ownerId)}\"][data-sf-mark=\"sankey-node\"]`;\n return [...svg.querySelectorAll<SVGGraphicsElement>(selector)].filter(element => element !== rect).map(rectOf);\n}\n\nfunction connectedLinks(svg: SVGSVGElement, ownerId: string, nodeId: string): SankeyNodeDragLink[] {\n const escapedOwner = CSS.escape(ownerId);\n const escapedNode = CSS.escape(nodeId);\n const asSource = [\n ...svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-id=\"${escapedOwner}\"][data-sf-from=\"${escapedNode}\"]`),\n ];\n const asTarget = [\n ...svg.querySelectorAll<SVGGraphicsElement>(`[data-sf-id=\"${escapedOwner}\"][data-sf-to=\"${escapedNode}\"]`),\n ];\n const links: SankeyNodeDragLink[] = [];\n for (const element of asSource) {\n const link = parseRibbonLink(element, true);\n if (link) {\n links.push(link);\n }\n }\n for (const element of asTarget) {\n const link = parseRibbonLink(element, false);\n if (link) {\n links.push(link);\n }\n }\n return links;\n}\n\nexport function resolveSankeyNodeDrag(svg: SVGSVGElement, event: PointerEvent): SankeyNodeDragState | null {\n if (!isNodePointer(event)) {\n return null;\n }\n const rect = findNodeRect(event);\n if (!rect) {\n return null;\n }\n const owner = resolveOwner(rect);\n if (owner?.role !== 'chart') {\n return null;\n }\n const nodeId = rect.getAttribute('data-sf-series');\n if (!nodeId) {\n return null;\n }\n const start = pointerUserPoint(svg, event);\n if (!start) {\n return null;\n }\n\n rect.setPointerCapture?.(event.pointerId);\n return {\n owner,\n pointerId: event.pointerId,\n nodeId,\n rect,\n label: findNodeLabel(svg, owner.id, nodeId),\n startX: start.x,\n startY: start.y,\n originalBounds: rectOf(rect),\n siblingBounds: siblingNodeBounds(svg, owner.id, rect),\n links: connectedLinks(svg, owner.id, nodeId),\n moved: false,\n lastDx: 0,\n lastDy: 0,\n };\n}\n","import { clearAlignmentGuides, pointerUserPoint, pxPerUnit, updateAlignmentGuides } from '../../dom';\nimport type { Emitter } from '../events';\nimport { offsetBounds } from '../move/geometry';\nimport { computeSnap, MOVE_ACTIVE_POINTS, nearestCandidates } from '../snapGeometry';\nimport { clearSankeyNodeDragPreview, updateSankeyNodeDragPreview } from './preview';\nimport { resolveSankeyNodeDrag } from './target';\nimport type { SankeyNodeDragState } from './types';\n\nconst MOVE_NOISE = 2;\nconst SNAP_THRESHOLD_PX = 20;\nconst GUIDE_OVERHANG = 10;\nconst GUIDE_COLOR = '#8b5cf6';\n\nexport class SankeyNodeDragSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #drag: SankeyNodeDragState | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n start(event: PointerEvent): boolean {\n if (this.#drag) {\n return false;\n }\n this.#drag = resolveSankeyNodeDrag(this.#svg, event);\n return this.#drag !== null;\n }\n\n move(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const point = pointerUserPoint(this.#svg, event);\n if (!point) {\n return;\n }\n const drag = this.#drag;\n const rawDx = point.x - drag.startX;\n const rawDy = point.y - drag.startY;\n if (!drag.moved && Math.hypot(rawDx, rawDy) < MOVE_NOISE) {\n return;\n }\n drag.moved = true;\n\n const leadBounds = offsetBounds(drag.originalBounds, rawDx, rawDy);\n const candidates = nearestCandidates(leadBounds, drag.siblingBounds);\n const snap = computeSnap(leadBounds, candidates, {\n threshold: SNAP_THRESHOLD_PX / pxPerUnit(this.#svg),\n activeX: MOVE_ACTIVE_POINTS,\n activeY: MOVE_ACTIVE_POINTS,\n guideOverhang: GUIDE_OVERHANG,\n });\n const dx = rawDx + snap.x.delta;\n const dy = rawDy + snap.y.delta;\n drag.lastDx = dx;\n drag.lastDy = dy;\n updateSankeyNodeDragPreview(drag, dx, dy);\n updateAlignmentGuides(\n this.#svg,\n [snap.x.guide, snap.y.guide].filter(guide => guide !== null),\n GUIDE_COLOR,\n );\n }\n\n cancel(): void {\n if (this.#drag) {\n clearSankeyNodeDragPreview(this.#drag);\n }\n this.#drag = null;\n clearAlignmentGuides(this.#svg);\n }\n\n finish(event: PointerEvent): void {\n if (!this.#drag || event.pointerId !== this.#drag.pointerId) {\n return;\n }\n const drag = this.#drag;\n this.#drag = null;\n (event.target as Element)?.releasePointerCapture?.(drag.pointerId);\n clearSankeyNodeDragPreview(drag);\n clearAlignmentGuides(this.#svg);\n if (!drag.moved) {\n return;\n }\n this.#emitter.emit('sankeyNodeMove', { owner: drag.owner, nodeId: drag.nodeId, dx: drag.lastDx, dy: drag.lastDy });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { ActiveTextEditor } from '../textEdit/activeEditor';\nimport { createSankeyNodeLabelEditor, resolveSankeyNodeLabelTarget } from './rename';\nimport { SankeyNodeDragSession } from './session';\n\nexport interface SankeyNodeHandle {\n destroy(): void;\n}\n\nexport function bindSankeyNode(viewer: Viewer, emitter: Emitter): SankeyNodeHandle {\n const svg = viewer.svg;\n const drag = new SankeyNodeDragSession(svg, emitter);\n let activeEditor: ActiveTextEditor | null = null;\n\n const onPointerDown = (event: PointerEvent) => {\n if (drag.start(event)) {\n event.stopPropagation();\n }\n };\n const onPointerMove = (event: PointerEvent) => {\n drag.move(event);\n };\n const onPointerUp = (event: PointerEvent) => {\n drag.finish(event);\n };\n const onDoubleClick = (event: MouseEvent) => {\n const target = resolveSankeyNodeLabelTarget(event);\n if (!target) {\n return;\n }\n activeEditor?.cancel();\n activeEditor = createSankeyNodeLabelEditor(target, emitter, () => {\n activeEditor = null;\n });\n };\n\n svg.addEventListener('pointerdown', onPointerDown);\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n svg.addEventListener('pointercancel', onPointerUp);\n svg.addEventListener('dblclick', onDoubleClick);\n\n return {\n destroy() {\n drag.cancel();\n activeEditor?.cancel();\n svg.removeEventListener('pointerdown', onPointerDown);\n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n svg.removeEventListener('pointercancel', onPointerUp);\n svg.removeEventListener('dblclick', onDoubleClick);\n },\n };\n}\n","import { screenRectOf } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nexport interface TextEditRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nconst FALLBACK_WIDTH = 120;\nconst FALLBACK_HEIGHT = 28;\n\nfunction centeredLabelRect(primaryNode: SVGGraphicsElement): TextEditRect {\n const primaryRect = screenRectOf(primaryNode);\n return {\n left: primaryRect.left + (primaryRect.width - FALLBACK_WIDTH) / 2,\n top: primaryRect.top + (primaryRect.height - FALLBACK_HEIGHT) / 2,\n width: FALLBACK_WIDTH,\n height: FALLBACK_HEIGHT,\n };\n}\n\nexport function resolveTextEditRect(\n owner: OwnerRef,\n textNode: SVGGraphicsElement | null,\n primaryNode: SVGGraphicsElement | null,\n): TextEditRect | null {\n if (owner.role === 'shape') {\n return primaryNode ? screenRectOf(primaryNode) : null;\n }\n if (textNode) {\n return screenRectOf(textNode);\n }\n return primaryNode ? centeredLabelRect(primaryNode) : null;\n}\n","import { findOwnerNode, isPrimary, isTextLabel } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { ActiveTextEditor } from './activeEditor';\nimport { resolveTextEditRect } from './geometry';\nimport { bindTextareaAutoGrow, createTextEditor } from './textarea';\n\nfunction textFontSize(textNode: SVGGraphicsElement | null): number {\n return Number.parseFloat(textNode?.getAttribute('font-size') || '14');\n}\n\nfunction textAlign(owner: OwnerRef, textNode: SVGGraphicsElement | null): 'left' | 'center' | 'right' {\n if (owner.role === 'shape') {\n return 'center';\n }\n const anchor = textNode?.getAttribute('text-anchor');\n if (anchor === 'middle') {\n return 'center';\n }\n return anchor === 'end' ? 'right' : 'left';\n}\n\nexport function createActiveTextEditor(\n svg: SVGSVGElement,\n owner: OwnerRef,\n emitter: Emitter,\n onClose: () => void,\n): ActiveTextEditor | null {\n const textNode = findOwnerNode(svg, owner.id, isTextLabel);\n const primaryNode = findOwnerNode(svg, owner.id, isPrimary);\n const rect = resolveTextEditRect(owner, textNode, primaryNode);\n if (!rect) {\n return null;\n }\n\n const originalText = textNode?.textContent ?? '';\n const fontSize = textFontSize(textNode);\n const previousVisibility = textNode?.getAttribute('visibility') ?? null;\n const fill = textNode?.getAttribute('fill');\n const textarea = createTextEditor({\n text: originalText,\n rect,\n fontSize,\n fontFamily: textNode?.getAttribute('font-family') || 'sans-serif',\n inline: true,\n color: fill && fill !== 'none' ? fill : undefined,\n fontWeight: textNode?.getAttribute('font-weight') ?? undefined,\n fontStyle: textNode?.getAttribute('font-style') ?? undefined,\n align: textAlign(owner, textNode),\n });\n textNode?.setAttribute('visibility', 'hidden');\n\n return new ActiveTextEditor({\n textarea,\n originalText,\n commit: text => emitter.emit('textChange', { owner, text }),\n unbindAutoGrow: bindTextareaAutoGrow(textarea, Math.max(rect.height, fontSize * 1.6)),\n onClose: () => {\n if (textNode?.isConnected) {\n if (previousVisibility === null) {\n textNode.removeAttribute('visibility');\n } else {\n textNode.setAttribute('visibility', previousVisibility);\n }\n }\n onClose();\n },\n });\n}\n","import { resolveOwner } from '../../dom';\nimport type { OwnerRef } from '../../viewer';\n\nconst EDITABLE_ROLES = new Set(['shape', 'link', 'isometric']);\n\nfunction isFrameTitle(target: Element | null): boolean {\n return Boolean(target?.closest('text, [id*=\"frame-tab-\"]'));\n}\n\nexport function resolveEditableTextOwner(event: MouseEvent): OwnerRef | null {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!owner) {\n return null;\n }\n if (owner.role === 'frame') {\n return isFrameTitle(target) ? owner : null;\n }\n return EDITABLE_ROLES.has(owner.role) ? owner : null;\n}\n","import type { OwnerRef } from '../../viewer';\nimport type { Emitter } from '../events';\nimport type { ActiveTextEditor } from './activeEditor';\nimport { createActiveTextEditor } from './editorFactory';\nimport { resolveEditableTextOwner } from './target';\n\nexport class TextEditingSession {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n #activeEditor: ActiveTextEditor | null = null;\n\n constructor(svg: SVGSVGElement, emitter: Emitter) {\n this.#svg = svg;\n this.#emitter = emitter;\n }\n\n readonly doubleClick = (event: MouseEvent): void => {\n const owner = resolveEditableTextOwner(event);\n if (owner) {\n this.begin(owner);\n }\n };\n\n cancel(): void {\n this.#activeEditor?.cancel();\n }\n\n private begin(owner: OwnerRef): void {\n this.cancel();\n this.#activeEditor = createActiveTextEditor(this.#svg, owner, this.#emitter, () => {\n this.#activeEditor = null;\n });\n }\n}\n","import type { Viewer } from '../../viewer';\nimport type { Emitter } from '../events';\nimport { TextEditingSession } from './session';\n\nexport interface TextEditingHandle {\n destroy(): void;\n}\n\nexport function bindTextEditing(viewer: Viewer, emitter: Emitter): TextEditingHandle {\n const svg = viewer.svg;\n const session = new TextEditingSession(svg, emitter);\n\n svg.addEventListener('dblclick', session.doubleClick);\n\n return {\n destroy() {\n session.cancel();\n svg.removeEventListener('dblclick', session.doubleClick);\n },\n };\n}\n","export function indentBlock(body: string, indent: string): string[] {\n return body.split('\\n').map(line => (line.trim() ? `${indent}${line}` : line));\n}\n\nexport const indentOf = (line: string): string => line.match(/^[ \\t]*/)?.[0] ?? '';\nexport const round1 = (n: number): number => Math.round(n * 10) / 10;\nexport const round2 = (n: number): number => Math.round(n * 100) / 100;\nexport const escapeSflString = (value: string): string =>\n value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\r\\n?/g, '\\n').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t');\n","import { indentOf } from './format';\nimport type { LineRange } from './scanner';\n\nconst DEFAULT_UNIT = ' ';\n\nexport function detectIndentUnit(lines: string[], range: LineRange): string {\n const parent = indentOf(lines[range.start]);\n for (let i = range.start + 1; i < range.end; i++) {\n if (!lines[i].trim()) {\n continue;\n }\n const indent = indentOf(lines[i]);\n if (indent.length > parent.length && indent.startsWith(parent)) {\n return indent.slice(parent.length);\n }\n }\n let smallest = '';\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n const indent = indentOf(line);\n if (indent && (!smallest || indent.length < smallest.length)) {\n smallest = indent;\n }\n }\n return smallest || DEFAULT_UNIT;\n}\n\nexport function childIndent(lines: string[], range: LineRange): string {\n return `${indentOf(lines[range.start])}${detectIndentUnit(lines, range)}`;\n}\n\nexport function insertBlockLines(lines: string[], range: LineRange, build: (baseIndent: string) => string[]): void {\n const unit = detectIndentUnit(lines, range);\n const baseIndent = `${indentOf(lines[range.start])}${unit}`;\n const block = build(baseIndent).map(line => {\n if (!line.startsWith(baseIndent)) {\n return line;\n }\n const rest = line.slice(baseIndent.length);\n const steps = (rest.match(/^( {4})*/)?.[0].length ?? 0) / 4;\n return `${baseIndent}${unit.repeat(steps)}${rest.slice(steps * 4)}`;\n });\n let at = range.end;\n while (at > range.start + 1 && !lines[at - 1].trim()) {\n at--;\n }\n lines.splice(at, 0, ...block);\n}\n","import { type Token, tokenize } from '../../../../sflLanguage';\n\nconst STRING_FILLER = '\"';\n\nexport interface MaskedSource {\n lines: string[];\n continuesString: boolean[];\n}\n\nfunction overwrite(masked: string[], row: number, from: number, to: number, text: string): void {\n const line = masked[row];\n if (line === undefined) {\n return;\n }\n masked[row] = line.slice(0, from) + text + line.slice(to);\n}\n\nfunction applyToken(target: MaskedSource, lines: string[], token: Token): void {\n const startRow = token.line - 1;\n const endRow = token.endLine - 1;\n const startCol = token.col - 1;\n const endCol = token.endCol - 1;\n const isString = token.type === 'string';\n\n if (startRow === endRow) {\n const source = lines[startRow];\n if (source === undefined) {\n return;\n }\n const text = isString ? STRING_FILLER.repeat(Math.max(0, endCol - startCol)) : source.slice(startCol, endCol);\n overwrite(target.lines, startRow, startCol, endCol, text);\n return;\n }\n\n const firstLength = lines[startRow]?.length ?? 0;\n overwrite(target.lines, startRow, startCol, firstLength, STRING_FILLER.repeat(Math.max(0, firstLength - startCol)));\n target.continuesString[startRow] = true;\n for (let row = startRow + 1; row < endRow; row++) {\n const length = lines[row]?.length ?? 0;\n overwrite(target.lines, row, 0, length, STRING_FILLER.repeat(length));\n target.continuesString[row] = true;\n }\n overwrite(target.lines, endRow, 0, endCol, STRING_FILLER.repeat(Math.max(0, endCol)));\n}\n\nexport function maskSource(lines: string[]): MaskedSource | null {\n let tokens: Token[];\n try {\n tokens = tokenize(lines.join('\\n'));\n } catch {\n return null;\n }\n\n const target: MaskedSource = {\n lines: lines.map(line => ' '.repeat(line.length)),\n continuesString: lines.map(() => false),\n };\n for (const token of tokens) {\n if (token.type === 'newline' || token.type === 'eof') {\n continue;\n }\n applyToken(target, lines, token);\n }\n return target;\n}\n\nexport function maskLines(lines: string[]): string[] | null {\n return maskSource(lines)?.lines ?? null;\n}\n\nexport function braceDelta(masked: string): number {\n let delta = 0;\n for (const character of masked) {\n if (character === '{') {\n delta++;\n } else if (character === '}') {\n delta--;\n }\n }\n return delta;\n}\n","import { braceDelta, maskLines } from './sourceMask';\n\nconst OWNER_HEADER =\n /^\\s*(Entity|Shape|Text|Image|Container|Screen|Chart|Path|Link|Isometric|Widget|Component|Connection|Shader)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/;\nexport const VALID_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport interface LineRange {\n start: number;\n end: number;\n}\n\nfunction blockEndIn(masked: string[], startLine: number): number {\n let depth = 0;\n for (let i = startLine; i < masked.length; i++) {\n for (const character of masked[i]) {\n if (character === '{') {\n depth++;\n } else if (character === '}') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n }\n return masked.length - 1;\n}\n\nexport function blockEndLine(lines: string[], startLine: number): number {\n const masked = maskLines(lines);\n return masked === null ? lines.length - 1 : blockEndIn(masked, startLine);\n}\n\nexport function findOwnerBlock(lines: string[], id: string): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n for (let i = 0; i < masked.length; i++) {\n const header = masked[i].match(OWNER_HEADER);\n if (!header || header[2] !== id) {\n continue;\n }\n return { start: i, end: blockEndIn(masked, i) };\n }\n return null;\n}\n\nexport function findChildBlock(lines: string[], range: LineRange, headerRe: RegExp): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n let depth = 0;\n for (let i = range.start; i <= range.end; i++) {\n if (depth === 1 && i > range.start && headerRe.test(masked[i])) {\n return { start: i, end: blockEndIn(masked, i) };\n }\n depth += braceDelta(masked[i]);\n }\n return null;\n}\n\nconst DATA_BLOCK_HEADER = /^\\s*data\\s*\\{/;\n\nexport function findContentChild(\n lines: string[],\n range: LineRange,\n headerRe: RegExp,\n bareHeaderRe?: RegExp,\n): LineRange | null {\n const direct = findChildBlock(lines, range, headerRe);\n if (direct !== null) {\n return direct;\n }\n const data = findChildBlock(lines, range, DATA_BLOCK_HEADER);\n if (!data) {\n return null;\n }\n return findChildBlock(lines, data, headerRe) ?? (bareHeaderRe ? findChildBlock(lines, data, bareHeaderRe) : null);\n}\n\nexport function findChildBlocks(lines: string[], range: LineRange, headerRe: RegExp): LineRange[] {\n const masked = maskLines(lines);\n if (masked === null) {\n return [];\n }\n const blocks: LineRange[] = [];\n let depth = 0;\n for (let i = range.start; i <= range.end; i++) {\n if (depth === 1 && i > range.start && headerRe.test(masked[i])) {\n blocks.push({ start: i, end: blockEndIn(masked, i) });\n }\n depth += braceDelta(masked[i]);\n }\n return blocks;\n}\n\nexport function findFirstBlockOfKind(lines: string[], kind: string): LineRange | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n const header = new RegExp(`^\\\\s*${kind}\\\\s+([A-Za-z_][A-Za-z0-9_]*)\\\\b`);\n for (let i = 0; i < masked.length; i++) {\n if (!header.test(masked[i])) {\n continue;\n }\n return { start: i, end: blockEndIn(masked, i) };\n }\n return null;\n}\n\nexport function nameExists(lines: string[], id: string): boolean {\n const masked = maskLines(lines);\n if (masked === null) {\n return false;\n }\n return masked.some(line => {\n const header = line.match(OWNER_HEADER);\n return header !== null && header[2] === id;\n });\n}\n","import { findContentChild, type LineRange } from './blocks';\n\nconst BLOCK_SEGMENT = /^([A-Za-z_][A-Za-z0-9_]*)(?:\\[([A-Za-z_][A-Za-z0-9_]*)\\])?$/;\nconst PROPERTY_SEGMENT = /^([A-Za-z_][A-Za-z0-9_]*)((?:\\[\\d+\\])*)$/;\n\nexport interface BlockSegment {\n name: string;\n id?: string;\n}\n\nexport interface PropertySegment {\n name: string;\n indices: number[];\n}\n\nexport interface PropertyPath {\n blocks: BlockSegment[];\n property: PropertySegment;\n}\n\nexport function parsePropertyPath(path: string): PropertyPath | null {\n const segments = path.split('.');\n const last = segments[segments.length - 1];\n if (segments.length === 0 || last === undefined) {\n return null;\n }\n\n const property = parsePropertySegment(last);\n if (property === null) {\n return null;\n }\n\n const blocks: BlockSegment[] = [];\n for (const segment of segments.slice(0, -1)) {\n const block = parseBlockSegment(segment);\n if (block === null) {\n return null;\n }\n blocks.push(block);\n }\n return { blocks, property };\n}\n\nfunction parseBlockSegment(segment: string): BlockSegment | null {\n const match = segment.match(BLOCK_SEGMENT);\n if (!match) {\n return null;\n }\n return match[2] === undefined ? { name: match[1] } : { name: match[1], id: match[2] };\n}\n\nfunction parsePropertySegment(segment: string): PropertySegment | null {\n const match = segment.match(PROPERTY_SEGMENT);\n if (!match) {\n return null;\n }\n const indices = [...match[2].matchAll(/\\d+/g)].map(entry => Number(entry[0]));\n return { name: match[1], indices };\n}\n\nexport function resolveBlocks(lines: string[], owner: LineRange, blocks: readonly BlockSegment[]): LineRange | null {\n let range = owner;\n for (const block of blocks) {\n const next = findContentChild(lines, range, blockHeader(block), bareSeriesHeader(block));\n if (next === null) {\n return null;\n }\n range = next;\n }\n return range;\n}\n\nfunction blockHeader(block: BlockSegment): RegExp {\n return block.id === undefined\n ? new RegExp(`^\\\\s*${block.name}\\\\s*(?::[^{]*)?\\\\{`)\n : new RegExp(`^\\\\s*${block.name}\\\\s+${block.id}\\\\s*(?::[^{]*)?\\\\{`);\n}\n\nfunction bareSeriesHeader(block: BlockSegment): RegExp | undefined {\n return block.name === 'Series' && block.id !== undefined\n ? new RegExp(`^\\\\s*${block.id}\\\\s*(?::[^{]*)?\\\\{`)\n : undefined;\n}\n","import type { LineRange } from './blocks';\nimport { type MaskedSource, maskSource } from './sourceMask';\n\nexport interface PropertySpan {\n line: number;\n start: number;\n endLine: number;\n end: number;\n}\n\ninterface Cursor {\n row: number;\n col: number;\n}\n\ninterface LineDepthScan {\n depthAt: number[];\n endDepth: number;\n}\n\ninterface ValueLineScan {\n depth: number;\n endColumn?: number;\n}\n\nexport function findDirectProperty(\n lines: string[],\n range: LineRange,\n key: string,\n targetDepth = 1,\n): PropertySpan | null {\n const source = maskSource(lines);\n if (source === null) {\n return null;\n }\n\n const keyPattern = new RegExp(`\\\\b${key}\\\\b\\\\s*:\\\\s*`, 'g');\n let depth = 0;\n for (let row = range.start; row <= range.end; row++) {\n const line = source.lines[row];\n if (line === undefined) {\n break;\n }\n const depthScan = scanLineDepths(line, depth);\n const valueStart = findPropertyValueStart(line, keyPattern, depthScan.depthAt, targetDepth);\n if (valueStart !== null) {\n return createPropertySpan(source, { row, col: valueStart }, range.end, targetDepth);\n }\n depth = depthScan.endDepth;\n }\n return null;\n}\n\nfunction scanLineDepths(line: string, startDepth: number): LineDepthScan {\n const depthAt = new Array<number>(line.length);\n let depth = startDepth;\n for (let column = 0; column < line.length; column++) {\n depthAt[column] = depth;\n if (line[column] === '{') {\n depth++;\n } else if (line[column] === '}') {\n depth--;\n }\n }\n return { depthAt, endDepth: depth };\n}\n\nfunction findPropertyValueStart(\n line: string,\n keyPattern: RegExp,\n depthAt: number[],\n targetDepth: number,\n): number | null {\n keyPattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: canonical RegExp.exec loop\n while ((match = keyPattern.exec(line))) {\n if (depthAt[match.index] === targetDepth) {\n return match.index + match[0].length;\n }\n keyPattern.lastIndex = match.index + 1;\n }\n return null;\n}\n\nfunction createPropertySpan(source: MaskedSource, from: Cursor, lastRow: number, targetDepth: number): PropertySpan {\n const end = trimBack(source.lines, from, findValueEnd(source, from, lastRow, targetDepth));\n return { line: from.row, start: from.col, endLine: end.row, end: end.col };\n}\n\nfunction findValueEnd(source: MaskedSource, from: Cursor, lastRow: number, targetDepth: number): Cursor {\n let depth = targetDepth;\n for (let row = from.row; row <= lastRow; row++) {\n const line = source.lines[row];\n if (line === undefined) {\n break;\n }\n const lineScan = scanValueLine(line, row === from.row ? from.col : 0, depth, targetDepth);\n if (lineScan.endColumn !== undefined) {\n return { row, col: lineScan.endColumn };\n }\n if (!source.continuesString[row]) {\n return { row, col: line.length };\n }\n depth = lineScan.depth;\n }\n return { row: lastRow, col: source.lines[lastRow]?.length ?? 0 };\n}\n\nfunction scanValueLine(line: string, startColumn: number, startDepth: number, targetDepth: number): ValueLineScan {\n let depth = startDepth;\n for (let column = startColumn; column < line.length; column++) {\n const character = line[column];\n if (character === '{') {\n depth++;\n } else if (character === '}') {\n if (depth <= targetDepth) {\n return { depth, endColumn: column };\n }\n depth--;\n } else if (character === ';' && depth === targetDepth) {\n return { depth, endColumn: column };\n }\n }\n return { depth };\n}\n\nfunction trimBack(masked: string[], from: Cursor, end: Cursor): Cursor {\n let row = end.row;\n let column = end.col;\n for (;;) {\n const line = masked[row] ?? '';\n while (column > 0 && /\\s/.test(line[column - 1])) {\n column--;\n }\n if (column > 0 || row <= from.row) {\n return { row, col: column };\n }\n row--;\n column = masked[row]?.length ?? 0;\n }\n}\n","import { escapeSflString, indentBlock, round1 } from '../format';\nimport type { InsertCanvasObjectOptions } from './types';\n\nfunction canvasObjectBlockKind(\n kind: InsertCanvasObjectOptions['kind'],\n): 'Shape' | 'Text' | 'Image' | 'Isometric' | 'Container' {\n if (kind === 'shape') {\n return 'Shape';\n }\n if (kind === 'text') {\n return 'Text';\n }\n if (kind === 'image') {\n return 'Image';\n }\n if (kind === 'isometric') {\n return 'Isometric';\n }\n return 'Container';\n}\n\nexport function buildCanvasObjectBlock(\n options: InsertCanvasObjectOptions,\n origin: { x: number; y: number },\n baseIndent: string,\n): string[] {\n const bodyIndent = `${baseIndent} `;\n const block: string[] = [`${baseIndent}${canvasObjectBlockKind(options.kind)} ${options.id} {`];\n\n if (options.kind === 'frame' || options.kind === 'swimlane') {\n block.push(`${bodyIndent}kind: ${options.kind}`);\n }\n if (options.text !== undefined) {\n block.push(`${bodyIndent}text: \"${escapeSflString(options.text)}\"`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n const size =\n options.depth === undefined\n ? `${round1(options.width)}, ${round1(options.height)}`\n : `${round1(options.width)}, ${round1(options.height)}, ${round1(options.depth)}`;\n block.push(\n `${bodyIndent}layout {`,\n `${bodyIndent} position: ${round1(options.x - origin.x)}, ${round1(options.y - origin.y)}`,\n `${bodyIndent} size: ${size}`,\n `${bodyIndent}}`,\n `${baseIndent}}`,\n );\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, findOwnerBlock, type LineRange } from '../scanner';\n\nexport interface CanvasObjectInsertionTarget {\n range: LineRange;\n origin: { x: number; y: number };\n}\n\nexport function resolveCanvasObjectInsertionTarget(\n sfl: string,\n lines: string[],\n parentId: string | undefined,\n): CanvasObjectInsertionTarget | null {\n if (!parentId) {\n const modelRange = findFirstBlockOfKind(lines, 'Model');\n return modelRange ? { range: modelRange, origin: { x: 0, y: 0 } } : null;\n }\n\n const parent = sflToCanvasState(sfl).canvasObjects.find(canvasObject => canvasObject.id === parentId);\n if (!parent) {\n return null;\n }\n\n const parentRange = findOwnerBlock(lines, parentId);\n if (!parentRange) {\n return null;\n }\n\n return { range: parentRange, origin: { x: parent.x, y: parent.y } };\n}\n","import { indentBlock, round1 } from '../format';\nimport type { InsertPathOptions } from './types';\n\nexport function buildPathBlock(\n options: InsertPathOptions,\n origin: { x: number; y: number },\n baseIndent: string,\n): string[] {\n const bodyIndent = `${baseIndent} `;\n const points = options.points\n .map(point => {\n const pair = `${round1(point.x - origin.x)}, ${round1(point.y - origin.y)}`;\n return point.tension === undefined ? `[${pair}]` : `[${pair}, ${round1(point.tension)}]`;\n })\n .join(', ');\n const block: string[] = [`${baseIndent}Path ${options.id} {`, `${bodyIndent}points: [${points}]`];\n\n if (options.closed) {\n block.push(`${bodyIndent}closed: true`);\n }\n if (options.tension) {\n block.push(`${bodyIndent}tension: ${options.tension}`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { nameExists, VALID_IDENT } from '../scanner';\nimport { buildCanvasObjectBlock } from './blockText';\nimport { resolveCanvasObjectInsertionTarget } from './insertionTarget';\nimport { buildPathBlock } from './pathBlockText';\nimport type { InsertCanvasObjectOptions, InsertPathOptions } from './types';\n\nexport function insertCanvasObject(sfl: string, options: InsertCanvasObjectOptions): string {\n if (!VALID_IDENT.test(options.id)) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n if (nameExists(lines, options.id)) {\n return sfl;\n }\n\n const target = resolveCanvasObjectInsertionTarget(sfl, lines, options.parentId);\n if (!target) {\n return sfl;\n }\n\n insertBlockLines(lines, target.range, baseIndent => buildCanvasObjectBlock(options, target.origin, baseIndent));\n return lines.join('\\n');\n}\n\nexport function insertPath(sfl: string, options: InsertPathOptions): string {\n if (!VALID_IDENT.test(options.id) || options.points.length < 2) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n if (nameExists(lines, options.id)) {\n return sfl;\n }\n\n const target = resolveCanvasObjectInsertionTarget(sfl, lines, options.parentId);\n if (!target) {\n return sfl;\n }\n\n insertBlockLines(lines, target.range, baseIndent => buildPathBlock(options, target.origin, baseIndent));\n return lines.join('\\n');\n}\n","import { blockEndLine, type LineRange } from '../scanner';\n\nconst LINK_HEADER = /^\\s*(?:Link|Connection)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/;\n\nexport function findReferencingLinkRanges(lines: string[], canvasObjectId: string): LineRange[] {\n const endpointReference = new RegExp(`\\\\b(from|to)\\\\s*:\\\\s*${canvasObjectId}\\\\b`);\n const ranges: LineRange[] = [];\n let lineIndex = 0;\n\n while (lineIndex < lines.length) {\n if (!LINK_HEADER.test(lines[lineIndex])) {\n lineIndex++;\n continue;\n }\n\n const end = blockEndLine(lines, lineIndex);\n if (lines.slice(lineIndex, end + 1).some(line => endpointReference.test(line))) {\n ranges.push({ start: lineIndex, end });\n }\n lineIndex = end + 1;\n }\n\n return ranges;\n}\n","import { blockEndLine } from '../scan/blocks';\nimport { braceDelta, maskLines } from '../scan/sourceMask';\n\nconst REPEAT_HEADER = /^(\\s*)Repeat\\s+[A-Za-z_]\\w*\\s*\\{\\s*$/;\nconst TEMPLATE_HEADER = /^\\s*[A-Z]\\w*\\s+([A-Za-z_]\\w*)\\b[^{]*\\{/;\nconst PROPERTY = /^\\s*[A-Za-z_]\\w*\\s*:/;\nconst WHERE = /^(\\s*)where\\s*:\\s*(.+?)\\s*$/;\n\nconst escaped = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n// A block that a Repeat made has no lines of its own, so it is taken away by keeping its cell out of the Repeat: the cell is added to `where`.\n// The other blocks of that cell go with it, and every other cell stays as it was, as each cell has random numbers of its own.\nexport function excludeRepeatCell(lines: string[], id: string): string[] | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n for (let start = 0; start < masked.length; start++) {\n const header = masked[start].match(REPEAT_HEADER);\n if (!header) {\n continue;\n }\n const end = blockEndLine(lines, start);\n let depth = 0;\n let cell: { col: number; row: number } | null = null;\n let whereLine = -1;\n let lastProperty = start;\n let seenTemplate = false;\n for (let i = start; i <= end; i++) {\n if (depth === 1 && i > start) {\n const template = masked[i].match(TEMPLATE_HEADER);\n if (template) {\n seenTemplate = true;\n const made = id.match(new RegExp(`^${escaped(template[1])}_(\\\\d+)(?:_(\\\\d+))?(?:_[A-Za-z]\\\\w*)?$`));\n if (made) {\n cell = { col: Number(made[1]), row: made[2] === undefined ? 0 : Number(made[2]) };\n }\n } else if (WHERE.test(masked[i])) {\n whereLine = i;\n } else if (!seenTemplate && PROPERTY.test(masked[i])) {\n lastProperty = i;\n }\n }\n depth += braceDelta(masked[i]);\n }\n if (!cell) {\n continue;\n }\n const keep = `(col != ${cell.col} || row != ${cell.row})`;\n const out = [...lines];\n if (whereLine >= 0) {\n const where = lines[whereLine].match(WHERE);\n if (where) {\n out[whereLine] = `${where[1]}where: (${where[2]}) && ${keep}`;\n return out;\n }\n }\n out.splice(lastProperty + 1, 0, `${header[1]} where: ${keep}`);\n return out;\n }\n return null;\n}\n\nconst USE_HEADER = /^\\s*Use\\s+([A-Za-z_]\\w*)\\s*:/;\n\n// The Use that made a block, as the blocks of a Use are named after it: `oak_trunk` is made by `Use oak`.\nexport function findUseBlock(lines: string[], id: string): { start: number; end: number } | null {\n const masked = maskLines(lines);\n if (masked === null) {\n return null;\n }\n let found: { start: number; end: number; length: number } | null = null;\n for (let start = 0; start < masked.length; start++) {\n const header = masked[start].match(USE_HEADER);\n if (header && id.startsWith(`${header[1]}_`) && (found === null || header[1].length > found.length)) {\n found = { start, end: blockEndLine(lines, start), length: header[1].length };\n }\n }\n return found && { start: found.start, end: found.end };\n}\n","import type { LineRange } from '../scanner';\n\nfunction containsRange(container: LineRange, candidate: LineRange): boolean {\n const sameRange = container.start === candidate.start && container.end === candidate.end;\n return !sameRange && container.start <= candidate.start && container.end >= candidate.end;\n}\n\nexport function outermostRemovalRanges(ranges: LineRange[]): LineRange[] {\n return ranges.filter(\n candidate => !ranges.some(container => container !== candidate && containsRange(container, candidate)),\n );\n}\n","import { braceDelta, maskLines } from '../scan/sourceMask';\nimport { blockEndLine, findOwnerBlock, type LineRange } from '../scanner';\nimport { findReferencingLinkRanges } from './linkReferences';\nimport { excludeRepeatCell, findUseBlock } from './madeBlocks';\nimport { outermostRemovalRanges } from './removalRanges';\nimport type { RemoveCanvasObjectOptions } from './types';\n\nconst GROUP_HEADER = /^\\s*Group\\s+([A-Za-z_][A-Za-z0-9_]*)\\b/;\nconst CHILD_BLOCK = /^\\s*[A-Z][A-Za-z]*\\s+[A-Za-z_]/;\n\n// The names of the groups around a line, the innermost first.\nfunction enclosingGroups(lines: string[], line: number): string[] {\n const masked = maskLines(lines);\n if (masked === null) {\n return [];\n }\n const open: Array<string | null> = [];\n for (let i = 0; i < line; i++) {\n const delta = braceDelta(masked[i]);\n if (delta > 0) {\n const group = masked[i].match(GROUP_HEADER);\n open.push(group ? group[1] : null);\n for (let extra = 1; extra < delta; extra++) {\n open.push(null);\n }\n } else {\n open.splice(open.length + delta, -delta);\n }\n }\n return open.filter((name): name is string => name !== null).reverse();\n}\n\n// A group that held the removed object and now holds no object goes with it, and so on outward.\nfunction removeEmptiedGroups(lines: string[], groups: string[]): void {\n for (const name of groups) {\n const masked = maskLines(lines);\n const start = masked?.findIndex(line => line.match(GROUP_HEADER)?.[1] === name) ?? -1;\n if (!masked || start < 0) {\n return;\n }\n const end = blockEndLine(lines, start);\n if (masked.slice(start + 1, end).some(line => CHILD_BLOCK.test(line))) {\n return;\n }\n lines.splice(start, end - start + 1);\n }\n}\n\nexport function removeCanvasObject(sfl: string, id: string, options: RemoveCanvasObjectOptions = {}): string {\n const lines = sfl.split('\\n');\n const canvasObjectRange = findOwnerBlock(lines, id);\n if (!canvasObjectRange) {\n const cell = excludeRepeatCell(lines, id);\n if (cell) {\n return cell.join('\\n');\n }\n const use = findUseBlock(lines, id);\n if (use) {\n lines.splice(use.start, use.end - use.start + 1);\n return lines.join('\\n');\n }\n return sfl;\n }\n\n const groups = enclosingGroups(lines, canvasObjectRange.start);\n const ranges: LineRange[] = [canvasObjectRange];\n if (options.alsoRemoveLinks ?? true) {\n ranges.push(...findReferencingLinkRanges(lines, id));\n }\n\n const removalRanges = outermostRemovalRanges(ranges).sort((left, right) => right.start - left.start);\n for (const range of removalRanges) {\n lines.splice(range.start, range.end - range.start + 1);\n }\n\n removeEmptiedGroups(lines, groups);\n\n return lines.join('\\n');\n}\n","interface ListElementSpan {\n start: number;\n end: number;\n}\n\nfunction skipString(text: string, quoteIndex: number): number {\n for (let cursor = quoteIndex + 1; cursor < text.length; cursor++) {\n if (text[cursor] === '\\\\') {\n cursor++;\n } else if (text[cursor] === '\"') {\n return cursor;\n }\n }\n return text.length - 1;\n}\n\nfunction closingBracket(text: string, openIndex: number): number {\n if (openIndex < 0) {\n return -1;\n }\n let depth = 0;\n for (let cursor = openIndex; cursor < text.length; cursor++) {\n if (text[cursor] === '\"') {\n cursor = skipString(text, cursor);\n } else if (text[cursor] === '[') {\n depth++;\n } else if (text[cursor] === ']') {\n depth--;\n if (depth === 0) {\n return cursor;\n }\n }\n }\n return -1;\n}\n\nexport function listElementSpans(text: string): { spans: ListElementSpan[]; start: number; end: number } | null {\n const listStart = text.indexOf('[');\n const listEnd = closingBracket(text, listStart);\n if (listStart < 0 || listEnd < 0) {\n return null;\n }\n const body = text.slice(listStart + 1, listEnd);\n if (!body.trim()) {\n return { spans: [], start: listStart, end: listEnd };\n }\n\n const spans: ListElementSpan[] = [];\n let depth = 0;\n let elementStart = 0;\n for (let cursor = 0; cursor < body.length; cursor++) {\n const character = body[cursor];\n if (character === '\"') {\n cursor = skipString(body, cursor);\n } else if (character === '[') {\n depth++;\n } else if (character === ']') {\n depth--;\n } else if (character === ',' && depth === 0) {\n spans.push({ start: listStart + 1 + elementStart, end: listStart + 1 + cursor });\n elementStart = cursor + 1;\n }\n }\n spans.push({ start: listStart + 1 + elementStart, end: listEnd });\n return { spans, start: listStart, end: listEnd };\n}\n\nexport function replaceListElement(\n text: string,\n index: number,\n replacement: (current: string) => string,\n): string | null {\n const list = listElementSpans(text);\n const span = list?.spans[index];\n if (!span) {\n return null;\n }\n const current = text.slice(span.start, span.end);\n return text.slice(0, span.start) + replacement(current) + text.slice(span.end);\n}\n\nexport function replaceListElementAt(\n text: string,\n matchElement: (element: string) => boolean,\n replacement: (current: string) => string,\n): string | null {\n const list = listElementSpans(text);\n const span = list?.spans.find(candidate => matchElement(text.slice(candidate.start, candidate.end)));\n if (!span) {\n return null;\n }\n const current = text.slice(span.start, span.end);\n return text.slice(0, span.start) + replacement(current) + text.slice(span.end);\n}\n\nexport function growListElement(text: string, index: number, value: string): string | null {\n const list = listElementSpans(text);\n if (!list || list.spans.length > index) {\n return null;\n }\n const existing = list.spans.map(span => text.slice(span.start, span.end).trim());\n const padding = Array.from({ length: index - list.spans.length }, () => 'none');\n const items = [...existing, ...padding, value];\n return `${text.slice(0, list.start + 1)}${items.join(', ')}${text.slice(list.end)}`;\n}\n","import type { ChartValueChangeEvent } from '../../events';\nimport { round1 } from '../format';\nimport { findContentChild, findDirectProperty, findOwnerBlock, VALID_IDENT } from '../scanner';\nimport { replaceListElement } from './listElement';\n\nfunction replaceChartValue(current: string, value: number): string {\n const pair = current.match(/^(\\s*\\[\\s*[-\\d.]+\\s*,\\s*)([-\\d.]+)(\\s*\\]\\s*)$/);\n if (pair) {\n return `${pair[1]}${round1(value)}${pair[3]}`;\n }\n const spacing = current.match(/^(\\s*)(?:.*?)(\\s*)$/);\n return `${spacing?.[1] ?? ''}${round1(value)}${spacing?.[2] ?? ''}`;\n}\n\nexport function applyChartValueChange(sfl: string, event: ChartValueChangeEvent): string {\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart || !VALID_IDENT.test(event.series)) {\n return sfl;\n }\n\n const series = findContentChild(\n lines,\n chart,\n new RegExp(`^\\\\s*Series\\\\s+${event.series}\\\\b`),\n new RegExp(`^\\\\s*${event.series}\\\\s*(?::[^{]*)?\\\\{`),\n );\n if (!series) {\n return sfl;\n }\n const span = findDirectProperty(lines, series, 'values');\n if (!span) {\n return sfl;\n }\n\n const line = lines[span.line];\n const patched = replaceListElement(line.slice(span.start, span.end), event.index, current =>\n replaceChartValue(current, event.value),\n );\n if (patched === null) {\n return sfl;\n }\n lines[span.line] = line.slice(0, span.start) + patched + line.slice(span.end);\n return lines.join('\\n');\n}\n","import type { LineRange } from '../scan/blocks';\nimport type { PropertySpan } from '../scan/properties';\n\nexport function replacePropertyValue(lines: string[], span: PropertySpan, value: string): void {\n const before = lines[span.line].slice(0, span.start);\n const after = lines[span.endLine].slice(span.end);\n lines.splice(span.line, span.endLine - span.line + 1, `${before}${value}${after}`);\n}\n\nexport function insertDirectProperty(\n lines: string[],\n range: LineRange,\n indent: string,\n key: string,\n value: string,\n): void {\n if (range.start === range.end) {\n const line = lines[range.start];\n const closeAt = line.lastIndexOf('}');\n if (closeAt !== -1) {\n const before = line.slice(0, closeAt).replace(/\\s+$/, '');\n const separator = /\\{$/.test(before) ? ' ' : '; ';\n lines[range.start] = `${before}${separator}${key}: ${value} }${line.slice(closeAt + 1)}`;\n return;\n }\n }\n lines.splice(range.start + 1, 0, `${indent}${key}: ${value}`);\n}\n","import { round2 } from '../format';\nimport type { LinkEndpointTextOptions } from './types';\n\nexport function formatLinkEndpoint(options: LinkEndpointTextOptions): string {\n if (!options.side) {\n return options.id;\n }\n\n const fraction = options.fraction !== undefined ? ` (${round2(options.fraction)})` : '';\n return `${options.id}, ${options.side}${fraction}`;\n}\n","import type { Side } from '../../../model/geometry/types';\nimport { childIndent } from './blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from './edits/propertyValues';\nimport { escapeSflString, round1 } from './format';\nimport { formatLinkEndpoint } from './linkPatch/endpointText';\nimport { findChildBlock, findDirectProperty, type LineRange, maskLines } from './scanner';\n\ntype LayoutTuple = readonly [key: string, first: number, second: number, third?: number];\n\nexport interface LinkEndpointPatch {\n end: 'from' | 'to';\n targetName: string;\n side: Side;\n fraction: number;\n}\n\nexport function setOrInsertText(lines: string[], range: LineRange, text: string): void {\n const value = `\"${escapeSflString(text)}\"`;\n const existing = findDirectProperty(lines, range, 'text');\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n return;\n }\n insertDirectProperty(lines, range, childIndent(lines, range), 'text', value);\n}\n\nexport function setOrInsertLayoutTuples(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n const layout = findChildBlock(lines, range, /^\\s*layout\\s*\\{/);\n if (layout) {\n updateLayoutBlock(lines, layout, props);\n return;\n }\n\n if (hasInlineLayout(lines, range)) {\n updateInlineLayout(lines, range, props);\n return;\n }\n\n if (range.start === range.end) {\n insertCompactLayout(lines, range.start, props);\n } else {\n insertMultilineLayout(lines, range, props);\n }\n}\n\nfunction hasInlineLayout(lines: string[], range: LineRange): boolean {\n const maskedStart = maskLines(lines)?.[range.start] ?? '';\n return range.start === range.end && /\\blayout\\s*\\{/.test(maskedStart);\n}\n\nfunction updateInlineLayout(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n for (const tuple of props) {\n const existing = findDirectProperty(lines, range, tuple[0], 2);\n if (existing) {\n replacePropertyValue(lines, existing, layoutTupleValue(tuple));\n }\n }\n}\n\nfunction insertCompactLayout(lines: string[], row: number, props: ReadonlyArray<LayoutTuple>): void {\n const line = lines[row];\n const closeAt = line.lastIndexOf('}');\n const before = line.slice(0, closeAt).replace(/\\s+$/, '');\n const separator = /\\{$/.test(before) ? ' ' : '; ';\n const body = props.map(tuple => `${tuple[0]}: ${layoutTupleValue(tuple)}`).join('; ');\n lines[row] = `${before}${separator}layout { ${body} } }${line.slice(closeAt + 1)}`;\n}\n\nfunction insertMultilineLayout(lines: string[], range: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n const indent = childIndent(lines, range);\n const body = props.map(tuple => `${indent} ${tuple[0]}: ${layoutTupleValue(tuple)}`);\n lines.splice(range.start + 1, 0, `${indent}layout {`, ...body, `${indent}}`);\n}\n\nfunction updateLayoutBlock(lines: string[], layout: LineRange, props: ReadonlyArray<LayoutTuple>): void {\n let currentLayout = layout;\n for (const tuple of props) {\n currentLayout = setLayoutTuple(lines, currentLayout, tuple);\n }\n}\n\nfunction setLayoutTuple(lines: string[], layout: LineRange, tuple: LayoutTuple): LineRange {\n const existing = findDirectProperty(lines, layout, tuple[0]);\n if (existing !== null) {\n replacePropertyValue(lines, existing, layoutTupleValue(tuple));\n return layout;\n }\n const indent = childIndent(lines, layout);\n const lengthBefore = lines.length;\n insertDirectProperty(lines, layout, indent, tuple[0], layoutTupleValue(tuple));\n return { start: layout.start, end: layout.end + (lines.length - lengthBefore) };\n}\n\nfunction layoutTupleValue(tuple: LayoutTuple): string {\n const base = `${round1(tuple[1])}, ${round1(tuple[2])}`;\n return tuple[3] === undefined ? base : `${base}, ${round1(tuple[3])}`;\n}\n\nexport function setEndpoint(lines: string[], range: LineRange, patch: LinkEndpointPatch): void {\n const value = formatLinkEndpoint({ id: patch.targetName, side: patch.side, fraction: patch.fraction });\n const existing = findDirectProperty(lines, range, patch.end);\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n return;\n }\n const indent = childIndent(lines, range);\n insertDirectProperty(lines, range, indent, patch.end, value);\n}\n","import type { LinkReconnectEvent } from '../../events';\nimport { setEndpoint } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyLinkReconnectChange(sfl: string, event: LinkReconnectEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setEndpoint(lines, range, {\n end: event.end,\n targetName: event.target.id,\n side: event.side,\n fraction: event.fraction,\n });\n return lines.join('\\n');\n}\n","import type { LinkSegmentChangeEvent } from '../../events';\nimport { childIndent } from '../blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from '../edits/propertyValues';\nimport { round1 } from '../format';\nimport { findDirectProperty } from '../scan/properties';\nimport { findOwnerBlock } from '../scanner';\n\nconst SEGMENT_SLOTS = 4;\n\nexport function applyLinkSegmentChange(sfl: string, event: LinkSegmentChangeEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n const existing = findDirectProperty(lines, range, 'segments');\n const offsets = Array.from({ length: SEGMENT_SLOTS }, () => 0);\n if (existing !== null && existing.line === existing.endLine) {\n const current = lines[existing.line].slice(existing.start, existing.end).match(/-?\\d+(?:\\.\\d+)?/g) ?? [];\n current.slice(0, SEGMENT_SLOTS).forEach((value, index) => {\n offsets[index] = Number(value);\n });\n }\n if (event.index >= 0 && event.index < SEGMENT_SLOTS) {\n offsets[event.index] = event.offset;\n }\n const value = `[${offsets.map(round1).join(', ')}]`;\n if (existing !== null) {\n replacePropertyValue(lines, existing, value);\n } else {\n insertDirectProperty(lines, range, childIndent(lines, range), 'segments', value);\n }\n return lines.join('\\n');\n}\n","import { round1 } from '../format';\nimport { findDirectProperty, type LineRange, type PropertySpan } from '../scanner';\n\nexport function pointsSpan(lines: string[], range: LineRange): PropertySpan | null {\n const start = findDirectProperty(lines, range, 'points');\n if (start === null) {\n return null;\n }\n let depth = 0;\n for (let row = start.line; row <= range.end; row++) {\n const line = lines[row] ?? '';\n for (let column = row === start.line ? start.start : 0; column < line.length; column++) {\n if (line[column] === '[') {\n depth++;\n } else if (line[column] === ']' && --depth === 0) {\n return { line: start.line, start: start.start, endLine: row, end: column + 1 };\n }\n }\n }\n return null;\n}\n\nexport function readSpan(lines: string[], span: PropertySpan): string {\n if (span.line === span.endLine) {\n return lines[span.line].slice(span.start, span.end);\n }\n return [\n lines[span.line].slice(span.start),\n ...lines.slice(span.line + 1, span.endLine),\n lines[span.endLine].slice(0, span.end),\n ].join('\\n');\n}\n\nexport function formatPoints(points: ReadonlyArray<{ x: number; y: number; tension?: number }>): string {\n const one = (point: { x: number; y: number; tension?: number }) =>\n point.tension === undefined\n ? `[${round1(point.x)}, ${round1(point.y)}]`\n : `[${round1(point.x)}, ${round1(point.y)}, ${round1(point.tension)}]`;\n return `[${points.map(one).join(', ')}]`;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { MoveChangeEvent } from '../../events';\nimport { replacePropertyValue } from '../edits/propertyValues';\nimport { round1 } from '../format';\nimport { setOrInsertLayoutTuples } from '../properties';\nimport { findOwnerBlock, type LineRange } from '../scanner';\nimport { pointsSpan, readSpan } from './pathPoints';\n\nconst POINT_PAIR = /\\[\\s*(-?[\\d.]+)\\s*,\\s*(-?[\\d.]+)\\s*(,\\s*-?[\\d.]+\\s*)?\\]/g;\n\nfunction movePathPoints(lines: string[], range: LineRange, dx: number, dy: number): void {\n const span = pointsSpan(lines, range);\n if (span === null) {\n return;\n }\n const shifted = readSpan(lines, span).replace(\n POINT_PAIR,\n (_match, x: string, y: string, rest?: string) =>\n `[${round1(Number(x) + dx)}, ${round1(Number(y) + dy)}${rest ? `, ${rest.replace(/^,\\s*/, '').trim()}` : ''}]`,\n );\n replacePropertyValue(lines, span, shifted);\n}\n\n// Several objects of one drag at once: the document is read one time, however many there are.\n// A position inside a frame is relative to it, so an object whose frame moves along is not moved a second time.\nexport function applyMoveChanges(sfl: string, events: readonly MoveChangeEvent[]): string {\n const state = sflToCanvasState(sfl);\n const lines = sfl.split('\\n');\n const parents = new Map(state.canvasObjects.map(candidate => [candidate.id, candidate.parentFrameId]));\n const moving = new Set(events.map(event => event.owner.id));\n const hasMovingAncestor = (id: string): boolean => {\n const seen = new Set<string>();\n for (let parent = parents.get(id); parent && !seen.has(parent); parent = parents.get(parent)) {\n if (moving.has(parent)) {\n return true;\n }\n seen.add(parent);\n }\n return false;\n };\n for (const event of events) {\n if (hasMovingAncestor(event.owner.id)) {\n continue;\n }\n const canvasObject = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n const range = canvasObject ? findOwnerBlock(lines, event.owner.id) : null;\n if (!canvasObject || !range) {\n continue;\n }\n if (event.owner.role === 'path') {\n movePathPoints(lines, range, event.dx, event.dy);\n continue;\n }\n const parent = canvasObject.parentFrameId\n ? state.canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n setOrInsertLayoutTuples(lines, range, [\n ['position', canvasObject.x - (parent?.x ?? 0) + event.dx, canvasObject.y - (parent?.y ?? 0) + event.dy],\n ]);\n }\n return lines.join('\\n');\n}\n\nexport function applyMoveChange(sfl: string, event: MoveChangeEvent): string {\n return applyMoveChanges(sfl, [event]);\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { PathPointChangeEvent } from '../../events';\nimport { replacePropertyValue } from '../edits/propertyValues';\nimport { findOwnerBlock } from '../scanner';\nimport { formatPoints, pointsSpan } from './pathPoints';\n\nexport function applyPathPointChange(sfl: string, event: PathPointChangeEvent): string {\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const canvasObject = canvasObjects.find(candidate => candidate.id === event.owner.id);\n if (!canvasObject) {\n return sfl;\n }\n const parent = canvasObject.parentFrameId\n ? canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n const origin = parent ? { x: parent.x, y: parent.y } : { x: 0, y: 0 };\n\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n const span = pointsSpan(lines, range);\n if (!span) {\n return sfl;\n }\n const kept = canvasObject.objectType === 'path' ? canvasObject.path?.points : undefined;\n const sameCount = kept?.length === event.points.length;\n const relative = event.points.map((point, index) => {\n const tension = sameCount ? kept?.[index]?.tension : undefined;\n const moved = { x: point.x - origin.x, y: point.y - origin.y };\n return tension === undefined ? moved : { ...moved, tension };\n });\n replacePropertyValue(lines, span, formatPoints(relative));\n return lines.join('\\n');\n}\n","import type { PropertyChangeEvent, PropertyValue } from '../../events';\nimport { childIndent } from '../blockInsert';\nimport { insertDirectProperty, replacePropertyValue } from '../edits/propertyValues';\nimport { escapeSflString } from '../format';\nimport { findDirectProperty, findOwnerBlock, type PropertySpan, parsePropertyPath, resolveBlocks } from '../scanner';\nimport { growListElement, replaceListElement } from './listElement';\n\nconst NESTED_STYLE_DEPTH = 2;\n\nexport function applyPropertyChange(sfl: string, event: PropertyChangeEvent): string {\n const path = parsePropertyPath(event.path);\n if (path === null || !isWritableValue(event.value)) {\n return sfl;\n }\n\n const lines = sfl.split('\\n');\n const owner = findOwnerBlock(lines, event.owner.id);\n if (owner === null) {\n return sfl;\n }\n\n const range = resolveBlocks(lines, owner, path.blocks);\n if (range === null) {\n return sfl;\n }\n\n const span =\n findDirectProperty(lines, range, path.property.name) ??\n findDirectProperty(lines, range, path.property.name, NESTED_STYLE_DEPTH);\n if (span === null) {\n const indent = childIndent(lines, range);\n if (path.property.indices.length === 1) {\n const [index] = path.property.indices;\n const items = growListElement('[]', index, formatValue(event.value, undefined, event.quote));\n if (items === null) {\n return sfl;\n }\n insertDirectProperty(lines, range, indent, path.property.name, items);\n return lines.join('\\n');\n }\n if (path.property.indices.length > 0) {\n return sfl;\n }\n insertDirectProperty(lines, range, indent, path.property.name, formatValue(event.value, undefined, event.quote));\n return lines.join('\\n');\n }\n\n const current = readSpan(lines, span);\n const next =\n path.property.indices.length > 0\n ? replaceIndexed(current, path.property.indices, event)\n : formatValue(event.value, current, event.quote);\n if (next === null) {\n return sfl;\n }\n\n replacePropertyValue(lines, span, next);\n return lines.join('\\n');\n}\n\nfunction isWritableValue(value: PropertyValue): boolean {\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n if (typeof value === 'object') {\n return value.length > 0 && value.every(entry => Number.isFinite(entry));\n }\n return true;\n}\n\nfunction readSpan(lines: string[], span: PropertySpan): string {\n if (span.line === span.endLine) {\n return lines[span.line].slice(span.start, span.end);\n }\n const first = lines[span.line].slice(span.start);\n const middle = lines.slice(span.line + 1, span.endLine);\n return [first, ...middle, lines[span.endLine].slice(0, span.end)].join('\\n');\n}\n\nfunction replaceIndexed(text: string, indices: readonly number[], event: PropertyChangeEvent): string | null {\n const [head, ...rest] = indices;\n let failed = false;\n\n const result = replaceListElement(text, head, current => {\n if (rest.length === 0) {\n return withSpacing(current, formatValue(event.value, current, event.quote, true));\n }\n const inner = replaceIndexed(current, rest, event);\n if (inner === null) {\n failed = true;\n return current;\n }\n return inner;\n });\n\n if (result !== null) {\n return failed ? null : result;\n }\n return rest.length === 0 ? growListElement(text, head, formatValue(event.value, undefined, event.quote)) : null;\n}\n\nfunction withSpacing(current: string, value: string): string {\n const spacing = current.match(/^(\\s*)[\\s\\S]*?(\\s*)$/);\n return `${spacing?.[1] ?? ''}${value}${spacing?.[2] ?? ''}`;\n}\n\nfunction formatValue(\n value: PropertyValue,\n current: string | undefined,\n quote: boolean | undefined,\n indexed = false,\n): string {\n if (typeof value === 'object') {\n return value.map(String).join(', ');\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n return shouldQuote(current, quote, indexed) ? `\"${escapeSflString(value)}\"` : value;\n}\n\nfunction shouldQuote(current: string | undefined, quote: boolean | undefined, indexed: boolean): boolean {\n if (quote !== undefined) {\n return quote;\n }\n const trimmed = current?.trim();\n if (trimmed === undefined || trimmed.startsWith('\"')) {\n return true;\n }\n return indexed && trimmed === 'none';\n}\n","import { indentBlock } from '../format';\nimport type { InsertConnectionOptions } from './types';\n\nexport function buildConnectionBlock(options: InsertConnectionOptions, baseIndent: string): string[] {\n const bodyIndent = `${baseIndent} `;\n const block: string[] = [\n `${baseIndent}Connection ${options.id} {`,\n `${bodyIndent}from: ${options.fromId}`,\n `${bodyIndent}to: ${options.toId}`,\n `${bodyIndent}fromFace: \"${options.fromFace}\"`,\n `${bodyIndent}toFace: \"${options.toFace}\"`,\n ];\n\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, type LineRange, nameExists, VALID_IDENT } from '../scanner';\nimport type { InsertConnectionOptions } from './types';\n\nexport function resolveConnectionInsertionTarget(\n sfl: string,\n lines: string[],\n options: InsertConnectionOptions,\n): LineRange | null {\n if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {\n return null;\n }\n\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const hasSource = canvasObjects.some(canvasObject => canvasObject.id === options.fromId);\n const hasTarget = canvasObjects.some(canvasObject => canvasObject.id === options.toId);\n if (!hasSource || !hasTarget) {\n return null;\n }\n\n return findFirstBlockOfKind(lines, 'Model');\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { buildConnectionBlock } from './blockText';\nimport { resolveConnectionInsertionTarget } from './insertionTarget';\nimport type { InsertConnectionOptions } from './types';\n\nexport function insertConnection(sfl: string, options: InsertConnectionOptions): string {\n const lines = sfl.split('\\n');\n const modelRange = resolveConnectionInsertionTarget(sfl, lines, options);\n if (!modelRange) {\n return sfl;\n }\n\n insertBlockLines(lines, modelRange, baseIndent => buildConnectionBlock(options, baseIndent));\n return lines.join('\\n');\n}\n","type Props = Record<string, string> | undefined;\n\n// Values that SFL writes as strings; the rest are numbers or bare keywords.\nconst QUOTED_KEYS = new Set(['fill', 'stroke', 'textColor', 'fontFamily', 'shadow', 'labelBackground']);\n\nfunction styleLine(key: string, value: string): string {\n return QUOTED_KEYS.has(key) ? ` ${key}: \"${value.replace(/\"/g, '\\\\\"')}\"` : ` ${key}: ${value}`;\n}\n\n// A `style { ... }` block that repeats the given properties of a resolved object. `leading` lines come first. Without any\n// line there is nothing to copy and the result is undefined.\nexport function styleBlock(props: Props, keys: readonly string[], leading: readonly string[] = []): string | undefined {\n const copied = keys.flatMap(key => {\n const value = props?.[key];\n return value === undefined ? [] : [styleLine(key, value)];\n });\n const lines = [...leading, ...copied];\n return lines.length > 0 ? `style {\\n${lines.join('\\n')}\\n}` : undefined;\n}\n","import type { IsometricFace } from '../../../../../model/isometricObject';\nimport { AXIS_COS, AXIS_SIN } from '../../../../../model/isometricObject';\nimport type { SflIsometricObject } from '../../../../../sflSemantic/canvasObjects/artifacts/isometric/object';\nimport type { IsometricQuickDuplicateDirection, QuickDuplicateEvent } from '../../../events';\nimport { insertCanvasObject } from '../../canvasObjectPatch/insert';\nimport type { InsertCanvasObjectOptions } from '../../canvasObjectPatch/types';\nimport { insertConnection } from '../../connectionPatch/insert';\nimport { styleBlock } from './styleBlock';\nimport type { QuickDuplicateOptions } from './types';\n\nconst ISOMETRIC_GAP = 40;\n\nconst ISOMETRIC_STYLE_KEYS = [\n 'fill',\n 'stroke',\n 'strokeWidth',\n 'cornerRadius',\n 'shadow',\n 'labelOffsetX',\n 'labelOffsetY',\n 'labelBackground',\n];\n\nconst TOUCHING_FACES: Record<IsometricQuickDuplicateDirection, { fromFace: IsometricFace; toFace: IsometricFace }> = {\n 'iso-width-pos': { fromFace: 'right', toFace: 'left' },\n 'iso-width-neg': { fromFace: 'left', toFace: 'right' },\n 'iso-depth-pos': { fromFace: 'front', toFace: 'back' },\n 'iso-depth-neg': { fromFace: 'back', toFace: 'front' },\n 'iso-height-pos': { fromFace: 'bottom', toFace: 'top' },\n 'iso-height-neg': { fromFace: 'top', toFace: 'bottom' },\n};\n\nexport function isIsometricDirection(\n direction: QuickDuplicateEvent['direction'],\n): direction is IsometricQuickDuplicateDirection {\n return direction.startsWith('iso-');\n}\n\n// One edge length plus the gap along the isometric axis of the clicked face, so a chain of copies stays on that axis.\nfunction isometricOffset(\n direction: IsometricQuickDuplicateDirection,\n object: SflIsometricObject,\n gap: number,\n): { dx: number; dy: number } {\n const { width, height } = object;\n const { depth } = object.isometric;\n switch (direction) {\n case 'iso-width-pos':\n return { dx: (width + gap) * AXIS_COS, dy: (width + gap) * AXIS_SIN };\n case 'iso-width-neg':\n return { dx: -(width + gap) * AXIS_COS, dy: -(width + gap) * AXIS_SIN };\n case 'iso-depth-pos':\n return { dx: -(depth + gap) * AXIS_COS, dy: (depth + gap) * AXIS_SIN };\n case 'iso-depth-neg':\n return { dx: (depth + gap) * AXIS_COS, dy: -(depth + gap) * AXIS_SIN };\n case 'iso-height-pos':\n return { dx: 0, dy: height + gap };\n case 'iso-height-neg':\n return { dx: 0, dy: -(height + gap) };\n }\n}\n\n// A copy stacked flush on the object would cast a shadow onto it, so it gets none.\nfunction copyStyle(object: SflIsometricObject, direction: IsometricQuickDuplicateDirection): string | undefined {\n if (!direction.startsWith('iso-height-')) {\n return styleBlock(object.props, ISOMETRIC_STYLE_KEYS);\n }\n return styleBlock(\n object.props,\n ISOMETRIC_STYLE_KEYS.filter(key => key !== 'shadow'),\n [' shadow: \"off\"'],\n );\n}\n\nfunction copyOf(\n object: SflIsometricObject,\n direction: IsometricQuickDuplicateDirection,\n options: QuickDuplicateOptions,\n): InsertCanvasObjectOptions {\n const { dx, dy } = isometricOffset(direction, object, options.gap ?? ISOMETRIC_GAP);\n return {\n id: options.shapeId,\n kind: 'isometric',\n text: object.text ?? '',\n x: object.x + dx,\n y: object.y + dy,\n width: object.width,\n height: object.height,\n depth: object.isometric.depth,\n parentId: object.parentFrameId,\n body: copyStyle(object, direction),\n };\n}\n\nexport function duplicateIsometricObject(\n sfl: string,\n object: SflIsometricObject,\n direction: IsometricQuickDuplicateDirection,\n options: QuickDuplicateOptions,\n): string {\n const withCopy = insertCanvasObject(sfl, copyOf(object, direction, options));\n return insertConnection(withCopy, {\n id: options.linkId,\n fromId: object.id,\n toId: options.shapeId,\n ...TOUCHING_FACES[direction],\n });\n}\n","import { escapeSflString, indentBlock } from '../format';\nimport { formatLinkEndpoint } from './endpointText';\nimport type { InsertLinkOptions } from './types';\n\nexport function buildLinkBlock(options: InsertLinkOptions, baseIndent: string): string[] {\n const bodyIndent = `${baseIndent} `;\n const from = formatLinkEndpoint({ id: options.fromId, side: options.fromSide, fraction: options.fromFraction });\n const to = formatLinkEndpoint({ id: options.toId, side: options.toSide, fraction: options.toFraction });\n const block: string[] = [`${baseIndent}Link ${options.id} {`, `${bodyIndent}from: ${from}`, `${bodyIndent}to: ${to}`];\n\n if (options.text !== undefined) {\n block.push(`${bodyIndent}text: \"${escapeSflString(options.text)}\"`);\n }\n if (options.body) {\n block.push(...indentBlock(options.body, bodyIndent));\n }\n\n block.push(`${baseIndent}}`);\n return block;\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport { findFirstBlockOfKind, type LineRange, nameExists, VALID_IDENT } from '../scanner';\nimport type { InsertLinkOptions } from './types';\n\nexport function resolveLinkInsertionTarget(sfl: string, lines: string[], options: InsertLinkOptions): LineRange | null {\n if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {\n return null;\n }\n\n const canvasObjects = sflToCanvasState(sfl).canvasObjects;\n const hasSource = canvasObjects.some(canvasObject => canvasObject.id === options.fromId);\n const hasTarget = canvasObjects.some(canvasObject => canvasObject.id === options.toId);\n if (!hasSource || !hasTarget) {\n return null;\n }\n\n return findFirstBlockOfKind(lines, 'Model');\n}\n","import { insertBlockLines } from '../blockInsert';\nimport { buildLinkBlock } from './blockText';\nimport { resolveLinkInsertionTarget } from './insertionTarget';\nimport type { InsertLinkOptions } from './types';\n\nexport function insertLink(sfl: string, options: InsertLinkOptions): string {\n const lines = sfl.split('\\n');\n const modelRange = resolveLinkInsertionTarget(sfl, lines, options);\n if (!modelRange) {\n return sfl;\n }\n\n insertBlockLines(lines, modelRange, baseIndent => buildLinkBlock(options, baseIndent));\n return lines.join('\\n');\n}\n","import type { SflLinkOut } from '../../../../../sflSemantic/canvasObjects/artifacts/links/types';\nimport type { SflCanvasObject } from '../../../../../sflSemantic/sflToCanvasState';\nimport { insertCanvasObject } from '../../canvasObjectPatch/insert';\nimport type { InsertCanvasObjectOptions } from '../../canvasObjectPatch/types';\nimport { insertLink } from '../../linkPatch/insert';\nimport type { InsertLinkOptions } from '../../linkPatch/types';\nimport { styleBlock } from './styleBlock';\nimport type { QuickDuplicateOptions, Side } from './types';\n\nconst SHAPE_GAP = 200;\n\nconst OPPOSITE_SIDE: Record<Side, Side> = { top: 'bottom', right: 'left', bottom: 'top', left: 'right' };\n\nconst SHAPE_STYLE_KEYS = [\n 'fill',\n 'stroke',\n 'strokeWidth',\n 'strokeStyle',\n 'textColor',\n 'fontSize',\n 'fontFamily',\n 'cornerRadius',\n 'opacity',\n 'blur',\n 'blend',\n 'shadow',\n];\nconst LINK_STYLE_KEYS = ['stroke', 'strokeWidth', 'strokeStyle', 'markerStart', 'markerEnd', 'route'];\n\nfunction shapeOffset(side: Side, object: SflCanvasObject, gap: number): { dx: number; dy: number } {\n switch (side) {\n case 'top':\n return { dx: 0, dy: -(object.height + gap) };\n case 'bottom':\n return { dx: 0, dy: object.height + gap };\n case 'left':\n return { dx: -(object.width + gap), dy: 0 };\n case 'right':\n return { dx: object.width + gap, dy: 0 };\n }\n}\n\nfunction copyOf(object: SflCanvasObject, side: Side, options: QuickDuplicateOptions): InsertCanvasObjectOptions {\n const { dx, dy } = shapeOffset(side, object, options.gap ?? SHAPE_GAP);\n const shape = object.shapeType ? [` shape: ${object.shapeType}`] : [];\n return {\n id: options.shapeId,\n kind: 'shape',\n text: object.text ?? '',\n x: object.x + dx,\n y: object.y + dy,\n width: object.width,\n height: object.height,\n parentId: object.parentFrameId,\n body: styleBlock(object.props, SHAPE_STYLE_KEYS, shape),\n };\n}\n\n// The new link looks like the other links that leave the object, or else like the first link of the document.\nfunction linkStyleReference(links: SflLinkOut[], objectId: string): SflLinkOut | undefined {\n return links.find(link => link.fromId === objectId) ?? links[0];\n}\n\nfunction linkToCopy(\n object: SflCanvasObject,\n links: SflLinkOut[],\n side: Side,\n options: QuickDuplicateOptions,\n): InsertLinkOptions {\n return {\n id: options.linkId,\n fromId: object.id,\n toId: options.shapeId,\n fromSide: side,\n toSide: OPPOSITE_SIDE[side],\n body: styleBlock(linkStyleReference(links, object.id)?.props, LINK_STYLE_KEYS),\n };\n}\n\nexport function duplicateShape(\n sfl: string,\n input: { object: SflCanvasObject; links: SflLinkOut[]; side: Side; options: QuickDuplicateOptions },\n): string {\n const { object, links, side, options } = input;\n const withCopy = insertCanvasObject(sfl, copyOf(object, side, options));\n return insertLink(withCopy, linkToCopy(object, links, side, options));\n}\n","import { isIsometricObject } from '../../../../sflSemantic/canvasObjects/artifacts/isometric/object';\nimport { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { QuickDuplicateEvent } from '../../events';\nimport { duplicateIsometricObject, isIsometricDirection } from './quickDuplicate/isometricDuplicate';\nimport { duplicateShape } from './quickDuplicate/shapeDuplicate';\nimport type { QuickDuplicateOptions } from './quickDuplicate/types';\n\nexport type { QuickDuplicateOptions } from './quickDuplicate/types';\n\n// Carries out a quick duplicate: a copy of the object with its look beyond the dragged edge, and a link or connection\n// to it. A direction that does not fit the kind of object changes nothing.\nexport function applyQuickDuplicateChange(\n sfl: string,\n event: QuickDuplicateEvent,\n options: QuickDuplicateOptions,\n): string {\n const state = sflToCanvasState(sfl);\n const object = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n if (!object) {\n return sfl;\n }\n const { direction } = event;\n if (isIsometricDirection(direction)) {\n return isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;\n }\n return isIsometricObject(object)\n ? sfl\n : duplicateShape(sfl, { object, links: state.links, side: direction, options });\n}\n","import { sflToCanvasState } from '../../../../sflSemantic/sflToCanvasState';\nimport type { ResizeChangeEvent } from '../../events';\nimport { setOrInsertLayoutTuples } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyResizeChange(sfl: string, event: ResizeChangeEvent): string {\n const state = sflToCanvasState(sfl);\n const canvasObject = state.canvasObjects.find(candidate => candidate.id === event.owner.id);\n const parent = canvasObject?.parentFrameId\n ? state.canvasObjects.find(candidate => candidate.id === canvasObject.parentFrameId)\n : undefined;\n const originX = parent?.x ?? 0;\n const originY = parent?.y ?? 0;\n\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setOrInsertLayoutTuples(lines, range, [\n ['position', event.x - originX, event.y - originY],\n canvasObject?.isometric\n ? ['size', event.width, event.height, event.depth ?? canvasObject.isometric.depth]\n : ['size', event.width, event.height],\n ]);\n return lines.join('\\n');\n}\n","import type { SankeyNodeMoveEvent, SankeyNodeRenameEvent } from '../../events';\nimport { round1 } from '../format';\nimport { findChildBlocks, findDirectProperty, findOwnerBlock, type LineRange } from '../scanner';\nimport { listElementSpans, replaceListElementAt } from './listElement';\n\nconst ZONE_LABEL = /^\\s*\\[\\s*\"((?:[^\"\\\\]|\\\\.)*)\"/;\n\nfunction zoneLabel(element: string): string | null {\n return element.match(ZONE_LABEL)?.[1] ?? null;\n}\n\nfunction escapeSflString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nfunction applyTupleOffset(tuple: string, dx: number, dy: number): string {\n const list = listElementSpans(tuple);\n if (!list) {\n return tuple;\n }\n const items = list.spans.map(span => tuple.slice(span.start, span.end).trim());\n while (items.length < 4) {\n items.push('0');\n }\n const currentX = Number(items[2]) || 0;\n const currentY = Number(items[3]) || 0;\n items[2] = String(round1(currentX + dx));\n items[3] = String(round1(currentY + dy));\n return `${tuple.slice(0, list.start + 1)}${items.join(', ')}${tuple.slice(list.end)}`;\n}\n\nexport function applySankeyNodeMoveChange(sfl: string, event: SankeyNodeMoveEvent): string {\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart) {\n return sfl;\n }\n const span = findDirectProperty(lines, chart, 'zones');\n if (!span) {\n return sfl;\n }\n const line = lines[span.line];\n const moved = replaceListElementAt(\n line.slice(span.start, span.end),\n element => zoneLabel(element) === event.nodeId,\n current => applyTupleOffset(current, event.dx, event.dy),\n );\n if (moved === null) {\n return sfl;\n }\n lines[span.line] = line.slice(0, span.start) + moved + line.slice(span.end);\n return lines.join('\\n');\n}\n\nexport function applySankeyNodeRenameChange(sfl: string, event: SankeyNodeRenameEvent): string {\n const label = event.label.trim();\n if (!label || label === event.nodeId) {\n return sfl;\n }\n const lines = sfl.split('\\n');\n const chart = findOwnerBlock(lines, event.owner.id);\n if (!chart) {\n return sfl;\n }\n const zonesSpan = findDirectProperty(lines, chart, 'zones');\n if (!zonesSpan) {\n return sfl;\n }\n const zonesLine = lines[zonesSpan.line];\n const renamedZones = replaceListElementAt(\n zonesLine.slice(zonesSpan.start, zonesSpan.end),\n element => zoneLabel(element) === event.nodeId,\n current =>\n current.replace(\n ZONE_LABEL,\n (match, group: string) => `${match.slice(0, match.length - group.length - 1)}${escapeSflString(label)}\"`,\n ),\n );\n if (renamedZones === null) {\n return sfl;\n }\n lines[zonesSpan.line] = zonesLine.slice(0, zonesSpan.start) + renamedZones + zonesLine.slice(zonesSpan.end);\n\n const seriesBlocks = findChildBlocks(lines, chart, /^\\s*Series\\s+[A-Za-z_][A-Za-z0-9_]*\\b/);\n for (const series of seriesBlocks) {\n renameEndpoint(lines, series, 'source', event.nodeId, label);\n renameEndpoint(lines, series, 'target', event.nodeId, label);\n }\n return lines.join('\\n');\n}\n\nfunction renameEndpoint(\n lines: string[],\n range: LineRange,\n key: 'source' | 'target',\n oldLabel: string,\n newLabel: string,\n): void {\n const span = findDirectProperty(lines, range, key);\n if (!span) {\n return;\n }\n const line = lines[span.line];\n const current = line.slice(span.start, span.end);\n const match = current.match(/^(\\s*\")((?:[^\"\\\\]|\\\\.)*)(\"\\s*)$/);\n if (!match || match[2] !== oldLabel) {\n return;\n }\n const replaced = `${match[1]}${escapeSflString(newLabel)}${match[3]}`;\n lines[span.line] = line.slice(0, span.start) + replaced + line.slice(span.end);\n}\n","import type { TextChangeEvent } from '../../events';\nimport { setOrInsertText } from '../properties';\nimport { findOwnerBlock } from '../scanner';\n\nexport function applyTextChange(sfl: string, event: TextChangeEvent): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, event.owner.id);\n if (!range) {\n return sfl;\n }\n setOrInsertText(lines, range, event.text);\n return lines.join('\\n');\n}\n","import { findOwnerBlock } from '../scanner';\n\nexport function removeLink(sfl: string, id: string): string {\n const lines = sfl.split('\\n');\n const range = findOwnerBlock(lines, id);\n if (!range) {\n return sfl;\n }\n\n lines.splice(range.start, range.end - range.start + 1);\n return lines.join('\\n');\n}\n","import type { Unsubscribe } from '../eventing/emitter';\nimport type { Viewer } from '../viewer';\nimport { bindChartValueDrag, type ChartValueDragHandle } from './chartValueDrag';\nimport { bindColorEdit, type ColorEditHandle } from './colorEdit/binding';\nimport { bindDeleteSelection, type DeleteSelectionHandle } from './deleteSelection';\nimport { Emitter, type InteractionEventMap, type InteractionEventName } from './events';\nimport { bindIsometricAxisResize, type IsometricAxisResizeDragHandle } from './isometricAxisResizeDrag';\nimport { bindIsometricLabelDrag, type IsometricLabelDragHandle } from './isometricLabelDrag/binding';\nimport { bindIsometricQuickDuplicate, type IsometricQuickDuplicateHandle } from './isometricQuickDuplicate/binding';\nimport { bindLinkEndpointDrag, type LinkEndpointDragHandle } from './linkEndpointDrag';\nimport { bindLinkSegmentDrag, type LinkSegmentDragHandle } from './linkSegmentDrag';\nimport { bindShapeMovement, type MoveDragHandle } from './moveDrag';\nimport { bindNudgeSelection, type NudgeSelectionHandle } from './nudgeSelection';\nimport { bindPathDraw, type PathDrawDragHandle, type PathDrawOptions } from './pathDrawDrag';\nimport { bindPathReshape, type PathReshapeDragHandle } from './pathReshapeDrag';\nimport { bindPieLabelDrag, type PieLabelDragHandle } from './pieLabelDrag/binding';\nimport { bindPropertyDrag, type PropertyDragHandle } from './propertyDrag/binding';\nimport { bindPropertyEditing, type PropertyEditingHandle, type PropertyEditingOptions } from './propertyEdit';\nimport { bindQuickDuplicate, type QuickDuplicateHandle } from './quickDuplicate';\nimport { bindRadarVertexDrag, type RadarVertexDragHandle } from './radarVertexDrag/binding';\nimport { bindShapeResize, type ResizeDragHandle } from './resizeDrag';\nimport { bindSankeyNode, type SankeyNodeHandle } from './sankeyNode/binding';\nimport { bindTextEditing, type TextEditingHandle } from './textEdit';\n\nexport interface Interaction {\n on<T extends InteractionEventName>(name: T, handler: (event: InteractionEventMap[T]) => void): Unsubscribe;\n startPathDraw(options?: PathDrawOptions): void;\n cancelPathDraw(): void;\n destroy(): void;\n}\n\nexport interface EditingOptions {\n properties?: PropertyEditingOptions;\n}\n\nexport function bindEditing(viewer: Viewer, options: EditingOptions = {}): Interaction {\n const emitter = new Emitter();\n const pathDraw: PathDrawDragHandle = bindPathDraw(viewer, emitter);\n const textEditing: TextEditingHandle = bindTextEditing(viewer, emitter);\n const movement: MoveDragHandle = bindShapeMovement(viewer, emitter);\n const resize: ResizeDragHandle = bindShapeResize(viewer, emitter);\n const isometricAxisResize: IsometricAxisResizeDragHandle = bindIsometricAxisResize(viewer, emitter);\n const pathReshape: PathReshapeDragHandle = bindPathReshape(viewer, emitter);\n const linkEndpoints: LinkEndpointDragHandle = bindLinkEndpointDrag(viewer, emitter);\n const linkSegments: LinkSegmentDragHandle = bindLinkSegmentDrag(viewer, emitter);\n const quickDuplicate: QuickDuplicateHandle = bindQuickDuplicate(viewer, emitter);\n const isometricQuickDuplicate: IsometricQuickDuplicateHandle = bindIsometricQuickDuplicate(viewer, emitter);\n const deleteSelection: DeleteSelectionHandle = bindDeleteSelection(viewer, emitter);\n const nudgeSelection: NudgeSelectionHandle = bindNudgeSelection(viewer, emitter);\n const chartValues: ChartValueDragHandle = bindChartValueDrag(viewer, emitter);\n const pieLabels: PieLabelDragHandle = bindPieLabelDrag(viewer, emitter);\n const isometricLabels: IsometricLabelDragHandle = bindIsometricLabelDrag(viewer, emitter);\n const radarVertices: RadarVertexDragHandle = bindRadarVertexDrag(viewer, emitter);\n const sankeyNodes: SankeyNodeHandle = bindSankeyNode(viewer, emitter);\n const properties: PropertyEditingHandle | null = options.properties\n ? bindPropertyEditing(viewer, emitter, options.properties)\n : null;\n const propertyDrag: PropertyDragHandle | null = options.properties\n ? bindPropertyDrag(viewer, emitter, options.properties.editable)\n : null;\n const colorEdit: ColorEditHandle | null = options.properties\n ? bindColorEdit(viewer, emitter, options.properties.editable, options.properties.colorPickerTheme)\n : null;\n\n return {\n on: (name, handler) => emitter.on(name, handler),\n startPathDraw: startOptions => pathDraw.start(startOptions),\n cancelPathDraw: () => pathDraw.cancel(),\n destroy() {\n pathDraw.destroy();\n textEditing.destroy();\n movement.destroy();\n resize.destroy();\n isometricAxisResize.destroy();\n pathReshape.destroy();\n linkEndpoints.destroy();\n linkSegments.destroy();\n quickDuplicate.destroy();\n isometricQuickDuplicate.destroy();\n deleteSelection.destroy();\n nudgeSelection.destroy();\n chartValues.destroy();\n pieLabels.destroy();\n isometricLabels.destroy();\n radarVertices.destroy();\n sankeyNodes.destroy();\n properties?.destroy();\n propertyDrag?.destroy();\n colorEdit?.destroy();\n emitter.clear();\n },\n };\n}\n\nexport type { Unsubscribe } from '../eventing/emitter';\nexport type { ColorEditHandle } from './colorEdit/binding';\nexport { readGradientValue } from './colorEdit/gradientLookup';\nexport type { ColorPopoverHandle, ColorPopoverOptions } from './colorEdit/popover';\nexport { openColorPopover } from './colorEdit/popover';\nexport type { ColorPickerTheme, ColorPickerThemeOption } from './colorEdit/theme';\nexport { resolveTheme } from './colorEdit/theme';\nexport type { PickerValue } from './colorEdit/value';\nexport { cssBackground, formatPickerValue, seedFrom } from './colorEdit/value';\nexport type {\n ChartValueChangeEvent,\n DeleteEvent,\n InteractionEventMap,\n InteractionEventName,\n IsometricQuickDuplicateDirection,\n LinkReconnectEvent,\n LinkSegmentChangeEvent,\n LinkToEvent,\n MoveChangeEvent,\n PathDrawCompleteEvent,\n PathPoint,\n PathPointChangeEvent,\n PropertyChangeEvent,\n PropertyValue,\n QuickDuplicateEvent,\n ResizeChangeEvent,\n SankeyNodeMoveEvent,\n SankeyNodeRenameEvent,\n TextChangeEvent,\n} from './events';\nexport type {\n InsertCanvasObjectOptions,\n InsertConnectionOptions,\n InsertLinkOptions,\n InsertPathOptions,\n QuickDuplicateOptions,\n RemoveCanvasObjectOptions,\n} from './patchSfl';\nexport {\n applyChartValueChange,\n applyLinkReconnectChange,\n applyLinkSegmentChange,\n applyMoveChange,\n applyMoveChanges,\n applyPathPointChange,\n applyPropertyChange,\n applyQuickDuplicateChange,\n applyResizeChange,\n applySankeyNodeMoveChange,\n applySankeyNodeRenameChange,\n applyTextChange,\n insertCanvasObject,\n insertConnection,\n insertLink,\n insertPath,\n removeCanvasObject,\n removeLink,\n} from './patchSfl';\nexport type { PathDrawOptions } from './pathDrawDrag';\nexport {\n bindPropertyEditing,\n type EditableRules,\n type PropertyEditingHandle,\n type PropertyEditingOptions,\n} from './propertyEdit';\n"]}
|