stickyflow 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/LICENSE +202 -0
- package/README.md +167 -2
- package/dist/chunk-34PK7HEU.cjs +842 -0
- package/dist/chunk-34PK7HEU.cjs.map +1 -0
- package/dist/chunk-6JKNT2YC.js +4685 -0
- package/dist/chunk-6JKNT2YC.js.map +1 -0
- package/dist/chunk-6LQJUAD4.js +801 -0
- package/dist/chunk-6LQJUAD4.js.map +1 -0
- package/dist/chunk-IIOJFR73.cjs +3671 -0
- package/dist/chunk-IIOJFR73.cjs.map +1 -0
- package/dist/chunk-KFJIFHXG.js +8559 -0
- package/dist/chunk-KFJIFHXG.js.map +1 -0
- package/dist/chunk-N6WVHOUQ.js +3665 -0
- package/dist/chunk-N6WVHOUQ.js.map +1 -0
- package/dist/chunk-S5BVAAEF.cjs +8568 -0
- package/dist/chunk-S5BVAAEF.cjs.map +1 -0
- package/dist/chunk-YM3XFBI4.cjs +4814 -0
- package/dist/chunk-YM3XFBI4.cjs.map +1 -0
- package/dist/index.cjs +1167 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +335 -0
- package/dist/index.d.ts +335 -0
- package/dist/index.js +1097 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/index.cjs +7358 -0
- package/dist/interaction/index.cjs.map +1 -0
- package/dist/interaction/index.d.cts +273 -0
- package/dist/interaction/index.d.ts +273 -0
- package/dist/interaction/index.js +7333 -0
- package/dist/interaction/index.js.map +1 -0
- package/dist/render-r1GYvjNm.d.cts +970 -0
- package/dist/render-r1GYvjNm.d.ts +970 -0
- package/dist/runtimeTypes-ByiafBwg.d.ts +239 -0
- package/dist/runtimeTypes-DwLeD-em.d.cts +239 -0
- package/dist/stickyflow-diagram.global.js +1442 -0
- package/dist/stickyflow-diagram.global.js.map +1 -0
- package/dist/types-T7W2yTQF.d.cts +116 -0
- package/dist/types-ndGA1kbl.d.ts +116 -0
- package/dist/viewer/index.cjs +31 -0
- package/dist/viewer/index.cjs.map +1 -0
- package/dist/viewer/index.d.cts +44 -0
- package/dist/viewer/index.d.ts +44 -0
- package/dist/viewer/index.js +6 -0
- package/dist/viewer/index.js.map +1 -0
- package/dist/web-component/index.cjs +144 -0
- package/dist/web-component/index.cjs.map +1 -0
- package/dist/web-component/index.d.cts +31 -0
- package/dist/web-component/index.d.ts +31 -0
- package/dist/web-component/index.js +141 -0
- package/dist/web-component/index.js.map +1 -0
- package/package.json +81 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/webComponent/iife.ts","../src/runtime/webComponent/config.ts","../src/sflLanguage/ast.ts","../src/sflLanguage/lexing/cursor.ts","../src/sflLanguage/lexing/error.ts","../src/sflLanguage/lexing/characters.ts","../src/sflLanguage/lexing/tokenCreation.ts","../src/sflLanguage/lexing/identifiers.ts","../src/sflLanguage/lexing/lineBreak.ts","../src/sflLanguage/lexing/lineComment.ts","../src/sflLanguage/lexing/numbers.ts","../src/sflLanguage/lexing/operators.ts","../src/sflLanguage/lexing/punctuation.ts","../src/sflLanguage/lexing/spacing.ts","../src/sflLanguage/lexing/strings.ts","../src/sflLanguage/lexing/nextToken.ts","../src/sflLanguage/lexing/tokenizer.ts","../src/sflLanguage/parsing/error.ts","../src/sflLanguage/parsing/cursor.ts","../src/sflLanguage/parsing/values.ts","../src/sflLanguage/parsing/expressions.ts","../src/sflLanguage/parsing/properties.ts","../src/sflLanguage/parsing/blocks.ts","../src/sflLanguage/parsing/document.ts","../src/sflLanguage/parsing/parser.ts","../src/sflSemantic/ast/valueAccess.ts","../src/sflSemantic/canvasObjects/artifacts/links/endpointReader.ts","../src/sflSemantic/ast/blockEntries.ts","../src/sflSemantic/canvasObjects/processing/blockKinds.ts","../src/sflSemantic/canvasObjects/artifacts/links/nameIndex.ts","../src/sflSemantic/canvasObjects/artifacts/links/presentation.ts","../src/sflSemantic/canvasObjects/artifacts/connections/reader.ts","../src/sflSemantic/canvasObjects/artifacts/links/blockReader.ts","../src/sflSemantic/canvasObjects/artifacts/links/reader.ts","../src/sflSemantic/canvasObjects/artifacts/links/netExpansion.ts","../src/sflSemantic/canvasObjects/processing/layout/flow.ts","../src/model/chart/supportedTypes.ts","../src/sflSemantic/canvasObjects/artifacts/chart/values.ts","../src/sflSemantic/canvasObjects/artifacts/chart/axis.ts","../src/sflSemantic/canvasObjects/artifacts/chart/rules.ts","../src/sflSemantic/canvasObjects/artifacts/chart/seriesValues.ts","../src/sflSemantic/canvasObjects/artifacts/chart/series.ts","../src/sflSemantic/canvasObjects/artifacts/chart/zones.ts","../src/sflSemantic/canvasObjects/artifacts/chart/reader.ts","../src/sflSemantic/canvasObjects/artifacts/chart/resolver.ts","../src/sflSemantic/canvasObjects/artifacts/isometric/reader.ts","../src/sflSemantic/canvasObjects/artifacts/isometric/resolver.ts","../src/sflSemantic/canvasObjects/artifacts/path/reader.ts","../src/sflSemantic/canvasObjects/artifacts/path/resolver.ts","../src/sflSemantic/canvasObjects/artifacts/swimlane/reader.ts","../src/sflSemantic/canvasObjects/artifacts/swimlane/resolver.ts","../src/sflSemantic/canvasObjects/processing/classification.ts","../src/sflSemantic/canvasObjects/processing/layout/geometry.ts","../src/sflSemantic/canvasObjects/processing/presentation.ts","../src/sflSemantic/canvasObjects/processing/resolver.ts","../src/sflSemantic/groups/members.ts","../src/sflSemantic/canvasTree/resolver.ts","../src/sflSemantic/definitions/shaders.ts","../src/sflSemantic/definitions/symbols.ts","../src/sflSemantic/definitions/collection.ts","../src/sflSemantic/definitions/compositionReferences.ts","../src/sflSemantic/definitions/inheritance.ts","../src/sflSemantic/definitions/propertyReaders.ts","../src/sflSemantic/diagnostics/charts.ts","../src/sflSemantic/diagnostics/widgets.ts","../src/sflSemantic/canvasState/resolution.ts","../src/sflSemantic/canvasState/resolver.ts","../src/sflSemantic/canvasObjects/artifacts/isometric/types.ts","../src/sflSemantic/sflToCanvasState.ts","../src/renderInput/styleDecoding/colorToken.ts","../src/renderInput/styleDecoding/color.ts","../src/renderInput/styleDecoding/ramp.ts","../src/renderInput/styleDecoding/shadow.ts","../src/renderInput/fromSfl/canvasObjects/values.ts","../src/renderInput/fromSfl/canvasObjects/chartBase.ts","../src/renderInput/fromSfl/canvasObjects/chartConfigs.ts","../src/renderInput/fromSfl/canvasObjects/chart.ts","../src/renderInput/fromSfl/canvasObjects/connection.ts","../src/renderInput/fromSfl/canvasObjects/frame.ts","../src/renderInput/fromSfl/canvasObjects/isometric.ts","../src/renderInput/fromSfl/canvasObjects/link.ts","../src/renderInput/fromSfl/canvasObjects/path.ts","../src/renderInput/fromSfl/canvasObjects/shape.ts","../src/renderInput/fromSfl/canvasObjects/swimlane.ts","../src/renderInput/fromSfl/canvasObjects/widget.ts","../src/renderInput/fromSfl/canvasObjects/collect.ts","../src/model/isometricObject/geometry.ts","../src/model/isometricObject/shading.ts","../src/model/geometry/ports/rectangleCoordinates.ts","../src/model/geometry/ports/coordinates.ts","../src/model/geometry/rectangle/edgePoint.ts","../src/renderInput/fromSfl/endpoint.ts","../src/renderInput/fromSfl/links.ts","../src/renderInput/fromSfl/index.ts","../src/renderScene/scene/tagging.ts","../src/renderScene/scene/bounds.ts","../src/renderScene/scene/freeformPath.ts","../src/renderScene/scene/numbers.ts","../src/renderScene/scene/order.ts","../src/renderScene/scene/paint.ts","../src/renderScene/scene/textStyle.ts","../src/renderScene/scene/roundedRectPath.ts","../src/renderScene/artifacts/container/style.ts","../src/renderScene/artifacts/container/titleTab.ts","../src/renderScene/artifacts/container/frame.ts","../src/renderScene/scene/shadow.ts","../src/renderScene/artifacts/container/swimlane/dividers.ts","../src/renderScene/artifacts/container/swimlane/labels.ts","../src/renderScene/artifacts/container/swimlane/layout.ts","../src/renderScene/artifacts/container/swimlane/index.ts","../src/renderScene/artifacts/containers.ts","../src/renderScene/scene/roundedPolygonPath.ts","../src/renderScene/artifacts/isometric.ts","../src/renderScene/artifacts/link/endpointLabels.ts","../src/renderScene/artifacts/link/label.ts","../src/model/color/conversion.ts","../src/model/color/interpolation.ts","../src/renderScene/scene/linkPaint.ts","../src/renderScene/scene/linkStroke.ts","../src/renderScene/scene/textLayout.ts","../src/renderScene/artifacts/link/geometry/label/pathMetrics.ts","../src/renderScene/artifacts/link/geometry/label/curvedGap.ts","../src/renderScene/artifacts/link/geometry/label/polylineGap.ts","../src/renderScene/artifacts/link/geometry/label/gap.ts","../src/renderScene/artifacts/link/geometry/markers/midpoint.ts","../src/renderScene/artifacts/link/geometry/routing/sideNormal.ts","../src/renderScene/artifacts/link/geometry/routing/cubic.ts","../src/renderScene/artifacts/link/geometry/routing/curvedRoute.ts","../src/renderScene/artifacts/link/geometry/routing/orthogonalPlan.ts","../src/renderScene/artifacts/link/geometry/routing/orthogonalPoints.ts","../src/renderScene/artifacts/link/geometry/routing/orthogonalSegments.ts","../src/renderScene/artifacts/link/geometry/routing/rounding.ts","../src/renderScene/artifacts/link/geometry/routing/orthogonal.ts","../src/renderScene/artifacts/link/geometry/routing/waypoints.ts","../src/renderScene/artifacts/link/geometry/routing/orthogonalRoute.ts","../src/renderScene/artifacts/link/geometry/routing/sides.ts","../src/renderScene/artifacts/link/geometry/routing/straightRoute.ts","../src/renderScene/artifacts/link/geometry/routing.ts","../src/renderScene/artifacts/link/layout.ts","../src/renderScene/artifacts/link/markers.ts","../src/renderScene/artifacts/link/roundedOrthogonalPathData.ts","../src/renderScene/artifacts/link/path.ts","../src/renderScene/artifacts/link/weight.ts","../src/renderScene/artifacts/link.ts","../src/renderScene/artifacts/path.ts","../src/renderScene/artifacts/shape/geometry/base.ts","../src/renderScene/artifacts/shape/geometry/cloud.ts","../src/renderScene/artifacts/shape/geometry/roundedForms.ts","../src/renderScene/artifacts/shape/geometry/pathCalculation.ts","../src/renderScene/artifacts/shape/geometry/simple.ts","../src/renderScene/artifacts/shape/geometry/index.ts","../src/renderScene/artifacts/shape/style.ts","../src/renderScene/scene/richTextLayout.ts","../src/renderScene/artifacts/shape/text.ts","../src/renderScene/artifacts/shape.ts","../src/model/widget/format.ts","../src/model/widget/theme.ts","../src/renderScene/artifacts/widget.ts","../src/renderScene/charts/primitives/defaults.ts","../src/renderScene/charts/primitives/axis.ts","../src/renderScene/charts/primitives/barCategories.ts","../src/renderScene/charts/primitives/barLabel.ts","../src/renderScene/charts/primitives/barShape.ts","../src/renderScene/charts/primitives/boxplot.ts","../src/renderScene/color.ts","../src/renderScene/charts/primitives/colors.ts","../src/renderScene/charts/primitives/errors.ts","../src/renderScene/charts/primitives/format.ts","../src/renderScene/charts/primitives/horizontalBars.ts","../src/renderScene/charts/primitives/linePath.ts","../src/renderScene/charts/primitives/pieShape.ts","../src/renderScene/charts/primitives/segments.ts","../src/renderScene/charts/primitives/shadow.ts","../src/renderScene/charts/primitives/stacking.ts","../src/renderScene/charts/primitives/text.ts","../src/renderScene/charts/propPath.ts","../src/renderScene/charts/decorations/axisLabels.ts","../src/renderScene/charts/decorations/boxplotYAxis.ts","../src/renderScene/charts/decorations/legend.ts","../src/renderScene/charts/decorations/layout.ts","../src/renderScene/charts/decorations/categoricalXAxis.ts","../src/renderScene/charts/decorations/numericXAxis.ts","../src/renderScene/charts/decorations/numericYAxis.ts","../src/renderScene/charts/decorations/axes.ts","../src/renderScene/charts/field/idw.ts","../src/renderScene/charts/field/grid.ts","../src/renderScene/charts/gridSupport.ts","../src/renderScene/charts/primitives/radarShape.ts","../src/renderScene/charts/decorations/gridDots.ts","../src/renderScene/charts/decorations/gridLineStyle.ts","../src/renderScene/charts/decorations/gridCircle.ts","../src/renderScene/charts/decorations/grid.ts","../src/renderScene/charts/decorations/rules.ts","../src/renderScene/charts/chartBackdrop.ts","../src/renderScene/charts/renderers/bar/glass.ts","../src/renderScene/charts/renderers/bar/glow.ts","../src/renderScene/charts/renderers/bar/labels.ts","../src/renderScene/charts/renderers/bar/track.ts","../src/renderScene/charts/renderers/bar/grouped.ts","../src/renderScene/charts/renderers/bar/horizontal.ts","../src/renderScene/charts/renderers/bar/stacked.ts","../src/renderScene/charts/renderers/bar.ts","../src/renderScene/charts/renderers/boxplot/layout.ts","../src/renderScene/charts/renderers/boxplot/geometry.ts","../src/renderScene/charts/renderers/boxplot/points.ts","../src/renderScene/charts/renderers/boxplot/shapes.ts","../src/renderScene/charts/renderers/boxplot/series.ts","../src/renderScene/charts/renderers/boxplot.ts","../src/renderScene/charts/renderers/custom.ts","../src/renderScene/charts/renderers/field/data.ts","../src/renderScene/charts/renderers/field/legend.ts","../src/renderScene/charts/field/colorRamp.ts","../src/renderScene/charts/field/isolines.ts","../src/renderScene/charts/renderers/field/scalar.ts","../src/renderScene/charts/renderers/field/vectors.ts","../src/renderScene/charts/renderers/field.ts","../src/renderScene/charts/renderers/heatmap/cells.ts","../src/renderScene/charts/renderers/heatmap/headers.ts","../src/renderScene/charts/renderers/heatmap/layout.ts","../src/renderScene/charts/renderers/heatmap/legend.ts","../src/renderScene/charts/renderers/heatmap.ts","../src/renderScene/charts/geometry/hexbin.ts","../src/renderScene/charts/geometry/sankey/columns.ts","../src/renderScene/charts/geometry/sankey/graph.ts","../src/renderScene/charts/geometry/sankey/nodeGeometry.ts","../src/renderScene/charts/geometry/sankey/links.ts","../src/renderScene/charts/geometry/sankey/nodes.ts","../src/renderScene/charts/geometry/sankey/layout.ts","../src/renderScene/charts/geometry/treemap.ts","../src/renderScene/charts/renderers/hexbin.ts","../src/renderScene/charts/renderers/cartesianPoints.ts","../src/renderScene/charts/renderers/line/area.ts","../src/renderScene/charts/renderers/line/highlights.ts","../src/renderScene/charts/renderers/line/marks.ts","../src/renderScene/charts/renderers/line/path.ts","../src/renderScene/charts/renderers/line/series.ts","../src/renderScene/charts/renderers/line.ts","../src/renderScene/charts/renderers/mekko/grid.ts","../src/renderScene/charts/renderers/mekko/labels.ts","../src/renderScene/charts/renderers/mekko/layout.ts","../src/renderScene/charts/renderers/mekko/segments.ts","../src/renderScene/charts/renderers/mekko.ts","../src/renderScene/charts/renderers/pie/center.ts","../src/renderScene/charts/renderers/pie/geometry.ts","../src/renderScene/charts/renderers/pie/labels.ts","../src/renderScene/charts/renderers/pie/slices.ts","../src/renderScene/charts/renderers/pie.ts","../src/renderScene/charts/renderers/polarArea.ts","../src/renderScene/charts/renderers/radar/geometry.ts","../src/renderScene/charts/renderers/radar/grid.ts","../src/renderScene/charts/renderers/radar/labels.ts","../src/renderScene/charts/renderers/radar/series.ts","../src/renderScene/charts/renderers/radar.ts","../src/renderScene/charts/renderers/radialBar.ts","../src/renderScene/charts/renderers/sankey/links.ts","../src/renderScene/charts/renderers/sankey/nodes.ts","../src/renderScene/charts/renderers/sankey/prepare.ts","../src/renderScene/charts/renderers/sankey.ts","../src/renderScene/charts/renderers/scatter.ts","../src/renderScene/charts/renderers/treemap/layout.ts","../src/renderScene/charts/renderers/treemap/legend.ts","../src/renderScene/charts/renderers/treemap/tiles.ts","../src/renderScene/charts/renderers/treemap.ts","../src/renderScene/charts/renderers/dispatch.ts","../src/renderScene/charts/cartesianChart.ts","../src/renderScene/charts/chartFrame.ts","../src/renderScene/charts/chartLegend.ts","../src/renderScene/charts/chartRenderContext.ts","../src/renderScene/charts/chartRenderOrder.ts","../src/renderScene/charts/chartTitle.ts","../src/renderScene/charts/chartFoundation.ts","../src/renderScene/charts/polarChart.ts","../src/renderScene/charts/undecoratedChart.ts","../src/renderScene/charts/buildChart.ts","../src/renderScene/charts/artifacts.ts","../src/renderScene/scene/build.ts","../src/svg/format.ts","../src/svg/clipDefinitions.ts","../src/svg/filterDefinitions.ts","../src/svg/markerBodies.ts","../src/svg/markerDefinitions.ts","../src/svg/paintDefinitions.ts","../src/svg/definitions.ts","../src/svg/linkHitAreas.ts","../src/svg/attributes.ts","../src/svg/domContract/attributes.ts","../src/svg/contract.ts","../src/svg/text.ts","../src/svg/nodes.ts","../src/svg/document.ts","../src/svg/renderScene.ts","../src/render.ts","../src/runtime/viewer/display/rootAttributesPatch.ts","../src/runtime/viewer/display/classifySceneDiff.ts","../src/runtime/viewer/display/definitionsPatch.ts","../src/runtime/viewer/display/elementPatch.ts","../src/runtime/viewer/display/sceneNodesPatch.ts","../src/runtime/viewer/display/scenePatch.ts","../src/runtime/viewer/display/svgDocument.ts","../src/runtime/viewer/display/viewport.ts","../src/runtime/viewer/display/index.ts","../src/runtime/eventing/emitter.ts","../src/runtime/viewer/events.ts","../src/runtime/viewer/export/raster.ts","../src/runtime/viewer/export/snapshot.ts","../src/runtime/dom/svgNamespace.ts","../src/runtime/dom/canvasObjectRoles.ts","../src/runtime/dom/selectionOverlay/dom.ts","../src/runtime/dom/changeOverlay.ts","../src/runtime/dom/contract.ts","../src/runtime/dom/domQuery.ts","../src/runtime/dom/selectionOverlay/scale.ts","../src/runtime/dom/selectionOverlay/quickDuplicate.ts","../src/runtime/dom/selectionOverlay/isometric.ts","../src/runtime/dom/selectionOverlay/link.ts","../src/runtime/dom/selectionOverlay/path.ts","../src/runtime/dom/selectionOverlay/resizeHandles.ts","../src/runtime/dom/selectionOverlay/shape.ts","../src/runtime/viewer/interaction/changeFlash.ts","../src/runtime/viewer/interaction/keyboard.ts","../src/runtime/viewer/interaction/modifiers.ts","../src/runtime/viewer/interaction/selection.ts","../src/runtime/viewer/interaction/pointerSelection.ts","../src/runtime/viewer/interaction/pointer.ts","../src/runtime/viewer/interaction/overlayPainter.ts","../src/runtime/viewer/interaction/selectionController.ts","../src/runtime/viewer/interaction/wheel.ts","../src/runtime/viewer/interaction/index.ts","../src/runtime/viewer/shaders/defaults.ts","../src/runtime/viewer/shaders/builtins/button.ts","../src/runtime/viewer/shaders/builtins/chromaticGlassPlate.ts","../src/runtime/viewer/shaders/builtins/chromaticHalo.ts","../src/runtime/viewer/shaders/builtins/eclipseOrb.ts","../src/runtime/viewer/shaders/builtins/emberMatrix.ts","../src/runtime/viewer/shaders/builtins/emberSlits.ts","../src/runtime/viewer/shaders/builtins/glassRefraction.ts","../src/runtime/viewer/shaders/builtins/halftoneHalo.ts","../src/runtime/viewer/shaders/builtins/halo.ts","../src/runtime/viewer/shaders/builtins/lumenPortal.ts","../src/runtime/viewer/shaders/builtins/lumenPortalLight.ts","../src/runtime/viewer/shaders/builtins/orb.ts","../src/runtime/viewer/shaders/builtins/pixelConstellation.ts","../src/runtime/viewer/shaders/builtins/plasmaGauge.ts","../src/runtime/viewer/shaders/builtins/prismSlats.ts","../src/runtime/viewer/shaders/builtins/ruler.ts","../src/runtime/viewer/shaders/builtins/smearOrb.ts","../src/runtime/viewer/shaders/builtins/tickScale.ts","../src/runtime/viewer/shaders/builtins/violetGlass.ts","../src/runtime/viewer/shaders/builtins/violetGlassLight.ts","../src/runtime/viewer/shaders/programs.ts","../src/runtime/viewer/shaders/backdrop.ts","../src/runtime/viewer/shaders/uniforms.ts","../src/runtime/viewer/shaders/webgl.ts","../src/runtime/viewer/shaders/createSurface.ts","../src/runtime/viewer/shaders/renderSurface.ts","../src/runtime/viewer/shaders/surfaceClock.ts","../src/runtime/viewer/shaders/surface.ts","../src/runtime/viewer/source.ts","../src/runtime/viewer/widgets/rollingNumberDom.ts","../src/runtime/viewer/widgets/documentWidgets.ts","../src/runtime/viewer/widgets/rulerKnob.ts","../src/runtime/viewer/session.ts","../src/runtime/viewer/index.ts","../src/runtime/webComponent/shadowView.ts","../src/runtime/webComponent/element.ts","../src/runtime/webComponent/index.ts"],"sourcesContent":["import { defineStickyflowDiagram, StickyflowDiagram } from './index';\n\ndefineStickyflowDiagram();\n\nexport { defineStickyflowDiagram, StickyflowDiagram };\n","export interface DiagramConfig {\n source: string | null;\n interactive: boolean;\n padding?: number;\n diagramId?: string;\n}\n\nexport const OBSERVED_ATTRS = ['source', 'interactive', 'padding', 'diagram-id'] as const;\n\nconst boolAttr = (value: string | null): boolean => value !== null && value !== 'false';\n\nexport function readConfig(getAttribute: (name: string) => string | null): DiagramConfig {\n const paddingRaw = getAttribute('padding');\n const padding =\n paddingRaw != null && paddingRaw !== '' && Number.isFinite(Number(paddingRaw)) ? Number(paddingRaw) : undefined;\n return {\n source: getAttribute('source'),\n interactive: boolAttr(getAttribute('interactive')),\n padding,\n diagramId: getAttribute('diagram-id') ?? undefined,\n };\n}\n","export const NAMED_BLOCK_KINDS = [\n 'Project',\n 'Model',\n 'Group',\n 'Entity',\n 'Container',\n 'Path',\n 'Chart',\n 'Widget',\n 'Shape',\n 'Text',\n 'Isometric',\n 'Link',\n 'Connection',\n 'Layout',\n 'Style',\n 'Shader',\n 'Axis',\n 'Series',\n 'Rule',\n 'Net',\n 'Symbol',\n 'Port',\n 'DataSource',\n] as const;\n\nexport type NamedBlockKind = (typeof NAMED_BLOCK_KINDS)[number];\nexport type BlockKind = NamedBlockKind | 'data';\n\nexport const BLOCK_KINDS: readonly BlockKind[] = [...NAMED_BLOCK_KINDS, 'data'];\n\nexport type Side = 'top' | 'bottom' | 'left' | 'right';\n\nexport const SIDES: readonly Side[] = ['top', 'bottom', 'left', 'right'];\n\nexport interface SflDocument {\n version: string;\n blocks: SflBlock[];\n}\n\nexport interface SflBlock {\n kind: BlockKind;\n name: string;\n composition: string[];\n entries: SflEntry[];\n}\n\nexport type SflEntry =\n | { type: 'property'; property: SflProperty }\n | { type: 'block'; block: SflBlock }\n | { type: 'layout'; layout: SflLayout }\n | { type: 'style'; style: SflStyle }\n | { type: 'data'; data: SflBlock }\n | { type: 'fields'; fields: SflProperty[] }\n | { type: 'binding'; binding: SflBinding }\n | { type: 'handler'; handler: SflHandler };\n\nexport type BindingOperator = '<-' | '<->' | '->';\n\nexport type ExpressionOperator = '+' | '-' | '*' | '/' | '>' | '<' | '>=' | '<=' | '==' | '!=' | '&&' | '||';\n\nexport type SflExpr =\n | { kind: 'number'; value: number }\n | { kind: 'string'; value: string }\n | { kind: 'boolean'; value: boolean }\n | { kind: 'ref'; path: string[] }\n | { kind: 'unary'; operator: '!' | '-'; operand: SflExpr }\n | { kind: 'binary'; operator: ExpressionOperator; left: SflExpr; right: SflExpr }\n | { kind: 'call'; callee: string[]; args: SflExpr[] };\n\nexport interface SflBinding {\n key: string;\n operator: BindingOperator;\n expr: SflExpr;\n line: number;\n col: number;\n}\n\nexport interface SflAssignment {\n target: string[];\n expr: SflExpr;\n line: number;\n col: number;\n}\n\nexport interface SflHandler {\n event: string;\n assignments: SflAssignment[];\n line: number;\n col: number;\n}\n\nexport interface SflProperty {\n key: string;\n value: SflValue;\n}\n\nexport interface SflLayout {\n properties: SflProperty[];\n}\n\nexport interface SflStyle {\n properties: SflProperty[];\n bindings?: SflBinding[];\n}\n\nexport type SflValue =\n | SflStringValue\n | SflNumberValue\n | SflTupleValue\n | SflListValue\n | SflIdentValue\n | SflEndpointValue;\n\nexport interface SflStringValue {\n type: 'string';\n value: string;\n}\n\nexport interface SflNumberValue {\n type: 'number';\n value: number;\n}\n\nexport interface SflTupleValue {\n type: 'tuple';\n values: number[];\n}\n\nexport interface SflListValue {\n type: 'list';\n values: SflValue[];\n}\n\nexport interface SflIdentValue {\n type: 'ident';\n segments: string[];\n}\n\nexport interface SflEndpointValue {\n type: 'endpoint';\n segments: string[];\n side?: Side;\n fraction?: number;\n}\n\nexport const isSide = (s: string): s is Side => (SIDES as readonly string[]).includes(s);\nexport const isBlockKind = (s: string): s is BlockKind => (BLOCK_KINDS as readonly string[]).includes(s);\nexport const isNamedBlockKind = (s: string): s is NamedBlockKind =>\n (NAMED_BLOCK_KINDS as readonly string[]).includes(s);\n","export interface SourcePosition {\n line: number;\n col: number;\n}\n\nexport class SourceCursor {\n private offset = 0;\n line = 1;\n col = 1;\n\n constructor(readonly input: string) {}\n\n get done(): boolean {\n return this.offset >= this.input.length;\n }\n\n peek(ahead = 0): string | undefined {\n return this.input[this.offset + ahead];\n }\n\n startsWith(value: string): boolean {\n return this.input.startsWith(value, this.offset);\n }\n\n position(): SourcePosition {\n return { line: this.line, col: this.col };\n }\n\n advance(): string {\n const character = this.input[this.offset];\n if (character === undefined) {\n throw new Error('Cannot advance beyond the end of the SFL source.');\n }\n this.offset++;\n if (character === '\\n' || (character === '\\r' && this.peek() !== '\\n')) {\n this.line++;\n this.col = 1;\n } else {\n this.col++;\n }\n return character;\n }\n}\n","export class SflLexError extends Error {\n constructor(\n message: string,\n public line: number,\n public col: number,\n ) {\n super(`SFL lex error (${line}:${col}): ${message}`);\n this.name = 'SflLexError';\n }\n}\n","export const isLetter = (character: string | undefined): character is string =>\n character !== undefined && /^[A-Za-z_]$/.test(character);\n\nexport const isDigit = (character: string | undefined): character is string =>\n character !== undefined && character >= '0' && character <= '9';\n\nexport const isIdentPart = (character: string | undefined): character is string =>\n character !== undefined && /^[A-Za-z0-9_]$/.test(character);\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport type { Token, TokenType } from './types';\n\nexport function createToken(\n type: TokenType,\n value: string,\n start: SourcePosition,\n detail: Pick<Token, 'numberValue'> = {},\n): Token {\n return {\n type,\n value,\n line: start.line,\n col: start.col,\n endLine: start.line,\n endCol: start.col,\n ...detail,\n };\n}\n\nexport function withTokenEnd(token: Token, cursor: SourceCursor): Token {\n return {\n ...token,\n endLine: cursor.line,\n endCol: cursor.col,\n };\n}\n","import { isIdentPart, isLetter } from './characters';\nimport type { SourceCursor, SourcePosition } from './cursor';\nimport { createToken } from './tokenCreation';\nimport type { Token } from './types';\n\nexport function startsIdentifier(cursor: SourceCursor): boolean {\n return isLetter(cursor.peek());\n}\n\nexport function readIdentifier(cursor: SourceCursor, start: SourcePosition): Token {\n let value = '';\n while (isIdentPart(cursor.peek())) {\n value += cursor.advance();\n }\n\n return createToken('ident', value, start);\n}\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport { createToken } from './tokenCreation';\nimport type { Token } from './types';\n\nexport function isLineBreak(character: string): boolean {\n return character === '\\r' || character === '\\n';\n}\n\nexport function readLineBreak(cursor: SourceCursor, start: SourcePosition): Token {\n const firstCharacter = cursor.advance();\n if (firstCharacter === '\\r' && cursor.peek() === '\\n') {\n cursor.advance();\n }\n\n return createToken('newline', '\\n', start);\n}\n","import type { SourceCursor } from './cursor';\n\nexport function startsLineComment(cursor: SourceCursor): boolean {\n return cursor.peek() === '/' && cursor.peek(1) === '/';\n}\n\nexport function consumeLineComment(cursor: SourceCursor): void {\n while (!cursor.done && cursor.peek() !== '\\n' && cursor.peek() !== '\\r') {\n cursor.advance();\n }\n}\n","import { isDigit } from './characters';\nimport type { SourceCursor, SourcePosition } from './cursor';\nimport { createToken } from './tokenCreation';\nimport type { Token } from './types';\n\nexport function startsNumber(cursor: SourceCursor): boolean {\n const character = cursor.peek();\n return isDigit(character) || (character === '-' && isDigit(cursor.peek(1)));\n}\n\nexport function readNumber(cursor: SourceCursor, start: SourcePosition): Token {\n let value = '';\n if (cursor.peek() === '-') {\n value += cursor.advance();\n }\n while (isDigit(cursor.peek())) {\n value += cursor.advance();\n }\n if (cursor.peek() === '.' && isDigit(cursor.peek(1))) {\n value += cursor.advance();\n while (isDigit(cursor.peek())) {\n value += cursor.advance();\n }\n }\n\n return createToken('number', value, start, { numberValue: Number(value) });\n}\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport { createToken } from './tokenCreation';\nimport type { Token, TokenType } from './types';\n\nconst OPERATORS: Array<[string, TokenType]> = [\n ['<->', 'bind2'],\n ['<-', 'bind'],\n ['->', 'action'],\n ['&&', 'op'],\n ['||', 'op'],\n ['>=', 'op'],\n ['<=', 'op'],\n ['==', 'op'],\n ['!=', 'op'],\n ['+', 'op'],\n ['-', 'op'],\n ['*', 'op'],\n ['/', 'op'],\n ['>', 'op'],\n ['<', 'op'],\n ['!', 'op'],\n];\n\nconst startsNumber = (character: string | undefined): boolean => character !== undefined && /[\\d.]/.test(character);\n\nexport function readOperator(cursor: SourceCursor, start: SourcePosition): Token | null {\n const match = OPERATORS.find(([text]) => cursor.startsWith(text));\n if (!match) {\n return null;\n }\n const [text, type] = match;\n if (text === '-' && startsNumber(cursor.peek(1))) {\n return null;\n }\n for (let index = 0; index < text.length; index++) {\n cursor.advance();\n }\n return createToken(type, text, start);\n}\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport { createToken } from './tokenCreation';\nimport type { Token, TokenType } from './types';\n\nconst PUNCTUATION: Partial<Record<string, TokenType>> = {\n '{': 'lbrace',\n '}': 'rbrace',\n '[': 'lbracket',\n ']': 'rbracket',\n '(': 'lparen',\n ')': 'rparen',\n ':': 'colon',\n ',': 'comma',\n ';': 'semi',\n '.': 'dot',\n '&': 'amp',\n};\n\nexport function readPunctuation(cursor: SourceCursor, start: SourcePosition): Token | null {\n const character = cursor.peek();\n const type = character ? PUNCTUATION[character] : undefined;\n if (!character || !type || (character === '&' && cursor.peek(1) === '&')) {\n return null;\n }\n\n cursor.advance();\n return createToken(type, character, start);\n}\n","import type { SourceCursor } from './cursor';\n\nexport function isSpacing(character: string): boolean {\n return character === ' ' || character === '\\t';\n}\n\nexport function consumeSpacing(cursor: SourceCursor): void {\n cursor.advance();\n}\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport { SflLexError } from './error';\nimport { createToken } from './tokenCreation';\nimport type { Token } from './types';\n\nfunction indentationWidth(line: string): number {\n let width = 0;\n while (line[width] === ' ' || line[width] === '\\t') {\n width++;\n }\n return width;\n}\n\nfunction dedent(text: string): string {\n const lines = text.split('\\n');\n let margin = Infinity;\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n margin = Math.min(margin, indentationWidth(line));\n }\n if (!Number.isFinite(margin) || margin === 0) {\n return text;\n }\n return lines.map(line => (line.trim() ? line.slice(margin) : line)).join('\\n');\n}\n\nfunction readLongString(cursor: SourceCursor, start: SourcePosition): string {\n consumeLongStringDelimiter(cursor);\n let body = '';\n\n while (!cursor.done) {\n if (cursor.startsWith('\"\"\"')) {\n consumeLongStringDelimiter(cursor);\n return dedent(body.replace(/^\\r?\\n/, '').replace(/\\r?\\n[ \\t]*$/, ''));\n }\n body += cursor.advance();\n }\n throw new SflLexError('unterminated long string', start.line, start.col);\n}\n\nfunction consumeLongStringDelimiter(cursor: SourceCursor): void {\n cursor.advance();\n cursor.advance();\n cursor.advance();\n}\n\nfunction readShortString(cursor: SourceCursor, start: SourcePosition): string {\n cursor.advance();\n let value = '';\n while (!cursor.done) {\n const character = cursor.advance();\n if (character === '\"') {\n return value;\n }\n if (character === '\\n' || character === '\\r') {\n throw new SflLexError('newline in short string (use \"\"\" for multiline)', start.line, start.col);\n }\n value += character === '\\\\' ? readEscapedCharacter(cursor, start) : character;\n }\n throw new SflLexError('unterminated string', start.line, start.col);\n}\n\nfunction readEscapedCharacter(cursor: SourceCursor, start: SourcePosition): string {\n if (cursor.done) {\n throw new SflLexError('unterminated escape sequence', start.line, start.col);\n }\n const escaped = cursor.advance();\n switch (escaped) {\n case '\"':\n return '\"';\n case '\\\\':\n return '\\\\';\n case 'n':\n return '\\n';\n case 't':\n return '\\t';\n default:\n throw new SflLexError(`invalid escape '\\\\${escaped}'`, start.line, start.col);\n }\n}\n\nfunction readString(cursor: SourceCursor, start: SourcePosition): string {\n return cursor.startsWith('\"\"\"') ? readLongString(cursor, start) : readShortString(cursor, start);\n}\n\nexport function readStringToken(cursor: SourceCursor, start: SourcePosition): Token {\n return createToken('string', readString(cursor, start), start);\n}\n","import type { SourceCursor, SourcePosition } from './cursor';\nimport { SflLexError } from './error';\nimport { readIdentifier, startsIdentifier } from './identifiers';\nimport { isLineBreak, readLineBreak } from './lineBreak';\nimport { consumeLineComment, startsLineComment } from './lineComment';\nimport { readNumber, startsNumber } from './numbers';\nimport { readOperator } from './operators';\nimport { readPunctuation } from './punctuation';\nimport { consumeSpacing, isSpacing } from './spacing';\nimport { readStringToken } from './strings';\nimport type { Token } from './types';\n\nexport function readNextToken(cursor: SourceCursor): Token | null {\n const character = cursor.peek();\n if (character === undefined) {\n return null;\n }\n\n const start = cursor.position();\n if (isLineBreak(character)) {\n return readLineBreak(cursor, start);\n }\n if (consumeLexerTrivia(cursor, character)) {\n return null;\n }\n const token = readSymbolToken(cursor, character, start) ?? readWordToken(cursor, start);\n if (token) {\n return token;\n }\n\n throw new SflLexError(`unexpected character '${character}'`, start.line, start.col);\n}\n\nfunction consumeLexerTrivia(cursor: SourceCursor, character: string): boolean {\n if (isSpacing(character)) {\n consumeSpacing(cursor);\n return true;\n }\n if (startsLineComment(cursor)) {\n consumeLineComment(cursor);\n return true;\n }\n return false;\n}\n\nfunction readSymbolToken(cursor: SourceCursor, character: string, start: SourcePosition): Token | null {\n const punctuation = readPunctuation(cursor, start);\n if (punctuation) {\n return punctuation;\n }\n if (character === '\"') {\n return readStringToken(cursor, start);\n }\n return readOperator(cursor, start);\n}\n\nfunction readWordToken(cursor: SourceCursor, start: SourcePosition): Token | null {\n if (startsNumber(cursor)) {\n return readNumber(cursor, start);\n }\n if (startsIdentifier(cursor)) {\n return readIdentifier(cursor, start);\n }\n return null;\n}\n","import { SourceCursor } from './cursor';\nimport { readNextToken } from './nextToken';\nimport { createToken, withTokenEnd } from './tokenCreation';\nimport type { Token } from './types';\n\nexport function tokenizeSource(input: string): Token[] {\n const cursor = new SourceCursor(input);\n const tokens: Token[] = [];\n\n while (!cursor.done) {\n const token = readNextToken(cursor);\n if (token) {\n tokens.push(withTokenEnd(token, cursor));\n }\n }\n\n tokens.push(withTokenEnd(createToken('eof', '', cursor.position()), cursor));\n return tokens;\n}\n","export class SflParseError extends Error {\n constructor(\n message: string,\n public line: number,\n public col: number,\n ) {\n super(`SFL parse error (${line}:${col}): ${message}`);\n this.name = 'SflParseError';\n }\n}\n","import type { Token, TokenType } from '../lexing/types';\nimport { SflParseError } from './error';\n\nexport class TokenCursor {\n private position = 0;\n\n constructor(private readonly tokens: Token[]) {}\n\n peek(offset = 0): Token {\n return this.tokens[Math.min(this.position + offset, this.tokens.length - 1)];\n }\n\n at(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n next(): Token {\n return this.tokens[this.position++];\n }\n\n expect(type: TokenType, description: string): Token {\n const token = this.peek();\n if (token.type !== type) {\n throw new SflParseError(`expected ${description}, got '${token.value || token.type}'`, token.line, token.col);\n }\n return this.next();\n }\n\n expectNumber(description: string): number {\n const token = this.expect('number', description);\n if (token.numberValue === undefined) {\n throw new SflParseError(`expected ${description} to contain a numeric value`, token.line, token.col);\n }\n return token.numberValue;\n }\n\n skipNewlines(): void {\n while (this.at('newline')) {\n this.next();\n }\n }\n}\n","import { isSide, type SflValue, type Side } from '../ast';\nimport type { TokenCursor } from './cursor';\nimport { SflParseError } from './error';\n\nexport function parsePathSegments(cursor: TokenCursor): string[] {\n const segments = [cursor.expect('ident', 'path identifier').value];\n while (cursor.at('dot')) {\n cursor.next();\n segments.push(cursor.expect('ident', 'identifier after \".\"').value);\n }\n return segments;\n}\n\nexport function parseEndpoint(cursor: TokenCursor): SflValue {\n const segments = parsePathSegments(cursor);\n let side: Side | undefined;\n let fraction: number | undefined;\n\n if (cursor.at('comma')) {\n cursor.next();\n const sideToken = cursor.expect('ident', 'side after \",\"');\n if (!isSide(sideToken.value)) {\n throw new SflParseError(\n `expected a side (top/right/bottom/left), got '${sideToken.value}'`,\n sideToken.line,\n sideToken.col,\n );\n }\n side = sideToken.value;\n if (cursor.at('lparen')) {\n cursor.next();\n fraction = cursor.expectNumber('fraction inside \"(\"');\n cursor.expect('rparen', \"')'\");\n }\n }\n return { type: 'endpoint', segments, side, fraction };\n}\n\nfunction parseList(cursor: TokenCursor): SflValue {\n cursor.expect('lbracket', \"'['\");\n const values: SflValue[] = [];\n cursor.skipNewlines();\n if (!cursor.at('rbracket')) {\n values.push(parseValue(cursor, false));\n cursor.skipNewlines();\n while (cursor.at('comma')) {\n cursor.next();\n cursor.skipNewlines();\n if (cursor.at('rbracket')) {\n break;\n }\n values.push(parseValue(cursor, false));\n cursor.skipNewlines();\n }\n }\n cursor.expect('rbracket', \"']'\");\n return { type: 'list', values };\n}\n\nexport function parseValue(cursor: TokenCursor, allowTuple = true): SflValue {\n const token = cursor.peek();\n switch (token.type) {\n case 'string':\n cursor.next();\n return { type: 'string', value: token.value };\n case 'lbracket':\n return parseList(cursor);\n case 'number': {\n const firstValue = cursor.expectNumber('number');\n if (!allowTuple || !cursor.at('comma')) {\n return { type: 'number', value: firstValue };\n }\n const values = [firstValue];\n while (cursor.at('comma')) {\n cursor.next();\n values.push(cursor.expectNumber('number in tuple'));\n }\n return { type: 'tuple', values };\n }\n case 'ident':\n return { type: 'ident', segments: parsePathSegments(cursor) };\n default:\n throw new SflParseError(`expected a value, got '${token.value || token.type}'`, token.line, token.col);\n }\n}\n","import type { ExpressionOperator, SflAssignment, SflBinding, SflExpr, SflHandler } from '../ast';\nimport type { TokenCursor } from './cursor';\nimport { SflParseError } from './error';\nimport { parsePathSegments } from './values';\n\nconst COMPARISONS = new Set(['>', '<', '>=', '<=', '==', '!=']);\n\nfunction atOperator(cursor: TokenCursor, operators: ReadonlySet<string>): boolean {\n const token = cursor.peek();\n return token.type === 'op' && operators.has(token.value);\n}\n\nfunction parseBinaryLevel(\n cursor: TokenCursor,\n operators: ReadonlySet<string>,\n parseOperand: (cursor: TokenCursor) => SflExpr,\n): SflExpr {\n let left = parseOperand(cursor);\n while (atOperator(cursor, operators)) {\n const operator = cursor.next().value as ExpressionOperator;\n left = { kind: 'binary', operator, left, right: parseOperand(cursor) };\n }\n return left;\n}\n\nconst OR = new Set(['||']);\nconst AND = new Set(['&&']);\nconst ADDITIVE = new Set(['+', '-']);\nconst MULTIPLICATIVE = new Set(['*', '/']);\n\nexport function parseExpression(cursor: TokenCursor): SflExpr {\n return parseBinaryLevel(cursor, OR, parseAnd);\n}\n\nfunction parseAnd(cursor: TokenCursor): SflExpr {\n return parseBinaryLevel(cursor, AND, parseComparison);\n}\n\nfunction parseComparison(cursor: TokenCursor): SflExpr {\n return parseBinaryLevel(cursor, COMPARISONS, parseAdditive);\n}\n\nfunction parseAdditive(cursor: TokenCursor): SflExpr {\n return parseBinaryLevel(cursor, ADDITIVE, parseMultiplicative);\n}\n\nfunction parseMultiplicative(cursor: TokenCursor): SflExpr {\n return parseBinaryLevel(cursor, MULTIPLICATIVE, parseUnary);\n}\n\nfunction parseUnary(cursor: TokenCursor): SflExpr {\n const token = cursor.peek();\n if (token.type === 'op' && (token.value === '!' || token.value === '-')) {\n cursor.next();\n return { kind: 'unary', operator: token.value, operand: parseUnary(cursor) };\n }\n return parsePrimary(cursor);\n}\n\nfunction parseCallArguments(cursor: TokenCursor): SflExpr[] {\n cursor.expect('lparen', \"'('\");\n const args: SflExpr[] = [];\n cursor.skipNewlines();\n while (!cursor.at('rparen')) {\n args.push(parseExpression(cursor));\n cursor.skipNewlines();\n if (cursor.at('comma')) {\n cursor.next();\n cursor.skipNewlines();\n } else if (!cursor.at('rparen')) {\n const token = cursor.peek();\n throw new SflParseError(`expected ',' or ')', got '${token.value || token.type}'`, token.line, token.col);\n }\n }\n cursor.expect('rparen', \"')'\");\n return args;\n}\n\nfunction parsePrimary(cursor: TokenCursor): SflExpr {\n const token = cursor.peek();\n switch (token.type) {\n case 'number':\n return { kind: 'number', value: cursor.expectNumber('number') };\n case 'string':\n cursor.next();\n return { kind: 'string', value: token.value };\n case 'lparen': {\n cursor.next();\n const inner = parseExpression(cursor);\n cursor.expect('rparen', \"')'\");\n return inner;\n }\n case 'ident': {\n const path = parsePathSegments(cursor);\n if (path.length === 1 && (path[0] === 'true' || path[0] === 'false')) {\n return { kind: 'boolean', value: path[0] === 'true' };\n }\n return cursor.at('lparen')\n ? { kind: 'call', callee: path, args: parseCallArguments(cursor) }\n : { kind: 'ref', path };\n }\n default:\n throw new SflParseError(`expected an expression, got '${token.value || token.type}'`, token.line, token.col);\n }\n}\n\nexport const BINDING_OPERATORS = ['bind', 'bind2', 'action'];\n\nexport function atBinding(cursor: TokenCursor): boolean {\n return (\n cursor.peek().type === 'ident' && cursor.peek(1).type === 'colon' && BINDING_OPERATORS.includes(cursor.peek(2).type)\n );\n}\n\nexport function parseBinding(cursor: TokenCursor): SflBinding {\n const key = cursor.expect('ident', 'bound property');\n cursor.expect('colon', \"':'\");\n const operator = cursor.next().value as SflBinding['operator'];\n const expr = parseExpression(cursor);\n const next = cursor.peek();\n if (!['newline', 'semi', 'rbrace', 'eof'].includes(next.type)) {\n throw new SflParseError(`unexpected '${next.value || next.type}' after binding`, next.line, next.col);\n }\n return { key: key.value, operator, expr, line: key.line, col: key.col };\n}\n\nexport function parseAssignment(cursor: TokenCursor): SflAssignment {\n const start = cursor.peek();\n const target = parsePathSegments(cursor);\n cursor.expect('bind', \"'<-'\");\n const expr = parseExpression(cursor);\n return { target, expr, line: start.line, col: start.col };\n}\n\nexport function atHandler(cursor: TokenCursor): boolean {\n const token = cursor.peek();\n return token.type === 'ident' && /^on[A-Z]/.test(token.value) && ['colon', 'lbrace'].includes(cursor.peek(1).type);\n}\n\nexport function parseHandler(cursor: TokenCursor): SflHandler {\n const event = cursor.expect('ident', 'event name');\n const assignments: SflAssignment[] = [];\n if (cursor.at('colon')) {\n cursor.next();\n assignments.push(parseAssignment(cursor));\n expectEnd(cursor, 'handler');\n } else {\n cursor.expect('lbrace', \"'{'\");\n cursor.skipNewlines();\n while (!cursor.at('rbrace')) {\n if (cursor.at('eof')) {\n throw new SflParseError(`unterminated handler '${event.value}'`, event.line, event.col);\n }\n assignments.push(parseAssignment(cursor));\n expectEnd(cursor, 'assignment');\n cursor.skipNewlines();\n }\n cursor.expect('rbrace', \"'}'\");\n }\n return { event: event.value, assignments, line: event.line, col: event.col };\n}\n\nfunction expectEnd(cursor: TokenCursor, what: string): void {\n const next = cursor.peek();\n if (!['newline', 'semi', 'rbrace', 'eof'].includes(next.type)) {\n throw new SflParseError(`unexpected '${next.value || next.type}' after ${what}`, next.line, next.col);\n }\n if (next.type === 'semi') {\n cursor.next();\n }\n}\n","import type { SflBinding, SflLayout, SflProperty, SflStyle } from '../ast';\nimport type { TokenCursor } from './cursor';\nimport { SflParseError } from './error';\nimport { atBinding, parseBinding } from './expressions';\nimport { parseEndpoint, parseValue } from './values';\n\nexport class PropertyParser {\n constructor(private readonly cursor: TokenCursor) {}\n\n parseLayout(): SflLayout {\n this.cursor.next();\n return { properties: this.parsePropertyBlock('layout') };\n }\n\n parseStyle(): SflStyle {\n this.cursor.next();\n this.cursor.skipNewlines();\n this.cursor.expect('lbrace', \"'{'\");\n const properties: SflProperty[] = [];\n const bindings: SflBinding[] = [];\n this.cursor.skipNewlines();\n while (!this.cursor.at('rbrace')) {\n if (this.cursor.at('eof')) {\n const token = this.cursor.peek();\n throw new SflParseError('unterminated style block', token.line, token.col);\n }\n if (atBinding(this.cursor)) {\n bindings.push(parseBinding(this.cursor));\n if (this.cursor.at('newline') || this.cursor.at('semi')) {\n this.cursor.next();\n }\n } else {\n properties.push(this.parseProperty());\n }\n this.cursor.skipNewlines();\n }\n this.cursor.expect('rbrace', \"'}'\");\n return bindings.length ? { properties, bindings } : { properties };\n }\n\n parseFields(): SflProperty[] {\n this.cursor.next();\n return this.parsePropertyBlock('fields');\n }\n\n parseProperty(): SflProperty {\n const key = this.cursor.expect('ident', 'property key').value;\n this.cursor.expect('colon', \"':'\");\n const value = key === 'from' || key === 'to' ? parseEndpoint(this.cursor) : parseValue(this.cursor);\n this.consumeTerminator();\n return { key, value };\n }\n\n private parsePropertyBlock(kind: 'layout' | 'style' | 'fields'): SflProperty[] {\n this.cursor.skipNewlines();\n this.cursor.expect('lbrace', \"'{'\");\n const properties: SflProperty[] = [];\n this.cursor.skipNewlines();\n while (!this.cursor.at('rbrace')) {\n if (this.cursor.at('eof')) {\n const token = this.cursor.peek();\n throw new SflParseError(`unterminated ${kind} block`, token.line, token.col);\n }\n properties.push(this.parseProperty());\n this.cursor.skipNewlines();\n }\n this.cursor.expect('rbrace', \"'}'\");\n return properties;\n }\n\n private consumeTerminator(): void {\n if (this.cursor.at('newline') || this.cursor.at('semi')) {\n this.cursor.next();\n return;\n }\n if (this.cursor.at('rbrace') || this.cursor.at('eof')) {\n return;\n }\n const token = this.cursor.peek();\n throw new SflParseError(`unexpected '${token.value || token.type}' after property value`, token.line, token.col);\n }\n}\n","import { isNamedBlockKind, type SflBlock, type SflEntry } from '../ast';\nimport type { TokenCursor } from './cursor';\nimport { SflParseError } from './error';\nimport { atBinding, atHandler, parseBinding, parseHandler } from './expressions';\nimport { PropertyParser } from './properties';\n\nexport class BlockParser {\n private readonly properties: PropertyParser;\n\n constructor(private readonly cursor: TokenCursor) {\n this.properties = new PropertyParser(cursor);\n }\n\n parseBlock(): SflBlock {\n const kind = this.cursor.expect('ident', 'block kind');\n if (!isNamedBlockKind(kind.value)) {\n throw new SflParseError(`unknown block kind '${kind.value}'`, kind.line, kind.col);\n }\n const name = this.cursor.expect('ident', 'block name');\n const composition = this.parseComposition();\n const entries = this.parseBlockEntries();\n return { kind: kind.value, name: name.value, composition, entries };\n }\n\n private parseComposition(): string[] {\n if (!this.cursor.at('colon')) {\n return [];\n }\n this.cursor.next();\n const composition = [this.cursor.expect('ident', 'reference name after \":\"').value];\n while (this.cursor.at('amp')) {\n this.cursor.next();\n composition.push(this.cursor.expect('ident', 'reference name after \"&\"').value);\n }\n return composition;\n }\n\n private parseBlockEntries(): SflEntry[] {\n return this.parseEntries(() => this.parseBlockEntry());\n }\n\n private parseDataEntries(): SflEntry[] {\n return this.parseEntries(() => this.parseDataEntry());\n }\n\n private parseEntries(parseEntry: () => SflEntry): SflEntry[] {\n this.cursor.skipNewlines();\n this.cursor.expect('lbrace', \"'{'\");\n const entries: SflEntry[] = [];\n this.cursor.skipNewlines();\n while (!this.cursor.at('rbrace')) {\n if (this.cursor.at('eof')) {\n const token = this.cursor.peek();\n throw new SflParseError('unterminated block (missing \"}\")', token.line, token.col);\n }\n entries.push(parseEntry());\n if (this.cursor.at('semi')) {\n this.cursor.next();\n }\n this.cursor.skipNewlines();\n }\n this.cursor.expect('rbrace', \"'}'\");\n return entries;\n }\n\n private parseBlockEntry(): SflEntry {\n const token = this.cursor.peek();\n if (token.type !== 'ident') {\n throw new SflParseError(\n `expected property, block, layout, or style — got '${token.value || token.type}'`,\n token.line,\n token.col,\n );\n }\n if (isNamedBlockKind(token.value) && this.cursor.peek(1).type === 'ident') {\n return { type: 'block', block: this.parseBlock() };\n }\n if (token.value === 'layout' && this.cursor.peek(1).type === 'lbrace') {\n return { type: 'layout', layout: this.properties.parseLayout() };\n }\n if (token.value === 'style' && this.cursor.peek(1).type === 'lbrace') {\n return { type: 'style', style: this.properties.parseStyle() };\n }\n if (token.value === 'fields' && this.cursor.peek(1).type === 'lbrace') {\n return { type: 'fields', fields: this.properties.parseFields() };\n }\n if (atBinding(this.cursor)) {\n return { type: 'binding', binding: parseBinding(this.cursor) };\n }\n if (atHandler(this.cursor)) {\n return { type: 'handler', handler: parseHandler(this.cursor) };\n }\n if (token.value === 'data' && this.cursor.peek(1).type === 'lbrace') {\n return { type: 'data', data: this.parseDataBlock() };\n }\n return { type: 'property', property: this.properties.parseProperty() };\n }\n\n private parseDataEntry(): SflEntry {\n const token = this.cursor.peek();\n if (token.type === 'ident' && !isNamedBlockKind(token.value) && this.looksLikeSeriesEntry()) {\n return { type: 'block', block: this.parseSeriesEntry() };\n }\n return this.parseBlockEntry();\n }\n\n private parseDataBlock(): SflBlock {\n this.cursor.next();\n return { kind: 'data', name: '', composition: [], entries: this.parseDataEntries() };\n }\n\n private looksLikeSeriesEntry(): boolean {\n if (this.cursor.peek(1).type === 'lbrace') {\n return true;\n }\n if (this.cursor.peek(1).type !== 'colon') {\n return false;\n }\n let offset = 2;\n if (this.cursor.peek(offset).type !== 'ident') {\n return false;\n }\n offset++;\n while (this.cursor.peek(offset).type === 'amp') {\n offset++;\n if (this.cursor.peek(offset).type !== 'ident') {\n return false;\n }\n offset++;\n }\n return this.cursor.peek(offset).type === 'lbrace';\n }\n\n private parseSeriesEntry(): SflBlock {\n const name = this.cursor.expect('ident', 'series name');\n const composition = this.parseComposition();\n const entries = this.parseBlockEntries();\n return { kind: 'Series', name: name.value, composition, entries };\n }\n}\n","import type { SflBlock, SflDocument } from '../ast';\nimport { BlockParser } from './blocks';\nimport type { TokenCursor } from './cursor';\nimport { SflParseError } from './error';\n\nexport class DocumentParser {\n private readonly blocks: BlockParser;\n\n constructor(private readonly cursor: TokenCursor) {\n this.blocks = new BlockParser(cursor);\n }\n\n parseDocument(): SflDocument {\n this.cursor.skipNewlines();\n const header = this.cursor.expect('ident', \"'sfl' header\");\n if (header.value !== 'sfl') {\n throw new SflParseError(`document must start with 'sfl', got '${header.value}'`, header.line, header.col);\n }\n const version = this.cursor.expect('number', 'version number');\n this.cursor.skipNewlines();\n\n const blocks: SflBlock[] = [];\n while (!this.cursor.at('eof')) {\n blocks.push(this.blocks.parseBlock());\n this.cursor.skipNewlines();\n }\n return { version: version.value, blocks };\n }\n}\n","import type { SflDocument } from '../ast';\nimport { tokenizeSource } from '../lexing/tokenizer';\nimport { TokenCursor } from './cursor';\nimport { DocumentParser } from './document';\n\nexport function parseSource(input: string): SflDocument {\n return new DocumentParser(new TokenCursor(tokenizeSource(input))).parseDocument();\n}\n","import type { SflValue } from '../../sflLanguage/ast';\n\nexport function asString(value?: SflValue): string | undefined {\n if (!value) {\n return undefined;\n }\n if (value.type === 'string') {\n return value.value;\n }\n if (value.type === 'ident') {\n return value.segments.join('.');\n }\n if (value.type === 'number') {\n return String(value.value);\n }\n return undefined;\n}\n\nexport function asNumber(value?: SflValue): number | undefined {\n return value?.type === 'number' ? value.value : undefined;\n}\n\nexport function tupleValues(value?: SflValue): number[] | undefined {\n return value?.type === 'tuple' ? value.values : undefined;\n}\n\nexport function listNumbers(value?: SflValue): number[] | undefined {\n return value?.type === 'list'\n ? value.values.flatMap(item => (item.type === 'number' ? [item.value] : []))\n : undefined;\n}\n","import type { SflValue, Side } from '../../../../sflLanguage/ast';\nimport type { SflCanvasObject } from '../../types';\n\nexport interface LinkEndpointReference {\n id?: string;\n side?: Side;\n fraction?: number;\n port?: string;\n}\n\nexport interface LinkEndpointReaderContext {\n idByName: Map<string, string>;\n canvasObjectById: Map<string, SflCanvasObject>;\n}\n\nfunction namedPortReference(segments: string[], context: LinkEndpointReaderContext): LinkEndpointReference | null {\n if (segments.length < 2) {\n return null;\n }\n\n const portName = segments[segments.length - 1];\n const canvasObjectName = segments[segments.length - 2];\n const canvasObjectId = context.idByName.get(canvasObjectName);\n const canvasObject = canvasObjectId ? context.canvasObjectById.get(canvasObjectId) : undefined;\n if (!canvasObject?.symbol?.ports?.some(port => port.name === portName)) {\n return null;\n }\n\n return { id: canvasObjectId, port: portName };\n}\n\nexport function readLinkEndpoint(\n value: SflValue | undefined,\n context: LinkEndpointReaderContext,\n): LinkEndpointReference {\n if (value?.type !== 'endpoint') {\n return {};\n }\n\n const namedPort = namedPortReference(value.segments, context);\n if (namedPort) {\n return namedPort;\n }\n\n const endpointName = value.segments[value.segments.length - 1];\n return {\n id: context.idByName.get(endpointName) ?? endpointName,\n side: value.side,\n fraction: value.fraction,\n };\n}\n","import type { SflBlock, SflValue } from '../../sflLanguage/ast';\n\nexport function directProperties(block: SflBlock): Map<string, SflValue> {\n const properties = new Map<string, SflValue>();\n for (const entry of block.entries) {\n if (entry.type === 'property') {\n properties.set(entry.property.key, entry.property.value);\n }\n }\n return properties;\n}\n\nexport function styleProperties(block: SflBlock): Map<string, SflValue> {\n const properties = new Map<string, SflValue>();\n for (const entry of block.entries) {\n if (entry.type === 'style') {\n for (const property of entry.style.properties) {\n properties.set(property.key, property.value);\n }\n }\n }\n return properties;\n}\n\nexport function layoutProperties(block: SflBlock): Map<string, SflValue> {\n const properties = new Map<string, SflValue>();\n for (const entry of block.entries) {\n if (entry.type === 'layout') {\n for (const property of entry.layout.properties) {\n properties.set(property.key, property.value);\n }\n }\n }\n return properties;\n}\n\nexport function childBlocks(block: SflBlock): SflBlock[] {\n return block.entries.flatMap(entry => (entry.type === 'block' ? [entry.block] : []));\n}\n\nfunction dataEntryBlock(block: SflBlock): SflBlock | undefined {\n for (const entry of block.entries) {\n if (entry.type === 'data') {\n return entry.data;\n }\n }\n return undefined;\n}\n\nexport function contentChildren(block: SflBlock): SflBlock[] {\n const data = dataEntryBlock(block);\n return data ? [...childBlocks(block), ...childBlocks(data)] : childBlocks(block);\n}\n\nexport function contentProperty(block: SflBlock, key: string): SflValue | undefined {\n const direct = directProperties(block).get(key);\n if (direct !== undefined) {\n return direct;\n }\n const data = dataEntryBlock(block);\n return data ? directProperties(data).get(key) : undefined;\n}\n","import type { BlockKind } from '../../../sflLanguage/ast';\n\nexport const CANVAS_OBJECT_BLOCK_KINDS = [\n 'Entity',\n 'Shape',\n 'Text',\n 'Container',\n 'Path',\n 'Chart',\n 'Widget',\n 'Isometric',\n] as const satisfies readonly BlockKind[];\n\nexport type CanvasObjectBlockKind = (typeof CANVAS_OBJECT_BLOCK_KINDS)[number];\n\nconst canvasObjectBlockKinds: ReadonlySet<BlockKind> = new Set(CANVAS_OBJECT_BLOCK_KINDS);\n\nexport function isCanvasObjectBlockKind(kind: BlockKind): kind is CanvasObjectBlockKind {\n return canvasObjectBlockKinds.has(kind);\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { childBlocks, directProperties } from '../../../ast/blockEntries';\nimport { asString } from '../../../ast/valueAccess';\nimport { isCanvasObjectBlockKind } from '../../processing/blockKinds';\n\nfunction indexLinkableNames(blocks: SflBlock[], idByName: Map<string, string>): void {\n for (const block of blocks) {\n if (isCanvasObjectBlockKind(block.kind)) {\n idByName.set(block.name, asString(directProperties(block).get('id')) ?? block.name);\n }\n\n indexLinkableNames(childBlocks(block), idByName);\n }\n}\n\nexport function buildLinkNameIndex(model: SflBlock | undefined): Map<string, string> {\n const idByName = new Map<string, string>();\n if (model) {\n indexLinkableNames(childBlocks(model), idByName);\n }\n return idByName;\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asString } from '../../../ast/valueAccess';\n\nconst STRUCTURAL_LINK_PROPERTIES = new Set(['id', 'from', 'to', 'text', 'order', 'segments']);\n\nexport function readLinkPresentation(properties: Map<string, SflValue>): Record<string, string> {\n const presentation: Record<string, string> = {};\n\n for (const [key, value] of properties) {\n if (STRUCTURAL_LINK_PROPERTIES.has(key)) {\n continue;\n }\n\n const text = asString(value);\n if (text !== undefined) {\n presentation[key] = text;\n }\n }\n\n return presentation;\n}\n","import type { IsometricFace } from '../../../../model/isometricObject';\nimport type { SflBlock } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { CanvasObjectResolutionContext } from '../../processing/resolver';\nimport type { SflCanvasObject } from '../../types';\nimport { readLinkEndpoint } from '../links/endpointReader';\nimport { buildLinkNameIndex } from '../links/nameIndex';\nimport { readLinkPresentation } from '../links/presentation';\nimport type { SflConnectionOut } from './types';\n\nconst FACES: ReadonlySet<string> = new Set(['top', 'bottom', 'front', 'back', 'left', 'right']);\n\nfunction readFace(value: string | undefined): IsometricFace {\n return value !== undefined && FACES.has(value) ? (value as IsometricFace) : 'front';\n}\n\nexport function readConnections(\n model: SflBlock | undefined,\n connectionBlocks: SflBlock[],\n canvasObjects: SflCanvasObject[],\n context: CanvasObjectResolutionContext,\n sourceIndexes: readonly number[] = [],\n): SflConnectionOut[] {\n const endpointContext = {\n idByName: buildLinkNameIndex(model),\n canvasObjectById: new Map(canvasObjects.map(canvasObject => [canvasObject.id, canvasObject])),\n };\n return connectionBlocks.map((block, index) => {\n const properties = context.mergedProps(block);\n return {\n id: asString(properties.get('id')) ?? block.name,\n fromId: readLinkEndpoint(properties.get('from'), endpointContext).id,\n toId: readLinkEndpoint(properties.get('to'), endpointContext).id,\n fromFace: readFace(asString(properties.get('fromFace'))),\n toFace: readFace(asString(properties.get('toFace'))),\n order: asNumber(properties.get('order')),\n sourceIndex: sourceIndexes[index],\n props: readLinkPresentation(properties),\n };\n });\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { asNumber, asString, listNumbers } from '../../../ast/valueAccess';\nimport type { CanvasObjectResolutionContext } from '../../processing/resolver';\nimport { type LinkEndpointReaderContext, readLinkEndpoint } from './endpointReader';\nimport { readLinkPresentation } from './presentation';\nimport type { SflLinkOut } from './types';\n\nexport function readLinkBlock(\n block: SflBlock,\n canvasObjectContext: CanvasObjectResolutionContext,\n endpointContext: LinkEndpointReaderContext,\n): SflLinkOut {\n const properties = canvasObjectContext.mergedProps(block);\n const from = readLinkEndpoint(properties.get('from'), endpointContext);\n const to = readLinkEndpoint(properties.get('to'), endpointContext);\n\n return {\n id: asString(properties.get('id')) ?? block.name,\n fromId: from.id,\n toId: to.id,\n text: asString(properties.get('text')),\n fromSide: from.side,\n fromFraction: from.fraction,\n toSide: to.side,\n toFraction: to.fraction,\n fromPort: from.port,\n toPort: to.port,\n order: asNumber(properties.get('order')),\n segments: listNumbers(properties.get('segments')),\n props: readLinkPresentation(properties),\n };\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport type { CanvasObjectResolutionContext } from '../../processing/resolver';\nimport type { SflCanvasObject } from '../../types';\nimport { readLinkBlock } from './blockReader';\nimport type { LinkEndpointReaderContext } from './endpointReader';\nimport { buildLinkNameIndex } from './nameIndex';\nimport type { SflLinkOut } from './types';\n\nexport function readLinks(\n model: SflBlock | undefined,\n linkBlocks: SflBlock[],\n canvasObjects: SflCanvasObject[],\n context: CanvasObjectResolutionContext,\n sourceIndexes: readonly number[] = [],\n): SflLinkOut[] {\n const endpointContext: LinkEndpointReaderContext = {\n idByName: buildLinkNameIndex(model),\n canvasObjectById: new Map(canvasObjects.map(canvasObject => [canvasObject.id, canvasObject])),\n };\n\n return linkBlocks.map((block, index) => ({\n ...readLinkBlock(block, context, endpointContext),\n sourceIndex: sourceIndexes[index],\n }));\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { asString } from '../../../ast/valueAccess';\nimport type { CanvasObjectResolutionContext } from '../../processing/resolver';\n\nfunction netMembers(block: SflBlock, context: CanvasObjectResolutionContext): string[][] {\n const membersValue = context.mergedProps(block).get('members');\n return membersValue?.type === 'list'\n ? membersValue.values.flatMap(value => (value.type === 'ident' ? [value.segments] : []))\n : [];\n}\n\nfunction netLink(block: SflBlock, from: string[], to: string[], index: number, text?: string): SflBlock {\n const entries: SflBlock['entries'] = [\n { type: 'property', property: { key: 'from', value: { type: 'endpoint', segments: from } } },\n { type: 'property', property: { key: 'to', value: { type: 'endpoint', segments: to } } },\n ];\n if (text) {\n entries.push({\n type: 'property',\n property: { key: 'text', value: { type: 'string', value: text } },\n });\n }\n return { kind: 'Link', name: `${block.name}_${index + 1}`, composition: [], entries };\n}\n\nexport function expandNetLinks(block: SflBlock, context: CanvasObjectResolutionContext): SflBlock[] {\n const members = netMembers(block, context);\n if (members.length < 2) {\n return [];\n }\n\n const text = asString(context.mergedProps(block).get('text'));\n return members.slice(1).map((member, index) => netLink(block, members[0], member, index, text));\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { CanvasObjectResolutionContext } from '../resolver';\n\nexport type FlowPositioner = (size: number[]) => number[] | undefined;\n\nexport function createFlowPositioner(block: SflBlock, context: CanvasObjectResolutionContext): FlowPositioner {\n const axis = asString(context.layoutProp(block, 'flow'));\n const gap = asNumber(context.layoutProp(block, 'gap')) ?? 0;\n let cursor = 0;\n\n return (size: number[]): number[] | undefined => {\n if (axis !== 'horizontal' && axis !== 'vertical') {\n return undefined;\n }\n const position = axis === 'horizontal' ? [cursor, 0] : [0, cursor];\n cursor += (axis === 'horizontal' ? size[0] : size[1]) + gap;\n return position;\n };\n}\n","export const CHART_TYPES = [\n 'bar',\n 'line',\n 'scatter',\n 'radar',\n 'radial',\n 'field',\n 'heatmap',\n 'boxplot',\n 'sankey',\n 'treemap',\n 'mekko',\n 'hexbin',\n 'pie',\n 'radialBar',\n 'polarArea',\n 'custom',\n] as const;\n\nexport type ChartType = (typeof CHART_TYPES)[number];\n\nexport function isChartType(value: string | undefined): value is ChartType {\n return value !== undefined && (CHART_TYPES as readonly string[]).includes(value);\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\n\nexport function numberList(value?: SflValue): number[] | undefined {\n if (value?.type !== 'list') {\n return undefined;\n }\n const numbers = value.values.flatMap(item => {\n const number = asNumber(item);\n return number === undefined ? [] : [number];\n });\n return numbers.length > 0 ? numbers : undefined;\n}\n\nexport function stringList(value?: SflValue): string[] | undefined {\n if (value?.type !== 'list') {\n return undefined;\n }\n return value.values.flatMap(item => {\n const text = asString(item);\n return text === undefined ? [] : [text];\n });\n}\n\nexport function readBoolean(value?: SflValue): boolean | undefined {\n const text = asString(value);\n if (text === undefined) {\n return undefined;\n }\n return text === 'true';\n}\n","import type { SflBlock, SflValue } from '../../../../sflLanguage/ast';\nimport { directProperties } from '../../../ast/blockEntries';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { ChartData } from './types';\nimport { numberList } from './values';\n\nexport function readAxis(block?: SflBlock): ChartData['axisX'] {\n const properties = block ? directProperties(block) : new Map<string, SflValue>();\n return {\n min: asNumber(properties.get('min')) ?? 0,\n max: asNumber(properties.get('max')) ?? 10,\n step: asNumber(properties.get('step')) ?? 1,\n label: asString(properties.get('label')),\n unit: asString(properties.get('unit')),\n thresholds: numberList(properties.get('thresholds')),\n };\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { contentChildren, directProperties } from '../../../ast/blockEntries';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { ChartData } from './types';\nimport { numberList } from './values';\n\nexport function readChartRules(block: SflBlock): ChartData['rules'] {\n return contentChildren(block)\n .filter(child => child.kind === 'Rule')\n .map(rule => {\n const properties = directProperties(rule);\n return {\n id: rule.name,\n at: asNumber(properties.get('at')) ?? 0,\n text: asString(properties.get('text')),\n color: asString(properties.get('color')),\n strokeWidth: asNumber(properties.get('strokeWidth')),\n dash: numberList(properties.get('dash')),\n };\n });\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { ChartSeries } from './types';\n\ntype SeriesValueShape = 'scalar' | 'tuple';\ntype SeriesError = NonNullable<ChartSeries['error']>[number];\n\nfunction asComponents(value: SflValue): number[] | undefined {\n if (value.type !== 'list' || value.values.length < 2) {\n return undefined;\n }\n const components = value.values.map(asNumber);\n return components.every((part): part is number => part !== undefined) ? components : undefined;\n}\n\nexport function readSeriesValues(value?: SflValue): ChartSeries['values'] {\n if (value?.type !== 'list') {\n return [];\n }\n const shape = firstSeriesValueShape(value.values);\n return shape === 'tuple' ? readTupleSeriesValues(value.values) : readScalarSeriesValues(value.values);\n}\n\nfunction firstSeriesValueShape(values: SflValue[]): SeriesValueShape | undefined {\n for (const value of values) {\n if (value.type === 'number') {\n return 'scalar';\n }\n if (asComponents(value)) {\n return 'tuple';\n }\n }\n return undefined;\n}\n\nfunction readScalarSeriesValues(values: SflValue[]): number[] {\n return values.flatMap(value => (value.type === 'number' ? [value.value] : []));\n}\n\nfunction readTupleSeriesValues(values: SflValue[]): ChartSeries['values'] {\n return values.flatMap(value => {\n const components = asComponents(value);\n return components ? [components] : [];\n }) as ChartSeries['values'];\n}\n\nexport function readSeriesErrors(value?: SflValue): ChartSeries['error'] {\n if (value?.type !== 'list') {\n return undefined;\n }\n return value.values.map(readSeriesError);\n}\n\nfunction readSeriesError(value: SflValue): SeriesError {\n if (value.type === 'ident' && value.segments.join('.') === 'none') {\n return null;\n }\n if (value.type === 'number') {\n return value.value;\n }\n return readSeriesErrorRange(value);\n}\n\nfunction readSeriesErrorRange(value: SflValue): [number, number] | null {\n if (value.type !== 'list' || value.values.length < 2) {\n return null;\n }\n const low = asNumber(value.values[0]);\n const high = asNumber(value.values[1]);\n return low !== undefined && high !== undefined ? [low, high] : null;\n}\n\nexport function readSeriesColors(value?: SflValue): ChartSeries['colors'] {\n if (value?.type !== 'list') {\n return undefined;\n }\n return value.values.map(readSeriesColor);\n}\n\nfunction readSeriesColor(value: SflValue): string | null {\n if (value.type === 'ident' && value.segments.join('.') === 'none') {\n return null;\n }\n return asString(value) ?? null;\n}\n\ntype SymbolDefinitions = Map<string, { points: Array<[number, number]>; tension?: number }>;\n\nexport function readSeriesSymbol(value: SflValue | undefined, symbolDefs: SymbolDefinitions): ChartSeries['symbol'] {\n if (value?.type === 'list') {\n const points = value.values.flatMap(readSeriesSymbolPoint);\n return points.length > 0 ? { points } : undefined;\n }\n const name = asString(value);\n const definition = name ? symbolDefs.get(name) : undefined;\n if (!definition) {\n return undefined;\n }\n return { points: definition.points, normalized: true, tension: definition.tension };\n}\n\nfunction readSeriesSymbolPoint(value: SflValue): Array<[number, number]> {\n if (value.type !== 'list' || value.values.length < 2) {\n return [];\n }\n const x = asNumber(value.values[0]);\n const y = asNumber(value.values[1]);\n return x === undefined || y === undefined ? [] : [[x, y]];\n}\n","import type { SflBlock } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport { readSeriesColors, readSeriesErrors, readSeriesSymbol, readSeriesValues } from './seriesValues';\nimport type { ChartProperties, ChartSeries } from './types';\nimport { numberList } from './values';\n\ntype SymbolDefinitions = Map<string, { points: Array<[number, number]>; tension?: number }>;\n\nexport function readSeries(\n block: SflBlock,\n symbolDefs: SymbolDefinitions,\n mergedProps: (block: SflBlock) => ChartProperties,\n): ChartSeries {\n const properties = mergedProps(block);\n return {\n id: block.name,\n label: asString(properties.get('label')) ?? block.name,\n color: asString(properties.get('color')),\n colors: readSeriesColors(properties.get('colors')),\n opacity: asNumber(properties.get('opacity')),\n group: asString(properties.get('group')),\n values: readSeriesValues(properties.get('values')),\n error: readSeriesErrors(properties.get('error')),\n source: asString(properties.get('source')),\n target: asString(properties.get('target')),\n size: asNumber(properties.get('size')),\n symbol: readSeriesSymbol(properties.get('symbol'), symbolDefs),\n stroke: asString(properties.get('stroke')),\n strokeWidth: asNumber(properties.get('strokeWidth')),\n dash: numberList(properties.get('dash')),\n offset: asNumber(properties.get('offset')),\n labelOffsetX: asNumber(properties.get('labelOffsetX')),\n labelOffsetY: asNumber(properties.get('labelOffsetY')),\n };\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { ChartData } from './types';\n\nexport function readChartZones(value?: SflValue): ChartData['zones'] {\n if (value?.type !== 'list') {\n return undefined;\n }\n const zones = value.values.flatMap(item => {\n if (item.type !== 'list') {\n return [];\n }\n const label = asString(item.values[0]);\n if (label === undefined) {\n return [];\n }\n return [\n {\n label,\n color: asString(item.values[1]),\n offsetX: asNumber(item.values[2]),\n offsetY: asNumber(item.values[3]),\n },\n ];\n });\n return zones.length > 0 ? zones : undefined;\n}\n","import { isChartType } from '../../../../model/chart';\nimport type { SflBlock } from '../../../../sflLanguage/ast';\nimport { contentChildren, contentProperty } from '../../../ast/blockEntries';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport { readAxis } from './axis';\nimport { readChartRules } from './rules';\nimport { readSeries } from './series';\nimport type { ChartData, ChartProperties } from './types';\nimport { numberList, readBoolean, stringList } from './values';\nimport { readChartZones } from './zones';\n\nconst STACKED_MODES: ReadonlyArray<NonNullable<ChartData['stacked']>> = ['none', 'true', 'percent', 'waterfall'];\n\nfunction asChartType(value: string | undefined): ChartData['chartType'] {\n return isChartType(value) ? value : 'bar';\n}\n\nfunction asStackedMode(value: string | undefined): ChartData['stacked'] {\n return STACKED_MODES.find(mode => mode === value);\n}\n\ntype SymbolDefinitions = Map<string, { points: Array<[number, number]>; tension?: number }>;\n\nexport function readChart(\n block: SflBlock,\n properties: ChartProperties,\n symbolDefs: SymbolDefinitions,\n mergedProps: (block: SflBlock) => ChartProperties,\n): ChartData {\n const children = contentChildren(block);\n const axes = children.filter(child => child.kind === 'Axis');\n const stacked = asString(properties.get('stacked'));\n return {\n chartType: asChartType(asString(properties.get('type'))),\n categories: stringList(contentProperty(block, 'categories')),\n areaOpacity: asNumber(properties.get('areaOpacity')),\n stacked: asStackedMode(stacked),\n scale: asString(properties.get('scale')),\n interpolate: asString(properties.get('interpolate')) === 'idw' ? 'idw' : undefined,\n idwPower: asNumber(properties.get('idwPower')),\n isolines: numberList(properties.get('isolines')),\n zones: readChartZones(properties.get('zones')),\n boxWidth: asNumber(properties.get('boxWidth')),\n orientation: asString(properties.get('orientation')) === 'horizontal' ? 'horizontal' : undefined,\n lineTension: asNumber(properties.get('lineTension')),\n highlightPoints: numberList(properties.get('highlightPoints')),\n barCornerRadius: asNumber(properties.get('barCornerRadius')),\n showBoxplotPoints: readBoolean(properties.get('showBoxplotPoints')),\n barBorderColor: asString(properties.get('barBorderColor')),\n barBorderWidth: asNumber(properties.get('barBorderWidth')),\n barGroupGap: asNumber(properties.get('barGroupGap')),\n barGlow: asNumber(properties.get('barGlow')),\n barGap: asNumber(properties.get('barGap')),\n mekkoVaryHeight: readBoolean(properties.get('mekkoVaryHeight')),\n hexRadius: asNumber(properties.get('hexRadius')),\n innerRadius: asNumber(properties.get('innerRadius')),\n pieCornerRadius: asNumber(properties.get('pieCornerRadius')),\n pieSliceGap: asNumber(properties.get('pieSliceGap')),\n ringThickness: asNumber(properties.get('ringThickness')),\n ringGap: asNumber(properties.get('ringGap')),\n cellGap: asNumber(properties.get('cellGap')),\n showValues: readBoolean(properties.get('showValues')),\n squareCells: readBoolean(properties.get('squareCells')),\n headerColor: asString(properties.get('headerColor')),\n tileGradient: readBoolean(properties.get('tileGradient')),\n showColumnBackdrop: readBoolean(properties.get('showColumnBackdrop')),\n labelPosition: asString(properties.get('labelPosition')) === 'inside' ? 'inside' : undefined,\n labelOrientation: asString(properties.get('labelOrientation')) === 'vertical' ? 'vertical' : undefined,\n labelColor: asString(properties.get('labelColor')),\n linkGradient: readBoolean(properties.get('linkGradient')),\n connectPoints: readBoolean(properties.get('connectPoints')),\n reverseComparison: readBoolean(properties.get('reverseComparison')),\n axisX: readAxis(axes.find(axis => axis.name === 'x')),\n axisY: readAxis(axes.find(axis => axis.name === 'y' || axis.name === 'value')),\n series: children.filter(child => child.kind === 'Series').map(child => readSeries(child, symbolDefs, mergedProps)),\n rules: readChartRules(block),\n };\n}\n","import type { SflBlock, SflValue } from '../../../../sflLanguage/ast';\nimport type { SflCanvasObjectBase, SflSymbolDefinition } from '../../types';\nimport { readChart } from './reader';\nimport type { SflChartObject } from './types';\n\nexport function resolveChartObject(\n base: SflCanvasObjectBase,\n block: SflBlock,\n properties: Map<string, SflValue>,\n symbolDefinitions: Map<string, SflSymbolDefinition>,\n mergedProperties: (block: SflBlock) => Map<string, SflValue>,\n): SflChartObject {\n return {\n ...base,\n objectType: 'chart',\n chart: readChart(block, properties, symbolDefinitions, mergedProperties),\n };\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asString } from '../../../ast/valueAccess';\nimport type { SflIsometricData } from './types';\n\ntype Properties = Map<string, SflValue>;\n\nexport function readIsometric(properties: Properties, depth: number): SflIsometricData {\n return {\n depth,\n icon: asString(properties.get('icon')),\n };\n}\n","import type { SflBlock, SflValue } from '../../../../sflLanguage/ast';\nimport { tupleValues } from '../../../ast/valueAccess';\nimport type { SflCanvasObjectBase } from '../../types';\nimport { readIsometric } from './reader';\nimport type { SflIsometricObject } from './types';\n\nexport function resolveIsometricObject(\n base: SflCanvasObjectBase,\n block: SflBlock,\n properties: Map<string, SflValue>,\n layoutProperty: (block: SflBlock, key: string) => SflValue | undefined,\n): SflIsometricObject {\n const size = tupleValues(layoutProperty(block, 'size'));\n return {\n ...base,\n objectType: 'isometric',\n isometric: readIsometric(properties, size?.[2] ?? 24),\n };\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { SflPathData } from './types';\n\ntype Properties = Map<string, SflValue>;\n\nexport function readPath(p: Properties, origin: { x: number; y: number }): SflPathData {\n const pointsValue = p.get('points');\n const points =\n pointsValue?.type === 'list'\n ? pointsValue.values.flatMap(value => {\n if (value.type !== 'list' || value.values.length < 2) {\n return [];\n }\n const x = asNumber(value.values[0]);\n const y = asNumber(value.values[1]);\n return x !== undefined && y !== undefined ? [{ x: origin.x + x, y: origin.y + y }] : [];\n })\n : [];\n\n return {\n points,\n tension: asNumber(p.get('tension')),\n startMarker: asString(p.get('startMarker')),\n endMarker: asString(p.get('endMarker')),\n closed: asString(p.get('closed')) === 'true',\n value: asNumber(p.get('value')),\n };\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport type { SflCanvasObjectBase } from '../../types';\nimport { readPath } from './reader';\nimport type { SflPathObject } from './types';\n\nexport function resolvePathObject(\n base: SflCanvasObjectBase,\n properties: Map<string, SflValue>,\n origin: { x: number; y: number },\n): SflPathObject {\n return {\n ...base,\n objectType: 'path',\n path: readPath(properties, origin),\n };\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../../ast/valueAccess';\nimport type { SflSwimlaneData } from './types';\n\ntype Properties = Map<string, SflValue>;\n\nexport function readSwimlane(p: Properties): SflSwimlaneData {\n const orientation = asString(p.get('orientation')) === 'vertical' ? 'vertical' : 'horizontal';\n const lanesValue = p.get('lanes');\n const lanes =\n lanesValue?.type === 'list'\n ? lanesValue.values.flatMap((value, index) => {\n if (value.type !== 'list') {\n return [];\n }\n const label = asString(value.values[0]);\n const size = asNumber(value.values[1]);\n if (label === undefined || size === undefined) {\n return [];\n }\n const color = asString(value.values[2]);\n return [{ id: `lane-${index + 1}`, label, size, ...(color ? { color } : {}) }];\n })\n : [];\n const swimlaneData: SflSwimlaneData = { orientation, lanes };\n\n return swimlaneData;\n}\n","import type { SflValue } from '../../../../sflLanguage/ast';\nimport type { SflCanvasObjectBase } from '../../types';\nimport { readSwimlane } from './reader';\nimport type { SflSwimlaneObject } from './types';\n\nexport function resolveSwimlaneObject(base: SflCanvasObjectBase, properties: Map<string, SflValue>): SflSwimlaneObject {\n return {\n ...base,\n objectType: 'swimlane',\n swimlane: readSwimlane(properties),\n };\n}\n","import type { SflBlock, SflValue } from '../../../sflLanguage/ast';\nimport { asString } from '../../ast/valueAccess';\nimport type { SflCanvasObjectType, SflSymbolDefinition } from '../types';\n\nexport interface CanvasObjectClassification {\n objectType: SflCanvasObjectType;\n kind: string;\n shapeType: string | undefined;\n symbol: SflSymbolDefinition | undefined;\n}\n\nfunction declaredCanvasObjectKind(block: SflBlock, properties: Map<string, SflValue>): string {\n if (block.kind === 'Path') {\n return 'path';\n }\n if (block.kind === 'Chart') {\n return 'chart';\n }\n if (block.kind === 'Widget') {\n return asString(properties.get('type')) ?? 'widget';\n }\n if (block.kind === 'Text') {\n return 'text';\n }\n if (block.kind === 'Isometric') {\n return 'isometric';\n }\n\n return asString(properties.get('kind')) ?? '';\n}\n\nfunction canvasObjectTypeForKind(kind: string): SflCanvasObjectType {\n if (kind === 'frame') {\n return 'frame';\n }\n if (kind === 'swimlane') {\n return 'swimlane';\n }\n if (kind === 'path') {\n return 'path';\n }\n if (kind === 'chart') {\n return 'chart';\n }\n if (kind === 'rollingNumber' || kind === 'tickScale' || kind === 'ruler') {\n return 'widget';\n }\n if (kind === 'isometric') {\n return 'isometric';\n }\n\n return 'shape';\n}\n\nexport function classifyCanvasObject(\n block: SflBlock,\n properties: Map<string, SflValue>,\n symbolDefinitions: Map<string, SflSymbolDefinition>,\n): CanvasObjectClassification {\n const kind = declaredCanvasObjectKind(block, properties);\n const shapeReference = asString(properties.get('shape'));\n const symbol = shapeReference ? symbolDefinitions.get(shapeReference) : undefined;\n\n return {\n objectType: block.kind === 'Widget' ? 'widget' : canvasObjectTypeForKind(kind),\n kind,\n shapeType: symbol ? 'symbol' : shapeReference,\n symbol,\n };\n}\n","import type { SflBlock, SflValue } from '../../../../sflLanguage/ast';\nimport { asNumber, tupleValues } from '../../../ast/valueAccess';\n\ntype LayoutProperty = (block: SflBlock, key: string) => SflValue | undefined;\n\nexport interface CanvasObjectGeometry {\n x: number;\n y: number;\n width: number;\n height: number;\n rotation: number | undefined;\n order: number | undefined;\n}\n\nexport function readCanvasObjectGeometry(\n block: SflBlock,\n origin: { x: number; y: number },\n layoutProperty: LayoutProperty,\n positionOverride?: number[],\n): CanvasObjectGeometry {\n const position = positionOverride ?? tupleValues(layoutProperty(block, 'position')) ?? [0, 0];\n const size = tupleValues(layoutProperty(block, 'size')) ?? [0, 0];\n\n return {\n x: origin.x + (position[0] ?? 0),\n y: origin.y + (position[1] ?? 0),\n width: size[0] ?? 0,\n height: size[1] ?? 0,\n rotation: asNumber(layoutProperty(block, 'rotation')),\n order: asNumber(layoutProperty(block, 'order')),\n };\n}\n","import type { SflValue } from '../../../sflLanguage/ast';\nimport { asString } from '../../ast/valueAccess';\n\nconst STRUCTURAL_PROPERTIES = new Set(['id', 'kind', 'text', 'shape', 'parent', 'order', 'orientation', 'lanes']);\n\nexport function readCanvasObjectPresentation(properties: Map<string, SflValue>): Record<string, string> {\n const presentation: Record<string, string> = {};\n\n for (const [key, value] of properties) {\n if (STRUCTURAL_PROPERTIES.has(key)) {\n continue;\n }\n\n const text = asString(value);\n if (text !== undefined) {\n presentation[key] = text;\n }\n }\n\n return presentation;\n}\n","import type { Shader } from '../../../model/shader';\nimport type { SflBlock, SflValue } from '../../../sflLanguage/ast';\nimport { asNumber, asString } from '../../ast/valueAccess';\nimport { resolveChartObject } from '../artifacts/chart/resolver';\nimport { resolveIsometricObject } from '../artifacts/isometric/resolver';\nimport { resolvePathObject } from '../artifacts/path/resolver';\nimport { resolveSwimlaneObject } from '../artifacts/swimlane/resolver';\nimport type {\n SflCanvasObject,\n SflCanvasObjectBase,\n SflFrameObject,\n SflShapeObject,\n SflSymbolDefinition,\n SflWidgetObject,\n} from '../types';\nimport { classifyCanvasObject } from './classification';\nimport { readCanvasObjectGeometry } from './layout/geometry';\nimport { readCanvasObjectPresentation } from './presentation';\n\nexport interface CanvasObjectResolutionContext {\n mergedProps: (block: SflBlock) => Map<string, SflValue>;\n layoutProp: (block: SflBlock, key: string) => SflValue | undefined;\n symbolDefs: Map<string, SflSymbolDefinition>;\n shaderDefs: Map<string, Shader>;\n}\n\nexport function resolveCanvasObject(\n block: SflBlock,\n origin: { x: number; y: number },\n context: CanvasObjectResolutionContext,\n frameId?: string,\n positionOverride?: number[],\n): SflCanvasObject {\n const { mergedProps, layoutProp, symbolDefs } = context;\n const properties = mergedProps(block);\n const classification = classifyCanvasObject(block, properties, symbolDefs);\n const geometry = readCanvasObjectGeometry(block, origin, layoutProp, positionOverride);\n const base: SflCanvasObjectBase = {\n id: asString(properties.get('id')) ?? block.name,\n kind: classification.kind,\n text: asString(properties.get('text')),\n ...geometry,\n parentFrameId: frameId ?? asString(properties.get('parent')),\n props: readCanvasObjectPresentation(properties),\n };\n\n switch (classification.objectType) {\n case 'chart':\n return resolveChartObject(base, block, properties, symbolDefs, mergedProps);\n case 'isometric':\n return resolveIsometricObject(base, block, properties, layoutProp);\n case 'path':\n return resolvePathObject(base, properties, origin);\n case 'swimlane':\n return resolveSwimlaneObject(base, properties);\n case 'frame':\n return { ...base, objectType: 'frame' } satisfies SflFrameObject;\n case 'widget':\n return {\n ...base,\n objectType: 'widget',\n widget: {\n type: asString(properties.get('type')) ?? 'rollingNumber',\n value: asString(properties.get('value')) ?? '0',\n digits: asNumber(properties.get('digits')),\n duration: asNumber(properties.get('duration')),\n min: asNumber(properties.get('min')),\n max: asNumber(properties.get('max')),\n label: asString(properties.get('label')),\n },\n } satisfies SflWidgetObject;\n case 'shape':\n return {\n ...base,\n objectType: 'shape',\n shapeType: classification.shapeType,\n symbol: classification.symbol,\n } satisfies SflShapeObject;\n }\n}\n","import type { SflBlock } from '../../sflLanguage/ast';\nimport { childBlocks, directProperties } from '../ast/blockEntries';\nimport { asString } from '../ast/valueAccess';\nimport { isCanvasObjectBlockKind } from '../canvasObjects/processing/blockKinds';\n\nexport function directGroupMemberIds(block: SflBlock): string[] {\n return childBlocks(block)\n .filter(child => isCanvasObjectBlockKind(child.kind))\n .map(child => asString(directProperties(child).get('id')) ?? child.name);\n}\n","import type { SflBlock } from '../../sflLanguage/ast';\nimport { childBlocks } from '../ast/blockEntries';\nimport { asString, tupleValues } from '../ast/valueAccess';\nimport { expandNetLinks } from '../canvasObjects/artifacts/links/netExpansion';\nimport { isCanvasObjectBlockKind } from '../canvasObjects/processing/blockKinds';\nimport { createFlowPositioner, type FlowPositioner } from '../canvasObjects/processing/layout/flow';\nimport { type CanvasObjectResolutionContext, resolveCanvasObject } from '../canvasObjects/processing/resolver';\nimport type { CanvasResolution } from '../canvasState/resolution';\nimport { directGroupMemberIds } from '../groups/members';\nimport type { SflCanvasObject, SflGroupOut } from '../types';\n\nexport interface CanvasTree {\n canvasObjects: SflCanvasObject[];\n groups: SflGroupOut[];\n linkBlocks: SflBlock[];\n connectionBlocks: SflBlock[];\n linkSourceIndexes: number[];\n connectionSourceIndexes: number[];\n}\n\ninterface CanvasLocation {\n origin: { x: number; y: number };\n frameId?: string;\n}\n\nclass CanvasTreeResolver {\n readonly #context: CanvasObjectResolutionContext;\n readonly #canvasObjects: SflCanvasObject[] = [];\n readonly #linkBlocks: SflBlock[] = [];\n readonly #connectionBlocks: SflBlock[] = [];\n readonly #linkSourceIndexes: number[] = [];\n readonly #connectionSourceIndexes: number[] = [];\n #sequence = 0;\n\n constructor(resolution: CanvasResolution) {\n this.#context = resolution.canvasObjectResolutionContext;\n }\n\n resolve(model: SflBlock | undefined): CanvasTree {\n const groups = model ? this.#resolveChildren(model, { origin: { x: 0, y: 0 } }) : [];\n return {\n canvasObjects: this.#canvasObjects,\n groups,\n linkBlocks: this.#linkBlocks,\n connectionBlocks: this.#connectionBlocks,\n linkSourceIndexes: this.#linkSourceIndexes,\n connectionSourceIndexes: this.#connectionSourceIndexes,\n };\n }\n\n #resolveChildren(block: SflBlock, location: CanvasLocation): SflGroupOut[] {\n const groups: SflGroupOut[] = [];\n const nextFlowPosition = createFlowPositioner(block, this.#context);\n\n for (const child of childBlocks(block)) {\n groups.push(...this.#resolveChild(child, location, nextFlowPosition));\n }\n return groups;\n }\n\n #resolveChild(child: SflBlock, location: CanvasLocation, nextFlowPosition: FlowPositioner): SflGroupOut[] {\n const sourceIndex = this.#sequence++;\n if (child.kind === 'Container') {\n return this.#resolveContainer(child, location, nextFlowPosition, sourceIndex);\n }\n if (isCanvasObjectBlockKind(child.kind)) {\n this.#resolveCanvasObject(child, location, nextFlowPosition, sourceIndex);\n return [];\n }\n\n switch (child.kind) {\n case 'Group':\n return [this.#resolveGroup(child, location)];\n case 'Link':\n this.#linkBlocks.push(child);\n this.#linkSourceIndexes.push(sourceIndex);\n return [];\n case 'Connection':\n this.#connectionBlocks.push(child);\n this.#connectionSourceIndexes.push(sourceIndex);\n return [];\n case 'Net': {\n const expanded = expandNetLinks(child, this.#context);\n this.#linkBlocks.push(...expanded);\n this.#linkSourceIndexes.push(...expanded.map(() => sourceIndex));\n return [];\n }\n default:\n return [];\n }\n }\n\n #resolveContainer(\n block: SflBlock,\n location: CanvasLocation,\n nextFlowPosition: FlowPositioner,\n sourceIndex: number,\n ): SflGroupOut[] {\n const canvasObject = this.#resolvePositionedCanvasObject(block, location, nextFlowPosition, sourceIndex);\n this.#canvasObjects.push(canvasObject);\n return this.#resolveChildren(block, {\n origin: { x: canvasObject.x, y: canvasObject.y },\n frameId: canvasObject.id,\n });\n }\n\n #resolveCanvasObject(\n block: SflBlock,\n location: CanvasLocation,\n nextFlowPosition: FlowPositioner,\n sourceIndex: number,\n ): void {\n this.#canvasObjects.push(this.#resolvePositionedCanvasObject(block, location, nextFlowPosition, sourceIndex));\n }\n\n #resolvePositionedCanvasObject(\n block: SflBlock,\n location: CanvasLocation,\n nextFlowPosition: FlowPositioner,\n sourceIndex: number,\n ): SflCanvasObject {\n const size = tupleValues(this.#context.layoutProp(block, 'size')) ?? [0, 0];\n return {\n ...resolveCanvasObject(block, location.origin, this.#context, location.frameId, nextFlowPosition(size)),\n sourceIndex,\n };\n }\n\n #resolveGroup(block: SflBlock, location: CanvasLocation): SflGroupOut {\n const properties = this.#context.mergedProps(block);\n return {\n id: asString(properties.get('id')) ?? block.name,\n name: asString(properties.get('text')) ?? block.name,\n color: asString(properties.get('color')),\n icon: asString(properties.get('icon')),\n canvasObjectIds: directGroupMemberIds(block),\n subGroups: this.#resolveChildren(block, location),\n parentFrameId: location.frameId ?? asString(properties.get('parent')),\n };\n }\n}\n\nexport function resolveCanvasTree(model: SflBlock | undefined, resolution: CanvasResolution): CanvasTree {\n return new CanvasTreeResolver(resolution).resolve(model);\n}\n","import type { Shader, ShaderParameter } from '../../model/shader';\nimport type { SflBlock } from '../../sflLanguage/ast';\nimport { directProperties } from '../ast/blockEntries';\nimport { asNumber, asString } from '../ast/valueAccess';\n\nexport function readShaderDefinition(block: SflBlock): Shader | undefined {\n const properties = directProperties(block);\n const program = asString(properties.get('program'));\n if (!program) {\n return undefined;\n }\n\n const parameters: Record<string, ShaderParameter> = {};\n for (const [key, value] of properties) {\n if (key === 'program') {\n continue;\n }\n const number = asNumber(value);\n const text = asString(value);\n if (number !== undefined) {\n parameters[key] = number;\n } else if (text !== undefined) {\n parameters[key] = text === 'true' ? true : text === 'false' ? false : text;\n }\n }\n return { name: block.name, program, parameters };\n}\n","import type { SflBlock } from '../../sflLanguage/ast';\nimport { childBlocks, directProperties } from '../ast/blockEntries';\nimport { asNumber, tupleValues } from '../ast/valueAccess';\nimport type { SflSymbolDefinition } from '../canvasObjects/types';\n\ntype SymbolDefinition = SflSymbolDefinition;\n\nfunction readSymbolPoints(block: SflBlock): Array<[number, number]> {\n const value = directProperties(block).get('points');\n if (value?.type !== 'list') {\n return [];\n }\n\n return value.values.flatMap(item => {\n if (item.type !== 'list' || item.values.length < 2) {\n return [];\n }\n\n const x = asNumber(item.values[0]);\n const y = asNumber(item.values[1]);\n return x === undefined || y === undefined ? [] : [[x, y] as [number, number]];\n });\n}\n\nfunction readSymbolPorts(block: SflBlock): SymbolDefinition['ports'] {\n const ports = childBlocks(block)\n .filter(child => child.kind === 'Port')\n .flatMap(port => {\n const position = tupleValues(directProperties(port).get('at'));\n if (typeof position?.[0] !== 'number' || typeof position[1] !== 'number') {\n return [];\n }\n\n return [{ name: port.name, at: [position[0], position[1]] as [number, number] }];\n });\n return ports.length > 0 ? ports : undefined;\n}\n\nexport function readSymbolDefinition(block: SflBlock): SymbolDefinition | undefined {\n const points = readSymbolPoints(block);\n if (points.length < 2) {\n return undefined;\n }\n\n return {\n name: block.name,\n points,\n tension: asNumber(directProperties(block).get('tension')),\n ports: readSymbolPorts(block),\n };\n}\n","import type { Shader } from '../../model/shader';\nimport type { SflBlock, SflDocument } from '../../sflLanguage/ast';\nimport { childBlocks } from '../ast/blockEntries';\nimport type { CanvasObjectResolutionContext } from '../canvasObjects/processing/resolver';\nimport { readShaderDefinition } from './shaders';\nimport { readSymbolDefinition } from './symbols';\n\nexport type BlockDefinitions = Map<string, SflBlock>;\n\nexport interface CanvasDefinitions {\n styles: BlockDefinitions;\n layouts: BlockDefinitions;\n symbols: CanvasObjectResolutionContext['symbolDefs'];\n shaders: Map<string, Shader>;\n model?: SflBlock;\n}\n\nfunction projectModel(block: SflBlock): SflBlock | undefined {\n return childBlocks(block).find(child => child.kind === 'Model');\n}\n\nexport function collectCanvasDefinitions(sflDocument: SflDocument): CanvasDefinitions {\n return {\n styles: collectStyleDefinitions(sflDocument),\n layouts: collectLayoutDefinitions(sflDocument),\n symbols: collectSymbolDefinitions(sflDocument),\n shaders: collectShaderDefinitions(sflDocument),\n model: findCanvasModel(sflDocument),\n };\n}\n\nfunction collectShaderDefinitions(sflDocument: SflDocument): Map<string, Shader> {\n const shaders = new Map<string, Shader>();\n for (const block of sflDocument.blocks) {\n if (block.kind !== 'Shader') {\n continue;\n }\n const shader = readShaderDefinition(block);\n if (shader) {\n shaders.set(block.name, shader);\n }\n }\n return shaders;\n}\n\nfunction collectStyleDefinitions(sflDocument: SflDocument): BlockDefinitions {\n const styles: BlockDefinitions = new Map();\n for (const block of sflDocument.blocks) {\n if (block.kind === 'Style') {\n styles.set(block.name, block);\n }\n }\n return styles;\n}\n\nfunction collectLayoutDefinitions(sflDocument: SflDocument): BlockDefinitions {\n const layouts: BlockDefinitions = new Map();\n for (const block of sflDocument.blocks) {\n if (block.kind === 'Layout') {\n layouts.set(block.name, block);\n }\n }\n return layouts;\n}\n\nfunction collectSymbolDefinitions(sflDocument: SflDocument): CanvasObjectResolutionContext['symbolDefs'] {\n const symbols: CanvasObjectResolutionContext['symbolDefs'] = new Map();\n for (const block of sflDocument.blocks) {\n if (block.kind !== 'Symbol') {\n continue;\n }\n const symbol = readSymbolDefinition(block);\n if (symbol) {\n symbols.set(block.name, symbol);\n }\n }\n return symbols;\n}\n\nfunction findCanvasModel(sflDocument: SflDocument): SflBlock | undefined {\n for (const block of sflDocument.blocks) {\n if (block.kind === 'Model') {\n return block;\n }\n if (block.kind === 'Project') {\n const model = projectModel(block);\n if (model) {\n return model;\n }\n }\n }\n return undefined;\n}\n","import type { SflBlock, SflDocument } from '../../sflLanguage/ast';\nimport { childBlocks } from '../ast/blockEntries';\nimport type { SflDiagnostic } from '../types';\n\nexport interface CompositionReferences {\n styleRef?: string;\n layoutRef?: string;\n}\n\nexport function classifyCompositionReferences(\n composition: string[],\n styleBlocks: Map<string, SflBlock>,\n layoutBlocks: Map<string, SflBlock>,\n): CompositionReferences {\n let styleRef: string | undefined;\n let layoutRef: string | undefined;\n for (const reference of composition) {\n if (styleBlocks.has(reference)) {\n styleRef = reference;\n } else if (layoutBlocks.has(reference)) {\n layoutRef = reference;\n }\n }\n return { styleRef, layoutRef };\n}\n\nfunction collectBlockDiagnostics(\n block: SflBlock,\n styleBlocks: Map<string, SflBlock>,\n layoutBlocks: Map<string, SflBlock>,\n diagnostics: SflDiagnostic[],\n): void {\n for (const reference of block.composition) {\n if (!styleBlocks.has(reference) && !layoutBlocks.has(reference)) {\n diagnostics.push({\n severity: 'warning',\n code: 'unresolved-style-or-layout',\n ownerId: block.name,\n message: `\"${reference}\" is not a Style or Layout defined at the top level of the document  \"${block.name}\" gets no shape, fill, or stroke from it.`,\n });\n }\n }\n for (const child of childBlocks(block)) {\n collectBlockDiagnostics(child, styleBlocks, layoutBlocks, diagnostics);\n }\n}\n\nexport function collectUnresolvedCompositionReferences(\n sflDocument: SflDocument,\n styleBlocks: Map<string, SflBlock>,\n layoutBlocks: Map<string, SflBlock>,\n): SflDiagnostic[] {\n const diagnostics: SflDiagnostic[] = [];\n for (const block of sflDocument.blocks) {\n collectBlockDiagnostics(block, styleBlocks, layoutBlocks, diagnostics);\n }\n return diagnostics;\n}\n","import type { SflBlock, SflValue } from '../../sflLanguage/ast';\nimport { directProperties } from '../ast/blockEntries';\nimport type { BlockDefinitions } from './collection';\n\nexport type ResolvedDefinitions = Map<string, Map<string, SflValue>>;\ntype ParentDefinitionName = (block: SflBlock) => string | undefined;\n\nexport function resolveDefinitionInheritance(\n definitions: BlockDefinitions,\n parentName: ParentDefinitionName,\n): ResolvedDefinitions {\n return new DefinitionInheritanceResolver(definitions, parentName).resolveAll();\n}\n\nclass DefinitionInheritanceResolver {\n readonly #definitions: BlockDefinitions;\n readonly #parentName: ParentDefinitionName;\n readonly #resolved: ResolvedDefinitions = new Map();\n\n constructor(definitions: BlockDefinitions, parentName: ParentDefinitionName) {\n this.#definitions = definitions;\n this.#parentName = parentName;\n }\n\n resolveAll(): ResolvedDefinitions {\n for (const name of this.#definitions.keys()) {\n this.#resolveDefinition(name, new Set());\n }\n return this.#resolved;\n }\n\n #resolveDefinition(name: string, ancestry: Set<string>): Map<string, SflValue> {\n const cached = this.#resolved.get(name);\n if (cached) {\n return cached;\n }\n\n const block = this.#definitions.get(name);\n if (!block || ancestry.has(name)) {\n return new Map();\n }\n\n const values = this.#inheritedProperties(block, new Set([...ancestry, name]));\n for (const [key, value] of directProperties(block)) {\n values.set(key, value);\n }\n this.#resolved.set(name, values);\n return values;\n }\n\n #inheritedProperties(block: SflBlock, ancestry: Set<string>): Map<string, SflValue> {\n const parent = this.#parentName(block);\n return parent ? new Map(this.#resolveDefinition(parent, ancestry)) : new Map();\n }\n}\n","import type { SflBlock, SflValue } from '../../sflLanguage/ast';\nimport { directProperties, layoutProperties, styleProperties } from '../ast/blockEntries';\nimport type { CanvasObjectResolutionContext } from '../canvasObjects/processing/resolver';\nimport type { CanvasDefinitions } from './collection';\nimport { classifyCompositionReferences } from './compositionReferences';\nimport { resolveDefinitionInheritance } from './inheritance';\n\nexport function createCanvasObjectPropertyReaders(definitions: CanvasDefinitions): CanvasObjectResolutionContext {\n const { styles, layouts, symbols, shaders } = definitions;\n const references = (block: SflBlock) => classifyCompositionReferences(block.composition, styles, layouts);\n const resolvedStyles = resolveDefinitionInheritance(styles, block => references(block).styleRef);\n const resolvedLayouts = resolveDefinitionInheritance(layouts, block => references(block).layoutRef);\n\n const mergedProps = (block: SflBlock): Map<string, SflValue> => {\n const merged = new Map(resolvedStyles.get(references(block).styleRef ?? '') ?? []);\n for (const [key, value] of directProperties(block)) {\n merged.set(key, value);\n }\n for (const [key, value] of styleProperties(block)) {\n merged.set(key, value);\n }\n return merged;\n };\n\n const layoutProp = (block: SflBlock, key: string): SflValue | undefined => {\n const localProperties = layoutProperties(block);\n if (localProperties.has(key)) {\n return localProperties.get(key);\n }\n\n const reference = references(block).layoutRef;\n return reference ? resolvedLayouts.get(reference)?.get(key) : undefined;\n };\n\n return { mergedProps, layoutProp, symbolDefs: symbols, shaderDefs: shaders };\n}\n","import { CHART_TYPES, type ChartType, isChartType } from '../../model/chart';\nimport type { SflBlock, SflDocument } from '../../sflLanguage/ast';\nimport { childBlocks, contentChildren, directProperties, styleProperties } from '../ast/blockEntries';\nimport { asString } from '../ast/valueAccess';\nimport type { SflDiagnostic } from '../types';\n\nconst NATIVE_CIRCULAR_CHART_TYPES: ReadonlySet<ChartType> = new Set(['radar', 'radial']);\nconst OPTIONAL_CIRCULAR_GRID_CHART_TYPES: ReadonlySet<ChartType> = new Set(['scatter', 'custom', 'hexbin']);\n\nexport function collectUnsupportedChartTypes(doc: SflDocument): SflDiagnostic[] {\n const diagnostics: SflDiagnostic[] = [];\n\n const visit = (block: SflBlock): void => {\n if (block.kind === 'Chart') {\n const declared = asString(directProperties(block).get('type'));\n if (declared !== undefined && !isChartType(declared)) {\n diagnostics.push({\n severity: 'warning',\n code: 'unsupported-chart-type',\n ownerId: block.name,\n message: `Unsupported chart type '${declared}'  drawn as a plain series plot. Supported: ${CHART_TYPES.join(', ')}.`,\n });\n }\n }\n for (const child of childBlocks(block)) {\n visit(child);\n }\n };\n\n for (const block of doc.blocks) {\n visit(block);\n }\n return diagnostics;\n}\n\nexport function collectEmptySeries(doc: SflDocument): SflDiagnostic[] {\n const diagnostics: SflDiagnostic[] = [];\n\n const visit = (block: SflBlock): void => {\n if (block.kind === 'Chart') {\n for (const series of contentChildren(block).filter(child => child.kind === 'Series')) {\n if (!directProperties(series).has('values')) {\n diagnostics.push({\n severity: 'warning',\n code: 'series-without-values',\n ownerId: series.name,\n message: `Series '${series.name}' has no values. If this was meant to be an Axis or Rule, it needs that keyword in front of the name  inside data{}, a bare name is read as a Series.`,\n });\n }\n }\n }\n for (const child of childBlocks(block)) {\n visit(child);\n }\n };\n\n for (const block of doc.blocks) {\n visit(block);\n }\n return diagnostics;\n}\n\nexport function collectUnsupportedGridShapes(doc: SflDocument): SflDiagnostic[] {\n const diagnostics: SflDiagnostic[] = [];\n\n const visit = (block: SflBlock): void => {\n if (block.kind === 'Chart') {\n const declared = asString(directProperties(block).get('type'));\n const chartType = isChartType(declared) ? declared : 'bar';\n const gridShape = asString(styleProperties(block).get('gridShape'));\n if (\n gridShape === 'circle' &&\n !OPTIONAL_CIRCULAR_GRID_CHART_TYPES.has(chartType) &&\n !NATIVE_CIRCULAR_CHART_TYPES.has(chartType)\n ) {\n diagnostics.push({\n severity: 'warning',\n code: 'unsupported-grid-shape',\n ownerId: block.name,\n message: `gridShape: circle isn't supported on '${chartType}'  drawn with the standard rectangular grid instead. Supported: ${[...OPTIONAL_CIRCULAR_GRID_CHART_TYPES].join(', ')}.`,\n });\n }\n }\n for (const child of childBlocks(block)) {\n visit(child);\n }\n };\n\n for (const block of doc.blocks) {\n visit(block);\n }\n return diagnostics;\n}\n","import type { SflBlock, SflDocument } from '../../sflLanguage/ast';\nimport { childBlocks, directProperties } from '../ast/blockEntries';\nimport { asString } from '../ast/valueAccess';\nimport type { SflDiagnostic } from '../types';\n\nexport function collectUnsupportedWidgetTypes(sflDocument: SflDocument): SflDiagnostic[] {\n const diagnostics: SflDiagnostic[] = [];\n\n const visit = (block: SflBlock): void => {\n if (block.kind === 'Widget') {\n const type = asString(directProperties(block).get('type')) ?? 'rollingNumber';\n if (type !== 'rollingNumber' && type !== 'tickScale' && type !== 'ruler') {\n diagnostics.push({\n severity: 'warning',\n code: 'unsupported-widget-type',\n ownerId: block.name,\n message: `Unsupported widget type '${type}'. Supported: rollingNumber, tickScale, ruler.`,\n });\n }\n }\n for (const child of childBlocks(block)) {\n visit(child);\n }\n };\n\n for (const block of sflDocument.blocks) {\n visit(block);\n }\n return diagnostics;\n}\n","import type { SflBlock, SflDocument } from '../../sflLanguage/ast';\nimport type { CanvasObjectResolutionContext } from '../canvasObjects/processing/resolver';\nimport { collectCanvasDefinitions } from '../definitions/collection';\nimport { collectUnresolvedCompositionReferences } from '../definitions/compositionReferences';\nimport { createCanvasObjectPropertyReaders } from '../definitions/propertyReaders';\nimport { collectEmptySeries, collectUnsupportedChartTypes, collectUnsupportedGridShapes } from '../diagnostics/charts';\nimport { collectUnsupportedWidgetTypes } from '../diagnostics/widgets';\nimport type { SflDiagnostic } from '../types';\n\nexport interface CanvasResolution {\n model?: SflBlock;\n diagnostics: SflDiagnostic[];\n canvasObjectResolutionContext: CanvasObjectResolutionContext;\n}\n\nexport function createCanvasResolution(doc: SflDocument): CanvasResolution {\n const definitions = collectCanvasDefinitions(doc);\n\n return {\n model: definitions.model,\n diagnostics: [\n ...collectUnresolvedCompositionReferences(doc, definitions.styles, definitions.layouts),\n ...collectUnsupportedChartTypes(doc),\n ...collectUnsupportedGridShapes(doc),\n ...collectEmptySeries(doc),\n ...collectUnsupportedWidgetTypes(doc),\n ],\n canvasObjectResolutionContext: createCanvasObjectPropertyReaders(definitions),\n };\n}\n","import type { SflDocument } from '../../sflLanguage/ast';\nimport { readConnections } from '../canvasObjects/artifacts/connections/reader';\nimport { readLinks } from '../canvasObjects/artifacts/links/reader';\nimport { resolveCanvasTree } from '../canvasTree/resolver';\nimport type { SflCanvasState } from '../types';\nimport { createCanvasResolution } from './resolution';\n\nexport function resolveCanvasState(document: SflDocument): SflCanvasState {\n const resolution = createCanvasResolution(document);\n const { canvasObjects, groups, linkBlocks, connectionBlocks, linkSourceIndexes, connectionSourceIndexes } =\n resolveCanvasTree(resolution.model, resolution);\n const links = readLinks(\n resolution.model,\n linkBlocks,\n canvasObjects,\n resolution.canvasObjectResolutionContext,\n linkSourceIndexes,\n );\n const connections = readConnections(\n resolution.model,\n connectionBlocks,\n canvasObjects,\n resolution.canvasObjectResolutionContext,\n connectionSourceIndexes,\n );\n\n return {\n canvasObjects,\n groups,\n links,\n connections,\n diagnostics: resolution.diagnostics,\n shaders: [...resolution.canvasObjectResolutionContext.shaderDefs.values()],\n };\n}\n","import type { SflCanvasObject } from '../../types';\n\nexport interface SflIsometricData {\n depth: number;\n icon?: string;\n}\n\nexport type SflIsometricObject = SflCanvasObject & {\n objectType: 'isometric';\n isometric: SflIsometricData;\n};\n\nexport function isIsometricObject(canvasObject: SflCanvasObject): canvasObject is SflIsometricObject {\n return canvasObject.objectType === 'isometric' && canvasObject.isometric !== undefined;\n}\n","import { parse } from '../sflLanguage';\nimport { resolveCanvasState } from './canvasState/resolver';\nimport type { SflCanvasState } from './types';\n\nexport type {\n SflCanvasObject,\n SflCanvasState,\n SflChartObject,\n SflConnectionOut,\n SflDiagnostic,\n SflGroupOut,\n SflIsometricObject,\n SflLinkOut,\n SflPathObject,\n SflSwimlaneObject,\n SflWidgetObject,\n} from './types';\nexport {\n isChartObject,\n isIsometricObject,\n isPathObject,\n isSwimlaneObject,\n} from './types';\n\nexport function sflToCanvasState(source: string): SflCanvasState {\n return resolveCanvasState(parse(source));\n}\n","export const COLOR_TOKEN_PATTERN = String.raw`rgba?\\([^)]*\\)|#[0-9a-fA-F]+|[a-zA-Z][\\w-]*`;\n","import { COLOR_TOKEN_PATTERN } from './colorToken';\n\nexport interface GradientStop {\n position: number;\n color: string;\n}\n\nexport interface GradientFill {\n type: 'gradient';\n angle: number;\n stops: GradientStop[];\n}\n\nexport interface MeshPoint {\n id: string;\n x: number;\n y: number;\n color: string;\n}\n\nexport interface MeshFill {\n type: 'mesh';\n points: MeshPoint[];\n}\n\nexport type DecodedColor = string | GradientFill | MeshFill;\n\nfunction decodeGradient(source: string): GradientFill | undefined {\n const match = source.match(/^gradient\\(\\s*([-\\d.]+)\\s*,\\s*(.*)\\)\\s*$/);\n if (!match) {\n return undefined;\n }\n\n const stops: GradientStop[] = [];\n const stopPattern = new RegExp(`(${COLOR_TOKEN_PATTERN})\\\\s+([-\\\\d.]+)%`, 'g');\n for (const stop of match[2].matchAll(stopPattern)) {\n stops.push({ color: stop[1], position: Number(stop[2]) });\n }\n return { type: 'gradient', angle: Number(match[1]), stops };\n}\n\nfunction decodeMesh(source: string): MeshFill | undefined {\n const match = source.match(/^mesh\\(\\s*(.*)\\)\\s*$/);\n if (!match) {\n return undefined;\n }\n\n const points: MeshPoint[] = [];\n const pointPattern = new RegExp(`(${COLOR_TOKEN_PATTERN})\\\\s+([-\\\\d.]+)\\\\s*,\\\\s*([-\\\\d.]+)`, 'g');\n let index = 0;\n for (const point of match[1].matchAll(pointPattern)) {\n points.push({\n id: `mp-${Date.now()}-${index++}`,\n color: point[1],\n x: Number(point[2]),\n y: Number(point[3]),\n });\n }\n return { type: 'mesh', points };\n}\n\nexport function decodeColor(source?: string): DecodedColor | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n return decodeGradient(source) ?? decodeMesh(source) ?? source;\n}\n","import { COLOR_TOKEN_PATTERN } from './colorToken';\n\nexport interface RampStop {\n position: number;\n color: string;\n}\n\nexport interface DecodedRamp {\n type: 'ramp';\n stops: RampStop[];\n}\n\nexport function decodeRamp(source?: string): DecodedRamp | undefined {\n if (!source) {\n return undefined;\n }\n const match = source.match(/^ramp\\(\\s*(.*)\\)\\s*$/);\n if (!match) {\n return undefined;\n }\n\n const stops: RampStop[] = [];\n const stopPattern = new RegExp(`(${COLOR_TOKEN_PATTERN})\\\\s+([-\\\\d.]+)`, 'g');\n for (const stop of match[1].matchAll(stopPattern)) {\n stops.push({ color: stop[1], position: Number(stop[2]) });\n }\n return { type: 'ramp', stops };\n}\n","import type { ShadowStyle } from '../../model/shadow';\n\nfunction applyShadowProperty(shadow: ShadowStyle, key: string, value: string): void {\n switch (key) {\n case 'color':\n shadow.color = value;\n break;\n case 'opacity':\n shadow.opacity = Number(value);\n break;\n case 'blur':\n shadow.blur = Number(value);\n break;\n case 'angle':\n shadow.angle = Number(value);\n break;\n case 'distance':\n shadow.distance = Number(value);\n break;\n }\n}\n\nexport function decodeShadow(source?: string): ShadowStyle | undefined {\n if (!source) {\n return undefined;\n }\n if (source === 'on') {\n return { enabled: true };\n }\n const match = source.match(/^shadow\\((.*)\\)\\s*$/);\n if (!match) {\n return undefined;\n }\n\n const shadow: ShadowStyle = { enabled: true };\n for (const part of match[1].split(',')) {\n const keyValue = part.split(':');\n if (keyValue.length !== 2) {\n continue;\n }\n applyShadowProperty(shadow, keyValue[0].trim(), keyValue[1].trim());\n }\n return shadow;\n}\n","import { decodeColor, type GradientFill } from '../../styleDecoding';\n\nexport const numOf = (value?: string): number | undefined => (value === undefined ? undefined : Number(value));\n\nexport function safeJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nexport function dashArray(value?: string): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = safeJson(value);\n if (!Array.isArray(parsed)) {\n return undefined;\n }\n const numbers = parsed.filter((entry): entry is number => typeof entry === 'number' && Number.isFinite(entry));\n return numbers.length === parsed.length ? numbers : undefined;\n}\n\nexport function solidColor(value?: string): string | undefined {\n const decoded = decodeColor(value);\n return typeof decoded === 'string' ? decoded : undefined;\n}\n\nexport function oneOf<T extends string>(value: string | undefined, allowed: readonly T[], fallback: T): T {\n return allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nexport const FONT_WEIGHTS = ['normal', 'bold'] as const;\nexport const SHAPE_FONT_WEIGHTS = [\n 'normal',\n 'bold',\n '100',\n '200',\n '300',\n '400',\n '500',\n '600',\n '700',\n '800',\n '900',\n] as const;\nexport const LABEL_POSITIONS = ['top', 'bottom', 'left', 'right'] as const;\nexport const PATH_MARKERS = ['none', 'arrow', 'filled_arrow'] as const;\nexport const BORDER_STYLES = ['none', 'single', 'double'] as const;\n\nexport function strokePaint(value?: string): string | GradientFill | undefined {\n const decoded = decodeColor(value);\n if (decoded === undefined || typeof decoded === 'string') {\n return decoded;\n }\n return decoded.type === 'gradient' ? decoded : undefined;\n}\n\nexport const TEXT_ALIGNS = ['left', 'center', 'right'] as const;\nexport const VERTICAL_ALIGNS = ['top', 'middle', 'bottom'] as const;\nexport const STROKE_STYLES = ['solid', 'dashed', 'dotted'] as const;\nexport const PATH_TYPES = ['straight', 'curved', 'orthogonal'] as const;\n\nexport function optionalOneOf<T extends string>(value: string | undefined, allowed: readonly T[]): T | undefined {\n return value !== undefined && allowed.includes(value as T) ? (value as T) : undefined;\n}\n\nexport const SHAPE_STROKE_STYLES = ['solid', 'dashed', 'dotted', 'double'] as const;\nexport const MARKER_TYPES = [\n 'none',\n 'arrow',\n 'filled_arrow',\n 'circle',\n 'filled_circle',\n 'diamond',\n 'filled_diamond',\n 'bar',\n 'triangle',\n 'one',\n 'zero_one',\n 'many',\n 'one_many',\n 'zero_many',\n] as const;\n","import type { ChartBase } from '../../../model/chart';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeColor, decodeShadow } from '../../styleDecoding';\nimport { numOf, solidColor } from './values';\n\ntype Props = SflCanvasObject['props'];\n\nfunction decodeImageFill(source: string | undefined): { url: string; overlay?: string } | undefined {\n const match = source?.match(/^image\\(\\s*([^,)]+?)\\s*(?:,\\s*(.+?))?\\s*\\)$/);\n return match ? { url: match[1], overlay: match[2] } : undefined;\n}\n\nfunction legendPositionOf(value: string | undefined): ChartBase['legendPosition'] {\n return value === 'bottom' ||\n value === 'bottomLeft' ||\n value === 'bottomRight' ||\n value === 'left' ||\n value === 'right'\n ? value\n : 'top';\n}\n\nfunction lineStyleOf(value: string | undefined): 'solid' | 'dashed' | 'dotted' {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction dataOf(e: SflCanvasObject): Pick<ChartBase, 'axisX' | 'axisY' | 'series' | 'rules'> {\n return {\n axisX: e.chart?.axisX ?? { min: 0, max: 4, step: 1 },\n axisY: e.chart?.axisY ?? { min: 0, max: 500, step: 100 },\n series: (e.chart?.series ?? []).map(s => ({\n ...s,\n color: decodeColor(s.color),\n colors: s.colors?.map(c => (c === null ? null : (decodeColor(c) ?? null))),\n strokeWidth: s.strokeWidth,\n })),\n rules: (e.chart?.rules ?? []).map(r => ({\n id: r.id,\n at: r.at,\n text: r.text,\n color: r.color,\n strokeWidth: r.strokeWidth,\n dash: r.dash,\n })),\n };\n}\n\nfunction frameOf(\n p: Props,\n): Pick<ChartBase, 'fillColor' | 'fillImage' | 'strokeColor' | 'strokeWidth' | 'cornerRadius' | 'shadowStyle'> {\n const image = decodeImageFill(p.fill);\n return {\n fillColor: image ? '#111418' : (decodeColor(p.fill) ?? '#ffffff'),\n fillImage: image,\n strokeColor: solidColor(p.stroke) ?? '#475569',\n strokeWidth: numOf(p.strokeWidth) ?? 1,\n cornerRadius: numOf(p.cornerRadius) ?? 12,\n shadowStyle: decodeShadow(p.shadow),\n };\n}\n\nfunction gridOf(\n p: Props,\n): Pick<\n ChartBase,\n 'gridColor' | 'gridWidth' | 'gridShape' | 'gridLineStyle' | 'gridRoundedCorners' | 'gridAxes' | 'showGrid'\n> {\n return {\n gridColor: p.gridColor ?? '#e2e8f0',\n gridWidth: numOf(p.gridWidth) ?? 1,\n gridShape: p.gridShape === 'circle' ? ('circle' as const) : ('rect' as const),\n gridLineStyle: lineStyleOf(p.gridLineStyle),\n gridRoundedCorners: p.gridRoundedCorners === 'true',\n gridAxes: p.gridAxes === 'x' || p.gridAxes === 'y' ? p.gridAxes : undefined,\n showGrid: p.showGrid !== 'false',\n };\n}\n\nfunction axesOf(\n p: Props,\n): Pick<\n ChartBase,\n | 'axisLabelColor'\n | 'axisLineWidth'\n | 'axisLineColor'\n | 'axisLineStyle'\n | 'tickLength'\n | 'axisFontSize'\n | 'axisFontFamily'\n | 'showValueAxis'\n | 'categoryAlign'\n | 'showAxisLabels'\n> {\n return {\n axisLabelColor: p.axisLabelColor,\n axisLineWidth: numOf(p.axisLineWidth),\n axisLineColor: p.axisLineColor,\n axisLineStyle: p.axisLineStyle === 'dashed' || p.axisLineStyle === 'dotted' ? p.axisLineStyle : undefined,\n tickLength: numOf(p.tickLength),\n axisFontSize: numOf(p.axisFontSize),\n axisFontFamily: p.axisFontFamily,\n showValueAxis: p.showValueAxis !== 'false',\n categoryAlign: p.categoryAlign === 'left' || p.categoryAlign === 'inside' ? p.categoryAlign : undefined,\n showAxisLabels: p.showAxisLabels !== 'false',\n };\n}\n\nfunction textOf(\n p: Props,\n): Pick<ChartBase, 'textColor' | 'titleSize' | 'titleWeight' | 'titleColor' | 'fontSize' | 'fontFamily'> {\n return {\n textColor: p.textColor ?? '#0f172a',\n titleSize: numOf(p.titleSize),\n titleWeight: p.titleWeight === 'normal' ? ('normal' as const) : undefined,\n titleColor: p.titleColor,\n fontSize: numOf(p.fontSize) ?? 12,\n fontFamily: p.fontFamily ?? \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n };\n}\n\nfunction legendOf(p: Props): Pick<ChartBase, 'legendColor' | 'showLegend' | 'legendPosition'> {\n return {\n legendColor: p.legendColor,\n showLegend: p.showLegend === 'true',\n legendPosition: legendPositionOf(p.legendPosition),\n };\n}\n\nexport function chartBase(e: SflCanvasObject): ChartBase {\n const p = e.props;\n return {\n id: e.id,\n title: e.text ?? null,\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n ...dataOf(e),\n ...frameOf(p),\n ...gridOf(p),\n ...axesOf(p),\n ...textOf(p),\n ...legendOf(p),\n order: e.order,\n sourceIndex: e.sourceIndex,\n };\n}\n","import type {\n BarChartConfig,\n BoxplotChartConfig,\n CustomChartConfig,\n FieldChartConfig,\n HeatmapChartConfig,\n HexbinChartConfig,\n LineChartConfig,\n MekkoChartConfig,\n PieChartConfig,\n PolarAreaChartConfig,\n RadarChartConfig,\n RadialBarChartConfig,\n RadialChartConfig,\n SankeyChartConfig,\n ScatterChartConfig,\n TreemapChartConfig,\n} from '../../../model/chart';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeColor, decodeRamp } from '../../styleDecoding';\nimport { numOf } from './values';\n\ntype ChartSource = SflCanvasObject['chart'];\ntype ChartProps = SflCanvasObject['props'];\n\nexport function barConfig(source: ChartSource, p: ChartProps): BarChartConfig {\n return {\n categories: source?.categories,\n barCornerRadius: source?.barCornerRadius,\n barBorderColor: decodeColor(source?.barBorderColor),\n barBorderWidth: source?.barBorderWidth,\n barGroupGap: source?.barGroupGap,\n barGap: source?.barGap,\n barGlow: source?.barGlow,\n barSegments: numOf(p.barSegments),\n barSegmentGap: numOf(p.barSegmentGap),\n barSegmentSnap: p.barSegmentSnap === 'false' ? false : undefined,\n barGlassBlur: numOf(p.barGlassBlur),\n barGlassSaturation: numOf(p.barGlassSaturation),\n barGlassTint: p.barGlassTint,\n barThickness: numOf(p.barThickness),\n orientation: source?.orientation,\n barTrack: p.barTrack === 'true',\n barRoundedBottom: p.barRoundedBottom === 'true',\n barLabelMaxOnly: p.barLabelMaxOnly === 'true',\n barTrackColor: p.barTrackColor,\n barTrackHatch: p.barTrackHatch === 'true',\n barTrackHatchColor: p.barTrackHatchColor,\n barTrackHatchAngle: numOf(p.barTrackHatchAngle),\n barTrackHatchSpacing: numOf(p.barTrackHatchSpacing),\n barTrackHatchWidth: numOf(p.barTrackHatchWidth),\n stacked: source?.stacked ?? 'true',\n showBarLabels: p.showBarLabels === 'true',\n barLabelPosition:\n p.barLabelPosition === 'inside' || p.barLabelPosition === 'center' || p.barLabelPosition === 'axis'\n ? p.barLabelPosition\n : undefined,\n barLabelFontSize: numOf(p.barLabelFontSize),\n barLabelFontFamily: p.barLabelFontFamily,\n barLabelFontWeight: p.barLabelFontWeight === 'bold' ? 'bold' : undefined,\n barLabelColor: p.barLabelColor,\n barLabelPill: p.barLabelPill === 'true',\n barLabelPillColor: p.barLabelPillColor,\n barLabelBorderColor: p.barLabelBorderColor,\n barLabelBorderWidth: numOf(p.barLabelBorderWidth),\n barLabelFormat: p.barLabelFormat,\n };\n}\n\nexport function lineConfig(source: ChartSource, p: ChartProps): LineChartConfig {\n return {\n categories: source?.categories,\n areaOpacity: source?.areaOpacity,\n lineTension: source?.lineTension,\n lineWidth: numOf(p.lineWidth),\n lineGlow: numOf(p.lineGlow),\n pointSize: numOf(p.pointSize),\n pointFill: p.pointFill,\n pointStrokeWidth: numOf(p.pointStrokeWidth),\n highlightPoints: source?.highlightPoints,\n highlightSize: numOf(p.highlightSize),\n highlightColor: p.highlightColor,\n highlightGuide: p.highlightGuide === 'true',\n highlightLabels: p.highlightLabels === 'true',\n highlightLabelColor: p.highlightLabelColor,\n highlightLabelFormat: p.highlightLabelFormat,\n };\n}\n\nexport function scatterConfig(source: ChartSource): ScatterChartConfig {\n return { categories: source?.categories };\n}\n\nexport function boxplotConfig(source: ChartSource): BoxplotChartConfig {\n return {\n boxWidth: source?.boxWidth,\n orientation: source?.orientation,\n barCornerRadius: source?.barCornerRadius,\n showBoxplotPoints: source?.showBoxplotPoints,\n barBorderColor: source?.barBorderColor,\n barBorderWidth: source?.barBorderWidth,\n };\n}\n\nexport function fieldConfig(source: ChartSource): FieldChartConfig {\n return {\n scale: decodeRamp(source?.scale),\n interpolate: source?.interpolate,\n idwPower: source?.idwPower,\n isolines: source?.isolines,\n };\n}\n\nexport function heatmapConfig(source: ChartSource): HeatmapChartConfig {\n return {\n categories: source?.categories,\n zones: source?.zones,\n cellGap: source?.cellGap,\n showValues: source?.showValues,\n squareCells: source?.squareCells,\n barCornerRadius: source?.barCornerRadius,\n };\n}\n\nexport function hexbinConfig(source: ChartSource): HexbinChartConfig {\n return { hexRadius: source?.hexRadius };\n}\n\nexport function mekkoConfig(source: ChartSource): MekkoChartConfig {\n return {\n categories: source?.categories,\n barCornerRadius: source?.barCornerRadius,\n mekkoVaryHeight: source?.mekkoVaryHeight,\n tileGradient: source?.tileGradient,\n showColumnBackdrop: source?.showColumnBackdrop,\n };\n}\n\nexport function pieConfig(source: ChartSource, p: ChartProps): PieChartConfig {\n return {\n innerRadius: source?.innerRadius,\n pieCornerRadius: source?.pieCornerRadius,\n pieSliceGap: source?.pieSliceGap,\n pieStartAngle: numOf(p.pieStartAngle),\n pieSweep: numOf(p.pieSweep),\n pieExplode: numOf(p.pieExplode),\n pieGlow: numOf(p.pieGlow),\n pieStroke: p.pieStroke,\n pieStrokeWidth: numOf(p.pieStrokeWidth),\n pieLabelPosition:\n p.pieLabelPosition === 'inside' || p.pieLabelPosition === 'outside' ? p.pieLabelPosition : undefined,\n pieLabelContent:\n p.pieLabelContent === 'percent' || p.pieLabelContent === 'name' || p.pieLabelContent === 'inline'\n ? p.pieLabelContent\n : undefined,\n pieLabelColor: p.pieLabelColor,\n pieCenterText: p.pieCenterText,\n pieCenterSize: numOf(p.pieCenterSize),\n pieCenterColor: p.pieCenterColor,\n };\n}\n\nexport function polarAreaConfig(source: ChartSource): PolarAreaChartConfig {\n return {\n innerRadius: source?.innerRadius,\n pieCornerRadius: source?.pieCornerRadius,\n pieSliceGap: source?.pieSliceGap,\n };\n}\n\nexport function radarConfig(source: ChartSource): RadarChartConfig {\n return {\n categories: source?.categories,\n areaOpacity: source?.areaOpacity,\n };\n}\n\nexport function radialConfig(source: ChartSource): RadialChartConfig {\n return {\n categories: source?.categories,\n areaOpacity: source?.areaOpacity,\n };\n}\n\nexport function radialBarConfig(source: ChartSource): RadialBarChartConfig {\n return {\n ringThickness: source?.ringThickness,\n ringGap: source?.ringGap,\n };\n}\n\nexport function sankeyConfig(source: ChartSource): SankeyChartConfig {\n return {\n zones: source?.zones,\n barCornerRadius: source?.barCornerRadius,\n labelPosition: source?.labelPosition,\n labelOrientation: source?.labelOrientation,\n labelColor: source?.labelColor,\n linkGradient: source?.linkGradient,\n };\n}\n\nexport function treemapConfig(source: ChartSource): TreemapChartConfig {\n return {\n zones: source?.zones,\n cellGap: source?.cellGap,\n barCornerRadius: source?.barCornerRadius,\n headerColor: source?.headerColor,\n tileGradient: source?.tileGradient,\n };\n}\n\nexport function customConfig(source: ChartSource): CustomChartConfig {\n return {\n categories: source?.categories,\n zones: source?.zones,\n orientation: source?.orientation,\n connectPoints: source?.connectPoints,\n reverseComparison: source?.reverseComparison,\n };\n}\n","import type { Chart, ChartBase, TypedChart } from '../../../model/chart';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { chartBase } from './chartBase';\nimport {\n barConfig,\n boxplotConfig,\n customConfig,\n fieldConfig,\n heatmapConfig,\n hexbinConfig,\n lineConfig,\n mekkoConfig,\n pieConfig,\n polarAreaConfig,\n radarConfig,\n radialBarConfig,\n radialConfig,\n sankeyConfig,\n scatterConfig,\n treemapConfig,\n} from './chartConfigs';\n\nexport function chartObject(e: SflCanvasObject): Chart {\n const base = chartBase(e);\n const source = e.chart;\n const p = e.props;\n const chartType = source?.chartType ?? 'bar';\n switch (chartType) {\n case 'bar':\n return typedChart(base, chartType, barConfig(source, p));\n case 'line':\n return typedChart(base, chartType, lineConfig(source, p));\n case 'scatter':\n return typedChart(base, chartType, scatterConfig(source));\n case 'boxplot':\n return typedChart(base, chartType, boxplotConfig(source));\n case 'field':\n return typedChart(base, chartType, fieldConfig(source));\n case 'heatmap':\n return typedChart(base, chartType, heatmapConfig(source));\n case 'hexbin':\n return typedChart(base, chartType, hexbinConfig(source));\n case 'mekko':\n return typedChart(base, chartType, mekkoConfig(source));\n case 'pie':\n return typedChart(base, chartType, pieConfig(source, p));\n case 'polarArea':\n return typedChart(base, chartType, polarAreaConfig(source));\n case 'radar':\n return typedChart(base, chartType, radarConfig(source));\n case 'radial':\n return typedChart(base, chartType, radialConfig(source));\n case 'radialBar':\n return typedChart(base, chartType, radialBarConfig(source));\n case 'sankey':\n return typedChart(base, chartType, sankeyConfig(source));\n case 'treemap':\n return typedChart(base, chartType, treemapConfig(source));\n case 'custom':\n return typedChart(base, chartType, customConfig(source));\n }\n}\n\nfunction typedChart<TType extends Chart['chartType'], TConfig extends object>(\n base: ChartBase,\n chartType: TType,\n config: TConfig,\n): TypedChart<TType, TConfig> {\n return { ...base, chartType, config };\n}\n","import type { Connection } from '../../../model/connection';\nimport type { SflConnectionOut } from '../../../sflSemantic/sflToCanvasState';\nimport { numOf, optionalOneOf, PATH_TYPES, STROKE_STYLES, strokePaint } from './values';\n\nexport function connectionObject(c: SflConnectionOut): Connection {\n const p = c.props;\n return {\n id: c.id,\n fromId: c.fromId,\n toId: c.toId,\n fromFace: c.fromFace,\n toFace: c.toFace,\n order: c.order,\n sourceIndex: c.sourceIndex,\n style: {\n pathType: optionalOneOf(p.route, PATH_TYPES) ?? 'straight',\n color: strokePaint(p.stroke),\n strokeWidth: numOf(p.strokeWidth),\n strokeStyle: optionalOneOf(p.strokeStyle, STROKE_STYLES),\n opacity: p.opacity !== undefined ? numOf(p.opacity) : undefined,\n },\n };\n}\n","import type { Frame } from '../../../model/frame';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { dashArray, FONT_WEIGHTS, LABEL_POSITIONS, numOf, oneOf } from './values';\n\nexport function frameObject(e: SflCanvasObject): Frame {\n const p = e.props;\n return {\n id: e.id,\n title: e.text ?? null,\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n fillColor: p.fill ?? 'rgba(155, 66, 223, 0.05)',\n strokeColor: p.stroke ?? '#9b42df',\n strokeWidth: numOf(p.strokeWidth) ?? 2,\n cornerRadius: numOf(p.cornerRadius) ?? 12,\n textColor: p.textColor ?? '#ffffff',\n fontSize: numOf(p.fontSize) ?? 14,\n fontWeight: oneOf(p.fontWeight, FONT_WEIGHTS, 'bold'),\n fontFamily: p.fontFamily,\n dash: dashArray(p.dash),\n showLabel: p.showLabel !== 'false',\n labelPosition: oneOf(p.labelPosition, LABEL_POSITIONS, 'top'),\n shadow: p.shadow !== 'false',\n order: e.order,\n sourceIndex: e.sourceIndex,\n };\n}\n","import type { IsometricObject } from '../../../model/isometricObject';\nimport type { SflIsometricObject } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeShadow } from '../../styleDecoding';\nimport { numOf, solidColor } from './values';\n\nexport function isometricObject(canvasObject: SflIsometricObject): IsometricObject {\n const presentation = canvasObject.props;\n const shadowStyle = decodeShadow(presentation.shadow);\n\n return {\n id: canvasObject.id,\n x: canvasObject.x,\n y: canvasObject.y,\n width: canvasObject.width,\n height: canvasObject.height,\n depth: canvasObject.isometric.depth,\n rotation: canvasObject.rotation,\n order: canvasObject.order,\n sourceIndex: canvasObject.sourceIndex,\n text: canvasObject.text,\n icon: canvasObject.isometric.icon,\n fill: solidColor(presentation.fill) ?? '#f8fafc',\n strokeColor: solidColor(presentation.stroke) ?? '#111827',\n strokeWidth: numOf(presentation.strokeWidth) ?? 1,\n cornerRadius: numOf(presentation.cornerRadius) ?? 8,\n hasShadow: shadowStyle?.enabled ?? false,\n shadowStyle,\n labelOffsetX: numOf(presentation.labelOffsetX) ?? 0,\n labelOffsetY: numOf(presentation.labelOffsetY) ?? 0,\n labelBackground: solidColor(presentation.labelBackground),\n parentFrameId: canvasObject.parentFrameId,\n };\n}\n","import type { Link } from '../../../model/link';\nimport type { SflLinkOut } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeShadow } from '../../styleDecoding';\nimport { MARKER_TYPES, numOf, optionalOneOf, PATH_TYPES, STROKE_STYLES, strokePaint } from './values';\n\nexport function linkObject(l: SflLinkOut): Link {\n const p = l.props;\n return {\n id: l.id,\n fromId: l.fromId,\n toId: l.toId,\n text: l.text ?? '',\n showText: p.showText !== 'false',\n weight: numOf(p.weight),\n showWeight: p.showWeight !== 'false',\n style: {\n pathType: optionalOneOf(p.route, PATH_TYPES),\n color: strokePaint(p.stroke),\n strokeWidth: numOf(p.strokeWidth),\n strokeStyle: optionalOneOf(p.strokeStyle, STROKE_STYLES),\n opacity: p.opacity !== undefined ? numOf(p.opacity) : undefined,\n fontSize: numOf(p.fontSize),\n fontFamily: p.fontFamily,\n startLabel: p.startLabel,\n endLabel: p.endLabel,\n shadow: decodeShadow(p.shadow),\n },\n startMarker: optionalOneOf(p.markerStart, MARKER_TYPES),\n endMarker: optionalOneOf(p.markerEnd, MARKER_TYPES),\n segmentOffsets: l.segments,\n fromPoint: l.fromPort\n ? { kind: 'port' as const, port: l.fromPort }\n : l.fromSide\n ? { kind: 'side' as const, side: l.fromSide, offset: l.fromFraction }\n : undefined,\n toPoint: l.toPort\n ? { kind: 'port' as const, port: l.toPort }\n : l.toSide\n ? { kind: 'side' as const, side: l.toSide, offset: l.toFraction }\n : undefined,\n order: l.order,\n sourceIndex: l.sourceIndex,\n };\n}\n","import type { FreeformPath } from '../../../model/path';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { dashArray, numOf, oneOf, PATH_MARKERS, solidColor } from './values';\n\nexport function pathObject(e: SflCanvasObject): FreeformPath {\n const p = e.props;\n return {\n id: e.id,\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n points: e.path?.points ?? [],\n value: e.path?.value,\n tension: e.path?.tension ?? 0,\n startMarker: oneOf(e.path?.startMarker, PATH_MARKERS, 'none'),\n endMarker: oneOf(e.path?.endMarker, PATH_MARKERS, 'none'),\n closed: e.path?.closed ?? false,\n strokeColor: solidColor(p.stroke) ?? '#7c3aed',\n strokeWidth: numOf(p.strokeWidth) ?? 2,\n dash: dashArray(p.dash) ?? [],\n opacity: numOf(p.opacity) ?? 1,\n fillColor: solidColor(p.fill) ?? 'transparent',\n order: e.order,\n sourceIndex: e.sourceIndex,\n };\n}\n","import type { Shader } from '../../../model/shader';\nimport type { ShapeType } from '../../../model/shape';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeColor, decodeShadow } from '../../styleDecoding';\nimport {\n dashArray,\n numOf,\n oneOf,\n optionalOneOf,\n SHAPE_FONT_WEIGHTS,\n SHAPE_STROKE_STYLES,\n strokePaint,\n TEXT_ALIGNS,\n VERTICAL_ALIGNS,\n} from './values';\n\nfunction shapeTypeOf(value: string | undefined): ShapeType {\n return (value || 'rectangle') as ShapeType;\n}\n\nexport function shapeObject(e: SflCanvasObject, shaders: ReadonlyMap<string, Shader>) {\n const p = e.props;\n const isText = e.kind === 'text';\n return {\n id: e.id,\n type: 'shape',\n text: e.text ?? null,\n shapeType: shapeTypeOf(e.shapeType),\n symbol: e.symbol,\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n w: e.width,\n h: e.height,\n rotation: e.rotation ?? 0,\n fillColor: decodeColor(p.fill ?? (isText ? 'none' : undefined)),\n strokeColor: strokePaint(p.stroke ?? (isText ? 'none' : undefined)),\n isText: isText || undefined,\n strokeWidth: numOf(p.strokeWidth),\n textColor: p.textColor,\n fontSize: numOf(p.fontSize),\n fontWeight: p.fontWeight === undefined ? undefined : oneOf(p.fontWeight, SHAPE_FONT_WEIGHTS, 'normal'),\n letterSpacing: numOf(p.letterSpacing),\n lineHeight: numOf(p.lineHeight),\n fontFamily: p.fontFamily,\n textAlign: optionalOneOf(p.textAlign, TEXT_ALIGNS),\n textVerticalAlign: optionalOneOf(p.verticalAlign, VERTICAL_ALIGNS),\n cornerRadius: numOf(p.cornerRadius),\n shadowStyle: decodeShadow(p.shadow),\n dash: dashArray(p.dash),\n strokeStyle: optionalOneOf(p.strokeStyle, SHAPE_STROKE_STYLES),\n opacity: numOf(p.opacity),\n parentFrameId: e.parentFrameId,\n order: e.order,\n sourceIndex: e.sourceIndex,\n shader: p.shader ? shaders.get(p.shader) : undefined,\n };\n}\n","import type { Swimlane } from '../../../model/swimlane';\nimport type { SflCanvasObject } from '../../../sflSemantic/sflToCanvasState';\nimport { decodeShadow } from '../../styleDecoding';\nimport { dashArray, FONT_WEIGHTS, numOf, oneOf } from './values';\n\nexport function swimlaneObject(e: SflCanvasObject): Swimlane {\n const p = e.props;\n return {\n id: e.id,\n title: e.text ?? null,\n x: e.x,\n y: e.y,\n width: e.width,\n height: e.height,\n orientation: e.swimlane?.orientation ?? 'horizontal',\n lanes: e.swimlane?.lanes ?? [],\n fillColor: p.fill ?? 'rgba(107, 114, 128, 0.05)',\n strokeColor: p.stroke ?? '#6b7280',\n strokeWidth: numOf(p.strokeWidth) ?? 2,\n cornerRadius: numOf(p.cornerRadius) ?? 12,\n dash: dashArray(p.dash),\n shadowStyle: decodeShadow(p.shadow),\n textColor: p.textColor ?? '#6b7280',\n fontSize: numOf(p.fontSize) ?? 22,\n fontWeight: oneOf(p.fontWeight, FONT_WEIGHTS, 'bold'),\n fontFamily: p.fontFamily,\n showLaneLabels: p.showLaneLabels !== 'false',\n order: e.order,\n sourceIndex: e.sourceIndex,\n };\n}\n","import type { RollingNumberWidget, RulerWidget, TickScaleWidget } from '../../../model/widget';\nimport type { SflWidgetObject } from '../../../sflSemantic/canvasObjects/types';\n\nconst CSS_COLOR = /^(?:#[0-9a-f]{3,8}|rgba?\\([\\d.,%\\s]+\\)|[a-z][\\w-]*)$/i;\nconst CSS_FONT_FAMILY = /^[\\w\\s,'\"-]+$/;\n\nfunction color(value: string | undefined): string | undefined {\n return value && CSS_COLOR.test(value) ? value : undefined;\n}\n\nfunction fontFamily(value: string | undefined): string | undefined {\n return value && CSS_FONT_FAMILY.test(value) ? value : undefined;\n}\n\nconst FONT_WEIGHT = /^(?:[1-9]00|normal|bold)$/;\n\nfunction variant(value: string | undefined): 'flip' | 'plain' | undefined {\n return value === 'plain' || value === 'flip' ? value : undefined;\n}\n\nfunction motion(value: string | undefined): 'roll' | 'fade' | undefined {\n return value === 'roll' || value === 'fade' ? value : undefined;\n}\n\nfunction fontWeight(value: string | undefined): string | undefined {\n return value && FONT_WEIGHT.test(value) ? value : undefined;\n}\n\nconst TICK_SCALE_NUMBERS = [\n 'ticks',\n 'major',\n 'radius',\n 'length',\n 'thickness',\n 'round',\n 'start',\n 'sweep',\n 'intensity',\n] as const;\nconst TICK_SCALE_COLORS = ['color', 'accent'] as const;\n\nfunction tickScaleObject(canvasObject: SflWidgetObject): TickScaleWidget {\n const properties = canvasObject.props;\n const parameters: Record<string, string | number> = {};\n for (const key of TICK_SCALE_NUMBERS) {\n const value = Number(properties[key]);\n if (properties[key] !== undefined && Number.isFinite(value)) {\n parameters[key] = value;\n }\n }\n for (const key of TICK_SCALE_COLORS) {\n const value = color(properties[key]);\n if (value) {\n parameters[key] = value;\n }\n }\n return {\n id: canvasObject.id,\n type: 'tickScale',\n value: canvasObject.widget.value,\n max: canvasObject.widget.max,\n label: canvasObject.widget.label,\n x: canvasObject.x,\n y: canvasObject.y,\n width: canvasObject.width,\n height: canvasObject.height,\n rotation: canvasObject.rotation,\n order: canvasObject.order,\n sourceIndex: canvasObject.sourceIndex,\n parentFrameId: canvasObject.parentFrameId,\n parameters,\n labels:\n properties.labels === 'true'\n ? {\n size:\n Number.isFinite(Number(properties.labelSize)) && properties.labelSize !== undefined\n ? Number(properties.labelSize)\n : undefined,\n color: color(properties.labelColor),\n offset:\n Number.isFinite(Number(properties.labelOffset)) && properties.labelOffset !== undefined\n ? Number(properties.labelOffset)\n : undefined,\n weight: fontWeight(properties.labelWeight),\n fontFamily: fontFamily(properties.labelFont),\n }\n : undefined,\n };\n}\n\nconst RULER_NUMBERS = [\n 'ticks',\n 'major',\n 'length',\n 'thickness',\n 'round',\n 'dent',\n 'spread',\n 'inset',\n 'line',\n 'gap',\n 'intensity',\n] as const;\nconst RULER_COLORS = ['color', 'accent', 'glow'] as const;\nconst RULER_DEFAULTS = { color: '#8f95c4', accent: '#d9f270', glow: '#3ddc84' };\nconst RULER_OPTIONAL_COLORS = ['core'] as const;\n\nfunction rulerObject(canvasObject: SflWidgetObject): RulerWidget {\n const properties = canvasObject.props;\n const parameters: Record<string, string | number> = {};\n for (const key of RULER_NUMBERS) {\n const value = Number(properties[key]);\n if (properties[key] !== undefined && Number.isFinite(value)) {\n parameters[key] = value;\n }\n }\n for (const key of RULER_COLORS) {\n parameters[key] = color(properties[key]) ?? RULER_DEFAULTS[key];\n }\n for (const key of RULER_OPTIONAL_COLORS) {\n const value = color(properties[key]);\n if (value) {\n parameters[key] = value;\n }\n }\n parameters.axis = properties.axis === 'horizontal' ? 'horizontal' : 'vertical';\n if (properties.knob) {\n parameters.knob = properties.knob;\n }\n return {\n id: canvasObject.id,\n type: 'ruler',\n value: canvasObject.widget.value,\n min: canvasObject.widget.min,\n max: canvasObject.widget.max,\n label: canvasObject.widget.label,\n x: canvasObject.x,\n y: canvasObject.y,\n width: canvasObject.width,\n height: canvasObject.height,\n rotation: canvasObject.rotation,\n order: canvasObject.order,\n sourceIndex: canvasObject.sourceIndex,\n parentFrameId: canvasObject.parentFrameId,\n parameters,\n labels:\n properties.labels === 'true'\n ? {\n size:\n Number.isFinite(Number(properties.labelSize)) && properties.labelSize !== undefined\n ? Number(properties.labelSize)\n : undefined,\n color: color(properties.labelColor),\n offset:\n Number.isFinite(Number(properties.labelOffset)) && properties.labelOffset !== undefined\n ? Number(properties.labelOffset)\n : undefined,\n weight: fontWeight(properties.labelWeight),\n fontFamily: fontFamily(properties.labelFont),\n }\n : undefined,\n };\n}\n\nexport function widgetObject(canvasObject: SflWidgetObject): RollingNumberWidget | TickScaleWidget | RulerWidget {\n if (canvasObject.widget.type === 'tickScale') {\n return tickScaleObject(canvasObject);\n }\n if (canvasObject.widget.type === 'ruler') {\n return rulerObject(canvasObject);\n }\n const properties = canvasObject.props;\n return {\n id: canvasObject.id,\n type: 'rollingNumber',\n value: canvasObject.widget.value,\n digits: canvasObject.widget.digits,\n duration: canvasObject.widget.duration,\n label: canvasObject.widget.label,\n x: canvasObject.x,\n y: canvasObject.y,\n width: canvasObject.width,\n height: canvasObject.height,\n rotation: canvasObject.rotation,\n order: canvasObject.order,\n sourceIndex: canvasObject.sourceIndex,\n parentFrameId: canvasObject.parentFrameId,\n style: {\n color: color(properties.color),\n surface: color(properties.surface),\n divider: color(properties.divider),\n labelColor: color(properties.labelColor),\n fontFamily: fontFamily(properties.fontFamily),\n variant: variant(properties.variant),\n motion: motion(properties.motion),\n fontWeight: fontWeight(properties.fontWeight),\n },\n };\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Connection } from '../../../model/connection';\nimport type { Frame } from '../../../model/frame';\nimport type { IsometricObject } from '../../../model/isometricObject';\nimport type { Link } from '../../../model/link';\nimport type { FreeformPath } from '../../../model/path';\nimport type { Shape } from '../../../model/shape';\nimport type { Swimlane } from '../../../model/swimlane';\nimport type { Widget } from '../../../model/widget';\nimport { isIsometricObject, type SflCanvasState, type SflWidgetObject } from '../../../sflSemantic/sflToCanvasState';\nimport { chartObject } from './chart';\nimport { connectionObject } from './connection';\nimport { frameObject } from './frame';\nimport { isometricObject } from './isometric';\nimport { linkObject } from './link';\nimport { pathObject } from './path';\nimport { shapeObject } from './shape';\nimport { swimlaneObject } from './swimlane';\nimport { widgetObject } from './widget';\n\nexport interface CollectedCanvasObjects {\n shapes: Shape[];\n frames: Frame[];\n swimlanes: Swimlane[];\n isometricObjects: IsometricObject[];\n paths: FreeformPath[];\n charts: Chart[];\n widgets: Widget[];\n links: Link[];\n connections: Connection[];\n}\n\nconst byOrder = <T extends { order?: number }>(items: readonly T[]): T[] =>\n [...items].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\nexport function collectCanvasObjects(state: SflCanvasState): CollectedCanvasObjects {\n const canvasObjects = byOrder(state.canvasObjects);\n const shaders = new Map((state.shaders ?? []).map(shader => [shader.name, shader]));\n return {\n shapes: canvasObjects\n .filter(canvasObject => canvasObject.objectType === 'shape')\n .map(shape => shapeObject(shape, shaders)),\n frames: canvasObjects.filter(canvasObject => canvasObject.objectType === 'frame').map(frameObject),\n swimlanes: canvasObjects.filter(canvasObject => canvasObject.objectType === 'swimlane').map(swimlaneObject),\n isometricObjects: canvasObjects.filter(isIsometricObject).map(isometricObject),\n paths: canvasObjects.filter(canvasObject => canvasObject.objectType === 'path').map(pathObject),\n charts: canvasObjects.filter(canvasObject => canvasObject.objectType === 'chart').map(chartObject),\n widgets: canvasObjects\n .filter(\n (canvasObject): canvasObject is SflWidgetObject =>\n canvasObject.objectType === 'widget' &&\n ['rollingNumber', 'tickScale', 'ruler'].includes(canvasObject.widget?.type ?? ''),\n )\n .map(widgetObject),\n links: byOrder(state.links).map(linkObject),\n connections: byOrder(state.connections).map(connectionObject),\n };\n}\n","import type { Point } from '../geometry/types';\nimport type { IsometricFace, IsometricObject } from './types';\n\nexport interface IsometricFaces {\n top: [Point, Point, Point, Point];\n bottom: [Point, Point, Point, Point];\n front: [Point, Point, Point, Point];\n back: [Point, Point, Point, Point];\n left: [Point, Point, Point, Point];\n right: [Point, Point, Point, Point];\n}\n\nexport const VISIBLE_ISOMETRIC_FACES: ReadonlySet<IsometricFace> = new Set(['top', 'front', 'right']);\n\nconst AXIS_ANGLE = Math.PI / 6;\nexport const AXIS_COS = Math.cos(AXIS_ANGLE);\nexport const AXIS_SIN = Math.sin(AXIS_ANGLE);\n\nexport interface IsometricBoundsFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function isometricBounds(\n object: Pick<IsometricObject, 'x' | 'y' | 'width' | 'height' | 'depth'>,\n): IsometricBoundsFrame {\n const width = Math.max(0, object.width);\n const height = Math.max(0, object.height);\n const depth = Math.max(0, object.depth);\n return {\n x: object.x,\n y: object.y,\n width: (width + depth) * AXIS_COS,\n height: height + (width + depth) * AXIS_SIN,\n };\n}\n\nexport function isometricTopFaceCenter(object: Pick<IsometricObject, 'x' | 'y' | 'width' | 'height' | 'depth'>): Point {\n const width = Math.max(0, object.width);\n const depth = Math.max(0, object.depth);\n return {\n x: object.x + ((width + depth) * AXIS_COS) / 2,\n y: object.y + ((width + depth) * AXIS_SIN) / 2,\n };\n}\n\nfunction faceCenter(corners: readonly [Point, Point, Point, Point]): Point {\n return {\n x: (corners[0].x + corners[1].x + corners[2].x + corners[3].x) / 4,\n y: (corners[0].y + corners[1].y + corners[2].y + corners[3].y) / 4,\n };\n}\n\nexport function isometricFaceCenter(\n object: Pick<IsometricObject, 'x' | 'y' | 'width' | 'height' | 'depth'>,\n face: IsometricFace,\n): Point {\n return faceCenter(isometricFaces(object)[face]);\n}\n\nexport function isometricFaces(\n object: Pick<IsometricObject, 'x' | 'y' | 'width' | 'height' | 'depth'>,\n): IsometricFaces {\n const { x, y } = object;\n const width = Math.max(0, object.width);\n const height = Math.max(0, object.height);\n const depth = Math.max(0, object.depth);\n\n const apex = { x: x + depth * AXIS_COS, y };\n const toRight = { x: width * AXIS_COS, y: width * AXIS_SIN };\n const toLeft = { x: -depth * AXIS_COS, y: depth * AXIS_SIN };\n const down = { x: 0, y: height };\n\n const right = { x: apex.x + toRight.x, y: apex.y + toRight.y };\n const left = { x: apex.x + toLeft.x, y: apex.y + toLeft.y };\n const center = { x: apex.x + toRight.x + toLeft.x, y: apex.y + toRight.y + toLeft.y };\n const apexDown = { x: apex.x + down.x, y: apex.y + down.y };\n const bottom = { x: center.x + down.x, y: center.y + down.y };\n const bottomLeft = { x: left.x + down.x, y: left.y + down.y };\n const bottomRight = { x: right.x + down.x, y: right.y + down.y };\n\n return {\n top: [apex, right, center, left],\n bottom: [apexDown, bottomRight, bottom, bottomLeft],\n front: [left, center, bottom, bottomLeft],\n back: [apex, right, bottomRight, apexDown],\n right: [center, right, bottomRight, bottom],\n left: [apex, left, bottomLeft, apexDown],\n };\n}\n","function clamp255(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction hexToRgb(hex: string): [number, number, number] | null {\n const match = /^#?([0-9a-fA-F]{6})$/.exec(hex.trim());\n if (!match) {\n return null;\n }\n const n = Number.parseInt(match[1], 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return `#${[r, g, b].map(channel => clamp255(channel).toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction multiply(hex: string, factor: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) {\n return hex;\n }\n const [r, g, b] = rgb;\n return rgbToHex(r * factor, g * factor, b * factor);\n}\n\nexport interface IsometricFaceFills {\n topFill: string;\n frontFill: string;\n sideFill: string;\n}\n\nexport function deriveFaceFills(fill: string): IsometricFaceFills {\n return {\n topFill: fill,\n frontFill: multiply(fill, 0.95),\n sideFill: multiply(fill, 0.88),\n };\n}\n","import type { Point, Rect } from '../types';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\nfunction rotatePoint(point: Point, degrees: number): Point {\n const radians = degrees * DEGREES_TO_RADIANS;\n const cosine = Math.cos(radians);\n const sine = Math.sin(radians);\n return { x: point.x * cosine - point.y * sine, y: point.x * sine + point.y * cosine };\n}\n\nfunction rectangleCenter(rectangle: Rect): Point {\n return { x: rectangle.x + rectangle.width / 2, y: rectangle.y + rectangle.height / 2 };\n}\n\nexport function worldPointToRectangle(rectangle: Rect, worldPoint: Point): Point {\n const center = rectangleCenter(rectangle);\n const pointRelativeToCenter = { x: worldPoint.x - center.x, y: worldPoint.y - center.y };\n return rectangle.rotation ? rotatePoint(pointRelativeToCenter, -rectangle.rotation) : pointRelativeToCenter;\n}\n\nexport function rectanglePointToWorld(rectangle: Rect, rectanglePoint: Point): Point {\n const center = rectangleCenter(rectangle);\n const rotatedPoint = rectangle.rotation ? rotatePoint(rectanglePoint, rectangle.rotation) : rectanglePoint;\n return { x: center.x + rotatedPoint.x, y: center.y + rotatedPoint.y };\n}\n","import type { Point, Rect, Side } from '../types';\nimport { rectanglePointToWorld, worldPointToRectangle } from './rectangleCoordinates';\nimport type { Port } from './types';\n\nfunction portPointInRectangle(rectangle: Rect, port: Port): Point {\n const offset = Math.max(0, Math.min(1, port.offset));\n const halfWidth = rectangle.width / 2;\n const halfHeight = rectangle.height / 2;\n switch (port.side) {\n case 'top':\n return { x: (offset - 0.5) * rectangle.width, y: -halfHeight };\n case 'right':\n return { x: halfWidth, y: (offset - 0.5) * rectangle.height };\n case 'bottom':\n return { x: (offset - 0.5) * rectangle.width, y: halfHeight };\n case 'left':\n return { x: -halfWidth, y: (offset - 0.5) * rectangle.height };\n }\n}\n\nexport function pointAtPort(rectangle: Rect, port: Port): Point {\n return rectanglePointToWorld(rectangle, portPointInRectangle(rectangle, port));\n}\n\nexport function pointAtNormalizedPort(rectangle: Rect, normalizedPosition: [number, number]): Point {\n return rectanglePointToWorld(rectangle, {\n x: (normalizedPosition[0] - 0.5) * rectangle.width,\n y: (normalizedPosition[1] - 0.5) * rectangle.height,\n });\n}\n\nexport function relativeOffsetOnRectangleSide(rectangle: Rect, side: Side, worldPoint: Point): number {\n const rectanglePoint = worldPointToRectangle(rectangle, worldPoint);\n switch (side) {\n case 'top':\n case 'bottom':\n return (rectanglePoint.x + rectangle.width / 2) / rectangle.width;\n case 'left':\n case 'right':\n return (rectanglePoint.y + rectangle.height / 2) / rectangle.height;\n }\n}\n","import type { Point } from '../types';\n\nexport interface BoxLike {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function elementCenter(rect: BoxLike): Point {\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n}\n\nexport function edgePointToward(rect: BoxLike, other: BoxLike): Point {\n const center = elementCenter(rect);\n const otherCenter = elementCenter(other);\n const angle = Math.atan2(otherCenter.y - center.y, otherCenter.x - center.x);\n if (angle >= -Math.PI / 4 && angle < Math.PI / 4) {\n return { x: rect.x + rect.width, y: center.y };\n }\n if (angle >= Math.PI / 4 && angle < (3 * Math.PI) / 4) {\n return { x: center.x, y: rect.y + rect.height };\n }\n if (angle >= (-3 * Math.PI) / 4 && angle < -Math.PI / 4) {\n return { x: center.x, y: rect.y };\n }\n return { x: rect.x, y: center.y };\n}\n","import { pointAtNormalizedPort } from '../../model/geometry/ports';\nimport { edgePointToward, elementCenter } from '../../model/geometry/rectangle';\nimport type { Point } from '../../model/geometry/types';\nimport type { Link } from '../../model/link';\nimport type { PositionedCanvasObject } from './types';\n\ntype LinkEndpoint = NonNullable<Link['fromPoint']>;\ntype LinkEnd = 'from' | 'to';\n\ninterface SelectedLinkEndpoint {\n canvasObjectId: string | undefined;\n oppositeCanvasObjectId: string | undefined;\n explicit: LinkEndpoint | undefined;\n}\n\nfunction sidePoint(canvasObject: PositionedCanvasObject, endpoint: Extract<LinkEndpoint, { side: unknown }>): Point {\n const offset = endpoint.offset ?? 0.5;\n switch (endpoint.side) {\n case 'top':\n return { x: canvasObject.x + canvasObject.width * offset, y: canvasObject.y };\n case 'right':\n return { x: canvasObject.x + canvasObject.width, y: canvasObject.y + canvasObject.height * offset };\n case 'bottom':\n return { x: canvasObject.x + canvasObject.width * offset, y: canvasObject.y + canvasObject.height };\n case 'left':\n return { x: canvasObject.x, y: canvasObject.y + canvasObject.height * offset };\n }\n}\n\nfunction namedPortPoint(\n canvasObject: PositionedCanvasObject,\n endpoint: Extract<LinkEndpoint, { kind: 'port' }>,\n): Point {\n const port = canvasObject.symbol?.ports?.find(candidate => candidate.name === endpoint.port);\n if (!port) {\n return elementCenter(canvasObject);\n }\n return pointAtNormalizedPort(\n {\n x: canvasObject.x,\n y: canvasObject.y,\n width: canvasObject.width,\n height: canvasObject.height,\n rotation: canvasObject.rotation ?? undefined,\n },\n port.at,\n );\n}\n\nexport function resolveLinkEndpoint(link: Link, end: LinkEnd, canvasObjects: PositionedCanvasObject[]): Point {\n const selected = selectLinkEndpoint(link, end);\n const absolutePoint = explicitAbsolutePoint(selected.explicit);\n if (absolutePoint) {\n return absolutePoint;\n }\n const canvasObject = findPositionedCanvasObject(canvasObjects, selected.canvasObjectId);\n if (!canvasObject) {\n return { x: 0, y: 0 };\n }\n const anchoredPoint = explicitAnchorPoint(canvasObject, selected.explicit);\n if (anchoredPoint) {\n return anchoredPoint;\n }\n return automaticEndpointPoint(\n canvasObject,\n findPositionedCanvasObject(canvasObjects, selected.oppositeCanvasObjectId),\n );\n}\n\nfunction selectLinkEndpoint(link: Link, end: LinkEnd): SelectedLinkEndpoint {\n return end === 'from'\n ? { canvasObjectId: link.fromId, oppositeCanvasObjectId: link.toId, explicit: link.fromPoint }\n : { canvasObjectId: link.toId, oppositeCanvasObjectId: link.fromId, explicit: link.toPoint };\n}\n\nfunction explicitAbsolutePoint(endpoint: LinkEndpoint | undefined): Point | null {\n return endpoint?.kind === 'absolute' ? { x: endpoint.x, y: endpoint.y } : null;\n}\n\nfunction explicitAnchorPoint(canvasObject: PositionedCanvasObject, endpoint: LinkEndpoint | undefined): Point | null {\n if (endpoint?.kind === 'port') {\n return namedPortPoint(canvasObject, endpoint);\n }\n if (endpoint?.kind === 'side') {\n return sidePoint(canvasObject, endpoint);\n }\n return null;\n}\n\nfunction automaticEndpointPoint(\n canvasObject: PositionedCanvasObject,\n opposite: PositionedCanvasObject | undefined,\n): Point {\n return opposite ? edgePointToward(canvasObject, opposite) : elementCenter(canvasObject);\n}\n\nfunction findPositionedCanvasObject(\n canvasObjects: PositionedCanvasObject[],\n id: string | undefined,\n): PositionedCanvasObject | undefined {\n return canvasObjects.find(candidate => candidate.id === id);\n}\n","import type { Connection } from '../../model/connection';\nimport type { Point } from '../../model/geometry/types';\nimport { type IsometricObject, isometricFaceCenter, VISIBLE_ISOMETRIC_FACES } from '../../model/isometricObject';\nimport type { Link } from '../../model/link';\nimport type { RenderInputLink } from '../types';\nimport type { CollectedCanvasObjects } from './canvasObjects/collect';\nimport { resolveLinkEndpoint } from './endpoint';\nimport type { PositionedCanvasObject } from './types';\n\nconst ISOMETRIC_SEQUENCE_BASE = 15_000;\n\nfunction positionedCanvasObjects(canvasObjects: CollectedCanvasObjects): PositionedCanvasObject[] {\n return [\n ...canvasObjects.shapes,\n ...canvasObjects.frames,\n ...canvasObjects.swimlanes,\n ...canvasObjects.paths,\n ...canvasObjects.charts,\n ];\n}\n\nfunction connectionEndpointPoint(object: IsometricObject | undefined, face: Connection['fromFace']): Point {\n return object ? isometricFaceCenter(object, face) : { x: 0, y: 0 };\n}\n\ninterface StackPosition {\n rank: number;\n sequence: number;\n}\n\nfunction isometricStackPosition(\n isometricObjects: IsometricObject[],\n id: string | undefined,\n): StackPosition | undefined {\n const index = isometricObjects.findIndex(object => object.id === id);\n if (index < 0) {\n return undefined;\n }\n const object = isometricObjects[index];\n return { rank: object.order ?? 0, sequence: object.sourceIndex ?? ISOMETRIC_SEQUENCE_BASE + index };\n}\n\nfunction connectionStack(\n isometricObjects: IsometricObject[],\n connection: Connection,\n): Pick<Connection, 'order' | 'sourceIndex'> {\n if (typeof connection.order === 'number') {\n return { order: connection.order, sourceIndex: connection.sourceIndex };\n }\n const behind = [\n VISIBLE_ISOMETRIC_FACES.has(connection.fromFace)\n ? undefined\n : isometricStackPosition(isometricObjects, connection.fromId),\n VISIBLE_ISOMETRIC_FACES.has(connection.toFace)\n ? undefined\n : isometricStackPosition(isometricObjects, connection.toId),\n ].filter((position): position is StackPosition => position !== undefined);\n if (!behind.length) {\n return { sourceIndex: connection.sourceIndex };\n }\n const lowest = behind.reduce((best, position) =>\n position.rank < best.rank || (position.rank === best.rank && position.sequence < best.sequence) ? position : best,\n );\n return { order: lowest.rank, sourceIndex: lowest.sequence - 0.5 };\n}\n\nfunction createRenderInputConnections(canvasObjects: CollectedCanvasObjects): RenderInputLink[] {\n const isometricById = new Map(canvasObjects.isometricObjects.map(object => [object.id, object]));\n return canvasObjects.connections.map(connection => {\n const link: Link = {\n id: connection.id,\n fromId: connection.fromId,\n toId: connection.toId,\n fromPoint: { kind: 'face', face: connection.fromFace },\n toPoint: { kind: 'face', face: connection.toFace },\n style: connection.style,\n ...connectionStack(canvasObjects.isometricObjects, connection),\n };\n return {\n link,\n from: connectionEndpointPoint(isometricById.get(connection.fromId ?? ''), connection.fromFace),\n to: connectionEndpointPoint(isometricById.get(connection.toId ?? ''), connection.toFace),\n kind: 'connection',\n };\n });\n}\n\nexport function createRenderInputLinks(canvasObjects: CollectedCanvasObjects): RenderInputLink[] {\n const positionedObjects = positionedCanvasObjects(canvasObjects);\n const links = canvasObjects.links.map(link => ({\n link,\n from: resolveLinkEndpoint(link, 'from', positionedObjects),\n to: resolveLinkEndpoint(link, 'to', positionedObjects),\n }));\n return [...links, ...createRenderInputConnections(canvasObjects)];\n}\n","import { sflToCanvasState } from '../../sflSemantic/sflToCanvasState';\nimport type { RenderInput } from '../types';\nimport { collectCanvasObjects } from './canvasObjects/collect';\nimport { createRenderInputLinks } from './links';\n\nexport function sflToRenderInput(sfl: string): RenderInput {\n const state = sflToCanvasState(sfl);\n const canvasObjects = collectCanvasObjects(state);\n return {\n shapes: canvasObjects.shapes,\n frames: canvasObjects.frames,\n swimlanes: canvasObjects.swimlanes,\n isometricObjects: canvasObjects.isometricObjects,\n paths: canvasObjects.paths,\n charts: canvasObjects.charts,\n widgets: canvasObjects.widgets,\n links: createRenderInputLinks(canvasObjects),\n diagnostics: state.diagnostics,\n };\n}\n","import type { RenderNode, SceneRole } from './types';\n\nexport function tag(\n nodes: RenderNode[],\n role: SceneRole,\n id: string,\n kind?: string,\n label?: string,\n parentFrameId?: string,\n): RenderNode[] {\n nodes.forEach((node, index) => {\n node.identity = {\n role,\n id,\n ...(kind ? { kind } : {}),\n ...(index === 0 ? { primary: true } : {}),\n ...(index === 0 && label ? { label } : {}),\n ...(index === 0 && parentFrameId ? { parentFrameId } : {}),\n };\n });\n return nodes;\n}\n","import type { Bounds, Point } from './types';\n\nexport const EMPTY_BOUNDS: Bounds = { minX: 0, minY: 0, maxX: 100, maxY: 100 };\n\nexport interface BoundsFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function boxBounds(frame: BoundsFrame, extra = 0): Bounds {\n return {\n minX: frame.x - extra,\n minY: frame.y - extra,\n maxX: frame.x + frame.width + extra,\n maxY: frame.y + frame.height + extra,\n };\n}\n\nexport function rotatedBounds(frame: BoundsFrame, degrees: number, extra = 0): Bounds {\n if (!degrees) {\n return boxBounds(frame, extra);\n }\n\n return boundsAroundPoints(rotateFrameCorners(frame, degrees), extra);\n}\n\nfunction rotateFrameCorners(frame: BoundsFrame, degrees: number): Point[] {\n const centerX = frame.x + frame.width / 2;\n const centerY = frame.y + frame.height / 2;\n const angle = (degrees * Math.PI) / 180;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return frameCorners(frame).map(point => ({\n x: centerX + (point.x - centerX) * cos - (point.y - centerY) * sin,\n y: centerY + (point.x - centerX) * sin + (point.y - centerY) * cos,\n }));\n}\n\nfunction frameCorners(frame: BoundsFrame): Point[] {\n return [\n { x: frame.x, y: frame.y },\n { x: frame.x + frame.width, y: frame.y },\n { x: frame.x + frame.width, y: frame.y + frame.height },\n { x: frame.x, y: frame.y + frame.height },\n ];\n}\n\nfunction boundsAroundPoints(points: Point[], extra: number): Bounds {\n return {\n minX: Math.min(...points.map(point => point.x)) - extra,\n minY: Math.min(...points.map(point => point.y)) - extra,\n maxX: Math.max(...points.map(point => point.x)) + extra,\n maxY: Math.max(...points.map(point => point.y)) + extra,\n };\n}\n","import type { PathPoint } from '../../model/path';\n\nexport interface FreeformPathGeometry {\n points: PathPoint[];\n tension: number;\n closed: boolean;\n}\n\nexport function freeformPathData(geometry: FreeformPathGeometry): string {\n if (geometry.points.length === 0) {\n return '';\n }\n if (geometry.points.length < 3 || geometry.tension <= 0) {\n return linearPathData(geometry);\n }\n return smoothPathData(geometry);\n}\n\nfunction linearPathData(geometry: FreeformPathGeometry): string {\n const [first, ...remaining] = geometry.points;\n const segments = remaining.map(point => `L ${point.x} ${point.y}`).join(' ');\n return `M ${first.x} ${first.y} ${segments}${geometry.closed ? ' Z' : ''}`;\n}\n\nfunction smoothPathData(geometry: FreeformPathGeometry): string {\n const first = geometry.points[0];\n const segmentCount = geometry.closed ? geometry.points.length : geometry.points.length - 1;\n const commands = [`M ${first.x} ${first.y}`];\n for (let index = 0; index < segmentCount; index++) {\n commands.push(curveSegmentCommand(geometry, index));\n }\n if (geometry.closed) {\n commands.push('Z');\n }\n return commands.join(' ');\n}\n\nfunction curveSegmentCommand(geometry: FreeformPathGeometry, index: number): string {\n const previous = freeformPointAt(geometry, index - 1);\n const start = freeformPointAt(geometry, index);\n const end = freeformPointAt(geometry, index + 1);\n const next = freeformPointAt(geometry, index + 2);\n const factor = geometry.tension / 6;\n const firstControl = { x: start.x + (end.x - previous.x) * factor, y: start.y + (end.y - previous.y) * factor };\n const secondControl = { x: end.x - (next.x - start.x) * factor, y: end.y - (next.y - start.y) * factor };\n return `C ${firstControl.x} ${firstControl.y} ${secondControl.x} ${secondControl.y} ${end.x} ${end.y}`;\n}\n\nfunction freeformPointAt(geometry: FreeformPathGeometry, index: number): PathPoint {\n if (geometry.closed) {\n return geometry.points[(index + geometry.points.length) % geometry.points.length];\n }\n return geometry.points[Math.max(0, Math.min(geometry.points.length - 1, index))];\n}\n","export function finite(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n","interface StackableObject {\n order_key?: string;\n orderKey?: string;\n order?: number;\n sourceIndex?: number;\n}\n\nexport function stackRank(object: StackableObject): number {\n const key = object.order_key ?? object.orderKey;\n if (!key) {\n return object.order ?? 0;\n }\n\n let rank = 0;\n for (let index = 0; index < Math.min(key.length, 8); index++) {\n rank = rank * 128 + key.charCodeAt(index);\n }\n return rank;\n}\n\nexport function stackSequence(object: StackableObject, fallback: number): number {\n return object.sourceIndex ?? fallback;\n}\n","import type { GradientColor, MeshGradientColor } from '../../model/color';\nimport type { RenderDiagnostic, ScenePaint } from './types';\n\nexport function paint(\n value: string | GradientColor | MeshGradientColor | null | undefined,\n diagnostics: RenderDiagnostic[],\n ownerId: string,\n): ScenePaint {\n if (!value) {\n return { kind: 'none' };\n }\n if (typeof value === 'string') {\n return { kind: 'solid', color: value };\n }\n if (value.type === 'gradient') {\n return {\n kind: 'linear-gradient',\n angle: value.angle,\n stops: value.stops.map(stop => ({ offset: stop.position, color: stop.color })),\n };\n }\n if (value.points.length === 0) {\n diagnostics.push({\n severity: 'warning',\n code: 'empty-mesh-gradient',\n ownerId,\n message: 'Mesh gradient has no color points.',\n });\n return { kind: 'none' };\n }\n return {\n kind: 'mesh-gradient',\n points: value.points.map(point => ({ x: point.x, y: point.y, color: point.color })),\n };\n}\n","export const DEFAULT_FONT = \"Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\n","export function topRoundedRectPath(x: number, y: number, width: number, height: number, radius: number): string {\n const clampedRadius = Math.max(0, Math.min(radius, width / 2, height));\n if (clampedRadius === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return `M ${x} ${y + clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + clampedRadius} ${y} H ${x + width - clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + width} ${y + clampedRadius} V ${y + height} H ${x} Z`;\n}\n\nexport function bottomRoundedRectPath(x: number, y: number, width: number, height: number, radius: number): string {\n const clampedRadius = Math.max(0, Math.min(radius, width / 2, height));\n if (clampedRadius === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return `M ${x} ${y} H ${x + width} V ${y + height - clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + width - clampedRadius} ${y + height} H ${x + clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x} ${y + height - clampedRadius} Z`;\n}\n\nexport function leftRoundedRectPath(x: number, y: number, width: number, height: number, radius: number): string {\n const clampedRadius = Math.max(0, Math.min(radius, width / 2, height / 2));\n if (clampedRadius === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return `M ${x} ${y + clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + clampedRadius} ${y} H ${x + width} V ${y + height} H ${x + clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x} ${y + height - clampedRadius} Z`;\n}\n\nexport function rightRoundedRectPath(x: number, y: number, width: number, height: number, radius: number): string {\n const clampedRadius = Math.max(0, Math.min(radius, width / 2, height / 2));\n if (clampedRadius === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return `M ${x} ${y} H ${x + width - clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + width} ${y + clampedRadius} V ${y + height - clampedRadius} A ${clampedRadius} ${clampedRadius} 0 0 1 ${x + width - clampedRadius} ${y + height} H ${x} Z`;\n}\n\nexport interface RectCornerRadii {\n topLeft: number;\n topRight: number;\n bottomRight: number;\n bottomLeft: number;\n}\n\nexport function cornersRoundedRectPath(\n x: number,\n y: number,\n width: number,\n height: number,\n radii: RectCornerRadii,\n): string {\n const max = Math.max(0, Math.min(width, height) / 2);\n const tl = Math.max(0, Math.min(radii.topLeft, max));\n const tr = Math.max(0, Math.min(radii.topRight, max));\n const br = Math.max(0, Math.min(radii.bottomRight, max));\n const bl = Math.max(0, Math.min(radii.bottomLeft, max));\n const arcTo = (r: number, toX: number, toY: number) => (r > 0 ? `A ${r} ${r} 0 0 1 ${toX} ${toY} ` : '');\n return (\n `M ${x + tl} ${y} H ${x + width - tr} ` +\n arcTo(tr, x + width, y + tr) +\n `V ${y + height - br} ` +\n arcTo(br, x + width - br, y + height) +\n `H ${x + bl} ` +\n arcTo(bl, x, y + height - bl) +\n `V ${y + tl} ` +\n arcTo(tl, x + tl, y) +\n 'Z'\n );\n}\n","import type { SceneStyle } from '../../scene';\n\nexport function simpleContainerStyle(fill: string, stroke: string, strokeWidth: number, dash?: number[]): SceneStyle {\n return {\n fill: { kind: 'solid', color: fill || 'transparent' },\n stroke: { kind: 'solid', color: stroke },\n strokeWidth,\n dash: dash?.length ? dash : undefined,\n };\n}\n","import type { Bounds, RenderNode } from '../../scene';\nimport { boxBounds, DEFAULT_FONT } from '../../scene';\nimport {\n bottomRoundedRectPath,\n leftRoundedRectPath,\n rightRoundedRectPath,\n topRoundedRectPath,\n} from '../../scene/roundedRectPath';\n\nexport type TitleTabPosition = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TitleTabInput {\n tabId: string;\n titleId: string;\n x: number;\n y: number;\n width: number;\n height: number;\n cornerRadius: number;\n strokeWidth: number;\n title: string;\n color: string;\n textColor: string;\n fontFamily?: string;\n fontSize: number;\n fontWeight: 'normal' | 'bold';\n labelPosition: TitleTabPosition;\n order: number;\n}\n\ninterface TabBox {\n x: number;\n y: number;\n width: number;\n height: number;\n path: string;\n}\n\nconst TAB_RADIUS = 8;\n\nfunction tabBox(input: TitleTabInput, thickness: number, length: number): TabBox {\n const inset = input.strokeWidth / 2;\n switch (input.labelPosition) {\n case 'bottom': {\n const x = input.x - inset;\n const y = input.y + input.height;\n return {\n x,\n y,\n width: length,\n height: thickness,\n path: bottomRoundedRectPath(x, y, length, thickness, TAB_RADIUS),\n };\n }\n case 'left': {\n const x = input.x - thickness;\n const y = input.y - inset;\n return { x, y, width: thickness, height: length, path: leftRoundedRectPath(x, y, thickness, length, TAB_RADIUS) };\n }\n case 'right': {\n const x = input.x + input.width;\n const y = input.y - inset;\n return {\n x,\n y,\n width: thickness,\n height: length,\n path: rightRoundedRectPath(x, y, thickness, length, TAB_RADIUS),\n };\n }\n default: {\n const x = input.x - inset;\n const y = input.y - thickness;\n return { x, y, width: length, height: thickness, path: topRoundedRectPath(x, y, length, thickness, TAB_RADIUS) };\n }\n }\n}\n\nexport function renderTitleTab(input: TitleTabInput): RenderNode[] {\n const thickness = Math.max(32, input.fontSize + 18);\n const padding = 16;\n const length = Math.max(120, input.title.length * input.fontSize * 0.62 + padding * 2);\n const box = tabBox(input, thickness, length);\n const bounds = boxBounds(box, 6);\n const vertical = input.labelPosition === 'left' || input.labelPosition === 'right';\n return [\n {\n type: 'path',\n id: input.tabId,\n order: input.order + 0.1,\n bounds,\n d: box.path,\n style: {\n fill: { kind: 'solid', color: input.color },\n stroke: { kind: 'none' },\n },\n },\n vertical ? verticalTitleText(input, box, padding, bounds) : horizontalTitleText(input, box, padding, bounds),\n ];\n}\n\nfunction horizontalTitleText(input: TitleTabInput, box: TabBox, padding: number, bounds: Bounds): RenderNode {\n return {\n type: 'text',\n id: input.titleId,\n order: input.order + 0.2,\n bounds,\n x: box.x + padding,\n y: box.y,\n width: Math.max(0, box.width - padding * 2),\n height: box.height,\n lines: [input.title],\n fontFamily: input.fontFamily ?? DEFAULT_FONT,\n fontSize: input.fontSize,\n fontWeight: input.fontWeight,\n color: input.textColor,\n align: 'left',\n verticalAlign: 'middle',\n lineHeight: 1.2,\n };\n}\n\nfunction verticalTitleText(input: TitleTabInput, box: TabBox, padding: number, bounds: Bounds): RenderNode {\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n const textThickness = input.fontSize * 1.4;\n const textLength = Math.max(1, box.height - padding * 2);\n return {\n type: 'text',\n id: input.titleId,\n order: input.order + 0.2,\n bounds,\n x: centerX - textLength / 2,\n y: centerY - textThickness / 2,\n width: textLength,\n height: textThickness,\n lines: [input.title],\n fontFamily: input.fontFamily ?? DEFAULT_FONT,\n fontSize: input.fontSize,\n fontWeight: input.fontWeight,\n color: input.textColor,\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.2,\n rotation: -90,\n rotationCenter: { x: centerX, y: centerY },\n };\n}\n","import type { Frame } from '../../../model/frame';\nimport type { RenderNode } from '../../scene';\nimport { boxBounds } from '../../scene';\nimport { cornersRoundedRectPath, type RectCornerRadii } from '../../scene/roundedRectPath';\nimport { simpleContainerStyle } from './style';\nimport { renderTitleTab, type TitleTabPosition } from './titleTab';\n\nconst SQUARED_CORNER_BY_LABEL_POSITION: Record<TitleTabPosition, keyof RectCornerRadii> = {\n top: 'topLeft',\n bottom: 'bottomLeft',\n left: 'topLeft',\n right: 'topRight',\n};\n\nfunction frameBoundaryNode(frame: Frame, order: number, hasTab: boolean): RenderNode {\n const shadow = frame.shadow ?? true;\n const bounds = boxBounds(\n { x: frame.x, y: frame.y, width: frame.width, height: frame.height },\n frame.strokeWidth + (shadow ? 20 : 4),\n );\n const style = {\n ...simpleContainerStyle(frame.fillColor, frame.strokeColor, frame.strokeWidth, frame.dash),\n shadow: shadow ? { color: '#000000', opacity: 0.2, blur: 12, dx: 0, dy: 4 } : undefined,\n };\n if (!hasTab) {\n return {\n type: 'rect',\n id: `frame-${frame.id}`,\n order,\n bounds,\n x: frame.x,\n y: frame.y,\n width: frame.width,\n height: frame.height,\n rx: frame.cornerRadius,\n style,\n };\n }\n const squared = SQUARED_CORNER_BY_LABEL_POSITION[frame.labelPosition ?? 'top'];\n const radii: RectCornerRadii = {\n topLeft: frame.cornerRadius,\n topRight: frame.cornerRadius,\n bottomRight: frame.cornerRadius,\n bottomLeft: frame.cornerRadius,\n [squared]: 0,\n };\n return {\n type: 'path',\n id: `frame-${frame.id}`,\n order,\n bounds,\n d: cornersRoundedRectPath(frame.x, frame.y, frame.width, frame.height, radii),\n detail: { of: 'frameBoundary', cornerRadius: frame.cornerRadius, squareCorner: squared },\n style,\n };\n}\n\nexport function buildFrame(frame: Frame, index: number): RenderNode[] {\n if (frame.isVisible === false) {\n return [];\n }\n const order = index;\n const hasTab = (frame.showLabel ?? true) && Boolean(frame.title);\n const nodes: RenderNode[] = [frameBoundaryNode(frame, order, hasTab)];\n if (hasTab && frame.title) {\n nodes.push(\n ...renderTitleTab({\n tabId: `frame-tab-${frame.id}`,\n titleId: `frame-title-${frame.id}`,\n x: frame.x,\n y: frame.y,\n width: frame.width,\n height: frame.height,\n cornerRadius: frame.cornerRadius,\n strokeWidth: frame.strokeWidth,\n title: frame.title,\n color: frame.strokeColor,\n textColor: frame.textColor,\n fontFamily: frame.fontFamily,\n fontSize: frame.fontSize,\n fontWeight: frame.fontWeight,\n labelPosition: frame.labelPosition ?? 'top',\n order,\n }),\n );\n }\n return nodes;\n}\n","import type { ShadowStyle } from '../../model/shadow';\n\nexport interface ResolvedShadow {\n color: string;\n opacity: number;\n blur: number;\n dx: number;\n dy: number;\n}\n\nexport const DEFAULT_SHADOW_STYLE: ShadowStyle = {\n enabled: false,\n color: '#000000',\n opacity: 0.3,\n blur: 10,\n angle: 45,\n distance: 4,\n};\n\nexport function getShadowOffset(angle: number, distance: number): { x: number; y: number } {\n const rad = (angle * Math.PI) / 180;\n return {\n x: Math.cos(rad) * distance,\n y: Math.sin(rad) * distance,\n };\n}\n\nexport function resolveShadow(shadow: ShadowStyle | undefined): ResolvedShadow | undefined {\n if (!shadow?.enabled) {\n return undefined;\n }\n const offset = getShadowOffset(shadow.angle ?? 45, shadow.distance ?? 5);\n return {\n color: shadow.color ?? '#000000',\n opacity: shadow.opacity ?? 0.25,\n blur: shadow.blur ?? 10,\n dx: offset.x,\n dy: offset.y,\n };\n}\n","import type { RenderNode } from '../../../scene';\nimport type { SwimlaneRenderContext } from './types';\n\nfunction dividerPath(context: SwimlaneRenderContext, offset: number): string {\n const { swimlane } = context;\n if (swimlane.orientation === 'horizontal') {\n return `M ${swimlane.x} ${swimlane.y + offset} H ${swimlane.x + swimlane.width}`;\n }\n return `M ${swimlane.x + offset} ${swimlane.y} V ${swimlane.y + swimlane.height}`;\n}\n\nexport function renderLaneDividers(context: SwimlaneRenderContext): RenderNode[] {\n return context.lanes.slice(1).map((lane, index) => ({\n type: 'path',\n id: `swimlane-divider-${context.swimlane.id}-${index}`,\n order: context.order + 0.1 + index / 100,\n bounds: context.bounds,\n d: dividerPath(context, lane.offset),\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: context.swimlane.strokeColor },\n strokeWidth: context.swimlane.strokeWidth,\n },\n }));\n}\n","import type { RenderNode, SceneText } from '../../../scene';\nimport { DEFAULT_FONT, rotatedBounds } from '../../../scene';\nimport type { PositionedLane, SwimlaneRenderContext } from './types';\n\nfunction labelBase(context: SwimlaneRenderContext, lane: PositionedLane, index: number) {\n return {\n type: 'text' as const,\n id: `swimlane-label-${context.swimlane.id}-${lane.id}`,\n order: context.order + 0.5 + index / 100,\n lines: [lane.label],\n fontFamily: context.swimlane.fontFamily ?? DEFAULT_FONT,\n fontSize: context.swimlane.fontSize,\n fontWeight: context.swimlane.fontWeight,\n color: context.swimlane.textColor,\n lineHeight: 1.2,\n };\n}\n\nfunction horizontalLabel(context: SwimlaneRenderContext, lane: PositionedLane, index: number): SceneText {\n const thickness = context.swimlane.fontSize * 1.4;\n const centerX = context.swimlane.x + 10 + thickness / 2;\n const centerY = context.swimlane.y + lane.offset + lane.size / 2;\n const width = Math.max(20, lane.size - 16);\n const x = centerX - width / 2;\n const y = centerY - thickness / 2;\n return {\n ...labelBase(context, lane, index),\n bounds: rotatedBounds({ x, y, width, height: thickness }, -90, 12),\n x,\n y,\n width,\n height: thickness,\n align: 'center',\n verticalAlign: 'middle',\n rotation: -90,\n rotationCenter: { x: centerX, y: centerY },\n };\n}\n\nfunction verticalLabel(context: SwimlaneRenderContext, lane: PositionedLane, index: number): SceneText {\n return {\n ...labelBase(context, lane, index),\n bounds: context.bounds,\n x: context.swimlane.x + lane.offset + 8,\n y: context.swimlane.y + 8,\n width: Math.max(0, lane.size - 16),\n height: Math.max(0, context.swimlane.height - 16),\n align: 'left',\n verticalAlign: 'top',\n };\n}\n\nexport function renderLaneLabels(context: SwimlaneRenderContext): RenderNode[] {\n if (!context.swimlane.showLaneLabels) {\n return [];\n }\n const render = context.swimlane.orientation === 'horizontal' ? horizontalLabel : verticalLabel;\n return context.lanes.map((lane, index) => render(context, lane, index));\n}\n","import type { Lane, Swimlane } from '../../../../model/swimlane';\nimport { boxBounds } from '../../../scene';\nimport type { PositionedLane, SwimlaneRenderContext } from './types';\n\nfunction normalizeLanes(swimlane: Swimlane): Lane[] {\n const targetSize = swimlane.orientation === 'horizontal' ? swimlane.height : swimlane.width;\n const total = swimlane.lanes.reduce((sum, lane) => sum + lane.size, 0);\n if (total <= 0 || targetSize <= 0) {\n return swimlane.lanes;\n }\n return swimlane.lanes.map(lane => ({ ...lane, size: lane.size * (targetSize / total) }));\n}\n\nfunction positionLanes(swimlane: Swimlane): PositionedLane[] {\n let offset = 0;\n return normalizeLanes(swimlane).map(lane => {\n const positioned = { ...lane, offset };\n offset += lane.size;\n return positioned;\n });\n}\n\nexport function createSwimlaneRenderContext(swimlane: Swimlane, index: number): SwimlaneRenderContext {\n return {\n swimlane,\n order: 5_000 + index,\n bounds: boxBounds(\n { x: swimlane.x, y: swimlane.y, width: swimlane.width, height: swimlane.height },\n swimlane.strokeWidth + 4,\n ),\n lanes: positionLanes(swimlane),\n };\n}\n","import type { Swimlane } from '../../../../model/swimlane';\nimport type { RenderNode } from '../../../scene';\nimport { resolveShadow } from '../../../scene/shadow';\nimport { simpleContainerStyle } from '../style';\nimport { renderLaneDividers } from './dividers';\nimport { renderLaneLabels } from './labels';\nimport { createSwimlaneRenderContext } from './layout';\n\nexport function buildSwimlane(swimlane: Swimlane, index: number): RenderNode[] {\n if (swimlane.isVisible === false) {\n return [];\n }\n const context = createSwimlaneRenderContext(swimlane, index);\n return [\n {\n type: 'rect',\n id: `swimlane-${swimlane.id}`,\n order: context.order,\n bounds: context.bounds,\n x: swimlane.x,\n y: swimlane.y,\n width: swimlane.width,\n height: swimlane.height,\n rx: swimlane.cornerRadius,\n style: {\n ...simpleContainerStyle(swimlane.fillColor, swimlane.strokeColor, swimlane.strokeWidth, swimlane.dash),\n shadow: resolveShadow(swimlane.shadowStyle),\n },\n },\n ...renderLaneDividers(context),\n ...renderLaneLabels(context),\n ];\n}\n","import type { RenderInput } from '../../renderInput/types';\nimport type { RenderNode } from '../scene';\nimport { tag } from '../scene/tagging';\nimport { buildFrame } from './container/frame';\nimport { buildSwimlane } from './container/swimlane';\n\nexport {\n bottomRoundedRectPath,\n leftRoundedRectPath,\n rightRoundedRectPath,\n topRoundedRectPath,\n} from '../scene/roundedRectPath';\nexport { buildFrame } from './container/frame';\nexport { simpleContainerStyle } from './container/style';\nexport { buildSwimlane } from './container/swimlane';\n\nexport function buildContainers(input: Pick<RenderInput, 'frames' | 'swimlanes'>): RenderNode[] {\n return [\n ...input.frames.flatMap((frame, index) =>\n tag(buildFrame(frame, index), 'frame', frame.id, undefined, frame.title ?? undefined),\n ),\n ...input.swimlanes.flatMap((swimlane, index) => tag(buildSwimlane(swimlane, index), 'swimlane', swimlane.id)),\n ];\n}\n","import type { Point } from './types';\n\ninterface RoundedCorner {\n vertex: Point;\n start: Point;\n end: Point;\n}\n\nfunction distance(a: Point, b: Point): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nfunction toward(from: Point, to: Point, distanceFromStart: number): Point {\n const length = distance(from, to);\n\n if (length === 0) {\n return from;\n }\n\n const ratio = distanceFromStart / length;\n\n return {\n x: from.x + (to.x - from.x) * ratio,\n y: from.y + (to.y - from.y) * ratio,\n };\n}\n\nfunction roundedCorner(previous: Point, vertex: Point, next: Point, requestedRadius: number): RoundedCorner {\n const radius = Math.max(0, Math.min(requestedRadius, distance(vertex, previous) / 2, distance(vertex, next) / 2));\n\n return {\n vertex,\n start: toward(vertex, previous, radius),\n end: toward(vertex, next, radius),\n };\n}\n\nexport function roundedPolygonPath(points: readonly Point[], radius: number | readonly number[]): string {\n if (points.length < 3) {\n return '';\n }\n\n const radiusAt = (index: number) => (typeof radius === 'number' ? radius : (radius[index] ?? 0));\n\n if (points.every((_, index) => radiusAt(index) <= 0)) {\n const [first, ...rest] = points;\n return `M ${first.x} ${first.y} ${rest.map(point => `L ${point.x} ${point.y}`).join(' ')} Z`;\n }\n\n const corners = points.map((vertex, index) =>\n roundedCorner(\n points[(index - 1 + points.length) % points.length],\n vertex,\n points[(index + 1) % points.length],\n radiusAt(index),\n ),\n );\n\n const commands = [`M ${corners[0].end.x} ${corners[0].end.y}`];\n\n for (let index = 1; index < corners.length; index++) {\n const corner = corners[index];\n commands.push(\n `L ${corner.start.x} ${corner.start.y}`,\n `Q ${corner.vertex.x} ${corner.vertex.y} ${corner.end.x} ${corner.end.y}`,\n );\n }\n\n const first = corners[0];\n commands.push(\n `L ${first.start.x} ${first.start.y}`,\n `Q ${first.vertex.x} ${first.vertex.y} ${first.end.x} ${first.end.y}`,\n 'Z',\n );\n\n return commands.join(' ');\n}\n","import {\n deriveFaceFills,\n type IsometricObject,\n isometricBounds,\n isometricFaces,\n isometricTopFaceCenter,\n} from '../../model/isometricObject';\nimport type { RenderNode, ScenePath, SceneRect, SceneText } from '../scene';\nimport { DEFAULT_FONT, finite, rotatedBounds } from '../scene';\nimport { roundedPolygonPath } from '../scene/roundedPolygonPath';\nimport { tag } from '../scene/tagging';\n\ntype Faces = ReturnType<typeof isometricFaces>;\ntype Point = { x: number; y: number };\ntype HullClip = { type: 'path'; d: string };\n\ninterface IsometricContext {\n object: IsometricObject;\n index: number;\n order: number;\n rotation: number;\n rotationCenter: Point;\n box: ReturnType<typeof isometricBounds>;\n strokeWidth: number;\n common: {\n type: 'path';\n bounds: ReturnType<typeof rotatedBounds>;\n rotation: number;\n rotationCenter: Point;\n style: NonNullable<ScenePath['style']>;\n };\n}\n\nfunction isometricContext(object: IsometricObject, index: number): IsometricContext {\n const strokeWidth = Math.max(0, finite(object.strokeWidth, 1));\n const rotation = finite(object.rotation, 0);\n const box = isometricBounds(object);\n const rotationCenter = { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n return {\n object,\n index,\n order: 15_000 + index,\n rotation,\n rotationCenter,\n box,\n strokeWidth,\n common: {\n type: 'path' as const,\n bounds: rotatedBounds(box, rotation, strokeWidth + 2),\n rotation,\n rotationCenter,\n style: {\n stroke: { kind: 'solid' as const, color: object.strokeColor ?? '#111827' },\n strokeWidth,\n lineJoin: 'round' as const,\n },\n },\n };\n}\n\nfunction groundShadowNode(context: IsometricContext, faces: Faces): ScenePath | undefined {\n const { object, index, rotation, rotationCenter } = context;\n if (!object.hasShadow) {\n return undefined;\n }\n const height = Math.max(0, object.height);\n const heightFactor = 0.6 + Math.min(1, height / 150) * 0.7;\n const shadowDrop = height + finite(object.shadowStyle?.distance, 0);\n const contactFootprint = faces.top.map(point => ({ x: point.x, y: point.y + shadowDrop }));\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 const footprintXs = footprint.map(point => point.x);\n const footprintYs = footprint.map(point => point.y);\n return {\n type: 'path',\n id: `isometric-${object.id}-ground-shadow`,\n order: 14_000 + index,\n bounds: {\n minX: Math.min(...footprintXs),\n minY: Math.min(...footprintYs),\n maxX: Math.max(...footprintXs),\n maxY: Math.max(...footprintYs),\n },\n d: roundedPolygonPath(footprint, 0),\n rotation,\n rotationCenter,\n style: {\n fill: { kind: 'solid', color: object.shadowStyle?.color ?? '#000000' },\n stroke: { kind: 'none' },\n opacity: Math.min(1, (object.shadowStyle?.opacity ?? 0.18) * heightFactor),\n blur: finite(object.shadowStyle?.blur, 8),\n pointerEvents: 'none',\n },\n };\n}\n\nfunction faceNodes(context: IsometricContext, faces: Faces, hullClip: HullClip): ScenePath[] {\n const { object, order, common } = context;\n const noStroke = { ...common.style, stroke: { kind: 'none' as const } };\n const faceFills = deriveFaceFills(object.fill ?? '#f8fafc');\n const colorProp = { prop: 'style.fill', propKind: 'color' as const, propSolidOnly: true };\n const face = (name: string, offset: number, points: Faces['top'], color: string): ScenePath => ({\n ...common,\n id: `isometric-${object.id}-${name}`,\n order: order + offset,\n d: roundedPolygonPath(points, 0),\n style: { ...noStroke, fill: { kind: 'solid', color }, clip: hullClip },\n ...colorProp,\n });\n return [\n face('top', 0, faces.top, faceFills.topFill),\n face('front', 0.1, faces.front, faceFills.frontFill),\n face('side', 0.2, faces.right, faceFills.sideFill),\n ];\n}\n\nfunction seamsNode(context: IsometricContext, faces: Faces, hullClip: HullClip): ScenePath {\n const { object, order, common, strokeWidth } = context;\n return {\n ...common,\n id: `isometric-${object.id}-seams`,\n order: order + 0.22,\n d: `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 style: {\n ...common.style,\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: '#cbd5e1' },\n strokeWidth: Math.min(strokeWidth, 1),\n clip: hullClip,\n },\n };\n}\n\nfunction hullNode(context: IsometricContext, hullPath: string, cornerRadius: number): ScenePath {\n const { object, order, common, box } = context;\n return {\n ...common,\n id: `isometric-${object.id}-hull`,\n order: order + 0.24,\n d: hullPath,\n detail: {\n of: 'isometricGeometry',\n width: Math.max(0, object.width),\n height: Math.max(0, object.height),\n depth: Math.max(0, object.depth),\n cornerRadius,\n bounds: box,\n labelOffsetX: finite(object.labelOffsetX, 0),\n labelOffsetY: finite(object.labelOffsetY, 0),\n },\n style: { ...common.style, fill: { kind: 'none' } },\n };\n}\n\nconst LABEL_HEIGHT = 20;\nconst LABEL_GAP = 12;\nconst LABEL_PADDING_X = 6;\nconst LABEL_PADDING_Y = 3;\nconst LABEL_CHAR_WIDTH = 6.5;\n\ninterface LabelPlacement {\n anchor: Point;\n centerX: number;\n topY: number;\n bottomY: number;\n}\n\nfunction labelPlacement(context: IsometricContext): LabelPlacement {\n const { object } = context;\n const anchor = isometricTopFaceCenter(object);\n const bottomY = anchor.y - LABEL_GAP + finite(object.labelOffsetY, 0);\n return { anchor, centerX: anchor.x + finite(object.labelOffsetX, 0), topY: bottomY - LABEL_HEIGHT, bottomY };\n}\n\nfunction labelTextNode(context: IsometricContext, placement: LabelPlacement, text: string): SceneText {\n const { object, order, rotation, rotationCenter, box } = context;\n const { centerX, topY, bottomY } = placement;\n return {\n type: 'text',\n id: `isometric-${object.id}-label`,\n order: order + 0.3,\n bounds: { minX: centerX - box.width / 2, minY: topY, maxX: centerX + box.width / 2, maxY: bottomY },\n x: centerX - box.width / 2,\n y: topY,\n width: box.width,\n height: LABEL_HEIGHT,\n lines: [text],\n fontFamily: DEFAULT_FONT,\n fontSize: 12,\n fontWeight: 'normal',\n color: '#111827',\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.2,\n rotation,\n rotationCenter,\n mark: 'isometric-label',\n };\n}\n\nfunction labelGuideNode(context: IsometricContext, placement: LabelPlacement): ScenePath {\n const { object, order, rotation, rotationCenter } = context;\n const { anchor, centerX, bottomY } = placement;\n return {\n type: 'path',\n id: `isometric-${object.id}-label-guide`,\n order: order + 0.25,\n bounds: {\n minX: Math.min(anchor.x, centerX),\n minY: Math.min(anchor.y, bottomY),\n maxX: Math.max(anchor.x, centerX),\n maxY: Math.max(anchor.y, bottomY),\n },\n d: `M ${anchor.x} ${anchor.y} L ${centerX} ${bottomY}`,\n rotation,\n rotationCenter,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: '#cbd5e1' },\n strokeWidth: 1,\n lineCap: 'round',\n pointerEvents: 'none',\n },\n };\n}\n\nfunction labelBackgroundNode(\n context: IsometricContext,\n placement: LabelPlacement,\n text: string,\n background: string,\n): SceneRect {\n const { object, order, rotation } = context;\n const { centerX, topY, bottomY } = placement;\n const width = Math.max(24, text.length * LABEL_CHAR_WIDTH + LABEL_PADDING_X * 2);\n return {\n type: 'rect',\n id: `isometric-${object.id}-label-background`,\n order: order + 0.28,\n x: centerX - width / 2,\n y: topY - LABEL_PADDING_Y,\n width,\n height: LABEL_HEIGHT + LABEL_PADDING_Y * 2,\n rx: 4,\n bounds: {\n minX: centerX - width / 2,\n minY: topY - LABEL_PADDING_Y,\n maxX: centerX + width / 2,\n maxY: bottomY + LABEL_PADDING_Y,\n },\n rotation,\n mark: 'isometric-label',\n style: { fill: { kind: 'solid', color: background }, stroke: { kind: 'none' } },\n };\n}\n\nfunction labelNodes(context: IsometricContext, text: string): RenderNode[] {\n const placement = labelPlacement(context);\n const label = labelTextNode(context, placement, text);\n const guide = labelGuideNode(context, placement);\n const background = context.object.labelBackground;\n if (!background) {\n return [guide, label];\n }\n return [guide, labelBackgroundNode(context, placement, text, background), label];\n}\n\nexport function buildIsometricObject(object: IsometricObject, index: number): RenderNode[] {\n const context = isometricContext(object, index);\n const faces = isometricFaces(object);\n const cornerRadius = Math.max(0, finite(object.cornerRadius, 8));\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 const hullClip: HullClip = { type: 'path', d: hullPath };\n\n const groundShadow = groundShadowNode(context, faces);\n const seams = seamsNode(context, faces, hullClip);\n const hull = hullNode(context, hullPath, cornerRadius);\n const facesNodes = faceNodes(context, faces, hullClip);\n const objectNodes: RenderNode[] = groundShadow\n ? [hull, ...facesNodes, groundShadow, seams]\n : [hull, ...facesNodes, seams];\n\n return object.text ? [...objectNodes, ...labelNodes(context, object.text)] : objectNodes;\n}\n\nexport function buildIsometricObjects(objects: readonly IsometricObject[]): RenderNode[] {\n return objects.flatMap((object, index) =>\n tag(\n buildIsometricObject(object, index),\n 'isometric',\n object.id,\n 'isometric',\n object.text ?? 'Isometric object',\n object.parentFrameId,\n ),\n );\n}\n","import type { Point, RenderNode } from '../../scene';\nimport { DEFAULT_FONT, finite } from '../../scene';\nimport type { LinkRenderContext } from './types';\n\nfunction endpointLabelPosition(points: number[], end: 'start' | 'end'): Point {\n const index = end === 'start' ? 0 : points.length - 2;\n const neighbor = end === 'start' ? 2 : points.length - 4;\n const x = points[index];\n const y = points[index + 1];\n const dx = points[neighbor] - x;\n const dy = points[neighbor + 1] - y;\n const length = Math.hypot(dx, dy) || 1;\n const ux = dx / length;\n const uy = dy / length;\n return { x: x + ux * 20 - uy * 13, y: y + uy * 20 + ux * 13 };\n}\n\nfunction renderEndpointLabel(context: LinkRenderContext, end: 'start' | 'end', labelIndex: number): RenderNode[] {\n const label = (end === 'start' ? context.link.style?.startLabel : context.link.style?.endLabel)?.trim();\n if (!label) {\n return [];\n }\n const fontSize = finite(context.link.style?.fontSize, 10);\n const position = endpointLabelPosition(context.points, end);\n const width = 90;\n return [\n {\n type: 'text',\n id: `link-${end}-label-${context.link.id}`,\n order: context.order + 0.55 + labelIndex * 0.01,\n bounds: context.bounds,\n x: position.x - width / 2,\n y: position.y - fontSize,\n width,\n height: fontSize * 2,\n lines: [label],\n fontFamily: context.link.style?.fontFamily ?? DEFAULT_FONT,\n fontSize,\n fontWeight: 'normal',\n color: context.color,\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.4,\n },\n ];\n}\n\nexport function renderEndpointLabels(context: LinkRenderContext): RenderNode[] {\n return [...renderEndpointLabel(context, 'start', 0), ...renderEndpointLabel(context, 'end', 1)];\n}\n","import type { RenderNode } from '../../scene';\nimport { DEFAULT_FONT } from '../../scene';\nimport type { LinkRenderContext } from './types';\n\nexport function renderMainLabel(context: LinkRenderContext): RenderNode[] {\n if (!context.label.visible) {\n return [];\n }\n return [\n {\n type: 'text',\n id: `link-text-${context.link.id}`,\n order: context.order + 0.5,\n bounds: context.bounds,\n x: context.midpoint.x - context.label.width / 2,\n y: context.midpoint.y - context.label.fontSize,\n width: context.label.width,\n height: context.label.fontSize * 2,\n lines: context.label.lines,\n fontFamily: context.link.style?.fontFamily ?? DEFAULT_FONT,\n fontSize: context.label.fontSize,\n fontWeight: 'normal',\n color: context.color,\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.4,\n },\n ];\n}\n","export interface RGB {\n r: number;\n g: number;\n b: number;\n a?: number;\n}\n\nexport interface HSV {\n h: number;\n s: number;\n v: number;\n}\n\nexport const hexToRgb = (hex: string): RGB => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i.exec(hex);\n if (!result) {\n return { r: 255, g: 255, b: 255, a: 1 };\n }\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] === undefined ? 1 : parseInt(result[4], 16) / 255,\n };\n};\n\nexport const rgbToHex = (r: number, g: number, b: number, a?: number): string => {\n const channel = (x: number) => {\n const hex = Math.max(0, Math.min(255, Math.round(x))).toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n };\n const alphaChannel = a === undefined || a >= 1 ? '' : channel(a * 255);\n return `#${channel(r)}${channel(g)}${channel(b)}${alphaChannel}`;\n};\n\nexport const hsvToRgb = (h: number, s: number, v: number): RGB => {\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n\n let r = 0,\n g = 0,\n b = 0;\n\n if (h >= 0 && h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h >= 60 && h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h >= 120 && h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h >= 180 && h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h >= 240 && h < 300) {\n r = x;\n g = 0;\n b = c;\n } else if (h >= 300 && h < 360) {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n};\n\nexport const rgbToHsv = (r: number, g: number, b: number): HSV => {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n if (delta !== 0) {\n if (max === r) {\n h = 60 * (((g - b) / delta) % 6);\n } else if (max === g) {\n h = 60 * ((b - r) / delta + 2);\n } else if (max === b) {\n h = 60 * ((r - g) / delta + 4);\n }\n }\n\n if (h < 0) {\n h += 360;\n }\n\n const s = max === 0 ? 0 : delta / max;\n const v = max;\n\n return { h, s, v };\n};\n","import { hexToRgb, rgbToHex } from './conversion';\n\nexport interface PositionedColorStop {\n position: number;\n color: string;\n}\n\nfunction mixHexColors(start: string, end: string, ratio: number): string {\n const startRgb = hexToRgb(start);\n const endRgb = hexToRgb(end);\n const startAlpha = startRgb.a ?? 1;\n const endAlpha = endRgb.a ?? 1;\n return rgbToHex(\n Math.round(startRgb.r + (endRgb.r - startRgb.r) * ratio),\n Math.round(startRgb.g + (endRgb.g - startRgb.g) * ratio),\n Math.round(startRgb.b + (endRgb.b - startRgb.b) * ratio),\n startAlpha + (endAlpha - startAlpha) * ratio,\n );\n}\n\nexport function interpolateHexColorStops(stops: PositionedColorStop[], position: number): string {\n const sortedStops = [...stops].sort((first, second) => first.position - second.position);\n const first = sortedStops[0];\n const last = sortedStops[sortedStops.length - 1];\n if (position <= first.position) {\n return first.color;\n }\n if (position >= last.position) {\n return last.color;\n }\n\n for (let index = 0; index < sortedStops.length - 1; index++) {\n const start = sortedStops[index];\n const end = sortedStops[index + 1];\n if (position >= start.position && position <= end.position) {\n const range = end.position - start.position;\n const ratio = range === 0 ? 0 : (position - start.position) / range;\n return mixHexColors(start.color, end.color, ratio);\n }\n }\n return last.color;\n}\n","import type { GradientColor } from '../../model/color';\nimport { interpolateHexColorStops } from '../../model/color';\nimport { relativePositionOnAxis } from '../../model/geometry/axisPosition';\nimport type { LinkStyle } from '../../model/link';\n\ntype LinkColor = LinkStyle['color'] | { type: 'solid'; color: string } | null | undefined;\n\nexport function getLinkStrokeColor(colorValue: LinkColor): string | undefined {\n if (!colorValue) {\n return undefined;\n }\n if (typeof colorValue === 'string') {\n return colorValue;\n }\n if (colorValue.type === 'gradient') {\n return colorValue.stops?.[0]?.color;\n }\n if (colorValue.type === 'solid') {\n return colorValue.color;\n }\n return undefined;\n}\n\nexport function getLinkEndpointColor(colorValue: LinkColor, end: 'start' | 'end'): string | undefined {\n if (isGradientWithStops(colorValue)) {\n return end === 'start' ? colorValue.stops[0].color : colorValue.stops[colorValue.stops.length - 1].color;\n }\n return getLinkStrokeColor(colorValue);\n}\n\nexport function getLinkColorAtPoint(\n colorValue: LinkColor,\n points: number[],\n point: { x: number; y: number },\n): string | undefined {\n if (!isGradientWithStops(colorValue)) {\n return getLinkStrokeColor(colorValue);\n }\n if (points.length < 4) {\n return colorValue.stops[0]?.color;\n }\n\n const axisStart = { x: points[0], y: points[1] };\n const axisEnd = { x: points[points.length - 2], y: points[points.length - 1] };\n const relativePosition = relativePositionOnAxis(axisStart, axisEnd, point);\n return interpolateHexColorStops(colorValue.stops, relativePosition * 100);\n}\n\nfunction isGradientWithStops(colorValue: LinkColor): colorValue is GradientColor {\n return Boolean(\n colorValue && typeof colorValue === 'object' && colorValue.type === 'gradient' && colorValue.stops?.length,\n );\n}\n","import type { GradientColor } from '../../model/color';\nimport type { StrokeStyle } from '../../model/link';\n\nexport const getLinkGradientStrokeProps = (colorValue: string | GradientColor | null | undefined, points: number[]) => {\n if (!colorValue || typeof colorValue === 'string' || colorValue.type !== 'gradient') {\n return {};\n }\n\n if (points.length < 4) {\n return {};\n }\n\n const colorStops: (number | string)[] = [];\n colorValue.stops.forEach(stop => {\n colorStops.push(stop.position / 100);\n colorStops.push(stop.color);\n });\n\n return {\n strokeLinearGradientStartPoint: { x: points[0], y: points[1] },\n strokeLinearGradientEndPoint: { x: points[points.length - 2], y: points[points.length - 1] },\n strokeLinearGradientColorStops: colorStops,\n };\n};\n\nexport const getDashArray = (strokeWidth: number, strokeStyle: StrokeStyle): number[] | undefined => {\n switch (strokeStyle) {\n case 'dashed':\n return [strokeWidth * 8, strokeWidth * 4];\n case 'dotted':\n return [strokeWidth * 2, strokeWidth * 3];\n case 'solid':\n default:\n return undefined;\n }\n};\n","import type { TextMetrics } from './textMetrics';\n\nconst PLAIN_CHAR_FACTOR = 0.58;\nconst BOLD_CHAR_FACTOR = 0.64;\n\nexport function wrapText(text: string, width: number, fontSize: number, metrics?: TextMetrics): string[] {\n const maxChars = Math.max(1, Math.floor(width / Math.max(1, fontSize * PLAIN_CHAR_FACTOR)));\n const fits = metrics\n ? (line: string, word: string) =>\n metrics.measure(line, false) + metrics.spaceWidth + metrics.measure(word, false) <= width\n : (line: string, word: string) => `${line} ${word}`.length <= maxChars;\n const result: string[] = [];\n for (const rawLine of text.split('\\n')) {\n const words = rawLine.split(/\\s+/).filter(Boolean);\n if (!words.length) {\n result.push('');\n continue;\n }\n let line = '';\n for (const word of words) {\n if (!line) {\n line = word;\n } else if (fits(line, word)) {\n line += ` ${word}`;\n } else {\n result.push(line);\n line = word;\n }\n }\n result.push(line);\n }\n return result;\n}\n\nexport function estimateTextWidth(text: string, fontSize: number, bold: boolean): number {\n return text.length * fontSize * (bold ? BOLD_CHAR_FACTOR : PLAIN_CHAR_FACTOR);\n}\n\nexport function heuristicRichMeasure(fontSize: number): TextMetrics {\n return {\n measure: (text: string, bold: boolean) => estimateTextWidth(text, fontSize, bold),\n spaceWidth: fontSize * PLAIN_CHAR_FACTOR,\n };\n}\n","import type { Point } from '../../../../../model/geometry/types';\n\nexport type { Point } from '../../../../../model/geometry/types';\n\nexport const lerpPoint = (a: Point, b: Point, t: number): Point => ({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n});\n\nexport function cubicBezierPoint(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const mt = 1 - t;\n return {\n x: mt * mt * mt * p0.x + 3 * mt * mt * t * p1.x + 3 * mt * t * t * p2.x + t * t * t * p3.x,\n y: mt * mt * mt * p0.y + 3 * mt * mt * t * p1.y + 3 * mt * t * t * p2.y + t * t * t * p3.y,\n };\n}\n\nexport function splitCubicBezier(p0: Point, p1: Point, p2: Point, p3: Point, t: number) {\n const a = lerpPoint(p0, p1, t);\n const b = lerpPoint(p1, p2, t);\n const c = lerpPoint(p2, p3, t);\n const d = lerpPoint(a, b, t);\n const e = lerpPoint(b, c, t);\n const f = lerpPoint(d, e, t);\n return { left: [p0, a, d, f], right: [f, e, c, p3] };\n}\n\nexport function pointAtArcLength(points: number[], targetLength: number): { point: Point; segmentIndex: number } {\n const lastIndex = points.length - 2;\n if (targetLength <= 0) {\n return { point: { x: points[0], y: points[1] }, segmentIndex: 0 };\n }\n\n let accumulated = 0;\n for (let index = 0; index < lastIndex; index += 2) {\n const start = { x: points[index], y: points[index + 1] };\n const end = { x: points[index + 2], y: points[index + 3] };\n const length = Math.hypot(end.x - start.x, end.y - start.y);\n if (accumulated + length >= targetLength) {\n const ratio = length === 0 ? 0 : (targetLength - accumulated) / length;\n return { point: lerpPoint(start, end, ratio), segmentIndex: index };\n }\n accumulated += length;\n }\n return { point: { x: points[lastIndex], y: points[lastIndex + 1] }, segmentIndex: lastIndex };\n}\n\nexport function polylineLength(points: number[]): number {\n let total = 0;\n for (let index = 0; index < points.length - 2; index += 2) {\n total += Math.hypot(points[index + 2] - points[index], points[index + 3] - points[index + 1]);\n }\n return total;\n}\n\nexport function bezierArcLength(p0: Point, p1: Point, p2: Point, p3: Point, samples = 40): number {\n let total = 0;\n let previous = p0;\n for (let index = 1; index <= samples; index++) {\n const point = cubicBezierPoint(p0, p1, p2, p3, index / samples);\n total += Math.hypot(point.x - previous.x, point.y - previous.y);\n previous = point;\n }\n return total;\n}\n","import { cubicBezierPoint, type Point, splitCubicBezier } from './pathMetrics';\nimport type { LabelGapClearance, LabelGapSplit } from './types';\n\nconst SAMPLES = 40;\n\nfunction sampledArcLengths(points: [Point, Point, Point, Point]): number[] {\n const lengths = [0];\n let previous = points[0];\n for (let index = 1; index <= SAMPLES; index++) {\n const point = cubicBezierPoint(...points, index / SAMPLES);\n lengths.push(lengths[index - 1] + Math.hypot(point.x - previous.x, point.y - previous.y));\n previous = point;\n }\n return lengths;\n}\n\nfunction parameterAtLength(lengths: number[], target: number): number {\n const total = lengths[SAMPLES];\n if (target <= 0) {\n return 0;\n }\n if (target >= total) {\n return 1;\n }\n for (let index = 1; index <= SAMPLES; index++) {\n if (lengths[index] >= target) {\n const fraction = (target - lengths[index - 1]) / (lengths[index] - lengths[index - 1] || 1);\n return (index - 1 + fraction) / SAMPLES;\n }\n }\n return 1;\n}\n\nfunction projectedGapHalfLength(\n points: [Point, Point, Point, Point],\n clearance: LabelGapClearance,\n maximum: number,\n): number {\n const [p0, p1, p2, p3] = points;\n const dx = 0.75 * (p1.x - p0.x) + 1.5 * (p2.x - p1.x) + 0.75 * (p3.x - p2.x);\n const dy = 0.75 * (p1.y - p0.y) + 1.5 * (p2.y - p1.y) + 0.75 * (p3.y - p2.y);\n const length = Math.hypot(dx, dy);\n const ux = length === 0 ? 1 : Math.abs(dx) / length;\n const uy = length === 0 ? 0 : Math.abs(dy) / length;\n return Math.min(clearance.halfWidth * ux + clearance.halfHeight * uy, maximum);\n}\n\nexport function splitCurvedPath(flatPoints: number[], clearance: LabelGapClearance): LabelGapSplit | null {\n if (flatPoints.length < 8) {\n return null;\n }\n const points = curvedControlPoints(flatPoints);\n const lengths = sampledArcLengths(points);\n const total = lengths[SAMPLES];\n if (total === 0) {\n return null;\n }\n\n const half = total / 2;\n const maximumGap = Math.max(0, half - clearance.minimumVisibleStub);\n const gapHalfLength = projectedGapHalfLength(points, clearance, maximumGap);\n const beforeParameter = parameterAtLength(lengths, half - gapHalfLength);\n const afterParameter = parameterAtLength(lengths, half + gapHalfLength);\n return {\n before: curvedPathBeforeGap(points, beforeParameter),\n after: curvedPathAfterGap(points, afterParameter),\n bezier: true,\n };\n}\n\nfunction curvedControlPoints(flatPoints: number[]): [Point, Point, Point, Point] {\n return [\n { x: flatPoints[0], y: flatPoints[1] },\n { x: flatPoints[2], y: flatPoints[3] },\n { x: flatPoints[4], y: flatPoints[5] },\n { x: flatPoints[6], y: flatPoints[7] },\n ];\n}\n\nfunction curvedPathBeforeGap(points: [Point, Point, Point, Point], parameter: number): number[] | null {\n if (parameter <= 0.01) {\n return null;\n }\n return splitCubicBezier(...points, parameter).left.flatMap(point => [point.x, point.y]);\n}\n\nfunction curvedPathAfterGap(points: [Point, Point, Point, Point], parameter: number): number[] | null {\n if (parameter >= 0.99) {\n return null;\n }\n return splitCubicBezier(...points, parameter).right.flatMap(point => [point.x, point.y]);\n}\n","import { type Point, pointAtArcLength, polylineLength } from './pathMetrics';\nimport type { LabelGapClearance, LabelGapSplit } from './types';\n\ntype PolylineGapPlacement = {\n beforeLength: number;\n afterLength: number;\n};\n\nexport function splitPolylinePath(points: number[], clearance: LabelGapClearance): LabelGapSplit | null {\n if (points.length < 4) {\n return null;\n }\n const total = polylineLength(points);\n if (total === 0) {\n return null;\n }\n\n const placement = polylineGapPlacement(points, total, clearance);\n return {\n before: polylineBeforeGap(points, placement.beforeLength),\n after: polylineAfterGap(points, placement.afterLength, total),\n bezier: false,\n };\n}\n\nfunction polylineGapPlacement(\n points: number[],\n totalLength: number,\n clearance: LabelGapClearance,\n): PolylineGapPlacement {\n const half = totalLength / 2;\n const midpoint = pointAtArcLength(points, half);\n const start = { x: points[midpoint.segmentIndex], y: points[midpoint.segmentIndex + 1] };\n const end = { x: points[midpoint.segmentIndex + 2], y: points[midpoint.segmentIndex + 3] };\n const gapHalfLength = projectedPolylineGap(start, end, clearance, half);\n return { beforeLength: half - gapHalfLength, afterLength: half + gapHalfLength };\n}\n\nfunction projectedPolylineGap(start: Point, end: Point, clearance: LabelGapClearance, halfLength: number): number {\n const segmentLength = Math.hypot(end.x - start.x, end.y - start.y);\n const horizontalShare = segmentLength === 0 ? 1 : Math.abs(end.x - start.x) / segmentLength;\n const verticalShare = segmentLength === 0 ? 0 : Math.abs(end.y - start.y) / segmentLength;\n const projectedClearance = clearance.halfWidth * horizontalShare + clearance.halfHeight * verticalShare;\n return Math.min(projectedClearance, Math.max(0, halfLength - clearance.minimumVisibleStub));\n}\n\nfunction polylineBeforeGap(points: number[], splitLength: number): number[] | null {\n if (splitLength <= 0.5) {\n return null;\n }\n const split = pointAtArcLength(points, splitLength);\n return [...points.slice(0, split.segmentIndex + 2), split.point.x, split.point.y];\n}\n\nfunction polylineAfterGap(points: number[], splitLength: number, totalLength: number): number[] | null {\n if (splitLength >= totalLength - 0.5) {\n return null;\n }\n const split = pointAtArcLength(points, splitLength);\n return [split.point.x, split.point.y, ...points.slice(split.segmentIndex + 2)];\n}\n","import type { PathType } from '../../../../../model/link';\nimport { splitCurvedPath } from './curvedGap';\nimport { bezierArcLength, type Point, polylineLength } from './pathMetrics';\nimport { splitPolylinePath } from './polylineGap';\nimport type { LabelGapClearance, LabelGapDash, LabelGapSplit } from './types';\n\nconst LABEL_GAP_PADDING = 3;\nconst MIN_VISIBLE_STUB = 10;\n\nfunction bezierPoints(points: number[]): [Point, Point, Point, Point] {\n return [\n { x: points[0], y: points[1] },\n { x: points[2], y: points[3] },\n { x: points[4], y: points[5] },\n { x: points[6], y: points[7] },\n ];\n}\n\nfunction pathLength(points: number[], bezier: boolean): number {\n if (bezier) {\n return bezierArcLength(...bezierPoints(points));\n }\n return polylineLength(points);\n}\n\nexport function splitPathAroundLabel(\n points: number[],\n pathType: PathType,\n gapWidth: number,\n gapHeight: number,\n): LabelGapSplit | null {\n const clearance: LabelGapClearance = {\n halfWidth: (gapWidth + LABEL_GAP_PADDING) / 2,\n halfHeight: (gapHeight + LABEL_GAP_PADDING) / 2,\n minimumVisibleStub: MIN_VISIBLE_STUB,\n };\n if (pathType === 'curved') {\n return splitCurvedPath(points, clearance);\n }\n return splitPolylinePath(points, clearance);\n}\n\nexport function labelGapDash(\n points: number[],\n pathType: PathType,\n gapWidth: number,\n gapHeight: number,\n): LabelGapDash | null {\n const split = splitPathAroundLabel(points, pathType, gapWidth, gapHeight);\n if (!split || (!split.before && !split.after)) {\n return null;\n }\n\n const totalLength = pathLength(points, split.bezier);\n const dashBefore = split.before ? pathLength(split.before, split.bezier) : 0;\n const afterLength = split.after ? pathLength(split.after, split.bezier) : 0;\n const gapLength = Math.max(0, totalLength - dashBefore - afterLength);\n if (gapLength <= 0) {\n return null;\n }\n return { dashBefore, gapLength };\n}\n","import type { PathType } from '../../../../../model/link';\nimport type { MarkerPoint } from './types';\n\nfunction curvedMidpoint(points: number[]): MarkerPoint {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = points;\n const t = 0.5;\n const mt = 1 - t;\n return {\n x: mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3,\n y: mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3,\n };\n}\n\nfunction orthogonalMidpoint(points: number[], fallback: MarkerPoint): MarkerPoint {\n let totalLength = 0;\n const segments: Array<{ start: MarkerPoint; end: MarkerPoint; length: number }> = [];\n for (let index = 0; index < points.length - 2; index += 2) {\n const start = { x: points[index], y: points[index + 1] };\n const end = { x: points[index + 2], y: points[index + 3] };\n const length = Math.sqrt((end.x - start.x) ** 2 + (end.y - start.y) ** 2);\n totalLength += length;\n segments.push({ start, end, length });\n }\n const halfLength = totalLength / 2;\n let accumulatedLength = 0;\n for (const segment of segments) {\n if (accumulatedLength + segment.length >= halfLength) {\n const ratio = (halfLength - accumulatedLength) / segment.length;\n return {\n x: segment.start.x + ratio * (segment.end.x - segment.start.x),\n y: segment.start.y + ratio * (segment.end.y - segment.start.y),\n };\n }\n accumulatedLength += segment.length;\n }\n return fallback;\n}\n\nexport function getLineMidpoint(\n points: number[],\n pathType: PathType,\n effectiveFrom: MarkerPoint,\n effectiveTo: MarkerPoint,\n): MarkerPoint {\n if (pathType === 'curved') {\n return curvedMidpoint(points);\n }\n const fallback = {\n x: (effectiveFrom.x + effectiveTo.x) / 2,\n y: (effectiveFrom.y + effectiveTo.y) / 2,\n };\n if (pathType === 'orthogonal') {\n return orthogonalMidpoint(points, fallback);\n }\n return fallback;\n}\n","import type { Side } from '../../../../../model/geometry/types';\n\nexport function 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","import type { Side } from '../../../../../model/geometry/types';\nimport { sideNormal } from './sideNormal';\n\nfunction controlDistances(\n from: { x: number; y: number },\n to: { x: number; y: number },\n fromNormal: [number, number],\n toNormal: [number, number],\n options?: { min?: number; max?: number; perpendicularScale?: number },\n): { fromDistance: number; toDistance: number } {\n const minimum = options?.min ?? 50;\n const maximum = options?.max ?? 240;\n const perpendicularScale = options?.perpendicularScale ?? 0.9;\n const deltaX = to.x - from.x;\n const deltaY = to.y - from.y;\n const alongFrom = Math.abs(deltaX * fromNormal[0] + deltaY * fromNormal[1]);\n const alongTo = Math.abs(deltaX * toNormal[0] + deltaY * toNormal[1]);\n const perpendicularFrom = Math.abs(deltaX * fromNormal[1] - deltaY * fromNormal[0]);\n const perpendicularTo = Math.abs(deltaX * toNormal[1] - deltaY * toNormal[0]);\n const parallel =\n (fromNormal[0] === toNormal[0] && fromNormal[1] === toNormal[1]) ||\n (fromNormal[0] === -toNormal[0] && fromNormal[1] === -toNormal[1]);\n\n let fromDistance = Math.max(minimum, Math.min(maximum, Math.max(alongFrom, perpendicularFrom * perpendicularScale)));\n let toDistance = Math.max(minimum, Math.min(maximum, Math.max(alongTo, perpendicularTo * perpendicularScale)));\n if (parallel) {\n fromDistance = Math.min(maximum, fromDistance + perpendicularFrom * 0.75);\n toDistance = Math.min(maximum, toDistance + perpendicularTo * 0.75);\n }\n return { fromDistance, toDistance };\n}\n\nexport function routeCubic(\n from: { x: number; y: number },\n to: { x: number; y: number },\n fromSide: Side,\n toSide: Side,\n options?: { min?: number; max?: number; perpendicularScale?: number },\n): { p0: [number, number]; p1: [number, number]; p2: [number, number]; p3: [number, number] } {\n const fromNormal = sideNormal(fromSide);\n const toNormal = sideNormal(toSide);\n const { fromDistance, toDistance } = controlDistances(from, to, fromNormal, toNormal, options);\n return {\n p0: [from.x, from.y],\n p1: [from.x + fromNormal[0] * fromDistance, from.y + fromNormal[1] * fromDistance],\n p2: [to.x + toNormal[0] * toDistance, to.y + toNormal[1] * toDistance],\n p3: [to.x, to.y],\n };\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport { routeCubic } from './cubic';\nimport type { LinkRoute, LinkRoutePoint } from './types';\n\nexport function calculateCurvedLinkRoute(\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n fromSide: Side,\n toSide: Side,\n): LinkRoute {\n const { p0, p1, p2, p3 } = routeCubic(from, to, fromSide, toSide, {\n min: 35,\n max: 90,\n perpendicularScale: 0.5,\n });\n return { points: [...p0, ...p1, ...p2, ...p3], segments: [] };\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport type { LinkRoutePoint } from './types';\n\nexport interface RouteConnection {\n side: Side;\n normal: [number, number];\n stub: [number, number];\n}\n\nexport interface OrthogonalRouteDraft {\n from: LinkRoutePoint;\n to: LinkRoutePoint;\n fromConnection: RouteConnection;\n toConnection: RouteConnection;\n horizontalFirst: boolean;\n}\n\nexport function snapAlignedEndpoints(\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n fromSide: Side,\n toSide: Side,\n): [LinkRoutePoint, LinkRoutePoint] {\n const threshold = 6;\n const verticalPair = ['top', 'bottom'].includes(fromSide) && ['top', 'bottom'].includes(toSide);\n const horizontalPair = ['left', 'right'].includes(fromSide) && ['left', 'right'].includes(toSide);\n if (verticalPair && Math.abs(to.x - from.x) < threshold) {\n return [from, { ...to, x: from.x }];\n }\n if (horizontalPair && Math.abs(to.y - from.y) < threshold) {\n return [from, { ...to, y: from.y }];\n }\n return [from, to];\n}\n\nexport function chooseInitialOrientation(\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n endpointEdges?: { fromEdge?: Side; toEdge?: Side },\n): boolean {\n if (endpointEdges?.toEdge) {\n return endpointEdges.toEdge === 'left' || endpointEdges.toEdge === 'right';\n }\n if (endpointEdges?.fromEdge) {\n return endpointEdges.fromEdge === 'left' || endpointEdges.fromEdge === 'right';\n }\n return Math.abs(to.x - from.x) > Math.abs(to.y - from.y);\n}\n\nexport function stepOutDistances(\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n fromNormal: [number, number],\n toNormal: [number, number],\n horizontalFirst: boolean,\n): [number, number] {\n let fromDistance = 40;\n let toDistance = 40;\n const axis = horizontalFirst ? 0 : 1;\n const delta = horizontalFirst ? to.x - from.x : to.y - from.y;\n if (fromNormal[axis] !== 0 && fromNormal[axis] === -toNormal[axis]) {\n const gap = delta * fromNormal[axis];\n if (gap > 0 && gap < fromDistance + toDistance) {\n fromDistance = gap / 2;\n toDistance = gap / 2;\n }\n } else if (fromNormal[axis] === 0) {\n const gap = delta * -toNormal[axis];\n if (gap > 0 && gap < toDistance) {\n toDistance = gap;\n }\n }\n return [fromDistance, toDistance];\n}\n\nexport function chooseBend(route: OrthogonalRouteDraft): [number, number] {\n const { fromConnection, toConnection, to, horizontalFirst } = route;\n const fromStub = fromConnection.stub;\n const toStub = toConnection.stub;\n let x = (fromStub[0] + toStub[0]) / 2;\n let y = (fromStub[1] + toStub[1]) / 2;\n const fromHorizontal = isHorizontalSide(fromConnection.side);\n const toHorizontal = isHorizontalSide(toConnection.side);\n if (fromHorizontal !== toHorizontal) {\n if (horizontalFirst) {\n x = (fromStub[0] - to.x) * toConnection.normal[0] >= 0 ? fromStub[0] : toStub[0];\n } else {\n y = (fromStub[1] - to.y) * toConnection.normal[1] >= 0 ? fromStub[1] : toStub[1];\n }\n } else if (fromConnection.side === toConnection.side) {\n if (horizontalFirst) {\n x = fromConnection.normal[0] < 0 ? Math.min(fromStub[0], toStub[0]) : Math.max(fromStub[0], toStub[0]);\n } else {\n y = fromConnection.normal[1] < 0 ? Math.min(fromStub[1], toStub[1]) : Math.max(fromStub[1], toStub[1]);\n }\n }\n return [x, y];\n}\n\nfunction isHorizontalSide(side: Side): boolean {\n return side === 'left' || side === 'right';\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport type { OrthogonalRouteDraft } from './orthogonalPlan';\nimport type { LinkRoutePoint } from './types';\n\nexport function segmentMidpoints(points: number[]): LinkRoutePoint[] {\n const midpoints: LinkRoutePoint[] = [];\n for (let index = 0; index < points.length - 2; index += 2) {\n midpoints.push({\n x: (points[index] + points[index + 2]) / 2,\n y: (points[index + 1] + points[index + 3]) / 2,\n });\n }\n return midpoints;\n}\n\nexport function baseOrthogonalPoints(route: OrthogonalRouteDraft, bend: [number, number]): number[] {\n const { from, to, fromConnection, toConnection, horizontalFirst } = route;\n const fromStub = fromConnection.stub;\n const toStub = toConnection.stub;\n const points = [from.x, from.y, fromStub[0], fromStub[1]];\n if (horizontalFirst) {\n points.push(bend[0], fromStub[1], bend[0], toStub[1]);\n } else {\n points.push(fromStub[0], bend[1], toStub[0], bend[1]);\n }\n points.push(toStub[0], toStub[1], to.x, to.y);\n return points;\n}\n\nexport function movableInnerSegments(horizontalFirst: boolean, fromSide: Side, toSide: Side): [boolean, boolean] {\n const fixedSides = horizontalFirst ? ['left', 'right'] : ['top', 'bottom'];\n return [!fixedSides.includes(fromSide), !fixedSides.includes(toSide)];\n}\n\nexport function offsetOrthogonalPoints(\n route: OrthogonalRouteDraft,\n bend: [number, number],\n segmentOffsets: number[] | undefined,\n movable: [boolean, boolean],\n): number[] {\n const { from, to, fromConnection, toConnection, horizontalFirst } = route;\n const fromStub = fromConnection.stub;\n const toStub = toConnection.stub;\n const first = movable[0] ? segmentOffsets?.[1] || 0 : 0;\n const middle = segmentOffsets?.[2] || 0;\n const last = movable[1] ? segmentOffsets?.[3] || 0 : 0;\n if (horizontalFirst) {\n const fromY = fromStub[1] + first;\n const bendX = bend[0] + middle;\n const toY = toStub[1] + last;\n return [from.x, from.y, fromStub[0], fromY, bendX, fromY, bendX, toY, toStub[0], toY, to.x, to.y];\n }\n const fromX = fromStub[0] + first;\n const bendY = bend[1] + middle;\n const toX = toStub[0] + last;\n return [from.x, from.y, fromX, fromStub[1], fromX, bendY, toX, bendY, toX, toStub[1], to.x, to.y];\n}\n","import type { LinkRoutePoint, PathSegment } from './types';\n\nexport function describeSegments(\n points: number[],\n originalMidpoints: LinkRoutePoint[],\n canMoveFirstInner: boolean,\n canMoveLastInner: boolean,\n): PathSegment[] {\n const totalSegments = (points.length - 2) / 2;\n return originalMidpoints.map((originalMidpoint, segmentIndex) => {\n const offset = segmentIndex * 2;\n const start = { x: points[offset], y: points[offset + 1] };\n const end = { x: points[offset + 2], y: points[offset + 3] };\n const midpoint = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\n const isInner = segmentIndex > 0 && segmentIndex < totalSegments - 1;\n const isMovableEdge =\n segmentIndex === 1 ? canMoveFirstInner : segmentIndex === totalSegments - 2 ? canMoveLastInner : true;\n const hasLength = Math.hypot(end.x - start.x, end.y - start.y) >= 1;\n return {\n start,\n end,\n midpoint,\n originalMidpoint,\n isHorizontal: Math.abs(end.x - start.x) > Math.abs(end.y - start.y),\n canMove: isInner && isMovableEdge && hasLength,\n };\n });\n}\n","import type { Point } from '../../../../../model/geometry/types';\n\ninterface RoundedCorner {\n entry: Point;\n exit: Point;\n center: Point;\n radius: number;\n startAngle: number;\n angleSweep: number;\n}\n\nconst CORNER_SAMPLE_COUNT = 8;\n\nexport function roundOrthogonalPoints(coordinates: number[], maximumRadius: number): number[] {\n if (coordinates.length < 6) {\n return coordinates;\n }\n const points = coordinatePoints(coordinates);\n const roundedPoints = [points[0]];\n for (let index = 1; index < points.length - 1; index++) {\n const corner = createRoundedCorner(points[index - 1], points[index], points[index + 1], maximumRadius);\n roundedPoints.push(...(corner ? sampleRoundedCorner(corner) : [points[index]]));\n }\n roundedPoints.push(points[points.length - 1]);\n return roundedPoints.flatMap(point => [point.x, point.y]);\n}\n\nfunction createRoundedCorner(previous: Point, corner: Point, next: Point, maximumRadius: number): RoundedCorner | null {\n const incoming = { x: corner.x - previous.x, y: corner.y - previous.y };\n const outgoing = { x: next.x - corner.x, y: next.y - corner.y };\n const incomingIsAxisAligned = incoming.x === 0 || incoming.y === 0;\n const outgoingIsAxisAligned = outgoing.x === 0 || outgoing.y === 0;\n const isStraight = (incoming.x === 0 && outgoing.x === 0) || (incoming.y === 0 && outgoing.y === 0);\n if (!incomingIsAxisAligned || !outgoingIsAxisAligned || isStraight) {\n return null;\n }\n const radius = Math.min(maximumRadius, axisLength(incoming) * 0.4, axisLength(outgoing) * 0.4);\n if (radius <= 0) {\n return null;\n }\n const incomingDirection = axisDirection(incoming);\n const outgoingDirection = axisDirection(outgoing);\n const entry = offsetPoint(corner, incomingDirection, -radius);\n const exit = offsetPoint(corner, outgoingDirection, radius);\n const center = offsetPoint(entry, outgoingDirection, radius);\n const startAngle = Math.atan2(entry.y - center.y, entry.x - center.x);\n const endAngle = Math.atan2(exit.y - center.y, exit.x - center.x);\n return { entry, exit, center, radius, startAngle, angleSweep: normalizedAngleSweep(endAngle - startAngle) };\n}\n\nfunction offsetPoint(point: Point, direction: Point, distance: number): Point {\n return { x: point.x + direction.x * distance, y: point.y + direction.y * distance };\n}\n\nfunction axisLength(vector: Point): number {\n return Math.abs(vector.x) + Math.abs(vector.y);\n}\n\nfunction axisDirection(vector: Point): Point {\n return { x: vector.x !== 0 ? Math.sign(vector.x) : 0, y: vector.y !== 0 ? Math.sign(vector.y) : 0 };\n}\n\nfunction normalizedAngleSweep(angle: number): number {\n if (angle > Math.PI) {\n return angle - 2 * Math.PI;\n }\n if (angle < -Math.PI) {\n return angle + 2 * Math.PI;\n }\n return angle;\n}\n\nfunction sampleRoundedCorner(corner: RoundedCorner): Point[] {\n const points = [corner.entry];\n for (let sampleIndex = 1; sampleIndex < CORNER_SAMPLE_COUNT - 1; sampleIndex++) {\n const progress = sampleIndex / (CORNER_SAMPLE_COUNT - 1);\n const angle = corner.startAngle + corner.angleSweep * progress;\n points.push({\n x: corner.center.x + Math.cos(angle) * corner.radius,\n y: corner.center.y + Math.sin(angle) * corner.radius,\n });\n }\n points.push(corner.exit);\n return points;\n}\n\nfunction coordinatePoints(coordinates: number[]): Point[] {\n const points: Point[] = [];\n for (let index = 0; index < coordinates.length; index += 2) {\n points.push({ x: coordinates[index], y: coordinates[index + 1] });\n }\n return points;\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport {\n chooseBend,\n chooseInitialOrientation,\n type OrthogonalRouteDraft,\n type RouteConnection,\n snapAlignedEndpoints,\n stepOutDistances,\n} from './orthogonalPlan';\nimport {\n baseOrthogonalPoints,\n movableInnerSegments,\n offsetOrthogonalPoints,\n segmentMidpoints,\n} from './orthogonalPoints';\nimport { describeSegments } from './orthogonalSegments';\nimport { roundOrthogonalPoints } from './rounding';\nimport { sideNormal } from './sideNormal';\nimport type { LinkRoute, LinkRoutePoint } from './types';\n\ninterface OrthogonalRouteRequest {\n from: LinkRoutePoint;\n to: LinkRoutePoint;\n fromSide: Side;\n toSide: Side;\n segmentOffsets?: number[];\n endpointEdges?: { fromEdge?: Side; toEdge?: Side };\n}\n\nexport function routeOrthogonal(request: OrthogonalRouteRequest): LinkRoute {\n const routeDraft = createOrthogonalRouteDraft(request);\n const bend = chooseBend(routeDraft);\n const originalPoints = baseOrthogonalPoints(routeDraft, bend);\n const originalSegmentMidpoints = segmentMidpoints(originalPoints);\n const movableSegments = movableInnerSegments(routeDraft.horizontalFirst, request.fromSide, request.toSide);\n const points = offsetOrthogonalPoints(routeDraft, bend, request.segmentOffsets, movableSegments);\n const segments = describeSegments(points, originalSegmentMidpoints, movableSegments[0], movableSegments[1]);\n return { points: roundOrthogonalPoints(points, 10), segments };\n}\n\nfunction createOrthogonalRouteDraft(request: OrthogonalRouteRequest): OrthogonalRouteDraft {\n const [alignedFrom, alignedTo] = snapAlignedEndpoints(request.from, request.to, request.fromSide, request.toSide);\n const fromNormal = sideNormal(request.fromSide);\n const toNormal = sideNormal(request.toSide);\n const horizontalFirst = chooseInitialOrientation(alignedFrom, alignedTo, request.endpointEdges);\n const [fromDistance, toDistance] = stepOutDistances(alignedFrom, alignedTo, fromNormal, toNormal, horizontalFirst);\n return {\n from: alignedFrom,\n to: alignedTo,\n fromConnection: createRouteConnection(alignedFrom, request.fromSide, fromNormal, fromDistance),\n toConnection: createRouteConnection(alignedTo, request.toSide, toNormal, toDistance),\n horizontalFirst,\n };\n}\n\nfunction createRouteConnection(\n point: LinkRoutePoint,\n side: Side,\n normal: [number, number],\n distance: number,\n): RouteConnection {\n return { side, normal, stub: [point.x + normal[0] * distance, point.y + normal[1] * distance] };\n}\n","import { roundOrthogonalPoints } from './rounding';\nimport type { LinkRoute, LinkRoutePoint, PathSegment } from './types';\n\nconst ORTHOGONAL_EPSILON = 0.5;\n\nexport function pathFromWaypoints(from: LinkRoutePoint, waypoints: LinkRoutePoint[], to: LinkRoutePoint): LinkRoute {\n const corners = [from, ...waypoints, to];\n const points: number[] = [];\n for (const point of corners) {\n points.push(point.x, point.y);\n }\n\n const segments: PathSegment[] = [];\n for (let index = 0; index < points.length - 2; index += 2) {\n const start = { x: points[index], y: points[index + 1] };\n const end = { x: points[index + 2], y: points[index + 3] };\n const midpoint = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\n segments.push({\n start,\n end,\n midpoint,\n originalMidpoint: midpoint,\n isHorizontal: Math.abs(end.x - start.x) > Math.abs(end.y - start.y),\n canMove: false,\n });\n }\n\n return { points: roundOrthogonalPoints(points, 10), segments };\n}\n\nexport function isAxisAligned(segments: PathSegment[]): boolean {\n return segments.every(segment => {\n const dx = Math.abs(segment.end.x - segment.start.x);\n const dy = Math.abs(segment.end.y - segment.start.y);\n return dx <= ORTHOGONAL_EPSILON || dy <= ORTHOGONAL_EPSILON;\n });\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport type { Link } from '../../../../../model/link';\nimport { routeOrthogonal } from './orthogonal';\nimport type { LinkRoute, LinkRoutePoint } from './types';\nimport { isAxisAligned, pathFromWaypoints } from './waypoints';\n\nexport function calculateOrthogonalLinkRoute(\n link: Link,\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n fromSide: Side,\n toSide: Side,\n): LinkRoute {\n if (link.waypoints && link.waypoints.length > 0) {\n const waypointResult = pathFromWaypoints(from, link.waypoints, to);\n if (isAxisAligned(waypointResult.segments)) {\n return waypointResult;\n }\n }\n\n const endpointEdges = { fromEdge: fromSide, toEdge: toSide };\n const request = { from, to, fromSide, toSide, segmentOffsets: link.segmentOffsets, endpointEdges };\n const route = routeOrthogonal(request);\n if (isAxisAligned(route.segments)) {\n return route;\n }\n return routeOrthogonal({ ...request, segmentOffsets: undefined });\n}\n","import type { Side } from '../../../../../model/geometry/types';\nimport type { Link } from '../../../../../model/link';\nimport type { LinkRoutePoint } from './types';\n\nfunction facingSide(from: LinkRoutePoint, to: LinkRoutePoint): 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\nexport function connectionSides(\n link: Link,\n from: LinkRoutePoint,\n to: LinkRoutePoint,\n): { fromSide: Side; toSide: Side } {\n const fromSide = link.fromPoint?.kind === 'side' ? link.fromPoint.side : facingSide(from, to);\n const toSide = link.toPoint?.kind === 'side' ? link.toPoint.side : facingSide(to, from);\n return { fromSide, toSide };\n}\n","import type { LinkRoute, LinkRoutePoint } from './types';\n\nexport function calculateStraightLinkRoute(from: LinkRoutePoint, to: LinkRoutePoint): LinkRoute {\n return { points: [from.x, from.y, to.x, to.y], segments: [] };\n}\n","import type { Link, PathType } from '../../../../model/link';\nimport { calculateCurvedLinkRoute } from './routing/curvedRoute';\nimport { calculateOrthogonalLinkRoute } from './routing/orthogonalRoute';\nimport { connectionSides } from './routing/sides';\nimport { calculateStraightLinkRoute } from './routing/straightRoute';\nimport type { LinkRoute, LinkRoutePoint } from './routing/types';\n\nexport type { LinkRoute } from './routing/types';\nexport function calculateLinkRoute(\n link: Link,\n effectiveFrom: LinkRoutePoint,\n effectiveTo: LinkRoutePoint,\n pathType: PathType,\n): LinkRoute {\n const { fromSide, toSide } = connectionSides(link, effectiveFrom, effectiveTo);\n if (pathType === 'curved') {\n return calculateCurvedLinkRoute(effectiveFrom, effectiveTo, fromSide, toSide);\n }\n if (pathType === 'orthogonal') {\n return calculateOrthogonalLinkRoute(link, effectiveFrom, effectiveTo, fromSide, toSide);\n }\n return calculateStraightLinkRoute(effectiveFrom, effectiveTo);\n}\n","import type { RenderInput } from '../../../renderInput/types';\nimport type { MeasureTextFactory, SceneStyle } from '../../scene';\nimport { DEFAULT_FONT, finite } from '../../scene';\nimport { getLinkStrokeColor } from '../../scene/linkPaint';\nimport { getDashArray } from '../../scene/linkStroke';\nimport { resolveShadow } from '../../scene/shadow';\nimport { wrapText } from '../../scene/textLayout';\nimport { calculateLinkRoute, getLineMidpoint, labelGapDash } from './geometry';\nimport type { LinkLabelLayout, LinkRenderContext } from './types';\n\nfunction linkBounds(points: number[], padding: number) {\n const xs = points.filter((_, index) => index % 2 === 0);\n const ys = points.filter((_, index) => index % 2 === 1);\n return {\n minX: Math.min(...xs) - padding,\n minY: Math.min(...ys) - padding,\n maxX: Math.max(...xs) + padding,\n maxY: Math.max(...ys) + padding,\n };\n}\n\nfunction labelLayout(link: RenderInput['links'][number]['link'], measureText?: MeasureTextFactory): LinkLabelLayout {\n const visible = Boolean(link.showText && link.text);\n const fontSize = finite(link.style?.fontSize, 10);\n const width = Math.min(250, Math.max(fontSize * 2, (link.text?.length ?? 0) * fontSize * 0.65 + 10));\n const metrics = measureText?.(link.style?.fontFamily ?? DEFAULT_FONT, fontSize);\n const lines = visible ? wrapText(link.text ?? '', width, fontSize, metrics) : [];\n return { visible, fontSize, width, height: lines.length * fontSize * 1.4, lines };\n}\n\nfunction linkStyle(\n item: RenderInput['links'][number],\n strokeWidth: number,\n color: string,\n dash: number[] | undefined,\n): SceneStyle {\n const link = item.link;\n const stroke =\n typeof link.style?.color === 'object' && link.style.color.type === 'gradient'\n ? {\n kind: 'linear-gradient' as const,\n angle: 0,\n stops: link.style.color.stops.map(stop => ({ offset: stop.position, color: stop.color })),\n }\n : { kind: 'solid' as const, color };\n return {\n fill: { kind: 'none' },\n stroke,\n strokeWidth,\n dash,\n lineCap: 'round',\n lineJoin: 'round',\n opacity: finite(link.style?.opacity, 1),\n shadow: resolveShadow(link.style?.shadow),\n };\n}\n\nexport function createLinkRenderContext(\n item: RenderInput['links'][number],\n index: number,\n measureText?: MeasureTextFactory,\n): LinkRenderContext {\n const { link, from, to } = item;\n const pathType = link.style?.pathType ?? 'orthogonal';\n const { points, segments } = calculateLinkRoute(link, from, to, pathType);\n const strokeWidth = finite(link.style?.strokeWidth, 2);\n const color = getLinkStrokeColor(link.style?.color) || '#64748b';\n const label = labelLayout(link, measureText);\n const contentDash = getDashArray(strokeWidth, link.style?.strokeStyle ?? 'solid');\n const gap = label.visible && !contentDash ? labelGapDash(points, pathType, label.width, label.height) : null;\n const dash = gap ? [gap.dashBefore, gap.gapLength, 1e6] : contentDash;\n return {\n link,\n pathType,\n points,\n segments,\n midpoint: getLineMidpoint(points, pathType, from, to),\n strokeWidth,\n bounds: linkBounds(points, strokeWidth + 14),\n color,\n order: 20_000 + index,\n style: linkStyle(item, strokeWidth, color, dash),\n label,\n hasLabelGap: Boolean(gap),\n };\n}\n","import type { Link, MarkerType } from '../../../model/link';\n\nexport function markerForEnd(link: Link, end: 'start' | 'end'): MarkerType {\n const explicit = end === 'start' ? link.startMarker : link.endMarker;\n if (explicit) {\n return explicit;\n }\n const direction = link.style?.arrowDirection ?? 'forward';\n if (direction === 'bidirectional') {\n return 'arrow';\n }\n if (end === 'start' && direction === 'backward') {\n return 'arrow';\n }\n if (end === 'end' && direction === 'forward') {\n return 'arrow';\n }\n return 'none';\n}\n","import type { PathSegment } from './geometry/routing/types';\n\nexport function roundedOrthogonalPathData(segments: PathSegment[], radius: number): string {\n if (segments.length === 0) {\n return '';\n }\n const raw = [segments[0].start, ...segments.map(segment => segment.end)];\n const points = raw.filter(\n (point, index) => index === 0 || point.x !== raw[index - 1].x || point.y !== raw[index - 1].y,\n );\n const corners = points.filter((point, index) => {\n if (index === 0 || index === points.length - 1) {\n return true;\n }\n const previous = points[index - 1];\n const next = points[index + 1];\n return !((previous.x === point.x && point.x === next.x) || (previous.y === point.y && point.y === next.y));\n });\n if (corners.length < 2) {\n return '';\n }\n\n let pathData = `M ${corners[0].x} ${corners[0].y}`;\n for (let index = 1; index < corners.length - 1; index++) {\n const previous = corners[index - 1];\n const corner = corners[index];\n const next = corners[index + 1];\n const incoming = Math.hypot(corner.x - previous.x, corner.y - previous.y);\n const outgoing = Math.hypot(next.x - corner.x, next.y - corner.y);\n if (incoming === 0 || outgoing === 0) {\n pathData += ` L ${corner.x} ${corner.y}`;\n continue;\n }\n const cornerRadius = Math.min(radius, incoming * 0.4, outgoing * 0.4);\n const before = {\n x: corner.x + ((previous.x - corner.x) / incoming) * cornerRadius,\n y: corner.y + ((previous.y - corner.y) / incoming) * cornerRadius,\n };\n const after = {\n x: corner.x + ((next.x - corner.x) / outgoing) * cornerRadius,\n y: corner.y + ((next.y - corner.y) / outgoing) * cornerRadius,\n };\n pathData += ` L ${before.x} ${before.y} Q ${corner.x} ${corner.y} ${after.x} ${after.y}`;\n }\n const last = corners[corners.length - 1];\n return `${pathData} L ${last.x} ${last.y}`;\n}\n","import type { PathType } from '../../../model/link';\nimport type { SceneLinkSegment, ScenePath } from '../../scene';\nimport type { PathSegment } from './geometry/routing/types';\nimport { markerForEnd } from './markers';\nimport { roundedOrthogonalPathData } from './roundedOrthogonalPathData';\nimport type { LinkRenderContext } from './types';\n\nfunction polylinePathData(points: number[]): string {\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\nfunction pathData(points: number[], pathType: PathType, segments: PathSegment[], strokeWidth: number): string {\n if (points.length < 4) {\n return '';\n }\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\nconst round = (value: number): number => Math.round(value * 100) / 100;\n\nfunction movableSegments(pathType: PathType, segments: PathSegment[]): SceneLinkSegment[] | undefined {\n if (pathType !== 'orthogonal' || !segments.some(segment => segment.canMove)) {\n return undefined;\n }\n return segments.map(segment => ({\n ax: round(segment.start.x),\n ay: round(segment.start.y),\n bx: round(segment.end.x),\n by: round(segment.end.y),\n ox: round(segment.originalMidpoint.x),\n oy: round(segment.originalMidpoint.y),\n movable: segment.canMove,\n }));\n}\n\nexport function renderLinkPath(context: LinkRenderContext): ScenePath {\n const { link } = context;\n return {\n type: 'path',\n id: `link-${link.id}`,\n order: context.order,\n bounds: context.bounds,\n d: pathData(context.points, context.pathType, context.segments, context.strokeWidth),\n style: context.style,\n markerStart: markerForEnd(link, 'start'),\n markerEnd: markerForEnd(link, 'end'),\n detail: {\n of: 'link',\n fromId: link.fromId,\n toId: link.toId,\n route: context.pathType,\n fromSide: link.fromPoint?.kind === 'side' ? link.fromPoint.side : undefined,\n toSide: link.toPoint?.kind === 'side' ? link.toPoint.side : undefined,\n fromFace: link.fromPoint?.kind === 'face' ? link.fromPoint.face : undefined,\n toFace: link.toPoint?.kind === 'face' ? link.toPoint.face : undefined,\n labelGap: context.hasLabelGap,\n segments: movableSegments(context.pathType, context.segments),\n },\n };\n}\n","import type { RenderNode } from '../../scene';\nimport type { LinkRenderContext } from './types';\n\nexport function renderWeightBadge(context: LinkRenderContext): RenderNode[] {\n const { link } = context;\n if (link.weight === undefined || link.weight === null || link.showWeight === false) {\n return [];\n }\n const text = link.weight.toFixed(1);\n const width = Math.max(30, text.length * 8 + 12);\n const height = 16;\n const y = context.midpoint.y + (context.label.visible ? context.label.height / 2 + 10 : 0);\n return [\n {\n type: 'rect',\n id: `link-weight-badge-${link.id}`,\n order: context.order + 0.6,\n bounds: context.bounds,\n x: context.midpoint.x - width / 2,\n y: y - height / 2,\n width,\n height,\n rx: height / 2,\n style: { fill: { kind: 'solid', color: context.color }, stroke: { kind: 'none' }, opacity: 0.92 },\n },\n {\n type: 'text',\n id: `link-weight-${link.id}`,\n order: context.order + 0.61,\n bounds: context.bounds,\n x: context.midpoint.x - width / 2,\n y: y - height / 2,\n width,\n height,\n lines: [text],\n fontFamily: 'Arial, sans-serif',\n fontSize: 10,\n fontWeight: 'bold',\n color: '#ffffff',\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1,\n },\n ];\n}\n","import type { RenderInput } from '../../renderInput/types';\nimport type { MeasureTextFactory, RenderNode } from '../scene';\nimport { tag } from '../scene/tagging';\nimport { renderEndpointLabels } from './link/endpointLabels';\nimport { renderMainLabel } from './link/label';\nimport { createLinkRenderContext } from './link/layout';\nimport { renderLinkPath } from './link/path';\nimport { renderWeightBadge } from './link/weight';\n\nexport function buildLink(\n item: RenderInput['links'][number],\n index: number,\n measureText?: MeasureTextFactory,\n): RenderNode[] {\n if (item.link.isVisible === false) {\n return [];\n }\n const context = createLinkRenderContext(item, index, measureText);\n return [\n renderLinkPath(context),\n ...renderMainLabel(context),\n ...renderWeightBadge(context),\n ...renderEndpointLabels(context),\n ];\n}\n\nexport function buildLinks(links: RenderInput['links'], measureText?: MeasureTextFactory): RenderNode[] {\n return links.flatMap((item, index) =>\n tag(\n buildLink(item, index, measureText),\n 'link',\n item.link.id,\n item.kind,\n item.link.text || `${item.link.fromId} → ${item.link.toId}`,\n ),\n );\n}\n","import type { FreeformPath } from '../../model/path';\nimport type { RenderNode } from '../scene';\nimport { finite, freeformPathData } from '../scene';\nimport { tag } from '../scene/tagging';\n\nexport function buildFreeformPath(path: FreeformPath, index: number): RenderNode[] {\n if (path.isVisible === false || path.points.length < 2) {\n return [];\n }\n const strokeWidth = finite(path.strokeWidth, 2);\n const extra = strokeWidth + 12;\n const bounds = {\n minX: Math.min(...path.points.map(point => point.x)) - extra,\n minY: Math.min(...path.points.map(point => point.y)) - extra,\n maxX: Math.max(...path.points.map(point => point.x)) + extra,\n maxY: Math.max(...path.points.map(point => point.y)) + extra,\n };\n const tension = finite(path.tension, 0);\n const closed = path.closed === true;\n return [\n {\n type: 'path',\n id: `path-${path.id}`,\n order: 30_000 + index,\n bounds,\n d: freeformPathData({ points: path.points, tension, closed }),\n markerStart: path.startMarker,\n markerEnd: path.endMarker,\n detail: {\n of: 'pathGeometry',\n points: path.points.map(point => [point.x, point.y]),\n tension,\n closed,\n },\n style: {\n fill: path.closed ? { kind: 'solid', color: path.fillColor ?? 'transparent' } : { kind: 'none' },\n stroke: { kind: 'solid', color: path.strokeColor ?? '#7c3aed' },\n strokeWidth,\n dash: path.dash?.length ? path.dash : undefined,\n lineCap: 'round',\n lineJoin: 'round',\n opacity: finite(path.opacity, 1),\n },\n },\n ];\n}\n\nexport function buildFreeformPaths(paths: readonly FreeformPath[]): RenderNode[] {\n return paths.flatMap((path, index) => tag(buildFreeformPath(path, index), 'path', path.id, 'path', 'Path'));\n}\n","import type { ShapeRenderContext } from '../types';\n\nexport function shapeNodeBase(context: ShapeRenderContext) {\n return {\n id: context.id,\n order: context.order,\n bounds: context.bounds,\n rotation: context.rotation,\n style: context.style,\n };\n}\n","type Point = readonly [number, number];\ntype Lobe = readonly [centerX: number, centerY: number, radius: number];\ntype Curve = readonly [control1: Point, control2: Point, end: Point];\n\ninterface CloudOutline {\n start: Point;\n curves: readonly Curve[];\n}\n\ninterface LobeArc {\n lobe: Lobe;\n from: number;\n to: number;\n}\n\nconst CLOUD_LOBES: readonly Lobe[] = [\n [30, 64, 24],\n [52, 40, 22],\n [86, 32, 28],\n [118, 42, 24],\n [132, 64, 24],\n];\n\nconst QUARTER_TURN = Math.PI / 2;\nconst FULL_TURN = 4 * QUARTER_TURN;\nconst BOTTOM_ANGLE = Math.PI / 2;\nconst EPSILON = 1e-9;\n\nfunction pointOnLobe([centerX, centerY, radius]: Lobe, angle: number): Point {\n return [centerX + radius * Math.cos(angle), centerY + radius * Math.sin(angle)];\n}\n\nfunction angleOnLobe([centerX, centerY]: Lobe, point: Point): number {\n return Math.atan2(point[1] - centerY, point[0] - centerX);\n}\n\nfunction outerCusp(first: Lobe, second: Lobe, centroid: Point): Point {\n const dx = second[0] - first[0];\n const dy = second[1] - first[1];\n const distance = Math.hypot(dx, dy);\n const along = (first[2] ** 2 - second[2] ** 2 + distance ** 2) / (2 * distance);\n const across = Math.sqrt(Math.max(0, first[2] ** 2 - along ** 2));\n const footX = first[0] + (along * dx) / distance;\n const footY = first[1] + (along * dy) / distance;\n const candidates: Point[] = [\n [footX - (across * dy) / distance, footY + (across * dx) / distance],\n [footX + (across * dy) / distance, footY - (across * dx) / distance],\n ];\n const fromCentroid = (point: Point) => Math.hypot(point[0] - centroid[0], point[1] - centroid[1]);\n return fromCentroid(candidates[0]) > fromCentroid(candidates[1]) ? candidates[0] : candidates[1];\n}\n\nfunction lobeArcs(lobes: readonly Lobe[]): LobeArc[] {\n const centroid: Point = [\n lobes.reduce((sum, lobe) => sum + lobe[0], 0) / lobes.length,\n lobes.reduce((sum, lobe) => sum + lobe[1], 0) / lobes.length,\n ];\n return lobes.map((lobe, index) => {\n const from = index === 0 ? BOTTOM_ANGLE : angleOnLobe(lobe, outerCusp(lobes[index - 1], lobe, centroid));\n const isLast = index === lobes.length - 1;\n let to = isLast ? BOTTOM_ANGLE : angleOnLobe(lobe, outerCusp(lobe, lobes[index + 1], centroid));\n while (to <= from) {\n to += FULL_TURN;\n }\n return { lobe, from, to };\n });\n}\n\nfunction quarterStops(from: number, to: number): number[] {\n const stops: number[] = [];\n for (let turn = Math.floor(from / QUARTER_TURN) + 1; turn * QUARTER_TURN < to - EPSILON; turn++) {\n stops.push(turn * QUARTER_TURN);\n }\n return [...stops, to];\n}\n\nfunction arcCurves({ lobe, from, to }: LobeArc): { start: Point; curves: Curve[] } {\n const start = pointOnLobe(lobe, from);\n const curves: Curve[] = [];\n let angle = from;\n for (const stop of quarterStops(from, to)) {\n const reach = (4 / 3) * Math.tan((stop - angle) / 4) * lobe[2];\n const begin = pointOnLobe(lobe, angle);\n const end = pointOnLobe(lobe, stop);\n curves.push([\n [begin[0] - reach * Math.sin(angle), begin[1] + reach * Math.cos(angle)],\n [end[0] + reach * Math.sin(stop), end[1] - reach * Math.cos(stop)],\n end,\n ]);\n angle = stop;\n }\n return { start, curves };\n}\n\nfunction normalizedCloudOutline(): CloudOutline {\n const arcs = lobeArcs(CLOUD_LOBES).map(arcCurves);\n const start = arcs[0].start;\n const curves = arcs.flatMap(arc => arc.curves);\n const anchors = [start, ...curves.map(curve => curve[2])];\n const minX = Math.min(...anchors.map(point => point[0]));\n const maxX = Math.max(...anchors.map(point => point[0]));\n const minY = Math.min(...anchors.map(point => point[1]));\n const maxY = Math.max(...anchors.map(point => point[1]));\n const unit = (point: Point): Point => [(point[0] - minX) / (maxX - minX), (point[1] - minY) / (maxY - minY)];\n return {\n start: unit(start),\n curves: curves.map(([first, second, end]) => [unit(first), unit(second), unit(end)]),\n };\n}\n\nconst CLOUD_OUTLINE = normalizedCloudOutline();\n\nexport function cloudPath(x: number, y: number, width: number, height: number): string {\n const at = ([u, v]: Point) => `${x + u * width} ${y + v * height}`;\n const curves = CLOUD_OUTLINE.curves.map(([first, second, end]) => `C ${at(first)} ${at(second)} ${at(end)}`);\n return `M ${at(CLOUD_OUTLINE.start)} ${curves.join(' ')} Z`;\n}\n","const KAPPA = 0.5523;\nconst CYLINDER_CAP_OF_HEIGHT = 0.22;\nconst CYLINDER_CAP_OF_WIDTH = 0.2;\nconst PERSON_BODY_IN_HEADS = 2;\nconst PERSON_NECK_IN_HEADS = 0.35;\nconst PERSON_WIDTH_IN_HEADS = 2 * PERSON_BODY_IN_HEADS;\nconst PERSON_HEIGHT_IN_HEADS = 2 + PERSON_NECK_IN_HEADS + PERSON_BODY_IN_HEADS;\n\nexport function cylinderPath(x: number, y: number, width: number, height: number): string {\n const cap = Math.min(height * CYLINDER_CAP_OF_HEIGHT, width * CYLINDER_CAP_OF_WIDTH);\n const rx = width / 2;\n const cx = x + rx;\n const left = x;\n const right = x + width;\n const lidY = y + cap;\n const floorY = y + height - cap;\n const lid =\n `M ${left} ${lidY} C ${left} ${lidY + KAPPA * cap} ${cx - KAPPA * rx} ${lidY + cap} ${cx} ${lidY + cap} ` +\n `C ${cx + KAPPA * rx} ${lidY + cap} ${right} ${lidY + KAPPA * cap} ${right} ${lidY} ` +\n `C ${right} ${lidY - KAPPA * cap} ${cx + KAPPA * rx} ${y} ${cx} ${y} ` +\n `C ${cx - KAPPA * rx} ${y} ${left} ${lidY - KAPPA * cap} ${left} ${lidY} Z`;\n const wall =\n `M ${left} ${lidY} L ${left} ${floorY} ` +\n `C ${left} ${floorY + KAPPA * cap} ${cx - KAPPA * rx} ${y + height} ${cx} ${y + height} ` +\n `C ${cx + KAPPA * rx} ${y + height} ${right} ${floorY + KAPPA * cap} ${right} ${floorY} ` +\n `L ${right} ${lidY}`;\n return `${lid} ${wall}`;\n}\n\ninterface PersonFigure {\n head: number;\n body: number;\n centerX: number;\n headCenterY: number;\n bottom: number;\n}\n\nfunction personFigure(x: number, y: number, width: number, height: number): PersonFigure {\n const scale = Math.min(width / PERSON_WIDTH_IN_HEADS, height / PERSON_HEIGHT_IN_HEADS);\n const head = scale;\n const body = scale * PERSON_BODY_IN_HEADS;\n const figureHeight = scale * PERSON_HEIGHT_IN_HEADS;\n const top = y + (height - figureHeight) / 2;\n return { head, body, centerX: x + width / 2, headCenterY: top + head, bottom: top + figureHeight };\n}\n\nexport function personLabelArea(x: number, y: number, width: number, height: number) {\n const { body, centerX, bottom } = personFigure(x, y, width, height);\n return { x: centerX - body, y: bottom - body, width: body * 2, height: body };\n}\n\nexport function personPath(x: number, y: number, width: number, height: number): string {\n const { head, body, centerX, headCenterY, bottom } = personFigure(x, y, width, height);\n const skull =\n `M ${centerX} ${headCenterY - head} ` +\n `C ${centerX + KAPPA * head} ${headCenterY - head} ${centerX + head} ${headCenterY - KAPPA * head} ${centerX + head} ${headCenterY} ` +\n `C ${centerX + head} ${headCenterY + KAPPA * head} ${centerX + KAPPA * head} ${headCenterY + head} ${centerX} ${headCenterY + head} ` +\n `C ${centerX - KAPPA * head} ${headCenterY + head} ${centerX - head} ${headCenterY + KAPPA * head} ${centerX - head} ${headCenterY} ` +\n `C ${centerX - head} ${headCenterY - KAPPA * head} ${centerX - KAPPA * head} ${headCenterY - head} ${centerX} ${headCenterY - head} Z`;\n const dome =\n `M ${centerX - body} ${bottom} ` +\n `C ${centerX - body} ${bottom - KAPPA * body} ${centerX - KAPPA * body} ${bottom - body} ${centerX} ${bottom - body} ` +\n `C ${centerX + KAPPA * body} ${bottom - body} ${centerX + body} ${bottom - KAPPA * body} ${centerX + body} ${bottom} Z`;\n return `${skull} ${dome}`;\n}\n","import type { ShapeType } from '../../../../model/shape';\nimport { cloudPath } from './cloud';\nimport { cylinderPath, personPath } from './roundedForms';\n\nconst polygonPath = (points: number[]): string =>\n points.length < 4\n ? ''\n : `M ${points[0]} ${points[1]} ${points.slice(2).reduce((s, n, i) => s + (i % 2 ? ` ${n}` : ` L ${n}`), '')} Z`;\n\nconst DOCUMENT_WAVE_AMPLITUDE = 0.1;\nconst QUARTER_SINE_SLOPE = Math.PI / 6;\nconst NOTE_FOLD_RATIO = 0.25;\nconst PREDEFINED_PROCESS_BAR_RATIO = 0.15;\n\nexport function pillCornerRadius(width: number, height: number): number {\n return Math.min(width, height) / 2;\n}\n\nexport function localShapePath(type: ShapeType, x: number, y: number, width: number, height: number): string | null {\n const p = (...coords: number[]) => polygonPath(coords);\n switch (type) {\n case 'diamond':\n return p(x + width / 2, y, x + width, y + height / 2, x + width / 2, y + height, x, y + height / 2);\n case 'triangle':\n return p(x + width / 2, y, x, y + height, x + width, y + height);\n case 'parallelogram':\n return p(x + width * 0.15, y, x + width, y, x + width * 0.85, y + height, x, y + height);\n case 'trapezoid':\n return p(x + width * 0.2, y, x + width * 0.8, y, x + width, y + height, x, y + height);\n case 'hexagon': {\n const cut = Math.min(width, height) / 4;\n return p(\n x + cut,\n y,\n x + width - cut,\n y,\n x + width,\n y + height / 2,\n x + width - cut,\n y + height,\n x + cut,\n y + height,\n x,\n y + height / 2,\n );\n }\n case 'document': {\n const amplitude = height * DOCUMENT_WAVE_AMPLITUDE;\n const mid = y + height - amplitude;\n const quarter = width / 4;\n const slope = amplitude * QUARTER_SINE_SLOPE;\n return (\n `M ${x} ${y} L ${x + width} ${y} L ${x + width} ${mid} ` +\n `C ${x + width - quarter / 3} ${mid - slope} ${x + width - (quarter * 2) / 3} ${mid - amplitude} ${x + width - quarter} ${mid - amplitude} ` +\n `C ${x + width - quarter - quarter / 3} ${mid - amplitude} ${x + width / 2 + quarter / 3} ${mid - slope} ${x + width / 2} ${mid} ` +\n `C ${x + width / 2 - quarter / 3} ${mid + slope} ${x + width / 2 - (quarter * 2) / 3} ${mid + amplitude} ${x + quarter} ${mid + amplitude} ` +\n `C ${x + quarter - quarter / 3} ${mid + amplitude} ${x + quarter / 3} ${mid + slope} ${x} ${mid} Z`\n );\n }\n case 'note': {\n const fold = Math.min(width, height) * NOTE_FOLD_RATIO;\n return (\n `M ${x} ${y} L ${x + width - fold} ${y} L ${x + width} ${y + fold} L ${x + width} ${y + height} L ${x} ${y + height} Z ` +\n `M ${x + width} ${y + fold} L ${x + width - fold} ${y + fold} L ${x + width - fold} ${y}`\n );\n }\n case 'cloud':\n return cloudPath(x, y, width, height);\n case 'cylinder':\n return cylinderPath(x, y, width, height);\n case 'person':\n return personPath(x, y, width, height);\n case 'predefined_process': {\n const bar = Math.min(width, height) * PREDEFINED_PROCESS_BAR_RATIO;\n return (\n `M ${x} ${y} L ${x + width} ${y} L ${x + width} ${y + height} L ${x} ${y + height} Z ` +\n `M ${x + bar} ${y} L ${x + bar} ${y + height} M ${x + width - bar} ${y} L ${x + width - bar} ${y + height}`\n );\n }\n default:\n return null;\n }\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite, freeformPathData } from '../../../scene';\nimport type { ShapeRenderContext } from '../types';\nimport { shapeNodeBase } from './base';\nimport { localShapePath, pillCornerRadius } from './pathCalculation';\n\nexport function renderPath(context: ShapeRenderContext): RenderNode[] {\n const path = localShapePath(context.shape.shapeType, context.x, context.y, context.width, context.height);\n if (!path) {\n return [];\n }\n return [{ ...shapeNodeBase(context), type: 'path', d: path, rotationCenter: context.rotationCenter }];\n}\n\nexport function renderBoundedPath(context: ShapeRenderContext): RenderNode[] {\n return renderPath(context).map(node => ({\n ...node,\n detail: {\n of: 'declaredBounds',\n bounds: { x: context.x, y: context.y, width: context.width, height: context.height },\n },\n }));\n}\n\nexport function renderRectangle(context: ShapeRenderContext): RenderNode[] {\n const rx =\n context.shape.shapeType === 'pill'\n ? pillCornerRadius(context.width, context.height)\n : context.shape.shapeType === 'rounded_rectangle'\n ? finite(context.shape.cornerRadius, 8)\n : 0;\n return [\n {\n ...shapeNodeBase(context),\n type: 'rect',\n x: context.x,\n y: context.y,\n width: context.width,\n height: context.height,\n rx,\n },\n ];\n}\n\nexport function renderEllipse(context: ShapeRenderContext): RenderNode[] {\n return [\n {\n ...shapeNodeBase(context),\n type: 'ellipse',\n cx: context.x + context.width / 2,\n cy: context.y + context.height / 2,\n rx: context.width / 2,\n ry: context.height / 2,\n },\n ];\n}\n\nexport function renderSymbol(context: ShapeRenderContext): RenderNode[] {\n if (!context.shape.symbol || context.shape.symbol.points.length < 2) {\n return renderRectangle(context);\n }\n const tension = finite(context.shape.symbol.tension, 0);\n const points = context.shape.symbol.points.map(([x, y]) => ({\n x: context.x + x * context.width,\n y: context.y + y * context.height,\n }));\n return [\n {\n ...shapeNodeBase(context),\n type: 'path',\n d: freeformPathData({ points, tension, closed: true }),\n rotationCenter: context.rotationCenter,\n detail: {\n of: 'symbolGeometry',\n points: context.shape.symbol.points,\n tension,\n declaredBounds: { x: context.x, y: context.y, width: context.width, height: context.height },\n },\n },\n ];\n}\n","import type { ShapeType } from '../../../../model/shape';\nimport type { RenderNode } from '../../../scene';\nimport type { ShapeGeometryRenderer, ShapeRenderContext } from '../types';\nimport { renderBoundedPath, renderEllipse, renderPath, renderRectangle, renderSymbol } from './simple';\n\nconst GEOMETRY_RENDERERS: Record<ShapeType, ShapeGeometryRenderer> = {\n cloud: renderPath,\n cylinder: renderPath,\n diamond: renderPath,\n document: renderPath,\n hexagon: renderPath,\n note: renderPath,\n oval: renderEllipse,\n circle: renderEllipse,\n parallelogram: renderPath,\n person: renderBoundedPath,\n pill: renderRectangle,\n predefined_process: renderPath,\n rectangle: renderRectangle,\n rounded_rectangle: renderRectangle,\n symbol: renderSymbol,\n trapezoid: renderPath,\n triangle: renderPath,\n};\n\nexport function renderShapeGeometry(context: ShapeRenderContext): RenderNode[] {\n const renderer = GEOMETRY_RENDERERS[context.shape.shapeType] ?? renderRectangle;\n return renderer(context);\n}\n","import type { Shape, ShapeType } from '../../../model/shape';\nimport type { RenderDiagnostic, SceneStyle } from '../../scene';\nimport { finite, paint } from '../../scene';\n\nconst REMOVED_SHAPE_HINTS: Record<string, string> = {\n container_rectangle: \" (use 'rectangle' with strokeStyle: dashed)\",\n};\n\nconst COMMON_SHAPE_DEFAULTS = {\n strokeColor: '#cbd5e1',\n strokeWidth: 2,\n fillColor: '#ffffff',\n dash: [],\n strokeStyle: 'solid' as const,\n fontSize: 14,\n fontWeight: 'normal' as const,\n textAlign: 'center' as const,\n textVerticalAlign: 'middle' as const,\n lineHeight: 1.3,\n hasShadow: false,\n opacity: 1,\n};\n\ninterface ShapeRenderDefaults {\n strokeColor: string;\n strokeWidth: number;\n fillColor: string;\n dash: readonly number[];\n strokeStyle: 'solid';\n fontSize: number;\n fontWeight: 'normal';\n textAlign: 'center';\n textVerticalAlign: 'middle';\n lineHeight: number;\n hasShadow: boolean;\n opacity: number;\n cornerRadius?: number;\n rotation?: number;\n}\n\nconst SHAPE_RENDER_DEFAULTS = {\n rectangle: COMMON_SHAPE_DEFAULTS,\n rounded_rectangle: { ...COMMON_SHAPE_DEFAULTS, cornerRadius: 8 },\n triangle: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n diamond: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n hexagon: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n oval: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n circle: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n document: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n parallelogram: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n trapezoid: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n cylinder: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n note: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n cloud: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n predefined_process: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n pill: COMMON_SHAPE_DEFAULTS,\n person: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n symbol: { ...COMMON_SHAPE_DEFAULTS, rotation: 0 },\n} as const satisfies Record<ShapeType, ShapeRenderDefaults>;\n\nexport function shapeDefaults(\n shape: Shape,\n diagnostics: RenderDiagnostic[],\n): (typeof SHAPE_RENDER_DEFAULTS)[keyof typeof SHAPE_RENDER_DEFAULTS] {\n const defaults = SHAPE_RENDER_DEFAULTS[shape.shapeType as keyof typeof SHAPE_RENDER_DEFAULTS];\n if (defaults) {\n return defaults;\n }\n diagnostics.push({\n severity: 'warning',\n code: 'unknown-shape-type',\n ownerId: shape.id,\n message: `Unknown shapeType '${shape.shapeType}'${REMOVED_SHAPE_HINTS[shape.shapeType] ?? ''}, falling back to rectangle defaults.`,\n });\n return SHAPE_RENDER_DEFAULTS.rectangle;\n}\n\nfunction shapeDash(shape: Shape, strokeWidth: number): number[] | undefined {\n if (shape.strokeStyle === 'dotted') {\n return [0.001, strokeWidth * 2];\n }\n if (shape.strokeStyle === 'dashed') {\n return [strokeWidth * 4, strokeWidth * 2];\n }\n return shape.dash?.length ? shape.dash : undefined;\n}\n\nexport function shapeStyle(shape: Shape, diagnostics: RenderDiagnostic[]): SceneStyle {\n const defaults = shapeDefaults(shape, diagnostics);\n const strokeWidth = finite(shape.strokeWidth, defaults.strokeWidth);\n const shadow =\n shape.shadowStyle ??\n (shape.hasShadow\n ? { enabled: true, color: '#000000', opacity: 0.25, blur: 10, angle: 45, distance: 5 }\n : undefined);\n const angle = (finite(shadow?.angle, 45) * Math.PI) / 180;\n return {\n fill: paint(shape.fillColor, diagnostics, shape.id),\n stroke: paint(shape.strokeColor, diagnostics, shape.id),\n strokeWidth,\n dash: shapeDash(shape, strokeWidth),\n lineCap: shape.strokeStyle === 'dotted' ? 'round' : 'butt',\n opacity: finite(shape.opacity, defaults.opacity),\n shadow: shadow?.enabled\n ? {\n color: shadow.color ?? '#000000',\n opacity: finite(shadow.opacity, 0.25),\n blur: finite(shadow.blur, 10),\n dx: Math.cos(angle) * finite(shadow.distance, 5),\n dy: Math.sin(angle) * finite(shadow.distance, 5),\n }\n : undefined,\n };\n}\n","export interface TextRun {\n text: string;\n bold: boolean;\n}\n\nconst BOLD_PATTERN = /\\*\\*([^*]+)\\*\\*/g;\n\nexport function hasBoldMarkup(text: string): boolean {\n return /\\*\\*[^*]+\\*\\*/.test(text);\n}\n\nexport function parseRichLine(line: string): TextRun[] {\n const runs: TextRun[] = [];\n let lastIndex = 0;\n BOLD_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: canonical RegExp.exec loop\n while ((match = BOLD_PATTERN.exec(line))) {\n if (match.index > lastIndex) {\n runs.push({ text: line.slice(lastIndex, match.index), bold: false });\n }\n if (match[1]) {\n runs.push({ text: match[1], bold: true });\n }\n lastIndex = BOLD_PATTERN.lastIndex;\n }\n if (lastIndex < line.length) {\n runs.push({ text: line.slice(lastIndex), bold: false });\n }\n return runs.length ? runs : [{ text: line, bold: false }];\n}\n\nexport function parseRichText(text: string): TextRun[][] {\n return text.split('\\n').map(parseRichLine);\n}\n\nexport interface RichWord {\n text: string;\n bold: boolean;\n}\n\nfunction runsToWords(runs: TextRun[]): RichWord[] {\n const words: RichWord[] = [];\n for (const run of runs) {\n for (const word of run.text.split(/\\s+/)) {\n if (word) {\n words.push({ text: word, bold: run.bold });\n }\n }\n }\n return words;\n}\n\nexport function wrapRichLine(\n runs: TextRun[],\n maxWidth: number,\n measure: (text: string, bold: boolean) => number,\n spaceWidth: number,\n): RichWord[][] {\n const words = runsToWords(runs);\n if (!words.length) {\n return [[]];\n }\n const lines: RichWord[][] = [];\n let current: RichWord[] = [];\n let currentWidth = 0;\n for (const word of words) {\n const wordWidth = measure(word.text, word.bold);\n const addedWidth = current.length ? spaceWidth + wordWidth : wordWidth;\n if (current.length && currentWidth + addedWidth > maxWidth) {\n lines.push(current);\n current = [word];\n currentWidth = wordWidth;\n } else {\n current.push(word);\n currentWidth += addedWidth;\n }\n }\n lines.push(current);\n return lines;\n}\n\nexport function wrapRichText(\n text: string,\n maxWidth: number,\n measure: (text: string, bold: boolean) => number,\n spaceWidth: number,\n): RichWord[][] {\n return parseRichText(text).flatMap(runs => wrapRichLine(runs, Math.max(1, maxWidth), measure, spaceWidth));\n}\n","import type { MeasureTextFactory, SceneText } from '../../scene';\nimport { DEFAULT_FONT, finite } from '../../scene';\nimport { hasBoldMarkup, wrapRichText } from '../../scene/richTextLayout';\nimport { heuristicRichMeasure, wrapText } from '../../scene/textLayout';\nimport { personLabelArea } from './geometry/roundedForms';\nimport { shapeDefaults } from './style';\nimport type { ShapeRenderContext } from './types';\n\nexport function renderShapeText(\n context: ShapeRenderContext,\n strokeWidth: number,\n measureText?: MeasureTextFactory,\n): SceneText | null {\n const { shape, bounds, order, rotation, rotationCenter, x, y, width, height } = context;\n if (!shape.text) {\n return null;\n }\n const fontSize = finite(shape.fontSize, shapeDefaults(shape, []).fontSize);\n const padding = shape.isText ? 0 : Math.max(8, strokeWidth * 2);\n const area = shape.shapeType === 'person' ? personLabelArea(x, y, width, height) : { x, y, width, height };\n const textWidth = Math.max(0, area.width - padding * 2);\n const fontFamily = shape.fontFamily || DEFAULT_FONT;\n const metrics = measureText?.(fontFamily, fontSize);\n const textNode: SceneText = {\n type: 'text',\n id: `shape-text-${shape.id}`,\n order: order + 0.5,\n bounds,\n x: area.x + padding,\n y: area.y + padding,\n width: textWidth,\n height: Math.max(0, area.height - padding * 2),\n lines: wrapText(shape.text, textWidth, fontSize, metrics),\n fontFamily,\n fontSize,\n fontWeight: shape.fontWeight ?? 'normal',\n letterSpacing: shape.letterSpacing,\n color: shape.textColor || '#111827',\n align: shape.textAlign ?? 'center',\n verticalAlign: shape.textVerticalAlign ?? 'middle',\n lineHeight: finite(shape.lineHeight, 1.3),\n rotation,\n rotationCenter,\n };\n if (hasBoldMarkup(shape.text)) {\n const { measure, spaceWidth } = metrics ?? heuristicRichMeasure(fontSize);\n textNode.richLines = wrapRichText(shape.text, textWidth, measure, spaceWidth);\n }\n return textNode;\n}\n","import type { Shape } from '../../model/shape';\nimport type { MeasureTextFactory, RenderDiagnostic, RenderNode, SceneStyle } from '../scene';\nimport { finite, rotatedBounds } from '../scene';\nimport { tag } from '../scene/tagging';\nimport { renderShapeGeometry } from './shape/geometry';\nimport { shapeStyle } from './shape/style';\nimport { renderShapeText } from './shape/text';\nimport type { ShapeRenderContext } from './shape/types';\n\nfunction renderDoubleStroke(context: ShapeRenderContext, strokeWidth: number): RenderNode[] {\n const insetWidth = Math.max(0, context.width - 2 * strokeWidth);\n const insetHeight = Math.max(0, context.height - 2 * strokeWidth);\n const ring: SceneStyle = {\n ...context.style,\n fill: { kind: 'none' },\n strokeWidth: Math.max(1, strokeWidth / 3),\n dash: undefined,\n shadow: undefined,\n };\n const nodes = renderShapeGeometry({ ...context, style: ring });\n if (insetWidth <= 0 || insetHeight <= 0) {\n return nodes;\n }\n\n const inset = {\n ...context,\n x: context.x + strokeWidth,\n y: context.y + strokeWidth,\n width: insetWidth,\n height: insetHeight,\n };\n nodes.push(\n ...renderShapeGeometry({\n ...inset,\n id: `${context.id}-fill`,\n style: { ...context.style, stroke: { kind: 'none' }, strokeWidth: 0, dash: undefined },\n }),\n ...renderShapeGeometry({ ...inset, id: `${context.id}-inner`, style: ring }),\n );\n return nodes;\n}\n\nfunction createRenderContext(\n shape: Shape,\n index: number,\n diagnostics: RenderDiagnostic[],\n): { context: ShapeRenderContext; strokeWidth: number } {\n const x = finite(shape.x, 0);\n const y = finite(shape.y, 0);\n const width = Math.max(0, finite(shape.width, 100));\n const height = Math.max(0, finite(shape.height, 100));\n const rotation = finite(shape.rotation, 0);\n const strokeWidth = finite(shape.strokeWidth, 2);\n return {\n strokeWidth,\n context: {\n shape,\n id: `shape-${shape.id}`,\n order: 10_000 + index,\n bounds: rotatedBounds({ x, y, width, height }, rotation, strokeWidth + (shape.hasShadow ? 20 : 2)),\n rotation,\n rotationCenter: { x: x + width / 2, y: y + height / 2 },\n style: shapeStyle(shape, diagnostics),\n x,\n y,\n width,\n height,\n },\n };\n}\n\nfunction renderShaderSurface(context: ShapeRenderContext): RenderNode | undefined {\n if (!context.shape.shader || (context.shape.shapeType !== 'circle' && context.shape.shapeType !== 'oval')) {\n return undefined;\n }\n return {\n id: `${context.id}-shader`,\n type: 'shader-surface',\n order: context.order,\n bounds: context.bounds,\n x: context.x,\n y: context.y,\n width: context.width,\n height: context.height,\n rotation: context.rotation,\n shader: context.shape.shader,\n mask: 'ellipse',\n fillColor: context.style.fill?.kind === 'solid' ? context.style.fill.color : undefined,\n };\n}\n\nexport function buildShape(\n shape: Shape,\n index: number,\n diagnostics: RenderDiagnostic[],\n measureText?: MeasureTextFactory,\n): RenderNode[] {\n if (shape.isVisible === false) {\n return [];\n }\n const { context, strokeWidth } = createRenderContext(shape, index, diagnostics);\n const nodes =\n shape.strokeStyle === 'double' ? renderDoubleStroke(context, strokeWidth || 1) : renderShapeGeometry(context);\n const shader = renderShaderSurface(context);\n if (shader) {\n for (const node of nodes) {\n if (node.type === 'ellipse' || node.type === 'path' || node.type === 'rect') {\n node.style = { ...node.style, pointerEvents: 'all' };\n }\n }\n nodes.push(shader);\n }\n const text = renderShapeText(context, strokeWidth, measureText);\n if (text) {\n nodes.push(text);\n }\n return nodes;\n}\n\nexport function buildShapes(\n shapes: readonly Shape[],\n diagnostics: RenderDiagnostic[],\n measureText?: MeasureTextFactory,\n): RenderNode[] {\n return shapes.flatMap((shape, index) =>\n tag(\n buildShape(shape, index, diagnostics, measureText),\n 'shape',\n shape.id,\n shape.shapeType,\n shape.text || shape.shapeType,\n shape.parentFrameId ?? undefined,\n ),\n );\n}\n","export function formatRollingNumber(value: string | number, digits: number | undefined): string {\n const text = String(value);\n if (digits === undefined) {\n return text;\n }\n if (!Number.isInteger(digits) || digits < 1) {\n return text;\n }\n return text.padStart(digits, '0');\n}\n","import type { RollingNumberWidgetStyle } from './types';\n\nexport const DEFAULT_ROLLING_NUMBER_STYLE: Required<RollingNumberWidgetStyle> = {\n color: '#000000',\n surface: 'rgba(255, 255, 255, 0.28)',\n divider: 'rgba(0, 0, 0, 0.2)',\n labelColor: 'rgba(0, 0, 0, 0.62)',\n fontFamily: \"'Roboto Mono', 'SFMono-Regular', Consolas, monospace\",\n variant: 'flip',\n motion: 'roll',\n fontWeight: '300',\n};\n\nexport function resolveRollingNumberStyle(style: RollingNumberWidgetStyle): Required<RollingNumberWidgetStyle> {\n return {\n color: style.color ?? DEFAULT_ROLLING_NUMBER_STYLE.color,\n surface: style.surface ?? DEFAULT_ROLLING_NUMBER_STYLE.surface,\n divider: style.divider ?? DEFAULT_ROLLING_NUMBER_STYLE.divider,\n labelColor: style.labelColor ?? DEFAULT_ROLLING_NUMBER_STYLE.labelColor,\n fontFamily: style.fontFamily ?? DEFAULT_ROLLING_NUMBER_STYLE.fontFamily,\n variant: style.variant ?? DEFAULT_ROLLING_NUMBER_STYLE.variant,\n motion: style.motion ?? DEFAULT_ROLLING_NUMBER_STYLE.motion,\n fontWeight: style.fontWeight ?? DEFAULT_ROLLING_NUMBER_STYLE.fontWeight,\n };\n}\n","import {\n formatRollingNumber,\n type RollingNumberWidget,\n type RulerWidget,\n resolveRollingNumberStyle,\n type TickScaleWidget,\n type Widget,\n} from '../../model/widget';\nimport { DEFAULT_FONT, finite, type RenderNode, rotatedBounds } from '../scene';\nimport { tag } from '../scene/tagging';\n\nfunction buildRollingNumber(widget: RollingNumberWidget, index: number): RenderNode[] {\n const x = finite(widget.x, 0);\n const y = finite(widget.y, 0);\n const width = Math.max(0, finite(widget.width, 160));\n const height = Math.max(0, finite(widget.height, 90));\n const rotation = finite(widget.rotation, 0);\n return [\n {\n id: `widget-${widget.id}`,\n type: 'rolling-number',\n order: 10_000 + index,\n bounds: rotatedBounds({ x, y, width, height }, rotation, 2),\n x,\n y,\n width,\n height,\n rotation,\n value: formatRollingNumber(widget.value, widget.digits),\n digits: widget.digits,\n duration: Math.max(0, finite(widget.duration, 420)),\n label: widget.label,\n widgetStyle: resolveRollingNumberStyle(widget.style),\n },\n ];\n}\n\nfunction buildTickScale(widget: TickScaleWidget, index: number): RenderNode[] {\n const x = finite(widget.x, 0);\n const y = finite(widget.y, 0);\n const width = Math.max(0, finite(widget.width, 200));\n const height = Math.max(0, finite(widget.height, 200));\n const rotation = finite(widget.rotation, 0);\n const max = finite(widget.max, 100) || 100;\n const progress = Math.min(1, Math.max(0, finite(Number(widget.value), 0) / max));\n const nodes: RenderNode[] = [\n {\n id: `widget-${widget.id}`,\n type: 'shader-surface',\n order: 10_000 + index,\n bounds: rotatedBounds({ x, y, width, height }, rotation, 2),\n x,\n y,\n width,\n height,\n rotation,\n shader: { name: widget.id, program: 'tickScale', parameters: { ...widget.parameters, progress, max } },\n mask: 'ellipse',\n },\n ];\n if (widget.labels) {\n nodes.push(...buildTickLabels(widget, { x, y, width, height, rotation, max, order: 10_000 + index }));\n }\n return nodes;\n}\n\nfunction buildTickLabels(\n widget: TickScaleWidget,\n box: { x: number; y: number; width: number; height: number; rotation: number; max: number; order: number },\n): RenderNode[] {\n const labels = widget.labels ?? {};\n const ticks = Math.max(1, finite(Number(widget.parameters.ticks), 48));\n const major = Math.max(1, finite(Number(widget.parameters.major), 5));\n const start = (finite(Number(widget.parameters.start), 225) * Math.PI) / 180;\n const sweep = (finite(Number(widget.parameters.sweep), 270) * Math.PI) / 180;\n const radius = finite(Number(widget.parameters.radius), 0.9) + finite(labels.offset, 0.08);\n const fontSize = finite(labels.size, 12);\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n const count = Math.floor(ticks / major);\n const nodes: RenderNode[] = [];\n for (let step = 0; step <= count; step += 1) {\n const fraction = (step * major) / ticks;\n const angle = start - fraction * sweep;\n const labelX = centerX + Math.cos(angle) * radius * (box.width / 2);\n const labelY = centerY - Math.sin(angle) * radius * (box.height / 2);\n const labelBox = { x: labelX - 24, y: labelY - fontSize, width: 48, height: fontSize * 2 };\n nodes.push({\n id: `widget-${widget.id}-label-${step}`,\n type: 'text',\n order: box.order + 0.1,\n bounds: rotatedBounds(labelBox, 0, 2),\n ...labelBox,\n lines: [String(Math.round(box.max * fraction * 10) / 10)],\n fontFamily: labels.fontFamily || DEFAULT_FONT,\n fontSize,\n fontWeight: (labels.weight ?? 'normal') as 'normal',\n color: labels.color || '#8f95c4',\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.3,\n });\n }\n return nodes;\n}\n\nfunction buildRuler(widget: RulerWidget, index: number): RenderNode[] {\n const x = finite(widget.x, 0);\n const y = finite(widget.y, 0);\n const width = Math.max(0, finite(widget.width, 120));\n const height = Math.max(0, finite(widget.height, 360));\n const rotation = finite(widget.rotation, 0);\n const min = finite(widget.min, 0);\n const max = finite(widget.max, 100);\n const progress = max === min ? 0 : Math.min(1, Math.max(0, (finite(Number(widget.value), min) - min) / (max - min)));\n const nodes: RenderNode[] = [\n {\n id: `widget-${widget.id}`,\n type: 'shader-surface',\n order: 10_000 + index,\n bounds: rotatedBounds({ x, y, width, height }, rotation, 2),\n x,\n y,\n width,\n height,\n rotation,\n shader: { name: widget.id, program: 'ruler', parameters: { ...widget.parameters, progress, min, max } },\n mask: 'rect',\n },\n ];\n if (widget.labels) {\n nodes.push(...buildRulerLabels(widget, { x, y, width, height, min, max, order: 10_000 + index }));\n }\n return nodes;\n}\n\nfunction buildRulerLabels(\n widget: RulerWidget,\n box: { x: number; y: number; width: number; height: number; min: number; max: number; order: number },\n): RenderNode[] {\n const labels = widget.labels ?? {};\n const horizontal = widget.parameters.axis === 'horizontal';\n const ticks = Math.max(1, finite(Number(widget.parameters.ticks), 50));\n const major = Math.max(1, finite(Number(widget.parameters.major), 5));\n const inset =\n finite(Number(widget.parameters.inset), 0.05) > 0 ? finite(Number(widget.parameters.inset), 0.05) : 0.05;\n const line = finite(Number(widget.parameters.line), 0.7) > 0 ? finite(Number(widget.parameters.line), 0.7) : 0.7;\n const across = horizontal ? box.height : box.width;\n const tickLength =\n (finite(Number(widget.parameters.length), 0.1) > 0 ? finite(Number(widget.parameters.length), 0.1) : 0.1) *\n across *\n 1.9;\n const edge = line * across - 0.12 * across - tickLength - finite(labels.offset, 0.04) * across;\n const fontSize = finite(labels.size, 12);\n const count = Math.floor(ticks / major);\n const nodes: RenderNode[] = [];\n for (let step = 0; step <= count; step += 1) {\n const fraction = (step * major) / ticks;\n const along = inset + (1 - 2 * inset) * fraction;\n const labelBox = horizontal\n ? { x: box.x + box.width * along - 24, y: box.y + edge - fontSize * 2, width: 48, height: fontSize * 2 }\n : { x: box.x + edge - 48, y: box.y + box.height * (1 - along) - fontSize, width: 48, height: fontSize * 2 };\n nodes.push({\n id: `widget-${widget.id}-label-${step}`,\n type: 'text',\n order: box.order + 0.1,\n bounds: rotatedBounds(labelBox, 0, 2),\n ...labelBox,\n lines: [String(Math.round((box.min + (box.max - box.min) * fraction) * 10) / 10)],\n fontFamily: labels.fontFamily || DEFAULT_FONT,\n fontSize,\n fontWeight: (labels.weight ?? 'normal') as 'normal',\n color: labels.color || '#8f95c4',\n align: horizontal ? 'center' : 'right',\n verticalAlign: 'middle',\n lineHeight: 1.3,\n });\n }\n return nodes;\n}\n\nexport function buildWidgets(widgets: readonly Widget[]): RenderNode[] {\n return widgets.flatMap((widget, index) =>\n tag(\n widget.type === 'tickScale'\n ? buildTickScale(widget, index)\n : widget.type === 'ruler'\n ? buildRuler(widget, index)\n : buildRollingNumber(widget, index),\n 'widget',\n widget.id,\n widget.type,\n widget.label ?? widget.value,\n widget.parentFrameId,\n ),\n );\n}\n","import type { ChartZone } from '../../../model/chart';\n\nexport const CHART_COLORS = ['#7c3aed', '#0ea5e9', '#f97316', '#10b981', '#ec4899', '#eab308'];\nexport const DEFAULT_ZONE_FILL = '#94a3b8';\nexport const DEFAULT_HEATMAP_ZONES: ChartZone[] = [\n { label: 'Low', color: '#ddd6fe' },\n { label: 'Medium', color: '#a78bfa' },\n { label: 'High', color: '#6d28d9' },\n];\nexport const DEFAULT_HEX_RADIUS = 14;\n","import type { ChartAxis, ChartZone } from '../../../model/chart';\nimport { interpolateHexColorStops } from '../../../model/color';\nimport { DEFAULT_ZONE_FILL } from './defaults';\n\nexport function mapChartValue(value: number, axis: ChartAxis, extent: number): number {\n if (axis.max === axis.min) {\n return 0;\n }\n return ((value - axis.min) / (axis.max - axis.min)) * extent;\n}\n\nexport function chartTicks(axis: ChartAxis): number[] {\n if (!(axis.step > 0)) {\n return axis.min === axis.max ? [axis.min] : [axis.min, axis.max];\n }\n\n const ascending = axis.min <= axis.max;\n const step = ascending ? axis.step : -axis.step;\n const ticks: number[] = [];\n for (\n let value = axis.min;\n (ascending ? value <= axis.max + 1e-9 : value >= axis.max - 1e-9) && ticks.length < 1000;\n value += step\n ) {\n ticks.push(Math.round(value * 1000) / 1000);\n }\n return ticks;\n}\n\nexport function axisBands(axis: ChartAxis): number[] {\n const thresholds = [...(axis.thresholds ?? [])]\n .filter(threshold => threshold > axis.min && threshold < axis.max)\n .sort((a, b) => a - b);\n return [axis.min, ...thresholds, axis.max];\n}\n\nexport function zoneColorAtValue(value: number, bands: number[], zones: ChartZone[]): string {\n const bandCount = Math.max(0, bands.length - 1);\n const stops = zones.slice(0, bandCount).map((zone, index) => ({\n position: bands[index + 1] ?? bands[bands.length - 1],\n color: zone.color ?? DEFAULT_ZONE_FILL,\n }));\n if (!stops.length) {\n return DEFAULT_ZONE_FILL;\n }\n return interpolateHexColorStops(stops, value);\n}\n","import type { ChartSeries } from '../../../model/chart';\n\nexport function barCategoryCount(chart: { series: ChartSeries[]; config?: { categories?: string[] } }): number {\n return Math.max(1, chart.config?.categories?.length ?? 0, ...chart.series.map(series => series.values.length));\n}\n","export const BAR_LABEL = { padX: 8, padY: 3, charWidth: 0.58, lineHeight: 1.2, gap: 4 } as const;\n\nexport interface BarLabelSize {\n width: number;\n height: number;\n lineHeight: number;\n padX: number;\n padY: number;\n}\n\nexport function formatBarLabel(value: number, template: string | undefined): string {\n return (template || '{value}').replace('{value}', String(Math.round(value * 100) / 100));\n}\n\nexport function barLabelSize(text: string, fontSize: number, pill: boolean): BarLabelSize {\n const padX = pill ? BAR_LABEL.padX : 0;\n const padY = pill ? BAR_LABEL.padY : 0;\n const lineHeight = fontSize * BAR_LABEL.lineHeight;\n return {\n width: text.length * fontSize * BAR_LABEL.charWidth + padX * 2,\n height: lineHeight + padY * 2,\n lineHeight,\n padX,\n padY,\n };\n}\n\nexport function pillPath(x: number, y: number, width: number, height: number): string {\n const r = height / 2;\n return (\n `M ${x + r} ${y} H ${x + width - r} A ${r} ${r} 0 0 1 ${x + width - r} ${y + height} ` +\n `H ${x + r} A ${r} ${r} 0 0 1 ${x + r} ${y} Z`\n );\n}\n","export function barShapePath(x: number, y: number, width: number, height: number, radius: number): string {\n const r = Math.max(0, Math.min(radius, width / 2, height));\n if (r === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return (\n `M ${x} ${y + r} ` +\n `Q ${x} ${y} ${x + r} ${y} ` +\n `H ${x + width - r} ` +\n `Q ${x + width} ${y} ${x + width} ${y + r} ` +\n `V ${y + height} ` +\n `H ${x} Z`\n );\n}\n\nexport function roundedBarPath(x: number, y: number, width: number, height: number, radius: number): string {\n const r = Math.max(0, Math.min(radius, width / 2, height / 2));\n if (r === 0) {\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n }\n return (\n `M ${x + r} ${y} H ${x + width - r} Q ${x + width} ${y} ${x + width} ${y + r} ` +\n `V ${y + height - r} Q ${x + width} ${y + height} ${x + width - r} ${y + height} ` +\n `H ${x + r} Q ${x} ${y + height} ${x} ${y + height - r} V ${y + r} Q ${x} ${y} ${x + r} ${y} Z`\n );\n}\n\nexport function barPath(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n roundedBottom: boolean,\n): string {\n return roundedBottom ? roundedBarPath(x, y, width, height, radius) : barShapePath(x, y, width, height, radius);\n}\n","interface BoxplotStats {\n min: number;\n q1: number;\n median: number;\n q3: number;\n max: number;\n}\n\nfunction quantile(sorted: number[], probability: number): number {\n if (sorted.length === 1) {\n return sorted[0];\n }\n\n const position = (sorted.length - 1) * probability;\n const lowerIndex = Math.floor(position);\n const upperIndex = Math.ceil(position);\n if (lowerIndex === upperIndex) {\n return sorted[lowerIndex];\n }\n return sorted[lowerIndex] + (position - lowerIndex) * (sorted[upperIndex] - sorted[lowerIndex]);\n}\n\nexport function computeBoxplotStats(values: number[]): BoxplotStats | null {\n if (!values?.length) {\n return null;\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n return {\n min: sorted[0],\n q1: quantile(sorted, 0.25),\n median: quantile(sorted, 0.5),\n q3: quantile(sorted, 0.75),\n max: sorted[sorted.length - 1],\n };\n}\n","function hexToRgb(hex: string | undefined): [number, number, number] | undefined {\n if (hex?.[0] !== '#') {\n return undefined;\n }\n const channels =\n hex.length === 4\n ? hex\n .slice(1)\n .split('')\n .map(channel => parseInt(channel + channel, 16))\n : [1, 3, 5].map(index => parseInt(hex.slice(index, index + 2), 16));\n const [red, green, blue] = channels;\n return [red, green, blue].some(channel => Number.isNaN(channel)) ? undefined : [red, green, blue];\n}\n\nexport function colorWithAlpha(hex: string | undefined, alpha: number): string {\n const rgb = hexToRgb(hex);\n const clamped = Math.max(0, Math.min(1, alpha));\n if (!rgb) {\n return clamped <= 0 ? 'transparent' : (hex ?? 'transparent');\n }\n const [red, green, blue] = rgb;\n return `rgba(${red}, ${green}, ${blue}, ${clamped})`;\n}\n\nfunction rgbToHex(red: number, green: number, blue: number): string {\n const channel = (value: number) =>\n Math.round(Math.max(0, Math.min(255, value)))\n .toString(16)\n .padStart(2, '0');\n return `#${channel(red)}${channel(green)}${channel(blue)}`;\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const r = red / 255;\n const g = green / 255;\n const b = blue / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const lightness = (max + min) / 2;\n const delta = max - min;\n if (delta === 0) {\n return [0, 0, lightness];\n }\n const saturation = delta / (1 - Math.abs(2 * lightness - 1));\n let hue: number;\n if (max === r) {\n hue = ((g - b) / delta) % 6;\n } else if (max === g) {\n hue = (b - r) / delta + 2;\n } else {\n hue = (r - g) / delta + 4;\n }\n hue *= 60;\n if (hue < 0) {\n hue += 360;\n }\n return [hue, saturation, lightness];\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;\n const x = chroma * (1 - Math.abs(((hue / 60) % 2) - 1));\n const m = lightness - chroma / 2;\n let [r, g, b] = [0, 0, 0];\n if (hue < 60) {\n [r, g, b] = [chroma, x, 0];\n } else if (hue < 120) {\n [r, g, b] = [x, chroma, 0];\n } else if (hue < 180) {\n [r, g, b] = [0, chroma, x];\n } else if (hue < 240) {\n [r, g, b] = [0, x, chroma];\n } else if (hue < 300) {\n [r, g, b] = [x, 0, chroma];\n } else {\n [r, g, b] = [chroma, 0, x];\n }\n return [(r + m) * 255, (g + m) * 255, (b + m) * 255];\n}\n\nfunction relativeLuminance(red: number, green: number, blue: number): number {\n const linear = (channel: number) => {\n const normalized = channel / 255;\n return normalized <= 0.03928 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * linear(red) + 0.7152 * linear(green) + 0.0722 * linear(blue);\n}\n\nfunction contrastRatio(luminanceA: number, luminanceB: number): number {\n const lighter = Math.max(luminanceA, luminanceB);\n const darker = Math.min(luminanceA, luminanceB);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nconst SAME_HUE_LIGHTNESS_GAP = 0.35;\nconst SAME_HUE_MIN_LIGHTNESS = 0.08;\nconst SAME_HUE_MAX_LIGHTNESS = 0.22;\nconst SAME_HUE_LIGHT_MIN_LIGHTNESS = 0.78;\nconst SAME_HUE_LIGHT_MAX_LIGHTNESS = 0.92;\nconst SAME_HUE_MIN_CONTRAST = 3;\n\nexport function contrastTextColor(hex: string | undefined): string {\n const rgb = hexToRgb(hex);\n if (!rgb) {\n return '#0f172a';\n }\n const [red, green, blue] = rgb;\n const fallback = (0.299 * red + 0.587 * green + 0.114 * blue) / 255 > 0.6 ? '#0f172a' : '#ffffff';\n const [hue, saturation, lightness] = rgbToHsl(red, green, blue);\n if (saturation === 0) {\n return fallback;\n }\n const targetLightness =\n lightness > 0.5\n ? Math.max(SAME_HUE_MIN_LIGHTNESS, Math.min(lightness - SAME_HUE_LIGHTNESS_GAP, SAME_HUE_MAX_LIGHTNESS))\n : Math.min(\n SAME_HUE_LIGHT_MAX_LIGHTNESS,\n Math.max(lightness + SAME_HUE_LIGHTNESS_GAP, SAME_HUE_LIGHT_MIN_LIGHTNESS),\n );\n const variant = hslToRgb(hue, saturation, targetLightness);\n const ratio = contrastRatio(relativeLuminance(red, green, blue), relativeLuminance(...variant));\n return ratio >= SAME_HUE_MIN_CONTRAST ? rgbToHex(...variant) : fallback;\n}\n\nexport function sameHueContrastColor(hex: string | undefined, fallback: string): string {\n const rgb = hexToRgb(hex);\n if (!rgb) {\n return fallback;\n }\n const [red, green, blue] = rgb;\n const [hue, saturation, lightness] = rgbToHsl(red, green, blue);\n if (saturation === 0) {\n return fallback;\n }\n const targetLightness =\n lightness > 0.5\n ? Math.max(SAME_HUE_MIN_LIGHTNESS, Math.min(lightness - SAME_HUE_LIGHTNESS_GAP, SAME_HUE_MAX_LIGHTNESS))\n : Math.min(\n SAME_HUE_LIGHT_MAX_LIGHTNESS,\n Math.max(lightness + SAME_HUE_LIGHTNESS_GAP, SAME_HUE_LIGHT_MIN_LIGHTNESS),\n );\n return rgbToHex(...hslToRgb(hue, saturation, targetLightness));\n}\n\nexport function isLightColor(hex: string | undefined): boolean {\n const rgb = hexToRgb(hex);\n return rgb ? rgbToHsl(...rgb)[2] > 0.5 : false;\n}\n\nexport function sameHueTint(hex: string | undefined, targetLightness: number): string | undefined {\n const rgb = hexToRgb(hex);\n if (!rgb) {\n return undefined;\n }\n const [hue, saturation] = rgbToHsl(...rgb);\n if (saturation === 0) {\n return undefined;\n }\n return rgbToHex(...hslToRgb(hue, saturation, targetLightness));\n}\n","import type { GradientColor, MeshGradientColor } from '../../../model/color';\n\nexport { contrastTextColor, isLightColor, sameHueContrastColor, sameHueTint } from '../../color';\n\nexport function representativeColor(\n value: string | GradientColor | MeshGradientColor | undefined,\n fallback: string,\n): string {\n if (!value) {\n return fallback;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (value.type === 'gradient') {\n return value.stops[0]?.color ?? fallback;\n }\n return value.points[0]?.color ?? fallback;\n}\n","import type { Bounds, RenderNode } from '../../scene';\n\nconst ERROR_CAP_HALF = 5;\n\ninterface VerticalErrorWhisker {\n id: string;\n order: number;\n bounds: Bounds;\n geometry: {\n centerX: number;\n startY: number;\n endY: number;\n };\n color: string;\n valueReference: {\n seriesId: string;\n valueIndex: number;\n };\n}\n\nexport function errorBarRange(value: number, error: number | [number, number]): [number, number] {\n return Array.isArray(error) ? [value - error[0], value + error[1]] : [value - error, value + error];\n}\n\nexport function createVerticalErrorWhiskerNode(whisker: VerticalErrorWhisker): RenderNode {\n return {\n type: 'path',\n id: whisker.id,\n order: whisker.order,\n bounds: whisker.bounds,\n d: verticalErrorWhiskerPath(whisker.geometry),\n detail: {\n of: 'chartValue',\n series: whisker.valueReference.seriesId,\n valueIndex: whisker.valueReference.valueIndex,\n },\n style: { fill: { kind: 'none' }, stroke: { kind: 'solid', color: whisker.color }, strokeWidth: 1 },\n };\n}\n\nfunction verticalErrorWhiskerPath(geometry: VerticalErrorWhisker['geometry']): string {\n const { centerX, startY, endY } = geometry;\n const capStartX = centerX - ERROR_CAP_HALF;\n const capEndX = centerX + ERROR_CAP_HALF;\n return `M ${centerX} ${startY} L ${centerX} ${endY} M ${capStartX} ${startY} L ${capEndX} ${startY} M ${capStartX} ${endY} L ${capEndX} ${endY}`;\n}\n","export function formatFieldValue(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(2).replace(/\\.?0+$/, '');\n}\n","import type { Chart, ChartSeries } from '../../../model/chart';\nimport { finite } from '../../scene';\nimport { barCategoryCount } from './barCategories';\n\nexport const CATEGORY_LABEL_ROW = 18;\n\ninterface BarSettings {\n categories?: string[];\n barGroupGap?: number;\n barThickness?: number;\n orientation?: string;\n}\n\nconst settings = (chart: Chart): BarSettings | undefined => chart.config as BarSettings | undefined;\n\nexport function isHorizontalBar(chart: Chart): boolean {\n return chart.chartType === 'bar' && settings(chart)?.orientation === 'horizontal';\n}\n\nexport interface HorizontalRows {\n count: number;\n slotHeight: number;\n groupGap: number;\n labelRow: number;\n barsHeight: number;\n offset: number;\n}\n\nexport function horizontalRows(chart: Chart, plot: { height: number }): HorizontalRows {\n const count = barCategoryCount({ series: chart.series as ChartSeries[], config: settings(chart) });\n const slotHeight = plot.height / count;\n const groupGap = Math.min(Math.max(0, finite(settings(chart)?.barGroupGap, 8)), Math.max(0, slotHeight - 1));\n const labelRow = chart.categoryAlign === 'left' ? CATEGORY_LABEL_ROW : 0;\n const available = Math.max(1, slotHeight - groupGap - labelRow);\n const thickness = finite(settings(chart)?.barThickness, 0);\n const barsHeight = thickness > 0 ? Math.min(available, thickness) : available;\n return { count, slotHeight, groupGap, labelRow, barsHeight, offset: (available - barsHeight) / 2 };\n}\n\nexport function rowTop(rows: HorizontalRows, plot: { y: number }, index: number): number {\n return plot.y + index * rows.slotHeight + rows.groupGap / 2 + rows.offset;\n}\n","import { freeformPathData } from '../../scene/freeformPath';\n\nexport interface LinePathPoint {\n x: number;\n y: number;\n}\n\nexport function linePathData(points: LinePathPoint[], tension: number): string {\n if (tension > 0) {\n return freeformPathData({ points, tension, closed: false });\n }\n const commands = points.map((point, index) => `${index ? 'L' : ''} ${point.x} ${point.y}`);\n return `M ${commands.join(' ')}`;\n}\n","export interface PiePoint {\n x: number;\n y: number;\n}\n\nexport interface PieGeometry {\n centerX: number;\n centerY: number;\n outerRadius: number;\n innerRadius: number;\n}\n\nexport function resolvePieRadii(\n plotWidth: number,\n plotHeight: number,\n configInnerRadius: number | undefined,\n configCornerRadius: number | undefined,\n): { outerRadius: number; innerRadius: number; cornerRadius: number } {\n const rawOuterRadius = Math.max(1, Math.min(plotWidth, plotHeight) / 2 - 4);\n const rawInnerRadius = Math.max(0, Math.min(configInnerRadius ?? 0, rawOuterRadius - 1));\n const cornerRadius = Math.max(0, Math.min(configCornerRadius ?? 0, rawOuterRadius / 2));\n const outerRadius = Math.max(1, rawOuterRadius - cornerRadius);\n const innerRadius = rawInnerRadius > 0 ? Math.min(rawInnerRadius + cornerRadius, outerRadius - 1) : 0;\n return { outerRadius, innerRadius, cornerRadius };\n}\n\nexport interface PieSliceAngles {\n start: number;\n end: number;\n}\n\nexport function pieArcPoint(geometry: PieGeometry, angle: number, radius: number): PiePoint {\n return {\n x: geometry.centerX + radius * Math.cos(angle),\n y: geometry.centerY + radius * Math.sin(angle),\n };\n}\n\nexport function clipSegmentToRect(from: PiePoint, to: PiePoint, halfWidth: number, halfHeight: number): PiePoint {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n let tMin = 0;\n let tMax = 1;\n if (Math.abs(dx) > 1e-6) {\n const tx1 = (to.x - halfWidth - from.x) / dx;\n const tx2 = (to.x + halfWidth - from.x) / dx;\n tMin = Math.max(tMin, Math.min(tx1, tx2));\n tMax = Math.min(tMax, Math.max(tx1, tx2));\n }\n if (Math.abs(dy) > 1e-6) {\n const ty1 = (to.y - halfHeight - from.y) / dy;\n const ty2 = (to.y + halfHeight - from.y) / dy;\n tMin = Math.max(tMin, Math.min(ty1, ty2));\n tMax = Math.min(tMax, Math.max(ty1, ty2));\n }\n const t = tMin <= tMax ? tMin : 1;\n return { x: from.x + t * dx, y: from.y + t * dy };\n}\n\nfunction largeArcFlag(a: number, b: number): number {\n return Math.abs(b - a) > Math.PI ? 1 : 0;\n}\n\nexport function gapInsetAngle(halfGap: number, radius: number): number {\n if (halfGap <= 0 || radius <= 0) {\n return 0;\n }\n return Math.asin(Math.min(1, halfGap / radius));\n}\n\nfunction insetAngles(angles: PieSliceAngles, inset: number): PieSliceAngles {\n return { start: angles.start + inset, end: angles.end - inset };\n}\n\nexport function pieApexRadius(halfGap: number, sweep: number, outerRadius: number): number {\n if (halfGap <= 0) {\n return 0;\n }\n const halfSweep = Math.min(Math.abs(sweep) / 2, Math.PI / 2);\n const denominator = Math.sin(halfSweep);\n return denominator <= 1e-6 ? outerRadius : Math.min(halfGap / denominator, outerRadius);\n}\n\nfunction apexSlicePath(geometry: PieGeometry, outerAngles: PieSliceAngles, apex: PiePoint): string {\n const start = pieArcPoint(geometry, outerAngles.start, geometry.outerRadius);\n const end = pieArcPoint(geometry, outerAngles.end, geometry.outerRadius);\n return [\n `M ${apex.x} ${apex.y}`,\n `L ${start.x} ${start.y}`,\n `A ${geometry.outerRadius} ${geometry.outerRadius} 0 ${largeArcFlag(outerAngles.start, outerAngles.end)} 1 ${end.x} ${end.y}`,\n 'Z',\n ].join(' ');\n}\n\nfunction donutSlicePath(\n geometry: PieGeometry,\n innerRadius: number,\n outerAngles: PieSliceAngles,\n innerAngles: PieSliceAngles,\n): string {\n const outerStart = pieArcPoint(geometry, outerAngles.start, geometry.outerRadius);\n const outerEnd = pieArcPoint(geometry, outerAngles.end, geometry.outerRadius);\n const innerEnd = pieArcPoint(geometry, innerAngles.end, innerRadius);\n const innerStart = pieArcPoint(geometry, innerAngles.start, innerRadius);\n return [\n `M ${outerStart.x} ${outerStart.y}`,\n `A ${geometry.outerRadius} ${geometry.outerRadius} 0 ${largeArcFlag(outerAngles.start, outerAngles.end)} 1 ${outerEnd.x} ${outerEnd.y}`,\n `L ${innerEnd.x} ${innerEnd.y}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArcFlag(innerAngles.start, innerAngles.end)} 0 ${innerStart.x} ${innerStart.y}`,\n 'Z',\n ].join(' ');\n}\n\nconst CORNER_ANGLE_HEADROOM = 0.82;\n\ninterface PieFillet {\n lineTangent: PiePoint;\n arcTangent: PiePoint;\n angle: number;\n}\n\nfunction pieFillet(\n geometry: PieGeometry,\n circleRadius: number,\n filletCenterRadius: number,\n edgeAngle: number,\n cornerRadius: number,\n sign: 1 | -1,\n): PieFillet {\n const ratio = Math.min(1, cornerRadius / filletCenterRadius);\n const angle = edgeAngle + sign * Math.asin(ratio);\n const d = Math.sqrt(Math.max(0, filletCenterRadius * filletCenterRadius - cornerRadius * cornerRadius));\n return {\n lineTangent: { x: geometry.centerX + d * Math.cos(edgeAngle), y: geometry.centerY + d * Math.sin(edgeAngle) },\n arcTangent: pieArcPoint(geometry, angle, circleRadius),\n angle,\n };\n}\n\nexport function maxPieCornerRadius(outerRadius: number, innerRadius: number, sweep: number): number {\n const halfSweep = Math.min(Math.abs(sweep) / 2, Math.PI / 2);\n const angleFactor = Math.sin(halfSweep * CORNER_ANGLE_HEADROOM);\n const outerLimit = outerRadius * angleFactor;\n const innerLimit = innerRadius > 0 ? innerRadius * angleFactor : Number.POSITIVE_INFINITY;\n const ringLimit = innerRadius > 0 ? (outerRadius - innerRadius) / 2 : outerRadius / 2;\n return Math.max(0, Math.min(outerLimit, innerLimit, ringLimit));\n}\n\nexport function maxApexCornerRadius(outerRadius: number, apexRadius: number, sweep: number): number {\n const halfSweep = Math.min(Math.abs(sweep) / 2, Math.PI / 2);\n const angleFactor = Math.sin(halfSweep * CORNER_ANGLE_HEADROOM);\n const outerLimit = outerRadius * angleFactor;\n const depthLimit = (outerRadius * outerRadius - apexRadius * apexRadius) / (2 * outerRadius);\n return Math.max(0, Math.min(outerLimit, depthLimit));\n}\n\nfunction roundedApexSlicePath(\n geometry: PieGeometry,\n outerAngles: PieSliceAngles,\n cornerRadius: number,\n apex: PiePoint,\n): string {\n const { outerRadius } = geometry;\n const outerFilletCenterRadius = outerRadius - cornerRadius;\n const start = pieFillet(geometry, outerRadius, outerFilletCenterRadius, outerAngles.start, cornerRadius, 1);\n const end = pieFillet(geometry, outerRadius, outerFilletCenterRadius, outerAngles.end, cornerRadius, -1);\n return [\n `M ${apex.x} ${apex.y}`,\n `L ${start.lineTangent.x} ${start.lineTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${start.arcTangent.x} ${start.arcTangent.y}`,\n `A ${outerRadius} ${outerRadius} 0 ${largeArcFlag(start.angle, end.angle)} 1 ${end.arcTangent.x} ${end.arcTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${end.lineTangent.x} ${end.lineTangent.y}`,\n 'Z',\n ].join(' ');\n}\n\nfunction roundedDonutSlicePath(\n geometry: PieGeometry,\n innerRadius: number,\n outerAngles: PieSliceAngles,\n innerAngles: PieSliceAngles,\n cornerRadius: number,\n): string {\n const { outerRadius } = geometry;\n const outerFilletCenterRadius = outerRadius - cornerRadius;\n const outerStart = pieFillet(geometry, outerRadius, outerFilletCenterRadius, outerAngles.start, cornerRadius, 1);\n const outerEnd = pieFillet(geometry, outerRadius, outerFilletCenterRadius, outerAngles.end, cornerRadius, -1);\n\n const innerFilletCenterRadius = innerRadius + cornerRadius;\n const innerStart = pieFillet(geometry, innerRadius, innerFilletCenterRadius, innerAngles.start, cornerRadius, 1);\n const innerEnd = pieFillet(geometry, innerRadius, innerFilletCenterRadius, innerAngles.end, cornerRadius, -1);\n\n return [\n `M ${outerStart.lineTangent.x} ${outerStart.lineTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${outerStart.arcTangent.x} ${outerStart.arcTangent.y}`,\n `A ${outerRadius} ${outerRadius} 0 ${largeArcFlag(outerStart.angle, outerEnd.angle)} 1 ${outerEnd.arcTangent.x} ${outerEnd.arcTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${outerEnd.lineTangent.x} ${outerEnd.lineTangent.y}`,\n `L ${innerEnd.lineTangent.x} ${innerEnd.lineTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${innerEnd.arcTangent.x} ${innerEnd.arcTangent.y}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArcFlag(innerEnd.angle, innerStart.angle)} 0 ${innerStart.arcTangent.x} ${innerStart.arcTangent.y}`,\n `A ${cornerRadius} ${cornerRadius} 0 0 1 ${innerStart.lineTangent.x} ${innerStart.lineTangent.y}`,\n 'Z',\n ].join(' ');\n}\n\nexport function pieUsesInnerArc(geometry: PieGeometry, angles: PieSliceAngles, gapPx: number): boolean {\n const halfGap = Math.max(0, gapPx) / 2;\n const apexRadius = pieApexRadius(halfGap, angles.end - angles.start, geometry.outerRadius);\n return geometry.innerRadius > 0 && geometry.innerRadius >= apexRadius;\n}\n\nexport function createPieSlicePath(geometry: PieGeometry, angles: PieSliceAngles, cornerRadius = 0, gapPx = 0): string {\n const halfGap = Math.max(0, gapPx) / 2;\n const outerAngles = insetAngles(angles, gapInsetAngle(halfGap, geometry.outerRadius));\n\n if (!pieUsesInnerArc(geometry, angles, gapPx)) {\n const apexRadius = pieApexRadius(halfGap, angles.end - angles.start, geometry.outerRadius);\n const apex = pieArcPoint(geometry, (angles.start + angles.end) / 2, apexRadius);\n return cornerRadius > 0\n ? roundedApexSlicePath(geometry, outerAngles, cornerRadius, apex)\n : apexSlicePath(geometry, outerAngles, apex);\n }\n\n const innerAngles = insetAngles(angles, gapInsetAngle(halfGap, geometry.innerRadius));\n return cornerRadius > 0\n ? roundedDonutSlicePath(geometry, geometry.innerRadius, outerAngles, innerAngles, cornerRadius)\n : donutSlicePath(geometry, geometry.innerRadius, outerAngles, innerAngles);\n}\n","import { roundedBarPath } from './barShape';\n\nexport interface SegmentFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function segmentedBarPath(\n frame: SegmentFrame,\n orientation: 'horizontal' | 'vertical',\n count: number,\n gap: number,\n radius: number,\n fraction: number,\n snap: boolean,\n): string {\n const horizontal = orientation === 'horizontal';\n const length = horizontal ? frame.width : frame.height;\n const segment = Math.max(1, (length - gap * (count - 1)) / count);\n const filled = Math.min(count, Math.max(0, fraction * count));\n const units = snap ? Math.round(filled) : filled;\n const parts: string[] = [];\n for (let index = 0; index < count; index++) {\n const visible = Math.min(1, Math.max(0, units - index)) * segment;\n if (visible < 0.5) {\n continue;\n }\n const offset = index * (segment + gap);\n parts.push(\n horizontal\n ? roundedBarPath(frame.x + offset, frame.y, visible, frame.height, radius)\n : roundedBarPath(frame.x, frame.y + frame.height - offset - visible, frame.width, visible, radius),\n );\n }\n return parts.join(' ');\n}\n","import type { ShadowStyle } from '../../../model/shadow';\nimport { finite } from '../../scene';\n\nexport interface ResolvedShadow {\n color: string;\n opacity: number;\n blur: number;\n dx: number;\n dy: number;\n}\n\nexport function resolveChartShadow(shadow: ShadowStyle | undefined): ResolvedShadow | undefined {\n if (!shadow?.enabled) {\n return undefined;\n }\n const angle = (finite(shadow.angle, 45) * Math.PI) / 180;\n const distance = finite(shadow.distance, 5);\n return {\n color: shadow.color ?? '#000000',\n opacity: finite(shadow.opacity, 0.25),\n blur: finite(shadow.blur, 10),\n dx: Math.cos(angle) * distance,\n dy: Math.sin(angle) * distance,\n };\n}\n","import type { Chart } from '../../../model/chart';\nimport { mapChartValue } from './axis';\n\ninterface StackedSegment {\n value: number;\n pixelStart: number;\n pixelEnd: number;\n}\n\nexport function stackedSegment(\n chart: Chart,\n mode: 'true' | 'percent' | 'waterfall',\n categoryIndex: number,\n seriesIndex: number,\n plotHeight: number,\n): StackedSegment {\n const value = (chart.series[seriesIndex].values as number[])[categoryIndex] ?? 0;\n if (mode === 'waterfall') {\n return waterfallSegment(chart, categoryIndex, seriesIndex, plotHeight, value);\n }\n if (mode === 'percent') {\n return percentSegment(chart, categoryIndex, seriesIndex, plotHeight, value);\n }\n return cumulativeSegment(chart, categoryIndex, seriesIndex, plotHeight, value);\n}\n\nfunction waterfallSegment(\n chart: Chart,\n categoryIndex: number,\n seriesIndex: number,\n plotHeight: number,\n value: number,\n): StackedSegment {\n let running = 0;\n for (let index = 0; index < categoryIndex; index++) {\n running += (chart.series[seriesIndex].values as number[])[index] ?? 0;\n }\n return mappedSegment(value, running, running + value, chart, plotHeight);\n}\n\nfunction percentSegment(\n chart: Chart,\n categoryIndex: number,\n seriesIndex: number,\n plotHeight: number,\n value: number,\n): StackedSegment {\n const total =\n chart.series.reduce((sum, series) => sum + Math.abs((series.values as number[])[categoryIndex] ?? 0), 0) || 1;\n let cumulative = 0;\n for (let index = 0; index < seriesIndex; index++) {\n cumulative += Math.abs((chart.series[index].values as number[])[categoryIndex] ?? 0);\n }\n const magnitude = Math.abs(value);\n return {\n value,\n pixelStart: (cumulative / total) * plotHeight,\n pixelEnd: ((cumulative + magnitude) / total) * plotHeight,\n };\n}\n\nfunction cumulativeSegment(\n chart: Chart,\n categoryIndex: number,\n seriesIndex: number,\n plotHeight: number,\n value: number,\n): StackedSegment {\n let cumulative = 0;\n for (let index = 0; index < seriesIndex; index++) {\n cumulative += (chart.series[index].values as number[])[categoryIndex] ?? 0;\n }\n return mappedSegment(value, cumulative, cumulative + value, chart, plotHeight);\n}\n\nfunction mappedSegment(value: number, start: number, end: number, chart: Chart, plotHeight: number): StackedSegment {\n return {\n value,\n pixelStart: mapChartValue(start, chart.axisY, plotHeight),\n pixelEnd: mapChartValue(end, chart.axisY, plotHeight),\n };\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Bounds, SceneText } from '../../scene';\nimport { DEFAULT_FONT, finite } from '../../scene';\n\nexport interface ChartTextOptions {\n id: string;\n order: number;\n bounds: Bounds;\n frame: { x: number; y: number; width: number; height: number };\n text: string;\n chart: Chart;\n align?: 'left' | 'center' | 'right';\n rotation?: number;\n role?: 'axis' | 'legend';\n}\n\nexport function chartText(options: ChartTextOptions): SceneText {\n const { chart, frame } = options;\n return {\n type: 'text',\n id: options.id,\n order: options.order,\n bounds: options.bounds,\n ...frame,\n lines: [options.text],\n fontFamily: (options.role === 'axis' ? chart.axisFontFamily : undefined) ?? chart.fontFamily ?? DEFAULT_FONT,\n fontSize: Math.max(\n 9,\n finite(options.role === 'axis' ? (chart.axisFontSize ?? chart.fontSize) : chart.fontSize, 12),\n ),\n fontWeight: 'normal',\n color:\n (options.role === 'axis' ? chart.axisLabelColor : options.role === 'legend' ? chart.legendColor : undefined) ??\n chart.textColor ??\n '#0f172a',\n align: options.align ?? 'left',\n verticalAlign: 'top',\n lineHeight: 1.2,\n rotation: options.rotation,\n rotationCenter: options.rotation ? { x: frame.x, y: frame.y } : undefined,\n };\n}\n","const IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction block(kind: string, id: string, property: string): string | undefined {\n return IDENT.test(id) ? `${kind}[${id}].${property}` : undefined;\n}\n\nexport const CHART_TITLE_PROP = 'text';\n\nexport function axisLabelProp(axis: 'x' | 'y'): string {\n return `Axis[${axis}].label`;\n}\n\nexport function categoryProp(index: number): string | undefined {\n return Number.isInteger(index) && index >= 0 ? `categories[${index}]` : undefined;\n}\n\nexport function seriesLabelProp(id: string): string | undefined {\n return block('Series', id, 'label');\n}\n\nexport function seriesColorProp(id: string): string | undefined {\n return block('Series', id, 'color');\n}\n\nexport function seriesLabelOffsetXProp(id: string): string | undefined {\n return block('Series', id, 'labelOffsetX');\n}\n\nexport function seriesLabelOffsetYProp(id: string): string | undefined {\n return block('Series', id, 'labelOffsetY');\n}\n\nexport function seriesValueProp(id: string, index: number): string | undefined {\n return Number.isInteger(index) && index >= 0 ? block('Series', id, `values[${index}]`) : undefined;\n}\n\nexport function seriesValueColorProp(id: string, index: number): string | undefined {\n return Number.isInteger(index) && index >= 0 ? block('Series', id, `colors[${index}]`) : undefined;\n}\n\nexport function ruleTextProp(id: string): string | undefined {\n return block('Rule', id, 'text');\n}\n\nexport function ruleAtProp(id: string): string | undefined {\n return block('Rule', id, 'at');\n}\n","import type { Chart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { chartText } from '../primitives';\nimport { axisLabelProp } from '../propPath';\nimport type { ChartLayout } from './layout';\n\nfunction buildXAxisLabel(chart: Chart, layout: ChartLayout, order: number): RenderNode | null {\n if (!chart.axisX.label) {\n return null;\n }\n return {\n ...chartText({\n role: 'axis',\n id: `chart-x-label-${chart.id}`,\n order,\n bounds: layout.bounds,\n frame: { x: layout.plot.x, y: chart.y + chart.height - 18, width: layout.plot.width, height: 18 },\n text: chart.axisX.label,\n chart,\n align: 'center',\n }),\n prop: axisLabelProp('x'),\n };\n}\n\nfunction buildYAxisLabel(chart: Chart, layout: ChartLayout, order: number): RenderNode | null {\n if (!chart.axisY.label || chart.showValueAxis === false) {\n return null;\n }\n return {\n ...chartText({\n role: 'axis',\n id: `chart-y-label-${chart.id}`,\n order,\n bounds: layout.bounds,\n frame: {\n x: chart.x + 12,\n y: layout.plot.y + layout.plot.height,\n width: layout.plot.height,\n height: 18,\n },\n text: chart.axisY.label,\n chart,\n align: 'center',\n rotation: -90,\n }),\n prop: axisLabelProp('y'),\n };\n}\n\nexport function buildAxisLabels(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n const labels: RenderNode[] = [];\n const xLabel = buildXAxisLabel(chart, layout, order);\n if (xLabel) {\n labels.push(xLabel);\n }\n const yLabel = buildYAxisLabel(chart, layout, order + labels.length);\n if (yLabel) {\n labels.push(yLabel);\n }\n return labels;\n}\n","import type { Chart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { chartText } from '../primitives';\nimport { seriesLabelProp } from '../propPath';\nimport type { ChartLayout } from './layout';\n\nexport function buildBoxplotSeriesYAxisTicks(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n const count = Math.max(1, chart.series.length);\n const slotWidth = layout.plot.height / count;\n\n return chart.series.map((series, index) => {\n const centerY = layout.plot.y + (index + 0.5) * slotWidth;\n return {\n ...chartText({\n role: 'axis',\n id: `chart-y-tick-${chart.id}-${index}`,\n order: order + index,\n bounds: layout.bounds,\n frame: { x: chart.x, y: centerY - 9, width: layout.padLeft - 8, height: 18 },\n text: series.label || series.id,\n chart,\n align: 'right',\n }),\n prop: seriesLabelProp(series.id),\n };\n });\n}\n","import type { Chart, ChartSeries } from '../../../model/chart';\nimport type { Bounds, RenderDiagnostic, RenderNode } from '../../scene';\nimport { finite, paint } from '../../scene';\nimport { CHART_COLORS, chartText, representativeColor } from '../primitives';\nimport { seriesColorProp, seriesLabelProp } from '../propPath';\nimport type { ChartLayout } from './layout';\n\nexport interface ChartLegendRender {\n chart: Chart;\n plot: ChartLayout['plot'];\n bounds: Bounds;\n order: number;\n diagnostics: RenderDiagnostic[];\n}\n\ninterface ChartLegendItem {\n series: ChartSeries;\n seriesIndex: number;\n x: number;\n y: number;\n width: number;\n order: number;\n}\n\nconst CHARTS_WITH_OWN_LEGEND = new Set(['heatmap', 'boxplot', 'sankey', 'treemap', 'mekko']);\n\nexport function buildLegend(render: ChartLegendRender): RenderNode[] {\n if (!usesStandardLegend(render.chart)) {\n return [];\n }\n return createLegendItems(render).flatMap(item => renderLegendItem(render, item));\n}\n\nfunction usesStandardLegend(chart: Chart): boolean {\n const isConnectedCustom = chart.chartType === 'custom' && Boolean(chart.config?.connectPoints);\n return chart.showLegend !== false && !CHARTS_WITH_OWN_LEGEND.has(chart.chartType) && !isConnectedCustom;\n}\n\nfunction legendSeries(chart: Chart): ChartSeries[] {\n return chart.chartType === 'field'\n ? chart.series.filter(item => (item.values[0] as number[] | undefined)?.length === 4)\n : chart.series;\n}\n\nexport const LEGEND_ROW_HEIGHT = 22;\nexport const LEGEND_COLUMN_GAP = 16;\n\nexport function isStackedLegendPosition(position: Chart['legendPosition']): boolean {\n return position === 'bottomLeft' || position === 'bottomRight';\n}\n\nfunction legendItemWidths(chart: Chart): number[] {\n return legendSeries(chart).map(item => Math.max(42, item.label.length * finite(chart.fontSize, 12) * 0.58 + 22));\n}\n\nexport function stackedLegendColumnWidth(chart: Chart): number {\n const widths = legendItemWidths(chart);\n return widths.length ? Math.max(...widths) : 0;\n}\n\nfunction legendStartX(chart: Chart, plot: ChartLegendRender['plot'], totalWidth: number): number {\n if (chart.legendPosition === 'bottom') {\n return plot.x + (plot.width - totalWidth) / 2;\n }\n return plot.x + plot.width - totalWidth;\n}\n\nfunction legendY(chart: Chart, plot: ChartLegendRender['plot']): number {\n return (chart.legendPosition ?? 'top') === 'top' ? chart.y + 16 : plot.y + plot.height + 16;\n}\n\nfunction createStackedLegendItems(render: ChartLegendRender): ChartLegendItem[] {\n const { chart, plot, order } = render;\n const series = legendSeries(chart);\n const widths = legendItemWidths(chart);\n const maxWidth = Math.max(...widths);\n const x =\n chart.legendPosition === 'bottomLeft'\n ? plot.x - LEGEND_COLUMN_GAP - maxWidth\n : plot.x + plot.width + LEGEND_COLUMN_GAP;\n const lastY = plot.y + plot.height - 15;\n return series.map((item, seriesIndex) => ({\n series: item,\n seriesIndex,\n x,\n y: lastY - (series.length - 1 - seriesIndex) * LEGEND_ROW_HEIGHT,\n width: widths[seriesIndex],\n order: order + (series.length - 1 - seriesIndex) * 2,\n }));\n}\n\nfunction createRowLegendItems(render: ChartLegendRender): ChartLegendItem[] {\n const { chart, plot, order } = render;\n const series = legendSeries(chart);\n const widths = legendItemWidths(chart);\n const totalWidth = widths.reduce((sum, width) => sum + width, 0);\n const y = legendY(chart, plot);\n let x = legendStartX(chart, plot, totalWidth);\n return series.map((item, seriesIndex) => {\n const width = widths[seriesIndex];\n const itemX = x;\n x += width;\n return { series: item, seriesIndex, x: itemX, y, width, order: order + (series.length - 1 - seriesIndex) * 2 };\n });\n}\n\nfunction createLegendItems(render: ChartLegendRender): ChartLegendItem[] {\n return isStackedLegendPosition(render.chart.legendPosition)\n ? createStackedLegendItems(render)\n : createRowLegendItems(render);\n}\n\nfunction renderLegendItem(render: ChartLegendRender, item: ChartLegendItem): RenderNode[] {\n return [createLegendSwatch(render, item), createLegendLabel(render, item)];\n}\n\nfunction createLegendSwatch(render: ChartLegendRender, item: ChartLegendItem): RenderNode {\n const { chart, bounds, diagnostics } = render;\n const fallback = CHART_COLORS[item.seriesIndex % CHART_COLORS.length];\n const solidOnly = chart.chartType === 'line';\n const color = solidOnly ? representativeColor(item.series.color, fallback) : (item.series.color ?? fallback);\n return {\n type: 'rect',\n id: `chart-legend-swatch-${chart.id}-${item.series.id}`,\n order: item.order,\n bounds,\n x: item.x,\n y: item.y,\n width: 10,\n height: 10,\n rx: 3,\n prop: seriesColorProp(item.series.id),\n propKind: 'color',\n propSolidOnly: solidOnly,\n style: { fill: paint(color, diagnostics, chart.id) },\n };\n}\n\nfunction createLegendLabel(render: ChartLegendRender, item: ChartLegendItem): RenderNode {\n const { chart, bounds } = render;\n return {\n ...chartText({\n role: 'legend',\n id: `chart-legend-${chart.id}-${item.series.id}`,\n order: item.order + 1,\n bounds,\n frame: { x: item.x + 15, y: item.y - 3, width: item.width - 15, height: 18 },\n text: item.series.label,\n chart,\n }),\n prop: seriesLabelProp(item.series.id),\n };\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Bounds } from '../../scene';\nimport { boxBounds, finite } from '../../scene';\nimport { isHorizontalBar } from '../primitives';\nimport { isStackedLegendPosition, LEGEND_COLUMN_GAP, LEGEND_ROW_HEIGHT, stackedLegendColumnWidth } from './legend';\n\nexport const CARTESIAN_VALUE_TYPES = new Set(['bar', 'line', 'scatter', 'boxplot', 'hexbin', 'custom', 'field']);\nconst CHARTS_WITHOUT_CARTESIAN_DECORATIONS = new Set([\n 'heatmap',\n 'sankey',\n 'treemap',\n 'mekko',\n 'pie',\n 'radialBar',\n 'polarArea',\n]);\n\nexport function hasCartesianDecorations(chart: Chart): boolean {\n return !CHARTS_WITHOUT_CARTESIAN_DECORATIONS.has(chart.chartType);\n}\n\nexport function tickOffset(chart: Chart): number {\n return hasCartesianDecorations(chart) ? Math.max(0, finite(chart.tickLength, 0)) : 0;\n}\n\nfunction isHorizontalBoxplot(chart: Chart): boolean {\n return chart.chartType === 'boxplot' && chart.config?.orientation === 'horizontal';\n}\n\nfunction boxplotCategoryLabelWidth(chart: Chart): number {\n const fontSize = finite(chart.fontSize, 12);\n const longest = Math.max(0, ...chart.series.map(series => (series.label || series.id).length));\n return longest * fontSize * 0.58 + 16;\n}\n\nconst TREEMAP_SIDE_LEGEND_WIDTH = 66;\n\nfunction treemapSideLegendSide(chart: Chart, showLegend: boolean): 'left' | 'right' | null {\n if (chart.chartType !== 'treemap' || !showLegend) {\n return null;\n }\n return chart.legendPosition === 'left' ? 'left' : chart.legendPosition === 'right' ? 'right' : null;\n}\n\nexport interface ChartLayout {\n bounds: Bounds;\n plot: { x: number; y: number; width: number; height: number };\n showLabels: boolean;\n showLegend: boolean;\n padLeft: number;\n}\n\nfunction barCategoryLabelWidth(chart: Chart): number {\n const fontSize = finite(chart.axisFontSize ?? chart.fontSize, 12);\n const categories = (chart.config as { categories?: string[] } | undefined)?.categories ?? [];\n return Math.max(0, ...categories.map(category => category.length)) * fontSize * 0.58 + 16;\n}\n\nfunction leftLabelWidth(chart: Chart): number {\n if (isHorizontalBoxplot(chart)) {\n return boxplotCategoryLabelWidth(chart);\n }\n if (isHorizontalBar(chart)) {\n return chart.categoryAlign === 'left' || chart.categoryAlign === 'inside' ? 20 : barCategoryLabelWidth(chart);\n }\n if (chart.showValueAxis === false) {\n return 20;\n }\n return chart.axisY.label ? 60 : 46;\n}\n\nexport function decorations(chart: Chart): ChartLayout {\n const showLabels = chart.showAxisLabels !== false;\n const showLegend = chart.showLegend !== false;\n const legendPosition = chart.legendPosition ?? 'top';\n const legendAtTop = legendPosition === 'top';\n const hasLegendItems = showLegend && chart.series.length > 0;\n const legendStacked = hasLegendItems && isStackedLegendPosition(legendPosition);\n const sideColumnWidth = legendStacked ? stackedLegendColumnWidth(chart) + LEGEND_COLUMN_GAP : 0;\n const treemapSide = treemapSideLegendSide(chart, showLegend);\n\n const tick = tickOffset(chart);\n const padLeft =\n tick +\n (showLabels ? leftLabelWidth(chart) : 12) +\n (legendPosition === 'bottomLeft' ? sideColumnWidth : 0) +\n (treemapSide === 'left' ? TREEMAP_SIDE_LEGEND_WIDTH : 0);\n const padRight =\n 24 +\n (legendPosition === 'bottomRight' ? sideColumnWidth : 0) +\n (treemapSide === 'right' ? TREEMAP_SIDE_LEGEND_WIDTH : 0);\n const valueRow =\n chart.chartType === 'bar' && chart.config?.showBarLabels === true && chart.config.barLabelPosition === 'axis';\n const horizontalValueAxis = isHorizontalBar(chart) && chart.showValueAxis !== false;\n const basePadBottom = showLabels\n ? isHorizontalBar(chart)\n ? horizontalValueAxis\n ? 34\n : 12\n : (chart.axisX.label ? 52 : 34) + (valueRow ? 18 : 0)\n : 12;\n const hasColorBar = chart.chartType === 'field' && showLegend && Boolean(chart.config?.scale?.stops.length);\n const legendAtBottomRow = hasLegendItems && !legendAtTop && !legendStacked;\n const padBottom = tick + basePadBottom + (hasColorBar ? 44 : 0) + (legendAtBottomRow ? 16 + LEGEND_ROW_HEIGHT : 0);\n const titleHeight = chart.title ? Math.max(44, 20 + finite(chart.titleSize, 14) * 1.6) : 0;\n const padTop = titleHeight || (legendAtTop && hasLegendItems ? 44 : 24);\n\n return {\n bounds: boxBounds(\n { x: chart.x, y: chart.y, width: chart.width, height: chart.height },\n finite(chart.strokeWidth, 1) + 2,\n ),\n plot: {\n x: chart.x + padLeft,\n y: chart.y + padTop,\n width: Math.max(1, chart.width - padLeft - padRight),\n height: Math.max(1, chart.height - padTop - padBottom),\n },\n showLabels,\n showLegend,\n padLeft,\n };\n}\n","import type { TypedChart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { finite } from '../../scene';\nimport { barCategoryCount, chartText } from '../primitives';\nimport { categoryProp, seriesLabelProp } from '../propPath';\nimport { type ChartLayout, tickOffset } from './layout';\n\nfunction categoryLabels(chart: TypedChart, count: number): string[] {\n if (chart.config?.categories?.length) {\n return chart.config.categories;\n }\n return Array.from({ length: count }, (_value, index) => String(index + 1));\n}\n\nexport function buildCategoricalXAxisTicks(chart: TypedChart, layout: ChartLayout, order: number): RenderNode[] {\n const count = barCategoryCount(chart);\n const slotWidth = layout.plot.width / count;\n const labels = categoryLabels(chart, count);\n\n const editable = Boolean(chart.config?.categories?.length);\n const left = chart.categoryAlign === 'left';\n const groupGap = left\n ? Math.min(\n Math.max(0, finite((chart.config as { barGroupGap?: number } | undefined)?.barGroupGap, 8)),\n Math.max(0, slotWidth - 1),\n )\n : 0;\n\n return Array.from({ length: count }, (_value, index) => {\n const centerX = layout.plot.x + (index + 0.5) * slotWidth;\n return {\n ...chartText({\n role: 'axis',\n id: `chart-x-tick-${chart.id}-${index}`,\n order: order + index,\n bounds: layout.bounds,\n frame: {\n x: left ? layout.plot.x + index * slotWidth + groupGap / 2 : centerX - slotWidth / 2,\n y: layout.plot.y + layout.plot.height + 4 + tickOffset(chart),\n width: left ? slotWidth - groupGap : slotWidth,\n height: 18,\n },\n text: labels[index] ?? String(index + 1),\n chart,\n align: left ? 'left' : 'center',\n }),\n prop: editable ? categoryProp(index) : undefined,\n };\n });\n}\n\nexport function buildSeriesXAxisTicks(chart: TypedChart, layout: ChartLayout, order: number): RenderNode[] {\n const count = Math.max(1, chart.series.length);\n const slotWidth = layout.plot.width / count;\n\n return chart.series.map((series, index) => {\n const centerX = layout.plot.x + (index + 0.5) * slotWidth;\n return {\n ...chartText({\n role: 'axis',\n id: `chart-x-tick-${chart.id}-${index}`,\n order: order + index,\n bounds: layout.bounds,\n frame: {\n x: centerX - slotWidth / 2,\n y: layout.plot.y + layout.plot.height + 4 + tickOffset(chart),\n width: slotWidth,\n height: 18,\n },\n text: series.label || series.id,\n chart,\n align: 'center',\n }),\n prop: seriesLabelProp(series.id),\n };\n });\n}\n","import type { Chart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { chartText, chartTicks, mapChartValue } from '../primitives';\nimport { type ChartLayout, tickOffset } from './layout';\n\nexport function buildNumericXAxisTicks(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n return chartTicks(chart.axisX).map((tick, index) => {\n const x = layout.plot.x + mapChartValue(tick, chart.axisX, layout.plot.width);\n return chartText({\n role: 'axis',\n id: `chart-x-tick-${chart.id}-${tick}`,\n order: order + index,\n bounds: layout.bounds,\n frame: { x: x - 20, y: layout.plot.y + layout.plot.height + 10 + tickOffset(chart), width: 40, height: 18 },\n text: String(tick),\n chart,\n align: 'center',\n });\n });\n}\n","import type { Chart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { chartText, chartTicks, mapChartValue } from '../primitives';\nimport { type ChartLayout, tickOffset } from './layout';\n\nexport function buildNumericYAxisTicks(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n return chartTicks(chart.axisY).map((tick, index) => {\n const y = layout.plot.y + layout.plot.height - mapChartValue(tick, chart.axisY, layout.plot.height);\n return chartText({\n role: 'axis',\n id: `chart-y-tick-${chart.id}-${tick}`,\n order: order + index,\n bounds: layout.bounds,\n frame: { x: chart.x, y: y - 6, width: layout.padLeft - 14 - tickOffset(chart), height: 18 },\n text: String(tick),\n chart,\n align: 'right',\n });\n });\n}\n","import type { Chart } from '../../../model/chart';\nimport type { RenderNode, SceneStyle } from '../../scene';\nimport { finite } from '../../scene';\nimport {\n barCategoryCount,\n chartText,\n chartTicks,\n horizontalRows,\n isHorizontalBar,\n mapChartValue,\n rowTop,\n} from '../primitives';\nimport { categoryProp } from '../propPath';\nimport { buildAxisLabels } from './axisLabels';\nimport { buildBoxplotSeriesYAxisTicks } from './boxplotYAxis';\nimport { buildCategoricalXAxisTicks, buildSeriesXAxisTicks } from './categoricalXAxis';\nimport { type ChartLayout, hasCartesianDecorations } from './layout';\nimport { buildNumericXAxisTicks } from './numericXAxis';\nimport { buildNumericYAxisTicks } from './numericYAxis';\n\nfunction isHorizontalBoxplot(chart: Chart): boolean {\n return chart.chartType === 'boxplot' && chart.config?.orientation === 'horizontal';\n}\n\nfunction buildXAxisTicks(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n if (chart.chartType === 'bar') {\n return buildCategoricalXAxisTicks(chart, layout, order);\n }\n if (chart.chartType === 'boxplot' && !isHorizontalBoxplot(chart)) {\n return buildSeriesXAxisTicks(chart, layout, order);\n }\n return buildNumericXAxisTicks(chart, layout, order);\n}\n\nfunction buildYAxisTicks(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n if (isHorizontalBoxplot(chart)) {\n return buildBoxplotSeriesYAxisTicks(chart, layout, order);\n }\n return chart.showValueAxis === false ? [] : buildNumericYAxisTicks(chart, layout, order);\n}\n\nfunction xTickPositions(chart: Chart, layout: ChartLayout): number[] {\n const { plot } = layout;\n if (chart.chartType === 'bar') {\n const count = barCategoryCount(chart);\n return Array.from({ length: count }, (_value, index) => plot.x + ((index + 0.5) * plot.width) / count);\n }\n return chartTicks(chart.axisX).map(tick => plot.x + mapChartValue(tick, chart.axisX, plot.width));\n}\n\nfunction axisLineDash(chart: Chart, width: number): Pick<SceneStyle, 'dash' | 'lineCap'> {\n if (chart.axisLineStyle === 'dashed') {\n return { dash: [width * 3, width * 2] };\n }\n return chart.axisLineStyle === 'dotted' ? { dash: [0.1, width * 3], lineCap: 'round' } : {};\n}\n\nfunction buildAxisLines(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n const lineWidth = finite(chart.axisLineWidth, 0);\n const tickLength = finite(chart.tickLength, 0);\n if (lineWidth <= 0 && tickLength <= 0) {\n return [];\n }\n const { plot, bounds } = layout;\n const bottom = plot.y + plot.height;\n const style: SceneStyle = {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.axisLineColor ?? chart.gridColor ?? '#94a3b8' },\n strokeWidth: lineWidth > 0 ? lineWidth : 1,\n pointerEvents: 'none',\n ...axisLineDash(chart, lineWidth > 0 ? lineWidth : 1),\n };\n const nodes: RenderNode[] = [];\n const add = (id: string, d: string) =>\n nodes.push({ type: 'path', id: `chart-axis-${id}-${chart.id}`, order: order + nodes.length, bounds, d, style });\n if (lineWidth > 0) {\n if (chart.showValueAxis !== false) {\n add('line-y', `M ${plot.x} ${plot.y} L ${plot.x} ${bottom}`);\n }\n add('line-x', `M ${plot.x} ${bottom} L ${plot.x + plot.width} ${bottom}`);\n }\n if (tickLength > 0 && isHorizontalBar(chart)) {\n chartTicks(chart.axisY).forEach(tick => {\n const x = plot.x + mapChartValue(tick, chart.axisY, plot.width);\n add(`tick-v-${tick}`, `M ${x} ${bottom} L ${x} ${bottom + tickLength}`);\n });\n const rows = horizontalRows(chart, plot);\n for (let index = 0; index < rows.count; index++) {\n const y = rowTop(rows, plot, index) + rows.labelRow + rows.barsHeight / 2;\n add(`tick-c-${index}`, `M ${plot.x - tickLength} ${y} L ${plot.x} ${y}`);\n }\n }\n if (tickLength > 0 && !isHorizontalBoxplot(chart) && !isHorizontalBar(chart)) {\n chartTicks(chart.axisY).forEach(tick => {\n const y = bottom - mapChartValue(tick, chart.axisY, plot.height);\n add(`tick-y-${tick}`, `M ${plot.x - tickLength} ${y} L ${plot.x} ${y}`);\n });\n xTickPositions(chart, layout).forEach((x, index) => {\n add(`tick-x-${index}`, `M ${x} ${bottom} L ${x} ${bottom + tickLength}`);\n });\n }\n return nodes;\n}\n\nfunction categoryNames(chart: Chart, count: number): string[] {\n const names = (chart.config as { categories?: string[] } | undefined)?.categories;\n return Array.from({ length: count }, (_value, index) => names?.[index] ?? String(index + 1));\n}\n\nfunction buildHorizontalBarAxes(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n const { plot, bounds } = layout;\n const rows = horizontalRows(chart, plot);\n const above = chart.categoryAlign === 'left';\n const inside = chart.categoryAlign === 'inside';\n const editable = Boolean((chart.config as { categories?: string[] } | undefined)?.categories?.length);\n const nodes: RenderNode[] = categoryNames(chart, rows.count).map((name, index) => {\n const top = rowTop(rows, plot, index);\n return {\n ...chartText({\n role: 'axis',\n id: `chart-y-category-${chart.id}-${index}`,\n order: order + index,\n bounds,\n frame: above\n ? { x: plot.x, y: top, width: plot.width, height: rows.labelRow }\n : inside\n ? { x: plot.x + 14, y: top + rows.barsHeight / 2 - 9, width: plot.width - 28, height: 18 }\n : { x: chart.x + 8, y: top + rows.barsHeight / 2 - 9, width: plot.x - chart.x - 16, height: 18 },\n text: name,\n chart,\n align: above || inside ? 'left' : 'right',\n }),\n prop: editable ? categoryProp(index) : undefined,\n };\n });\n if (chart.showValueAxis !== false) {\n chartTicks(chart.axisY).forEach((tick, index) => {\n const x = plot.x + mapChartValue(tick, chart.axisY, plot.width);\n nodes.push(\n chartText({\n role: 'axis',\n id: `chart-x-tick-${chart.id}-${tick}`,\n order: order + rows.count + index,\n bounds,\n frame: { x: x - 20, y: plot.y + plot.height + 4 + finite(chart.tickLength, 0), width: 40, height: 18 },\n text: String(tick),\n chart,\n align: 'center',\n }),\n );\n });\n }\n return nodes;\n}\n\nexport function buildChartAxes(chart: Chart, layout: ChartLayout, order: number): RenderNode[] {\n if (!hasCartesianDecorations(chart)) {\n return [];\n }\n const lines = buildAxisLines(chart, layout, order);\n if (!layout.showLabels) {\n return lines;\n }\n order += lines.length;\n if (isHorizontalBar(chart)) {\n return [...lines, ...buildHorizontalBarAxes(chart, layout, order)];\n }\n\n const xTicks = buildXAxisTicks(chart, layout, order);\n const yTicks = buildYAxisTicks(chart, layout, order + xTicks.length);\n const labels = buildAxisLabels(chart, layout, order + xTicks.length + yTicks.length);\n return [...lines, ...xTicks, ...yTicks, ...labels];\n}\n","import type { FieldSample } from './types';\n\nexport function idwInterpolate(samples: FieldSample[], pointX: number, pointY: number, power: number): number {\n let weightedSum = 0;\n let weightSum = 0;\n for (const sample of samples) {\n const deltaX = sample.x - pointX;\n const deltaY = sample.y - pointY;\n const distanceSquared = deltaX * deltaX + deltaY * deltaY;\n if (distanceSquared === 0) {\n return sample.value;\n }\n const weight = 1 / distanceSquared ** (power / 2);\n weightedSum += weight * sample.value;\n weightSum += weight;\n }\n return weightSum === 0 ? 0 : weightedSum / weightSum;\n}\n","import type { Chart } from '../../../model/chart';\nimport type { SceneStyle } from '../../scene';\nimport { idwInterpolate } from './idw';\nimport type { FieldGrid, FieldSample } from './types';\n\nexport const FIELD_GRID_MAX_CELLS = 32;\n\nexport function fieldSurfaceClip(\n chart: Chart,\n plot: { x: number; y: number; width: number; height: number },\n): SceneStyle['clip'] {\n return { type: 'rect', x: plot.x, y: plot.y, width: plot.width, height: plot.height, rx: chart.cornerRadius ?? 12 };\n}\n\nexport function computeFieldGrid(samples: FieldSample[], width: number, height: number, power: number): FieldGrid {\n const aspect = width > 0 && height > 0 ? width / height : 1;\n const cols = Math.max(\n 2,\n Math.min(FIELD_GRID_MAX_CELLS, Math.round(Math.sqrt(FIELD_GRID_MAX_CELLS * FIELD_GRID_MAX_CELLS * aspect))),\n );\n const rows = Math.max(2, Math.round(cols / aspect));\n const grid = new Float32Array(cols * rows);\n for (let row = 0; row < rows; row++) {\n const pointY = height * (row / (rows - 1));\n for (let column = 0; column < cols; column++) {\n const pointX = width * (column / (cols - 1));\n grid[row * cols + column] = samples.length ? idwInterpolate(samples, pointX, pointY, power) : 0;\n }\n }\n return { grid, cols, rows };\n}\n","import type { ChartType } from '../../model/chart';\n\nexport const CIRCULAR_GRID_CHART_TYPES: ReadonlySet<ChartType> = new Set(['scatter', 'custom', 'hexbin']);\n","import { freeformPathData } from '../../scene/freeformPath';\n\nexport interface RadarPoint {\n x: number;\n y: number;\n}\n\nexport interface RadarFrame {\n centerX: number;\n centerY: number;\n radius: number;\n min: number;\n max: number;\n count: number;\n curved: boolean;\n}\n\nconst START_ANGLE = -Math.PI / 2;\nconst CURVED_TENSION = 0.5;\nconst LABEL_FREE_MARGIN = 6;\n\nexport function radarLabelSpace(fontSize: number): number {\n return Math.max(38, fontSize * 3.2);\n}\n\nexport function radarRadius(plotWidth: number, plotHeight: number, fontSize: number, hasLabels = true): number {\n const margin = hasLabels ? radarLabelSpace(fontSize) : LABEL_FREE_MARGIN;\n return Math.max(8, Math.min(plotWidth, plotHeight) / 2 - margin);\n}\n\nexport function radarCategoryCount(configuredCount: number, dataCount: number): number {\n return Math.max(3, configuredCount || dataCount);\n}\n\nexport function radarAngleAt(count: number, index: number): number {\n return START_ANGLE + (index * Math.PI * 2) / count;\n}\n\nexport function angleForAxisValue(min: number, max: number, value: number): number {\n const ratio = max === min ? 0 : (value - min) / (max - min);\n return START_ANGLE + ratio * Math.PI * 2;\n}\n\nexport function radarPointAt(frame: RadarFrame, index: number, pointRadius: number): RadarPoint {\n const angle = radarAngleAt(frame.count, index);\n return {\n x: frame.centerX + Math.cos(angle) * pointRadius,\n y: frame.centerY + Math.sin(angle) * pointRadius,\n };\n}\n\nexport function radarRadiusForValue(frame: RadarFrame, value: number): number {\n const range = frame.max - frame.min;\n const ratio = range === 0 ? 0 : Math.max(0, Math.min(1, (value - frame.min) / range));\n return ratio * frame.radius;\n}\n\nexport function radarVertexPoint(frame: RadarFrame, index: number, value: number): RadarPoint {\n return radarPointAt(frame, index, radarRadiusForValue(frame, value));\n}\n\nexport function radarValueAtPoint(frame: RadarFrame, index: number, px: number, py: number): number {\n const angle = radarAngleAt(frame.count, index);\n const projected = (px - frame.centerX) * Math.cos(angle) + (py - frame.centerY) * Math.sin(angle);\n const ratio = frame.radius === 0 ? 0 : Math.max(0, Math.min(1, projected / frame.radius));\n return frame.min + ratio * (frame.max - frame.min);\n}\n\nexport function radarSeriesPath(points: RadarPoint[], curved: boolean): string {\n if (points.length === 0) {\n return '';\n }\n if (curved) {\n return freeformPathData({ points, tension: CURVED_TENSION, closed: true });\n }\n const commands = points.map((point, index) => `${index ? 'L ' : ''}${point.x} ${point.y}`);\n return `M ${commands.join(' ')} Z`;\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Bounds, RenderNode, SceneStyle } from '../../scene';\n\nexport function createGridDot(\n chart: Chart,\n id: string,\n order: number,\n bounds: Bounds,\n x: number,\n y: number,\n width: number,\n clip: SceneStyle['clip'],\n): RenderNode {\n const radius = Math.max(1, width * 1.5);\n const style = { fill: { kind: 'solid' as const, color: chart.gridColor ?? '#e2e8f0' }, clip };\n if (chart.gridRoundedCorners === true) {\n return { type: 'ellipse', id, order, bounds, cx: x, cy: y, rx: radius, ry: radius, style };\n }\n const size = radius * 2;\n return { type: 'rect', id, order, bounds, x: x - radius, y: y - radius, width: size, height: size, style };\n}\n","import type { Chart } from '../../../model/chart';\nimport type { SceneStyle } from '../../scene';\n\nexport function gridLineDashStyle(chart: Chart, width: number): Pick<SceneStyle, 'dash' | 'lineCap'> {\n if (chart.gridLineStyle !== 'dashed') {\n return {};\n }\n const rounded = chart.gridRoundedCorners === true;\n return { dash: [width * 3, width * 2], lineCap: rounded ? 'round' : 'butt' };\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Bounds, RenderNode, SceneStyle } from '../../scene';\nimport { finite } from '../../scene';\nimport { chartTicks } from '../primitives';\nimport { angleForAxisValue } from '../primitives/radarShape';\nimport { createGridDot } from './gridDots';\nimport { gridLineDashStyle } from './gridLineStyle';\nimport type { ChartLayout } from './layout';\n\nexport function buildCircularChartGrid(\n chart: Chart,\n plot: ChartLayout['plot'],\n bounds: Bounds,\n order: number,\n): RenderNode[] {\n const centerX = plot.x + plot.width / 2;\n const centerY = plot.y + plot.height / 2;\n const radius = Math.max(0, Math.min(plot.width, plot.height) / 2);\n const width = finite(chart.gridWidth, 1);\n\n if (chart.gridLineStyle === 'dotted') {\n return buildDottedCircularGrid(chart, bounds, order, centerX, centerY, radius, width);\n }\n\n const style: SceneStyle = {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: width,\n ...gridLineDashStyle(chart, width),\n };\n\n const nodes: RenderNode[] = [];\n chartTicks(chart.axisY)\n .filter(tick => tick > chart.axisY.min)\n .forEach(tick => {\n const ringRadius = radius * ringRatio(chart, tick);\n nodes.push({\n type: 'ellipse',\n id: `chart-grid-ring-${chart.id}-${tick}`,\n order: order + nodes.length,\n bounds,\n cx: centerX,\n cy: centerY,\n rx: ringRadius,\n ry: ringRadius,\n style,\n });\n });\n\n chartTicks(chart.axisX).forEach(tick => {\n const angle = angleForAxisValue(chart.axisX.min, chart.axisX.max, tick);\n const edgeX = centerX + Math.cos(angle) * radius;\n const edgeY = centerY + Math.sin(angle) * radius;\n nodes.push({\n type: 'path',\n id: `chart-grid-spoke-${chart.id}-${tick}`,\n order: order + nodes.length,\n bounds,\n d: `M ${centerX} ${centerY} L ${edgeX} ${edgeY}`,\n style,\n });\n });\n\n return nodes;\n}\n\nfunction buildDottedCircularGrid(\n chart: Chart,\n bounds: Bounds,\n order: number,\n centerX: number,\n centerY: number,\n radius: number,\n width: number,\n): RenderNode[] {\n const yTicks = chartTicks(chart.axisY).filter(tick => tick > chart.axisY.min);\n const xTicks = chartTicks(chart.axisX);\n const nodes: RenderNode[] = [];\n yTicks.forEach(yTick => {\n const ringRadius = radius * ringRatio(chart, yTick);\n xTicks.forEach(xTick => {\n const angle = angleForAxisValue(chart.axisX.min, chart.axisX.max, xTick);\n const x = centerX + Math.cos(angle) * ringRadius;\n const y = centerY + Math.sin(angle) * ringRadius;\n const id = `chart-grid-dot-${chart.id}-${xTick}-${yTick}`;\n nodes.push(createGridDot(chart, id, order + nodes.length, bounds, x, y, width, undefined));\n });\n });\n return nodes;\n}\n\nfunction ringRatio(chart: Chart, tick: number): number {\n const range = chart.axisY.max - chart.axisY.min;\n return range === 0 ? 0 : Math.max(0, Math.min(1, (tick - chart.axisY.min) / range));\n}\n","import type { Chart } from '../../../model/chart';\nimport type { Bounds, RenderNode, SceneStyle } from '../../scene';\nimport { finite } from '../../scene';\nimport { fieldSurfaceClip } from '../field/grid';\nimport { CIRCULAR_GRID_CHART_TYPES } from '../gridSupport';\nimport { chartTicks, isHorizontalBar, mapChartValue } from '../primitives';\nimport { buildCircularChartGrid } from './gridCircle';\nimport { createGridDot } from './gridDots';\nimport { gridLineDashStyle } from './gridLineStyle';\nimport { type ChartLayout, hasCartesianDecorations } from './layout';\n\nexport function buildChartGrid(chart: Chart, plot: ChartLayout['plot'], bounds: Bounds, order: number): RenderNode[] {\n if (chart.showGrid === false || !hasCartesianDecorations(chart)) {\n return [];\n }\n\n if (chart.gridShape === 'circle' && CIRCULAR_GRID_CHART_TYPES.has(chart.chartType)) {\n return buildCircularChartGrid(chart, plot, bounds, order);\n }\n\n const width = finite(chart.gridWidth, 1);\n if (isHorizontalBar(chart)) {\n return buildHorizontalBarGrid(chart, plot, bounds, order, width);\n }\n const clip = chart.chartType === 'field' ? fieldSurfaceClip(chart, plot) : undefined;\n if (chart.gridLineStyle === 'dotted') {\n return buildDottedRectGrid(chart, plot, bounds, order, width, clip);\n }\n\n const style: SceneStyle = {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: width,\n ...gridLineDashStyle(chart, width),\n clip,\n };\n\n const nodes: RenderNode[] = [];\n (chart.gridAxes === 'y' ? [] : chartTicks(chart.axisX)).forEach(tick => {\n const x = plot.x + mapChartValue(tick, chart.axisX, plot.width);\n nodes.push({\n type: 'path',\n id: `chart-grid-x-${chart.id}-${tick}`,\n order: order + nodes.length,\n bounds,\n d: `M ${x} ${plot.y} L ${x} ${plot.y + plot.height}`,\n style,\n });\n });\n (chart.gridAxes === 'x' ? [] : chartTicks(chart.axisY)).forEach(tick => {\n const y = plot.y + plot.height - mapChartValue(tick, chart.axisY, plot.height);\n nodes.push({\n type: 'path',\n id: `chart-grid-y-${chart.id}-${tick}`,\n order: order + nodes.length,\n bounds,\n d: `M ${plot.x} ${y} L ${plot.x + plot.width} ${y}`,\n style,\n });\n });\n return nodes;\n}\n\nfunction buildHorizontalBarGrid(\n chart: Chart,\n plot: ChartLayout['plot'],\n bounds: Bounds,\n order: number,\n width: number,\n): RenderNode[] {\n if (chart.gridAxes === 'y') {\n return [];\n }\n const style: SceneStyle = {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: width,\n ...(chart.gridLineStyle === 'dotted'\n ? { dash: [0.1, width * 3], lineCap: 'round' as const }\n : gridLineDashStyle(chart, width)),\n };\n return chartTicks(chart.axisY).map((tick, index) => {\n const x = plot.x + mapChartValue(tick, chart.axisY, plot.width);\n return {\n type: 'path',\n id: `chart-grid-x-${chart.id}-${tick}`,\n order: order + index,\n bounds,\n d: `M ${x} ${plot.y} L ${x} ${plot.y + plot.height}`,\n style,\n };\n });\n}\n\nfunction buildDottedRectGrid(\n chart: Chart,\n plot: ChartLayout['plot'],\n bounds: Bounds,\n order: number,\n width: number,\n clip: SceneStyle['clip'],\n): RenderNode[] {\n const xTicks = chartTicks(chart.axisX);\n const yTicks = chartTicks(chart.axisY);\n const nodes: RenderNode[] = [];\n xTicks.forEach(xTick => {\n const x = plot.x + mapChartValue(xTick, chart.axisX, plot.width);\n yTicks.forEach(yTick => {\n const y = plot.y + plot.height - mapChartValue(yTick, chart.axisY, plot.height);\n const id = `chart-grid-dot-${chart.id}-${xTick}-${yTick}`;\n nodes.push(createGridDot(chart, id, order + nodes.length, bounds, x, y, width, clip));\n });\n });\n return nodes;\n}\n","import type { Chart, ChartRule } from '../../../model/chart';\nimport type { Bounds, RenderNode } from '../../scene';\nimport { finite } from '../../scene';\nimport { chartText, mapChartValue } from '../primitives';\nimport { ruleAtProp, ruleTextProp } from '../propPath';\nimport type { ChartLayout } from './layout';\n\nexport interface ChartRulesRender {\n chart: Chart;\n plot: ChartLayout['plot'];\n bounds: Bounds;\n order: number;\n}\n\ninterface ChartRuleMark {\n rule: ChartRule;\n color: string;\n y: number;\n lineOrder: number;\n labelOrder?: number;\n}\n\nexport function buildChartRules(render: ChartRulesRender): RenderNode[] {\n if (!render.chart.rules?.length) {\n return [];\n }\n return createChartRuleMarks(render).flatMap(mark => renderChartRule(render, mark));\n}\n\nfunction createChartRuleMarks(render: ChartRulesRender): ChartRuleMark[] {\n let nextOrder = render.order;\n return (render.chart.rules ?? []).map(rule => {\n const lineOrder = nextOrder++;\n const labelOrder = rule.text ? nextOrder++ : undefined;\n return {\n rule,\n color: rule.color || render.chart.strokeColor || '#475569',\n y: render.plot.y + render.plot.height - mapChartValue(rule.at, render.chart.axisY, render.plot.height),\n lineOrder,\n labelOrder,\n };\n });\n}\n\nfunction renderChartRule(render: ChartRulesRender, mark: ChartRuleMark): RenderNode[] {\n const nodes = [createChartRuleLine(render, mark)];\n if (mark.rule.text && mark.labelOrder !== undefined) {\n nodes.push(createChartRuleLabel(render, mark));\n }\n return nodes;\n}\n\nfunction createChartRuleLine(render: ChartRulesRender, mark: ChartRuleMark): RenderNode {\n return {\n type: 'path',\n id: `chart-rule-${render.chart.id}-${mark.rule.id}`,\n order: mark.lineOrder,\n bounds: render.bounds,\n d: `M ${render.plot.x} ${mark.y} L ${render.plot.x + render.plot.width} ${mark.y}`,\n prop: ruleAtProp(mark.rule.id),\n propKind: 'value',\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: mark.color },\n strokeWidth: mark.rule.strokeWidth ?? 1,\n dash: mark.rule.dash,\n },\n };\n}\n\nfunction createChartRuleLabel(render: ChartRulesRender, mark: ChartRuleMark): RenderNode {\n const fontSize = Math.max(9, finite(render.chart.fontSize, 12) - 2);\n return {\n ...chartText({\n id: `chart-rule-label-${render.chart.id}-${mark.rule.id}`,\n order: mark.labelOrder ?? mark.lineOrder + 1,\n bounds: render.bounds,\n frame: { x: render.plot.x + 4, y: mark.y - fontSize - 2, width: 160, height: fontSize + 2 },\n text: mark.rule.text ?? '',\n chart: render.chart,\n }),\n color: mark.color,\n prop: ruleTextProp(mark.rule.id),\n };\n}\n","import type { Chart } from '../../model/chart';\nimport type { Bounds, RenderNode } from '../scene';\nimport { finite } from '../scene';\nimport type { ChartRenderOrder } from './chartRenderOrder';\n\nexport function chartImageRect(chart: Chart): { x: number; y: number; width: number; height: number; rx: number } {\n const inset = finite(chart.strokeWidth, 1) / 2;\n return {\n x: chart.x + inset,\n y: chart.y + inset,\n width: Math.max(1, chart.width - inset * 2),\n height: Math.max(1, chart.height - inset * 2),\n rx: Math.max(0, finite(chart.cornerRadius, 12) - inset),\n };\n}\n\nexport function buildChartBackdrop(chart: Chart, bounds: Bounds, order: ChartRenderOrder): RenderNode[] {\n if (!chart.fillImage) {\n return [];\n }\n const rect = chartImageRect(chart);\n const nodes: RenderNode[] = [\n {\n type: 'image',\n id: `chart-image-${chart.id}`,\n order: order.next(),\n bounds,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n href: chart.fillImage.url,\n style: { clip: { type: 'rect', ...rect }, pointerEvents: 'none' },\n },\n ];\n if (chart.fillImage.overlay) {\n nodes.push({\n type: 'rect',\n id: `chart-image-overlay-${chart.id}`,\n order: order.next(),\n bounds,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n rx: rect.rx,\n style: { fill: { kind: 'solid', color: chart.fillImage.overlay }, pointerEvents: 'none' },\n });\n }\n return nodes;\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite } from '../../../scene';\nimport { chartImageRect } from '../../chartBackdrop';\nimport { buildChartGrid } from '../../decorations/grid';\nimport type { ChartRenderContext } from '../types';\n\nexport function createGlassBackdropNodes(context: ChartRenderContext, id: string, d: string): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const blur = finite(chart.config?.barGlassBlur, 0);\n if (blur <= 0 || !chart.fillImage) {\n return [];\n }\n const rect = chartImageRect(chart);\n const nodes: RenderNode[] = [\n {\n type: 'image',\n id: `chart-bar-glass-${chart.id}-${id}`,\n order: nextOrder(),\n bounds,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n href: chart.fillImage.url,\n style: {\n blur,\n saturate: finite(chart.config?.barGlassSaturation, 1),\n clip: { type: 'path', d },\n pointerEvents: 'none',\n },\n },\n ];\n if (chart.fillImage.overlay) {\n nodes.push({\n type: 'path',\n id: `chart-bar-glass-overlay-${chart.id}-${id}`,\n order: nextOrder(),\n bounds,\n d,\n style: { fill: { kind: 'solid', color: chart.fillImage.overlay }, pointerEvents: 'none' },\n });\n }\n if (chart.config?.barGlassTint) {\n nodes.push({\n type: 'path',\n id: `chart-bar-glass-tint-${chart.id}-${id}`,\n order: nextOrder(),\n bounds,\n d,\n style: { fill: { kind: 'solid', color: chart.config.barGlassTint }, pointerEvents: 'none' },\n });\n }\n nodes.push(\n ...buildChartGrid(chart, context.plot, bounds, 0).map(node => ({\n ...node,\n id: `${node.id}-glass-${id}`,\n order: nextOrder(),\n style: {\n ...('style' in node ? node.style : {}),\n clip: { type: 'path' as const, d },\n pointerEvents: 'none' as const,\n },\n })),\n );\n return nodes;\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { representativeColor } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\n\nexport function createBarGlowNode(\n context: ChartRenderContext,\n id: string,\n d: string,\n color: NonNullable<ChartSeries['color']>,\n glow: number,\n bounds: RenderNode['bounds'] = context.bounds,\n): RenderNode {\n const { chart, diagnostics, nextOrder } = context;\n return {\n type: 'path',\n id,\n order: nextOrder(),\n bounds,\n d,\n style: {\n fill: paint(color, diagnostics, chart.id),\n shadow: { color: representativeColor(color, '#ffffff'), opacity: 0.9, blur: glow, dx: 0, dy: 0 },\n pointerEvents: 'none',\n },\n };\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport { BAR_LABEL, barLabelSize, CATEGORY_LABEL_ROW, chartText, formatBarLabel, pillPath } from '../../primitives';\nimport type { BarLabelSize } from '../../primitives/barLabel';\nimport type { ChartRenderContext } from '../types';\n\nexport type BarLabelPlacement = 'outside' | 'inside' | 'center' | 'axis';\n\nexport interface BarLabelTarget {\n id: string;\n value: number;\n frame: { x: number; y: number; width: number; height: number };\n placement: BarLabelPlacement;\n horizontal?: boolean;\n}\n\ninterface LabelBox extends BarLabelSize {\n left: number;\n top: number;\n}\n\nexport function barLabelsEnabled(context: ChartRenderContext): boolean {\n return context.chart.config?.showBarLabels === true;\n}\n\nfunction resolvePlacement(target: BarLabelTarget, size: BarLabelSize): BarLabelPlacement {\n const fits = target.frame.height >= size.height + BAR_LABEL.gap * 2;\n return target.placement !== 'outside' && !fits ? 'outside' : target.placement;\n}\n\nfunction labelTop(placement: BarLabelPlacement, frame: BarLabelTarget['frame'], height: number): number {\n if (placement === 'outside') {\n return frame.y - height - BAR_LABEL.gap;\n }\n return placement === 'inside' ? frame.y + BAR_LABEL.gap : frame.y + frame.height / 2 - height / 2;\n}\n\nfunction createPillNode(context: ChartRenderContext, id: string, box: LabelBox, color: string): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const config = chart.config;\n return {\n type: 'path',\n id: `${id}-pill`,\n order: nextOrder(),\n bounds,\n d: pillPath(box.left, box.top, box.width, box.height),\n style: {\n fill: config?.barLabelPillColor ? paint(config.barLabelPillColor, diagnostics, chart.id) : { kind: 'none' },\n stroke: paint(config?.barLabelBorderColor ?? color, diagnostics, chart.id),\n strokeWidth: finite(config?.barLabelBorderWidth, 1),\n pointerEvents: 'none',\n },\n };\n}\n\nfunction createTextNode(\n context: ChartRenderContext,\n id: string,\n box: LabelBox,\n text: string,\n placement: BarLabelPlacement,\n fontSize: number,\n color: string,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const config = chart.config;\n return {\n ...chartText({\n id,\n order: nextOrder(),\n bounds,\n frame: { x: box.left, y: box.top + box.padY, width: box.width, height: box.lineHeight },\n text,\n chart,\n align: 'center',\n }),\n mark: `bar-label|${placement}|${config?.barLabelFormat ?? ''}`,\n color,\n fontSize,\n fontFamily: config?.barLabelFontFamily ?? chart.fontFamily ?? 'Inter, sans-serif',\n fontWeight: config?.barLabelFontWeight ?? 'normal',\n };\n}\n\nfunction createAxisValueNode(\n context: ChartRenderContext,\n target: BarLabelTarget,\n text: string,\n fontSize: number,\n): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n const config = chart.config;\n const top = plot.y + plot.height + 4 + 16 + Math.max(0, chart.tickLength ?? 0);\n return {\n ...chartText({\n id: target.id,\n order: nextOrder(),\n bounds,\n frame: target.horizontal\n ? chart.categoryAlign === 'inside'\n ? {\n x: plot.x,\n y: target.frame.y + target.frame.height / 2 - fontSize * 0.6,\n width: plot.width - 14,\n height: fontSize * 1.2,\n }\n : { x: plot.x, y: target.frame.y - CATEGORY_LABEL_ROW, width: plot.width, height: fontSize * 1.2 }\n : { x: target.frame.x, y: top, width: target.frame.width, height: fontSize * 1.2 },\n text,\n chart,\n align: target.horizontal ? 'right' : chart.categoryAlign === 'left' ? 'left' : 'center',\n }),\n mark: `bar-label|axis|${config?.barLabelFormat ?? ''}`,\n color: config?.barLabelColor ?? chart.textColor ?? '#0f172a',\n fontSize,\n fontFamily: config?.barLabelFontFamily ?? chart.fontFamily ?? 'Inter, sans-serif',\n fontWeight: config?.barLabelFontWeight ?? 'normal',\n };\n}\n\nfunction horizontalPlacement(target: BarLabelTarget, size: BarLabelSize): BarLabelPlacement {\n const requested = target.placement === 'axis' ? 'outside' : target.placement;\n const fits = target.frame.width >= size.width + BAR_LABEL.gap * 2;\n return requested !== 'outside' && !fits ? 'outside' : requested;\n}\n\nfunction horizontalBox(target: BarLabelTarget, size: BarLabelSize, placement: BarLabelPlacement): LabelBox {\n const { frame } = target;\n const left =\n placement === 'outside'\n ? frame.x + frame.width + BAR_LABEL.gap\n : placement === 'inside'\n ? frame.x + frame.width - size.width - BAR_LABEL.gap\n : frame.x + frame.width / 2 - size.width / 2;\n return { ...size, left, top: frame.y + frame.height / 2 - size.height / 2 };\n}\n\nexport function createBarLabelNodes(context: ChartRenderContext, target: BarLabelTarget): RenderNode[] {\n const { chart } = context;\n const config = chart.config;\n const fontSize = Math.max(8, finite(config?.barLabelFontSize, finite(chart.fontSize, 12)));\n const text = formatBarLabel(target.value, config?.barLabelFormat);\n if (target.placement === 'axis') {\n return [createAxisValueNode(context, target, text, fontSize)];\n }\n const pill = config?.barLabelPill === true;\n const size = barLabelSize(text, fontSize, pill);\n const placement = target.horizontal ? horizontalPlacement(target, size) : resolvePlacement(target, size);\n const box: LabelBox = target.horizontal\n ? horizontalBox(target, size, placement)\n : {\n ...size,\n left: target.frame.x + target.frame.width / 2 - size.width / 2,\n top: labelTop(placement, target.frame, size.height),\n };\n const color = config?.barLabelColor ?? chart.textColor ?? '#0f172a';\n\n const nodes: RenderNode[] = [];\n if (pill) {\n nodes.push(createPillNode(context, target.id, box, color));\n }\n nodes.push(createTextNode(context, target.id, box, text, placement, fontSize, color));\n return nodes;\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport { roundedBarPath } from '../../primitives/barShape';\nimport { segmentedBarPath } from '../../primitives/segments';\nimport type { ChartRenderContext } from '../types';\n\nconst DEFAULT_HATCH = { angle: 45, spacing: 7, width: 1.5 };\nconst MIN_HATCH_SPACING = 2;\n\nfunction hatchPath(x: number, y: number, width: number, height: number, angle: number, spacing: number): string {\n const radians = (angle * Math.PI) / 180;\n const direction = { x: Math.cos(radians), y: Math.sin(radians) };\n const normal = { x: -direction.y, y: direction.x };\n const center = { x: x + width / 2, y: y + height / 2 };\n const reach = Math.hypot(width, height) / 2;\n const segments: string[] = [];\n for (let offset = -reach; offset <= reach; offset += spacing) {\n const cx = center.x + normal.x * offset;\n const cy = center.y + normal.y * offset;\n segments.push(\n `M ${cx - direction.x * reach} ${cy - direction.y * reach} L ${cx + direction.x * reach} ${cy + direction.y * reach}`,\n );\n }\n return segments.join(' ');\n}\n\nexport function barTrackClip(\n context: ChartRenderContext,\n frame: { x: number; y: number; width: number; height: number },\n): { type: 'path'; d: string } | undefined {\n if (!barTrackEnabled(context)) {\n return undefined;\n }\n return {\n type: 'path',\n d: roundedBarPath(frame.x, frame.y, frame.width, frame.height, context.chart.config?.barCornerRadius ?? 2),\n };\n}\n\nexport function barTrackEnabled(context: ChartRenderContext): boolean {\n return context.chart.config?.barTrack === true;\n}\n\nexport function createBarTrackNodes(\n context: ChartRenderContext,\n id: string,\n frame: { x: number; y: number; width: number; height: number },\n orientation: 'horizontal' | 'vertical' = 'vertical',\n): RenderNode[] {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const config = chart.config;\n const radius = config?.barCornerRadius ?? 2;\n const segments = finite(config?.barSegments, 0);\n const d =\n segments > 0\n ? segmentedBarPath(frame, orientation, segments, finite(config?.barSegmentGap, 4), radius, 1, true)\n : roundedBarPath(frame.x, frame.y, frame.width, frame.height, radius);\n const nodes: RenderNode[] = [\n {\n type: 'path',\n id: `chart-bar-track-${chart.id}-${id}`,\n order: nextOrder(),\n bounds,\n d,\n style: {\n fill: paint(config?.barTrackColor ?? chart.gridColor ?? '#e2e8f0', diagnostics, chart.id),\n pointerEvents: 'none',\n },\n },\n ];\n if (config?.barTrackHatch) {\n nodes.push({\n type: 'path',\n id: `chart-bar-track-hatch-${chart.id}-${id}`,\n order: nextOrder(),\n bounds,\n d: hatchPath(\n frame.x,\n frame.y,\n frame.width,\n frame.height,\n finite(config.barTrackHatchAngle, DEFAULT_HATCH.angle),\n Math.max(MIN_HATCH_SPACING, finite(config.barTrackHatchSpacing, DEFAULT_HATCH.spacing)),\n ),\n style: {\n fill: { kind: 'none' },\n stroke: paint(config.barTrackHatchColor ?? chart.gridColor ?? '#cbd5e1', diagnostics, chart.id),\n strokeWidth: finite(config.barTrackHatchWidth, DEFAULT_HATCH.width),\n pointerEvents: 'none',\n clip: { type: 'path', d },\n },\n });\n }\n return nodes;\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport {\n barCategoryCount,\n barPath,\n CHART_COLORS,\n createVerticalErrorWhiskerNode,\n errorBarRange,\n mapChartValue,\n resolveChartShadow,\n segmentedBarPath,\n} from '../../primitives';\nimport { seriesValueColorProp, seriesValueProp } from '../../propPath';\nimport type { ChartRenderContext } from '../types';\nimport { createGlassBackdropNodes } from './glass';\nimport { createBarGlowNode } from './glow';\nimport { barLabelsEnabled, createBarLabelNodes } from './labels';\nimport { barTrackClip, barTrackEnabled, createBarTrackNodes } from './track';\n\ninterface GroupedBarLayout {\n slotWidth: number;\n seriesWidth: number;\n groupGap: number;\n barGap: number;\n}\n\ninterface GroupedBarMark {\n seriesId: string;\n valueIndex: number;\n value: number;\n error: number | [number, number] | null | undefined;\n color: NonNullable<ChartSeries['color']>;\n hasColorOverride: boolean;\n frame: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport function renderGroupedBars(context: ChartRenderContext): RenderNode[] {\n const layout = createGroupedBarLayout(context);\n const marks = context.chart.series.flatMap((series, seriesIndex) =>\n createSeriesBarMarks(context, layout, series, seriesIndex),\n );\n const tracks = barTrackEnabled(context)\n ? marks.flatMap(mark =>\n createBarTrackNodes(context, `${mark.seriesId}-${mark.valueIndex}`, {\n x: mark.frame.x,\n y: context.plot.y,\n width: mark.frame.width,\n height: context.plot.height,\n }),\n )\n : [];\n const bars = marks.flatMap(mark => renderGroupedBarMark(context, mark));\n const labels = barLabelsEnabled(context) ? marks.flatMap(mark => createGroupedLabel(context, mark, marks)) : [];\n return [...tracks, ...bars, ...marks.flatMap(mark => createGroupedGlow(context, mark)), ...labels];\n}\n\nfunction isSeriesMax(mark: GroupedBarMark, marks: GroupedBarMark[]): boolean {\n const values = marks.filter(entry => entry.seriesId === mark.seriesId).map(entry => entry.value);\n return mark.value >= Math.max(...values);\n}\n\nfunction createGroupedLabel(context: ChartRenderContext, mark: GroupedBarMark, marks: GroupedBarMark[]): RenderNode[] {\n const { chart } = context;\n if (chart.config?.barLabelMaxOnly && !isSeriesMax(mark, marks)) {\n return [];\n }\n return createBarLabelNodes(context, {\n id: `chart-bar-label-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n value: mark.value,\n frame: mark.frame,\n placement: chart.config?.barLabelPosition ?? 'outside',\n });\n}\n\nfunction groupedShape(context: ChartRenderContext, frame: GroupedBarMark['frame']): string {\n const { chart, plot } = context;\n const config = chart.config;\n const radius = config?.barCornerRadius ?? 2;\n const segments = finite(config?.barSegments, 0);\n if (segments > 0) {\n return segmentedBarPath(\n { x: frame.x, y: plot.y, width: frame.width, height: plot.height },\n 'vertical',\n segments,\n finite(config?.barSegmentGap, 4),\n radius,\n frame.height / plot.height,\n config?.barSegmentSnap !== false,\n );\n }\n return barPath(frame.x, frame.y, frame.width, frame.height, radius, config?.barRoundedBottom === true);\n}\n\nfunction createGroupedGlow(context: ChartRenderContext, mark: GroupedBarMark): RenderNode[] {\n const { chart } = context;\n const glow = finite(chart.config?.barGlow, 0);\n if (glow <= 0 || mark.frame.height <= 0) {\n return [];\n }\n const d = groupedShape(context, mark.frame);\n return [\n createBarGlowNode(context, `chart-bar-glow-${chart.id}-${mark.seriesId}-${mark.valueIndex}`, d, mark.color, glow),\n ];\n}\n\nfunction createGroupedBarLayout(context: ChartRenderContext): GroupedBarLayout {\n const { chart, plot } = context;\n const valueCount = barCategoryCount(chart);\n const slotWidth = plot.width / valueCount;\n const groupGap = Math.min(Math.max(0, finite(chart.config?.barGroupGap, 8)), Math.max(0, slotWidth - 1));\n const barGap = Math.max(0, finite(chart.config?.barGap, 2));\n return {\n slotWidth,\n seriesWidth: Math.max(1, (slotWidth - groupGap) / Math.max(1, chart.series.length)),\n groupGap,\n barGap,\n };\n}\n\nfunction createSeriesBarMarks(\n context: ChartRenderContext,\n layout: GroupedBarLayout,\n series: ChartSeries,\n seriesIndex: number,\n): GroupedBarMark[] {\n const { chart, plot } = context;\n const seriesColor = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n return series.values.map((value, valueIndex) => {\n const numericValue = Array.isArray(value) ? value[1] : value;\n const height = Math.max(0, mapChartValue(numericValue, chart.axisY, plot.height));\n return {\n seriesId: series.id,\n valueIndex,\n value: numericValue,\n error: series.error?.[valueIndex],\n color: series.colors?.[valueIndex] ?? seriesColor,\n hasColorOverride: series.colors?.[valueIndex] != null,\n frame: {\n x: plot.x + valueIndex * layout.slotWidth + layout.groupGap / 2 + seriesIndex * layout.seriesWidth,\n y: plot.y + plot.height - height,\n width: Math.max(1, layout.seriesWidth - layout.barGap),\n height,\n },\n };\n });\n}\n\nfunction renderGroupedBarMark(context: ChartRenderContext, mark: GroupedBarMark): RenderNode[] {\n const nodes = createGroupedBarNodes(context, mark);\n const errorNode = createGroupedBarError(context, mark);\n if (errorNode) {\n nodes.push(errorNode);\n }\n return nodes;\n}\n\nfunction plotClipPath(plot: { x: number; y: number; width: number; height: number }): string {\n const { x, y, width, height } = plot;\n return `M ${x} ${y} H ${x + width} V ${y + height} H ${x} Z`;\n}\n\nfunction createGroupedBarNodes(context: ChartRenderContext, mark: GroupedBarMark): RenderNode[] {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const radius = chart.config?.barCornerRadius ?? 2;\n const { x, width } = mark.frame;\n const path = groupedShape(context, mark.frame);\n const fill = paint(mark.color, diagnostics, chart.id);\n const stroke = paint(chart.config?.barBorderColor || '#000000', diagnostics, chart.id);\n const strokeWidth = finite(chart.config?.barBorderWidth, 0);\n const shadow = resolveChartShadow(chart.shadowStyle);\n\n const shadowCaster: RenderNode | undefined = shadow\n ? {\n type: 'path',\n id: `chart-bar-shadow-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n order: nextOrder(),\n bounds,\n d: path,\n style: {\n fill,\n stroke,\n strokeWidth,\n shadow,\n clip: barTrackClip(context, { x, y: plot.y, width, height: plot.height }) ?? {\n type: 'path',\n d: plotClipPath(plot),\n },\n },\n }\n : undefined;\n\n const bar: RenderNode = {\n type: 'path',\n id: `chart-bar-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n order: nextOrder(),\n bounds,\n d: path,\n detail: {\n of: 'chartValue',\n series: mark.seriesId,\n valueIndex: mark.valueIndex,\n mark: 'bar',\n radius,\n colorProp: seriesValueColorProp(mark.seriesId, mark.valueIndex),\n hasColorOverride: mark.hasColorOverride,\n },\n prop: seriesValueProp(mark.seriesId, mark.valueIndex),\n style: { fill, stroke, strokeWidth, innerShadow: shadow },\n };\n\n const glass = createGlassBackdropNodes(context, `${mark.seriesId}-${mark.valueIndex}`, path);\n return shadowCaster ? [shadowCaster, ...glass, bar] : [...glass, bar];\n}\n\nfunction createGroupedBarError(context: ChartRenderContext, mark: GroupedBarMark): RenderNode | null {\n if (mark.error == null) {\n return null;\n }\n const { chart, plot, bounds, nextOrder } = context;\n const [lower, upper] = errorBarRange(mark.value, mark.error);\n return createVerticalErrorWhiskerNode({\n id: `chart-bar-error-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n order: nextOrder(),\n bounds,\n geometry: {\n centerX: mark.frame.x + mark.frame.width / 2,\n startY: plot.y + plot.height - mapChartValue(lower, chart.axisY, plot.height),\n endY: plot.y + plot.height - mapChartValue(upper, chart.axisY, plot.height),\n },\n color: chart.textColor ?? '#0f172a',\n valueReference: { seriesId: mark.seriesId, valueIndex: mark.valueIndex },\n });\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport {\n CHART_COLORS,\n horizontalRows,\n mapChartValue,\n resolveChartShadow,\n roundedBarPath,\n rowTop,\n segmentedBarPath,\n stackedSegment,\n} from '../../primitives';\nimport { seriesValueColorProp } from '../../propPath';\nimport type { ChartRenderContext } from '../types';\nimport { createGlassBackdropNodes } from './glass';\nimport { createBarGlowNode } from './glow';\nimport { barLabelsEnabled, createBarLabelNodes } from './labels';\nimport { barTrackClip, barTrackEnabled, createBarTrackNodes } from './track';\n\ninterface Frame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype Rows = ReturnType<typeof horizontalRows>;\n\ninterface Layers {\n tracks: RenderNode[];\n bars: RenderNode[];\n glows: RenderNode[];\n labels: RenderNode[];\n}\n\nfunction barFrame(\n context: ChartRenderContext,\n rows: Rows,\n seriesIndex: number,\n valueIndex: number,\n value: number,\n): Frame {\n const { chart, plot } = context;\n const top = rowTop(rows, plot, valueIndex) + rows.labelRow;\n if (context.stackedMode) {\n const segment = stackedSegment(chart, context.stackedMode, valueIndex, seriesIndex, plot.width);\n const start = Math.min(segment.pixelStart, segment.pixelEnd);\n return {\n x: plot.x + start,\n y: top,\n width: Math.max(1, Math.abs(segment.pixelEnd - segment.pixelStart)),\n height: rows.barsHeight,\n };\n }\n const barGap = Math.max(0, finite(chart.config?.barGap, 2));\n const seriesHeight = rows.barsHeight / Math.max(1, chart.series.length);\n const width = Math.max(0, mapChartValue(value, chart.axisY, plot.width));\n return { x: plot.x, y: top + seriesIndex * seriesHeight, width, height: Math.max(1, seriesHeight - barGap) };\n}\n\nfunction barPath(context: ChartRenderContext, frame: Frame): string {\n const { chart, plot } = context;\n const config = chart.config;\n const segments = context.stackedMode && chart.series.length > 1 ? 0 : finite(config?.barSegments, 0);\n if (segments > 0) {\n return segmentedBarPath(\n { x: plot.x, y: frame.y, width: plot.width, height: frame.height },\n 'horizontal',\n segments,\n finite(config?.barSegmentGap, 4),\n config?.barCornerRadius ?? 2,\n frame.width / plot.width,\n config?.barSegmentSnap !== false,\n );\n }\n return roundedBarPath(frame.x, frame.y, frame.width, frame.height, config?.barCornerRadius ?? 2);\n}\n\ninterface BarMark {\n id: string;\n series: ChartSeries;\n seriesIndex: number;\n valueIndex: number;\n value: number;\n frame: Frame;\n trackFrame: Frame;\n bounds: { minX: number; maxX: number; minY: number; maxY: number };\n path: string;\n color: NonNullable<ChartSeries['color']>;\n}\n\nfunction markOf(\n context: ChartRenderContext,\n rows: Rows,\n series: ChartSeries,\n seriesIndex: number,\n valueIndex: number,\n value: number,\n): BarMark {\n const { plot } = context;\n const frame = barFrame(context, rows, seriesIndex, valueIndex, value);\n return {\n id: `${series.id}-${valueIndex}`,\n series,\n seriesIndex,\n valueIndex,\n value,\n frame,\n trackFrame: { x: plot.x, y: frame.y, width: plot.width, height: frame.height },\n bounds: {\n minX: frame.x,\n maxX: frame.x + Math.max(frame.width, 1),\n minY: frame.y,\n maxY: frame.y + frame.height,\n },\n path: barPath(context, frame),\n color: series.colors?.[valueIndex] ?? series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length],\n };\n}\n\nfunction barNodes(context: ChartRenderContext, mark: BarMark): RenderNode[] {\n const { chart, diagnostics, nextOrder } = context;\n const config = chart.config;\n const stroke = paint(config?.barBorderColor || '#000000', diagnostics, chart.id);\n const strokeWidth = finite(config?.barBorderWidth, 0);\n const shadow = resolveChartShadow(chart.shadowStyle);\n const fill = paint(mark.color, diagnostics, chart.id);\n const nodes: RenderNode[] = [...createGlassBackdropNodes(context, mark.id, mark.path)];\n if (shadow) {\n nodes.push({\n type: 'path',\n id: `chart-bar-shadow-${chart.id}-${mark.id}`,\n order: nextOrder(),\n bounds: mark.bounds,\n d: mark.path,\n style: { fill, stroke, strokeWidth, shadow, clip: barTrackClip(context, mark.trackFrame) },\n });\n }\n nodes.push({\n type: 'path',\n id: `chart-bar-${chart.id}-${mark.id}`,\n order: nextOrder(),\n bounds: mark.bounds,\n d: mark.path,\n detail: {\n of: 'chartValue',\n series: mark.series.id,\n valueIndex: mark.valueIndex,\n mark: 'bar',\n radius: config?.barCornerRadius ?? 2,\n colorProp: seriesValueColorProp(mark.series.id, mark.valueIndex),\n hasColorOverride: mark.series.colors?.[mark.valueIndex] != null,\n },\n style: { fill, stroke, strokeWidth, innerShadow: shadow },\n });\n return nodes;\n}\n\nfunction labelNodes(context: ChartRenderContext, mark: BarMark, highest: number): RenderNode[] {\n const { chart } = context;\n const config = chart.config;\n const showLabel = barLabelsEnabled(context) && (!config?.barLabelMaxOnly || mark.value >= highest);\n const lastSeries = mark.seriesIndex === chart.series.length - 1;\n if (!showLabel || (context.stackedMode && !lastSeries && config?.barLabelPosition === 'outside')) {\n return [];\n }\n return createBarLabelNodes(context, {\n id: `chart-bar-label-${chart.id}-${mark.id}`,\n value: mark.value,\n frame: mark.frame,\n placement: config?.barLabelPosition ?? 'outside',\n horizontal: true,\n });\n}\n\nfunction pushBar(\n context: ChartRenderContext,\n rows: Rows,\n layers: Layers,\n series: ChartSeries,\n seriesIndex: number,\n valueIndex: number,\n value: number,\n highest: number,\n): void {\n const { chart } = context;\n const mark = markOf(context, rows, series, seriesIndex, valueIndex, value);\n if (barTrackEnabled(context) && (!context.stackedMode || seriesIndex === 0)) {\n layers.tracks.push(...createBarTrackNodes(context, mark.id, mark.trackFrame, 'horizontal'));\n }\n layers.bars.push(...barNodes(context, mark));\n const glow = finite(chart.config?.barGlow, 0);\n if (glow > 0 && mark.frame.width > 0) {\n layers.glows.push(\n createBarGlowNode(context, `chart-bar-glow-${chart.id}-${mark.id}`, mark.path, mark.color, glow, mark.bounds),\n );\n }\n layers.labels.push(...labelNodes(context, mark, highest));\n}\n\nexport function renderHorizontalBars(context: ChartRenderContext): RenderNode[] {\n const rows = horizontalRows(context.chart, context.plot);\n const layers: Layers = { tracks: [], bars: [], glows: [], labels: [] };\n context.chart.series.forEach((series, seriesIndex) => {\n const numeric = series.values.map(value => (typeof value === 'number' ? value : value[1]));\n const highest = Math.max(...numeric);\n numeric.forEach((value, valueIndex) => {\n pushBar(context, rows, layers, series, seriesIndex, valueIndex, value, highest);\n });\n });\n return [...layers.tracks, ...layers.bars, ...layers.glows, ...layers.labels];\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport {\n barCategoryCount,\n barPath,\n CHART_COLORS,\n resolveChartShadow,\n segmentedBarPath,\n stackedSegment,\n} from '../../primitives';\nimport { seriesValueColorProp, seriesValueProp } from '../../propPath';\nimport type { ChartRenderContext, StackedMode } from '../types';\nimport { createGlassBackdropNodes } from './glass';\nimport { createBarGlowNode } from './glow';\nimport { barLabelsEnabled, createBarLabelNodes } from './labels';\nimport { barTrackClip, barTrackEnabled, createBarTrackNodes } from './track';\n\ninterface Layers {\n tracks: RenderNode[];\n bars: RenderNode[];\n glows: RenderNode[];\n labels: RenderNode[];\n}\n\ninterface Slot {\n slotWidth: number;\n groupGap: number;\n barWidth: number;\n cornerRadius: number;\n outerSeriesIndex: number | null;\n}\n\nfunction slotOf(context: ChartRenderContext, mode: StackedMode): Slot {\n const { chart, plot } = context;\n const slotWidth = plot.width / barCategoryCount(chart);\n const groupGap = Math.min(Math.max(0, finite(chart.config?.barGroupGap, 8)), Math.max(0, slotWidth - 1));\n return {\n slotWidth,\n groupGap,\n barWidth: Math.max(1, slotWidth - groupGap),\n cornerRadius: chart.config?.barCornerRadius ?? 2,\n outerSeriesIndex: mode === 'waterfall' ? null : chart.series.length - 1,\n };\n}\n\nfunction pathOf(context: ChartRenderContext, x: number, y: number, height: number, slot: Slot, radius: number): string {\n const { chart, plot } = context;\n const segments = chart.series.length === 1 ? finite(chart.config?.barSegments, 0) : 0;\n if (segments > 0) {\n return segmentedBarPath(\n { x, y: plot.y, width: slot.barWidth, height: plot.height },\n 'vertical',\n segments,\n finite(chart.config?.barSegmentGap, 4),\n radius,\n height / plot.height,\n chart.config?.barSegmentSnap !== false,\n );\n }\n return barPath(x, y, slot.barWidth, height, radius, chart.config?.barRoundedBottom === true);\n}\n\nfunction pushLabel(\n context: ChartRenderContext,\n layers: Layers,\n series: ChartSeries,\n seriesIndex: number,\n valueIndex: number,\n slot: Slot,\n frame: { x: number; y: number; width: number; height: number },\n): void {\n const { chart } = context;\n const config = chart.config;\n const visible =\n barLabelsEnabled(context) &&\n !(config?.barLabelMaxOnly && !isSeriesMax(series.values, valueIndex)) &&\n (config?.barLabelPosition !== 'axis' || seriesIndex === slot.outerSeriesIndex);\n if (!visible) {\n return;\n }\n const requested = config?.barLabelPosition ?? 'outside';\n const value = series.values[valueIndex];\n layers.labels.push(\n ...createBarLabelNodes(context, {\n id: `chart-bar-label-${chart.id}-${series.id}-${valueIndex}`,\n value: Array.isArray(value) ? value[1] : (value ?? 0),\n frame,\n placement: requested === 'outside' && seriesIndex !== slot.outerSeriesIndex ? 'center' : requested,\n }),\n );\n}\n\ninterface SegmentMark {\n series: ChartSeries;\n valueIndex: number;\n radius: number;\n color: NonNullable<ChartSeries['color']>;\n x: number;\n y: number;\n height: number;\n path: string;\n column: { x: number; y: number; width: number; height: number };\n}\n\nfunction markOf(\n context: ChartRenderContext,\n mode: StackedMode,\n slot: Slot,\n series: ChartSeries,\n seriesIndex: number,\n valueIndex: number,\n): SegmentMark {\n const { chart, plot } = context;\n const segment = stackedSegment(chart, mode, valueIndex, seriesIndex, plot.height);\n const radius = slot.outerSeriesIndex === null || seriesIndex === slot.outerSeriesIndex ? slot.cornerRadius : 0;\n const x = plot.x + valueIndex * slot.slotWidth + slot.groupGap / 2;\n const y = plot.y + plot.height - Math.max(segment.pixelStart, segment.pixelEnd);\n const height = Math.max(1, Math.abs(segment.pixelEnd - segment.pixelStart));\n return {\n series,\n valueIndex,\n radius,\n color: series.colors?.[valueIndex] ?? series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length],\n x,\n y,\n height,\n path: pathOf(context, x, y, height, slot, radius),\n column: { x, y: plot.y, width: slot.barWidth, height: plot.height },\n };\n}\n\nfunction segmentNodes(context: ChartRenderContext, mark: SegmentMark): RenderNode[] {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const { series, valueIndex, path } = mark;\n const fill = paint(mark.color, diagnostics, chart.id);\n const stroke = paint(chart.config?.barBorderColor || '#000000', diagnostics, chart.id);\n const strokeWidth = finite(chart.config?.barBorderWidth, 0);\n const shadow = resolveChartShadow(chart.shadowStyle);\n const nodes: RenderNode[] = [];\n if (shadow) {\n const plotClip = `M ${plot.x} ${plot.y} H ${plot.x + plot.width} V ${plot.y + plot.height} H ${plot.x} Z`;\n nodes.push({\n type: 'path',\n id: `chart-bar-shadow-${chart.id}-${series.id}-${valueIndex}`,\n order: nextOrder(),\n bounds,\n d: path,\n style: {\n fill,\n stroke,\n strokeWidth,\n shadow,\n clip: barTrackClip(context, mark.column) ?? { type: 'path', d: plotClip },\n },\n });\n }\n nodes.push(...createGlassBackdropNodes(context, `${series.id}-${valueIndex}`, path));\n nodes.push({\n type: 'path',\n id: `chart-bar-${chart.id}-${series.id}-${valueIndex}`,\n order: nextOrder(),\n bounds,\n d: path,\n detail: {\n of: 'chartValue',\n series: series.id,\n valueIndex,\n mark: 'bar',\n radius: mark.radius,\n colorProp: seriesValueColorProp(series.id, valueIndex),\n hasColorOverride: series.colors?.[valueIndex] != null,\n },\n prop: seriesValueProp(series.id, valueIndex),\n style: { fill, stroke, strokeWidth, innerShadow: shadow },\n });\n return nodes;\n}\n\nfunction pushSegment(\n context: ChartRenderContext,\n mode: StackedMode,\n layers: Layers,\n slot: Slot,\n series: ChartSeries,\n seriesIndex: number,\n valueIndex: number,\n): void {\n const { chart } = context;\n const mark = markOf(context, mode, slot, series, seriesIndex, valueIndex);\n if (seriesIndex === 0 && barTrackEnabled(context)) {\n layers.tracks.push(...createBarTrackNodes(context, String(valueIndex), mark.column));\n }\n layers.bars.push(...segmentNodes(context, mark));\n const frame = { x: mark.x, y: mark.y, width: slot.barWidth, height: mark.height };\n pushLabel(context, layers, series, seriesIndex, valueIndex, slot, frame);\n const glow = finite(chart.config?.barGlow, 0);\n if (glow > 0) {\n layers.glows.push(\n createBarGlowNode(context, `chart-bar-glow-${chart.id}-${series.id}-${valueIndex}`, mark.path, mark.color, glow),\n );\n }\n}\n\nexport function renderStackedBars(context: ChartRenderContext, mode: StackedMode): RenderNode[] {\n const { chart } = context;\n const layers: Layers = { tracks: [], bars: [], glows: [], labels: [] };\n const slot = slotOf(context, mode);\n const valueCount = barCategoryCount(chart);\n for (let valueIndex = 0; valueIndex < valueCount; valueIndex++) {\n chart.series.forEach((series, seriesIndex) => {\n pushSegment(context, mode, layers, slot, series, seriesIndex, valueIndex);\n });\n }\n return [...layers.tracks, ...layers.bars, ...layers.glows, ...layers.labels];\n}\n\nfunction isSeriesMax(values: ReadonlyArray<number | readonly number[]>, index: number): boolean {\n const numeric = values.map(value => (typeof value === 'number' ? value : value[1]));\n return numeric[index] >= Math.max(...numeric);\n}\n","import type { RenderNode } from '../../scene';\nimport { isHorizontalBar } from '../primitives';\nimport { renderGroupedBars } from './bar/grouped';\nimport { renderHorizontalBars } from './bar/horizontal';\nimport { renderStackedBars } from './bar/stacked';\nimport type { ChartRenderContext } from './types';\n\nexport function renderBar(context: ChartRenderContext): RenderNode[] {\n if (isHorizontalBar(context.chart)) {\n return renderHorizontalBars(context);\n }\n if (context.stackedMode) {\n return renderStackedBars(context, context.stackedMode);\n }\n return renderGroupedBars(context);\n}\n","import { finite } from '../../../scene';\nimport { representativeColor } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { BoxplotLayout } from './types';\n\nexport function createBoxplotLayout(context: ChartRenderContext): BoxplotLayout {\n const { chart, plot } = context;\n const orientation = chart.config?.orientation ?? 'vertical';\n const boxCount = Math.max(1, chart.series.length);\n const slotWidth = (orientation === 'horizontal' ? plot.height : plot.width) / boxCount;\n const widthFraction = Math.min(1, Math.max(0.05, chart.config?.boxWidth ?? 0.6));\n return {\n orientation,\n slotWidth,\n boxWidth: Math.max(4, slotWidth * widthFraction),\n cornerRadius: chart.config?.barCornerRadius ?? 2,\n showPoints: chart.config?.showBoxplotPoints ?? true,\n borderColor: representativeColor(chart.config?.barBorderColor, '#000000'),\n borderWidth: finite(chart.config?.barBorderWidth, 1),\n };\n}\n","import { mapChartValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { BoxplotGeometry, BoxplotLayout, BoxplotOrientation, BoxplotStats } from './types';\n\nexport function boxplotPoint(orientation: BoxplotOrientation, center: number, value: number): { x: number; y: number } {\n return orientation === 'horizontal' ? { x: value, y: center } : { x: center, y: value };\n}\n\nexport function createBoxplotGeometry(\n context: ChartRenderContext,\n layout: BoxplotLayout,\n seriesIndex: number,\n stats: BoxplotStats,\n): BoxplotGeometry {\n const { chart, plot } = context;\n const { orientation } = layout;\n const valueAt = (value: number): number =>\n orientation === 'horizontal'\n ? plot.x + mapChartValue(value, chart.axisX, plot.width)\n : plot.y + plot.height - mapChartValue(value, chart.axisY, plot.height);\n const center = plot[orientation === 'horizontal' ? 'y' : 'x'] + seriesIndex * layout.slotWidth + layout.slotWidth / 2;\n return {\n center,\n min: valueAt(stats.min),\n q1: valueAt(stats.q1),\n median: valueAt(stats.median),\n q3: valueAt(stats.q3),\n max: valueAt(stats.max),\n };\n}\n","import type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { mapChartValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport { boxplotPoint } from './geometry';\nimport type { BoxplotLayout, BoxplotSeriesMark } from './types';\n\nexport function renderSamplePoints(\n context: ChartRenderContext,\n layout: BoxplotLayout,\n mark: BoxplotSeriesMark,\n): RenderNode[] {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const valueAt = (value: number): number =>\n layout.orientation === 'horizontal'\n ? plot.x + mapChartValue(value, chart.axisX, plot.width)\n : plot.y + plot.height - mapChartValue(value, chart.axisY, plot.height);\n return (mark.series.values as number[]).map((value, pointIndex) => {\n const center = mark.geometry.center + jitter(mark.seriesIndex * 10_000 + pointIndex) * layout.boxWidth;\n const { x, y } = boxplotPoint(layout.orientation, center, valueAt(value));\n return {\n type: 'ellipse',\n id: `chart-box-point-${mark.id}-${pointIndex}`,\n order: nextOrder(),\n bounds,\n cx: x,\n cy: y,\n rx: 3,\n ry: 3,\n style: { fill: paint(mark.color, diagnostics, chart.id), opacity: 0.7 },\n };\n });\n}\n\nfunction jitter(seed: number): number {\n const hash = Math.sin(seed * 12.9898) * 43758.5453;\n return hash - Math.floor(hash) - 0.5;\n}\n","import type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport type { ChartRenderContext } from '../types';\nimport { boxplotPoint } from './geometry';\nimport type { BoxplotLayout, BoxplotSeriesMark } from './types';\n\ninterface BoxplotBorderLine {\n id: string;\n from: { x: number; y: number };\n to: { x: number; y: number };\n strokeWidth: number;\n}\n\nexport function renderBoxAndWhiskers(\n context: ChartRenderContext,\n layout: BoxplotLayout,\n mark: BoxplotSeriesMark,\n): RenderNode[] {\n return [\n createBoxBorderLine(context, layout, lowerWhisker(layout, mark)),\n createBoxBorderLine(context, layout, upperWhisker(layout, mark)),\n createBoxBorderLine(context, layout, lowerWhiskerCap(layout, mark)),\n createBoxBorderLine(context, layout, upperWhiskerCap(layout, mark)),\n createBoxNode(context, layout, mark),\n createBoxBorderLine(context, layout, medianLine(layout, mark)),\n ];\n}\n\nfunction lowerWhisker(layout: BoxplotLayout, mark: BoxplotSeriesMark): BoxplotBorderLine {\n const { center, min, q1 } = mark.geometry;\n return {\n id: `chart-box-whisker-lo-${mark.id}`,\n from: boxplotPoint(layout.orientation, center, min),\n to: boxplotPoint(layout.orientation, center, q1),\n strokeWidth: 1,\n };\n}\n\nfunction upperWhisker(layout: BoxplotLayout, mark: BoxplotSeriesMark): BoxplotBorderLine {\n const { center, q3, max } = mark.geometry;\n return {\n id: `chart-box-whisker-hi-${mark.id}`,\n from: boxplotPoint(layout.orientation, center, q3),\n to: boxplotPoint(layout.orientation, center, max),\n strokeWidth: 1,\n };\n}\n\nfunction lowerWhiskerCap(layout: BoxplotLayout, mark: BoxplotSeriesMark): BoxplotBorderLine {\n return whiskerCap(`chart-box-cap-lo-${mark.id}`, layout, mark.geometry.center, mark.geometry.min);\n}\n\nfunction upperWhiskerCap(layout: BoxplotLayout, mark: BoxplotSeriesMark): BoxplotBorderLine {\n return whiskerCap(`chart-box-cap-hi-${mark.id}`, layout, mark.geometry.center, mark.geometry.max);\n}\n\nfunction whiskerCap(id: string, layout: BoxplotLayout, center: number, value: number): BoxplotBorderLine {\n const capHalf = layout.boxWidth * 0.2;\n return {\n id,\n from: boxplotPoint(layout.orientation, center - capHalf, value),\n to: boxplotPoint(layout.orientation, center + capHalf, value),\n strokeWidth: 1,\n };\n}\n\nfunction medianLine(layout: BoxplotLayout, mark: BoxplotSeriesMark): BoxplotBorderLine {\n const half = layout.boxWidth / 2;\n return {\n id: `chart-box-median-${mark.id}`,\n from: boxplotPoint(layout.orientation, mark.geometry.center - half, mark.geometry.median),\n to: boxplotPoint(layout.orientation, mark.geometry.center + half, mark.geometry.median),\n strokeWidth: 2,\n };\n}\n\nfunction createBoxBorderLine(context: ChartRenderContext, layout: BoxplotLayout, line: BoxplotBorderLine): RenderNode {\n return {\n type: 'path',\n id: line.id,\n order: context.nextOrder(),\n bounds: context.bounds,\n d: `M ${line.from.x} ${line.from.y} L ${line.to.x} ${line.to.y}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: layout.borderColor },\n strokeWidth: line.strokeWidth,\n },\n };\n}\n\nfunction createBoxNode(context: ChartRenderContext, layout: BoxplotLayout, mark: BoxplotSeriesMark): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const { geometry } = mark;\n const half = layout.boxWidth / 2;\n const a = boxplotPoint(layout.orientation, geometry.center - half, geometry.q1);\n const b = boxplotPoint(layout.orientation, geometry.center + half, geometry.q3);\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.max(1, Math.abs(b.x - a.x));\n const height = Math.max(1, Math.abs(b.y - a.y));\n return {\n type: 'rect',\n id: `chart-box-${mark.id}`,\n order: nextOrder(),\n bounds,\n x,\n y,\n width,\n height,\n rx: layout.cornerRadius,\n style: {\n fill: paint(mark.color, diagnostics, chart.id),\n stroke: { kind: 'solid', color: layout.borderColor },\n strokeWidth: layout.borderWidth,\n },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { CHART_COLORS, computeBoxplotStats } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport { createBoxplotGeometry } from './geometry';\nimport { renderSamplePoints } from './points';\nimport { renderBoxAndWhiskers } from './shapes';\nimport type { BoxplotLayout, BoxplotSeriesMark } from './types';\n\nexport function renderBoxplotSeries(\n context: ChartRenderContext,\n layout: BoxplotLayout,\n series: ChartSeries,\n seriesIndex: number,\n): RenderNode[] {\n const stats = computeBoxplotStats(series.values as number[]);\n if (!stats) {\n return [];\n }\n\n const geometry = createBoxplotGeometry(context, layout, seriesIndex, stats);\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n const mark: BoxplotSeriesMark = {\n id: `${context.chart.id}-${series.id}`,\n series,\n seriesIndex,\n color,\n geometry,\n };\n const nodes = renderBoxAndWhiskers(context, layout, mark);\n if (layout.showPoints) {\n nodes.push(...renderSamplePoints(context, layout, mark));\n }\n return nodes;\n}\n","import type { RenderNode } from '../../scene';\nimport { createBoxplotLayout } from './boxplot/layout';\nimport { renderBoxplotSeries } from './boxplot/series';\nimport type { ChartRenderContext } from './types';\n\nexport function renderBoxplot(context: ChartRenderContext): RenderNode[] {\n const layout = createBoxplotLayout(context);\n const nodes: RenderNode[] = [];\n\n context.chart.series.forEach((series, seriesIndex) => {\n nodes.push(...renderBoxplotSeries(context, layout, series, seriesIndex));\n });\n\n return nodes;\n}\n","import type { ChartSeries, TypedChart } from '../../../model/chart';\nimport type { RenderNode, SceneStyle } from '../../scene';\nimport { finite, freeformPathData, paint } from '../../scene';\nimport { CHART_COLORS, chartText, DEFAULT_ZONE_FILL, mapChartValue } from '../primitives';\nimport type { ChartRenderContext } from './types';\n\ninterface CustomChartPoint {\n x: number;\n y: number;\n}\n\ninterface CustomMark {\n series: ChartSeries;\n valueIndex: number;\n point: CustomChartPoint;\n style: SceneStyle;\n}\n\nconst HOLLOW_POINT_STROKE = '#94a3b8';\nconst CONNECTOR_LABEL_GAP = 8;\nconst CONNECTOR_LABEL_WIDTH = 140;\n\nexport function renderCustom(context: ChartRenderContext): RenderNode[] {\n if (context.chart.config?.connectPoints && context.chart.series.length >= 2) {\n return renderConnectedPairs(context);\n }\n return context.chart.series.flatMap((series, seriesIndex) => renderCustomSeries(context, series, seriesIndex));\n}\n\nfunction renderCustomSeries(context: ChartRenderContext, series: ChartSeries, seriesIndex: number): RenderNode[] {\n const style = customSeriesStyle(context, series, seriesIndex);\n return customSeriesValues(context, series).map((value, valueIndex) => {\n const point = customPointPosition(context, value);\n const mark = { series, valueIndex, point, style };\n return series.symbol?.points.length ? createCustomSymbolMark(context, mark) : createCustomPointMark(context, mark);\n });\n}\n\nfunction isHorizontal(chart: TypedChart): boolean {\n return chart.config?.orientation === 'horizontal';\n}\n\nfunction customSeriesValues(context: ChartRenderContext, series: ChartSeries): Array<[number, number]> {\n const { chart } = context;\n const hasExplicitXValues = series.values.length > 0 && Array.isArray(series.values[0]);\n if (hasExplicitXValues) {\n return (series.values as number[][]).map(value => [value[0], value[1]]);\n }\n if (isHorizontal(chart)) {\n return (series.values as number[]).map((value, index) => [value, chart.axisY.min + index * chart.axisY.step]);\n }\n return (series.values as number[]).map((value, index) => [chart.axisX.min + index * chart.axisX.step, value]);\n}\n\nfunction metricComponent(chart: TypedChart, point: [number, number]): number {\n return isHorizontal(chart) ? point[0] : point[1];\n}\n\nfunction customPointPosition(context: ChartRenderContext, value: [number, number]): CustomChartPoint {\n return {\n x: context.plot.x + mapChartValue(value[0], context.chart.axisX, context.plot.width),\n y: context.plot.y + context.plot.height - mapChartValue(value[1], context.chart.axisY, context.plot.height),\n };\n}\n\nfunction customSeriesStyle(context: ChartRenderContext, series: ChartSeries, seriesIndex: number): SceneStyle {\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n return {\n fill: paint(color, context.diagnostics, context.chart.id),\n stroke: series.stroke ? { kind: 'solid', color: series.stroke } : undefined,\n strokeWidth: series.stroke ? finite(series.strokeWidth, 1) : undefined,\n };\n}\n\nfunction createCustomSymbolMark(context: ChartRenderContext, mark: CustomMark): RenderNode {\n const symbol = mark.series.symbol;\n const size = finite(mark.series.size, 3);\n const scale = symbol?.normalized ? size * 2 : 1;\n const offset = symbol?.normalized ? 0.5 : 0;\n const points = (symbol?.points ?? []).map(([x, y]) => ({\n x: mark.point.x + (x - offset) * scale,\n y: mark.point.y + (y - offset) * scale,\n }));\n return {\n type: 'path',\n id: customMarkId(context.chart, mark.series, mark.valueIndex),\n order: context.nextOrder(),\n bounds: context.bounds,\n d: freeformPathData({ points, tension: finite(symbol?.tension, 0), closed: true }),\n style: mark.style,\n };\n}\n\nfunction createCustomPointMark(context: ChartRenderContext, mark: CustomMark): RenderNode {\n const radius = finite(mark.series.size, 3);\n return {\n type: 'ellipse',\n id: customMarkId(context.chart, mark.series, mark.valueIndex),\n order: context.nextOrder(),\n bounds: context.bounds,\n cx: mark.point.x,\n cy: mark.point.y,\n rx: radius,\n ry: radius,\n style: mark.style,\n };\n}\n\nfunction customMarkId(chart: TypedChart, series: ChartSeries, valueIndex: number): string {\n return `chart-custom-mark-${chart.id}-${series.id}-${valueIndex}`;\n}\n\nfunction renderConnectedPairs(context: ChartRenderContext): RenderNode[] {\n const { chart } = context;\n const [beforeSeries, afterSeries] = chart.series;\n const beforeValues = customSeriesValues(context, beforeSeries);\n const afterValues = customSeriesValues(context, afterSeries);\n const zones = chart.config?.zones ?? [];\n const betterColor = zones[0]?.color ?? '#10b981';\n const worseColor = zones[1]?.color ?? '#ec4899';\n const tieColor = zones[2]?.color ?? DEFAULT_ZONE_FILL;\n const reverse = Boolean(chart.config?.reverseComparison);\n const count = Math.min(beforeValues.length, afterValues.length);\n const categories = chart.config?.categories ?? [];\n const nodes: RenderNode[] = [];\n\n for (let index = 0; index < count; index++) {\n const beforeValue = beforeValues[index];\n const afterValue = afterValues[index];\n const beforePoint = customPointPosition(context, beforeValue);\n const afterPoint = customPointPosition(context, afterValue);\n const beforeMetric = metricComponent(chart, beforeValue);\n const afterMetric = metricComponent(chart, afterValue);\n const better = reverse ? afterMetric < beforeMetric : afterMetric > beforeMetric;\n const worse = reverse ? afterMetric > beforeMetric : afterMetric < beforeMetric;\n const comparisonColor = better ? betterColor : worse ? worseColor : tieColor;\n const radius = finite(afterSeries.size, 3);\n\n nodes.push(createConnectorLine(context, index, beforePoint, afterPoint, comparisonColor));\n nodes.push(\n createCustomPointMark(context, {\n series: beforeSeries,\n valueIndex: index,\n point: beforePoint,\n style: {\n fill: paint(chart.gridColor ?? '#e2e8f0', context.diagnostics, chart.id),\n stroke: { kind: 'solid', color: HOLLOW_POINT_STROKE },\n strokeWidth: 1.5,\n },\n }),\n );\n nodes.push(\n createCustomPointMark(context, {\n series: afterSeries,\n valueIndex: index,\n point: afterPoint,\n style: {\n fill: paint(comparisonColor, context.diagnostics, chart.id),\n stroke: undefined,\n strokeWidth: undefined,\n },\n }),\n );\n if (context.showLabels && categories[index]) {\n nodes.push(createConnectorLabel(context, index, beforePoint, afterPoint, radius, categories[index]));\n }\n }\n\n return nodes;\n}\n\nfunction createConnectorLine(\n context: ChartRenderContext,\n index: number,\n from: CustomChartPoint,\n to: CustomChartPoint,\n color: string,\n): RenderNode {\n const { chart } = context;\n return {\n type: 'path',\n id: `chart-custom-connector-${chart.id}-${index}`,\n order: context.nextOrder(),\n bounds: context.bounds,\n d: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n style: { fill: { kind: 'none' }, stroke: { kind: 'solid', color }, strokeWidth: 2 },\n };\n}\n\nfunction createConnectorLabel(\n context: ChartRenderContext,\n index: number,\n beforePoint: CustomChartPoint,\n afterPoint: CustomChartPoint,\n radius: number,\n text: string,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const horizontal = isHorizontal(chart);\n const frame = horizontal\n ? {\n x: Math.max(beforePoint.x, afterPoint.x) + radius + CONNECTOR_LABEL_GAP,\n y: Math.min(beforePoint.y, afterPoint.y) - 8,\n width: CONNECTOR_LABEL_WIDTH,\n height: 16,\n }\n : {\n x: Math.min(beforePoint.x, afterPoint.x) - CONNECTOR_LABEL_WIDTH / 2,\n y: Math.min(beforePoint.y, afterPoint.y) - radius - CONNECTOR_LABEL_GAP - 14,\n width: CONNECTOR_LABEL_WIDTH,\n height: 16,\n };\n return {\n ...chartText({\n id: `chart-custom-label-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n frame,\n text,\n chart,\n align: horizontal ? 'left' : 'center',\n }),\n fontSize: Math.max(9, finite(chart.fontSize, 12)) - 2,\n };\n}\n","import { mapChartValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { FieldData } from './types';\n\nexport function classifyFieldData(context: ChartRenderContext): FieldData {\n const { chart, plot } = context;\n const scalarSeries = chart.series.filter(series => tupleSize(series.values[0]) === 3);\n const vectorSeries = chart.series.filter(series => tupleSize(series.values[0]) === 4);\n const scalarSamples = scalarSeries.flatMap(series =>\n (series.values as [number, number, number][]).map(([x, y, value]) => ({\n x: mapChartValue(x, chart.axisX, plot.width),\n y: plot.height - mapChartValue(y, chart.axisY, plot.height),\n value,\n })),\n );\n\n return { scalarSamples, vectorSeries };\n}\n\nfunction tupleSize(value: unknown): number | undefined {\n return Array.isArray(value) ? value.length : undefined;\n}\n","import type { ChartRamp } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { chartText, formatFieldValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\n\nexport function renderFieldLegend(context: ChartRenderContext): RenderNode[] {\n const stops = context.chart.config?.scale?.stops;\n if (!context.showLegend || !stops?.length) {\n return [];\n }\n\n const sortedStops = [...stops].sort((a, b) => a.position - b.position);\n const minimum = sortedStops[0].position;\n const maximum = sortedStops[sortedStops.length - 1].position;\n const geometry = legendGeometry(context);\n return [\n createColorBar(context, sortedStops, minimum, maximum, geometry),\n ...createLegendLabels(context, minimum, maximum, geometry),\n ];\n}\n\ninterface LegendGeometry {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nfunction legendGeometry(context: ChartRenderContext): LegendGeometry {\n const { plot } = context;\n const width = Math.min(220, plot.width);\n return {\n x: plot.x + (plot.width - width) / 2,\n y: plot.y + plot.height + 46,\n width,\n height: 8,\n };\n}\n\nfunction createColorBar(\n context: ChartRenderContext,\n stops: ChartRamp['stops'],\n minimum: number,\n maximum: number,\n geometry: LegendGeometry,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const span = maximum - minimum;\n return {\n type: 'rect',\n id: `chart-field-colorbar-${chart.id}`,\n order: nextOrder(),\n bounds,\n x: geometry.x,\n y: geometry.y,\n width: geometry.width,\n height: geometry.height,\n rx: 2,\n style: {\n fill: {\n kind: 'linear-gradient',\n angle: 0,\n stops: stops.map(stop => ({\n offset: span === 0 ? 0 : ((stop.position - minimum) / span) * 100,\n color: stop.color,\n })),\n },\n },\n };\n}\n\nfunction createLegendLabels(\n context: ChartRenderContext,\n minimum: number,\n maximum: number,\n geometry: LegendGeometry,\n): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const y = geometry.y + geometry.height + 3;\n return [\n chartText({\n id: `chart-field-colorbar-min-${chart.id}`,\n order: nextOrder(),\n bounds,\n frame: { x: geometry.x, y, width: 80, height: 16 },\n text: formatFieldValue(minimum),\n chart,\n }),\n chartText({\n id: `chart-field-colorbar-max-${chart.id}`,\n order: nextOrder(),\n bounds,\n frame: { x: geometry.x + geometry.width - 80, y, width: 80, height: 16 },\n text: formatFieldValue(maximum),\n chart,\n align: 'right',\n }),\n ];\n}\n","import type { ChartRamp } from '../../../model/chart';\nimport { interpolateHexColorStops } from '../../../model/color';\n\nconst RAMP_FALLBACK_COLOR = '#94a3b8';\n\nexport function colorAtRamp(ramp: ChartRamp | undefined, value: number): string {\n if (!ramp?.stops.length) {\n return RAMP_FALLBACK_COLOR;\n }\n\n return interpolateHexColorStops(ramp.stops, value);\n}\n","export interface IsolineSegment {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nexport interface IsolineField {\n values: Float32Array;\n columns: number;\n rows: number;\n width: number;\n height: number;\n}\n\ninterface IsolineSample {\n x: number;\n y: number;\n value: number;\n}\n\ninterface IsolineCell {\n topLeft: IsolineSample;\n topRight: IsolineSample;\n bottomRight: IsolineSample;\n bottomLeft: IsolineSample;\n}\n\nexport type IsolinePoint = [number, number];\n\ninterface CellEdgeIntersections {\n top: IsolinePoint;\n right: IsolinePoint;\n bottom: IsolinePoint;\n left: IsolinePoint;\n}\n\nexport function stitchIsolineSegments(segments: readonly IsolineSegment[]): IsolinePoint[][] {\n if (segments.length === 0) {\n return [];\n }\n const pointKey = (point: IsolinePoint): string => `${Math.round(point[0] * 1000)}:${Math.round(point[1] * 1000)}`;\n const adjacency = new Map<string, Array<{ point: IsolinePoint; segment: number }>>();\n const addEdge = (from: IsolinePoint, to: IsolinePoint, segment: number): void => {\n const key = pointKey(from);\n const list = adjacency.get(key);\n const entry = { point: to, segment };\n if (list) {\n list.push(entry);\n } else {\n adjacency.set(key, [entry]);\n }\n };\n segments.forEach((segment, index) => {\n const a: IsolinePoint = [segment.x1, segment.y1];\n const b: IsolinePoint = [segment.x2, segment.y2];\n addEdge(a, b, index);\n addEdge(b, a, index);\n });\n\n const usedSegments = new Array(segments.length).fill(false);\n const extend = (chain: IsolinePoint[], from: IsolinePoint): void => {\n let current = from;\n for (;;) {\n const candidates = adjacency.get(pointKey(current));\n const next = candidates?.find(candidate => !usedSegments[candidate.segment]);\n if (!next) {\n return;\n }\n usedSegments[next.segment] = true;\n chain.push(next.point);\n current = next.point;\n }\n };\n\n const chains: IsolinePoint[][] = [];\n segments.forEach((segment, index) => {\n if (usedSegments[index]) {\n return;\n }\n usedSegments[index] = true;\n const forward: IsolinePoint[] = [\n [segment.x1, segment.y1],\n [segment.x2, segment.y2],\n ];\n extend(forward, forward[forward.length - 1]);\n const backward: IsolinePoint[] = [];\n extend(backward, forward[0]);\n backward.reverse();\n chains.push([...backward, ...forward]);\n });\n return chains;\n}\n\nexport function computeIsolineSegments(field: IsolineField, threshold: number): IsolineSegment[] {\n const segments: IsolineSegment[] = [];\n for (let row = 0; row < field.rows - 1; row++) {\n for (let column = 0; column < field.columns - 1; column++) {\n const cell = createIsolineCell(field, row, column);\n const caseIndex = isolineCaseIndex(cell, threshold);\n if (caseIndex !== 0 && caseIndex !== 15) {\n segments.push(...segmentsForIsolineCase(cell, caseIndex, threshold));\n }\n }\n }\n return segments;\n}\n\nfunction createIsolineCell(field: IsolineField, row: number, column: number): IsolineCell {\n return {\n topLeft: fieldSample(field, row, column),\n topRight: fieldSample(field, row, column + 1),\n bottomRight: fieldSample(field, row + 1, column + 1),\n bottomLeft: fieldSample(field, row + 1, column),\n };\n}\n\nfunction fieldSample(field: IsolineField, row: number, column: number): IsolineSample {\n return {\n x: field.width * (column / (field.columns - 1)),\n y: field.height * (row / (field.rows - 1)),\n value: field.values[row * field.columns + column],\n };\n}\n\nfunction isolineCaseIndex(cell: IsolineCell, threshold: number): number {\n return (\n (isAboveThreshold(cell.topLeft, threshold) ? 8 : 0) |\n (isAboveThreshold(cell.topRight, threshold) ? 4 : 0) |\n (isAboveThreshold(cell.bottomRight, threshold) ? 2 : 0) |\n (isAboveThreshold(cell.bottomLeft, threshold) ? 1 : 0)\n );\n}\n\nfunction isAboveThreshold(sample: IsolineSample, threshold: number): boolean {\n return sample.value >= threshold;\n}\n\nfunction segmentsForIsolineCase(cell: IsolineCell, caseIndex: number, threshold: number): IsolineSegment[] {\n const edges = cellEdgeIntersections(cell, threshold);\n switch (caseIndex) {\n case 1:\n case 14:\n return [isolineSegment(edges.left, edges.bottom)];\n case 2:\n case 13:\n return [isolineSegment(edges.bottom, edges.right)];\n case 3:\n case 12:\n return [isolineSegment(edges.left, edges.right)];\n case 4:\n case 11:\n return [isolineSegment(edges.top, edges.right)];\n case 5:\n return [isolineSegment(edges.left, edges.top), isolineSegment(edges.bottom, edges.right)];\n case 6:\n case 9:\n return [isolineSegment(edges.top, edges.bottom)];\n case 7:\n case 8:\n return [isolineSegment(edges.left, edges.top)];\n case 10:\n return [isolineSegment(edges.top, edges.right), isolineSegment(edges.left, edges.bottom)];\n default:\n return [];\n }\n}\n\nfunction cellEdgeIntersections(cell: IsolineCell, threshold: number): CellEdgeIntersections {\n return {\n top: interpolateEdge(cell.topLeft, cell.topRight, threshold),\n right: interpolateEdge(cell.topRight, cell.bottomRight, threshold),\n bottom: interpolateEdge(cell.bottomLeft, cell.bottomRight, threshold),\n left: interpolateEdge(cell.topLeft, cell.bottomLeft, threshold),\n };\n}\n\nfunction interpolateEdge(start: IsolineSample, end: IsolineSample, threshold: number): IsolinePoint {\n const progress = end.value === start.value ? 0.5 : (threshold - start.value) / (end.value - start.value);\n return [start.x + (end.x - start.x) * progress, start.y + (end.y - start.y) * progress];\n}\n\nfunction isolineSegment(from: IsolinePoint, to: IsolinePoint): IsolineSegment {\n return { x1: from[0], y1: from[1], x2: to[0], y2: to[1] };\n}\n","import type { RenderNode } from '../../../scene';\nimport { colorAtRamp } from '../../field/colorRamp';\nimport { computeFieldGrid, fieldSurfaceClip } from '../../field/grid';\nimport { computeIsolineSegments, stitchIsolineSegments } from '../../field/isolines';\nimport type { FieldSample } from '../../field/types';\nimport { linePathData } from '../../primitives/linePath';\nimport type { ChartRenderContext } from '../types';\nimport type { ScalarFieldGrid } from './types';\n\nconst ISOLINE_TENSION = 0.5;\n\nexport function renderScalarField(context: ChartRenderContext, samples: FieldSample[]): RenderNode[] {\n if (!samples.length || context.plot.width <= 0 || context.plot.height <= 0) {\n return [];\n }\n\n const grid = createScalarGrid(context, samples);\n return [...renderFieldCells(context, grid), ...renderIsolines(context, grid)];\n}\n\nfunction createScalarGrid(context: ChartRenderContext, samples: FieldSample[]): ScalarFieldGrid {\n const { plot, chart } = context;\n const result = computeFieldGrid(samples, plot.width, plot.height, chart.config?.idwPower ?? 2);\n return {\n values: result.grid,\n columns: result.cols,\n rows: result.rows,\n cellWidth: plot.width / Math.max(1, result.cols - 1),\n cellHeight: plot.height / Math.max(1, result.rows - 1),\n };\n}\n\nfunction renderFieldCells(context: ChartRenderContext, grid: ScalarFieldGrid): RenderNode[] {\n const nodes: RenderNode[] = [];\n for (let row = 0; row < grid.rows; row++) {\n for (let column = 0; column < grid.columns; column++) {\n nodes.push(createFieldCell(context, grid, row, column));\n }\n }\n return nodes;\n}\n\nfunction createFieldCell(context: ChartRenderContext, grid: ScalarFieldGrid, row: number, column: number): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n const centerX = plot.x + plot.width * (column / (grid.columns - 1));\n const centerY = plot.y + plot.height * (row / (grid.rows - 1));\n const color = colorAtRamp(chart.config?.scale, grid.values[row * grid.columns + column]);\n return {\n type: 'rect',\n id: `chart-field-cell-${chart.id}-${row}-${column}`,\n order: nextOrder(),\n bounds,\n x: centerX - grid.cellWidth / 2,\n y: centerY - grid.cellHeight / 2,\n width: grid.cellWidth,\n height: grid.cellHeight,\n style: { fill: { kind: 'solid', color }, clip: fieldSurfaceClip(chart, plot) },\n };\n}\n\nfunction renderIsolines(context: ChartRenderContext, grid: ScalarFieldGrid): RenderNode[] {\n const nodes: RenderNode[] = [];\n (context.chart.config?.isolines ?? []).forEach((threshold, thresholdIndex) => {\n const node = createIsoline(context, grid, threshold, thresholdIndex);\n if (node) {\n nodes.push(node);\n }\n });\n return nodes;\n}\n\nfunction createIsoline(\n context: ChartRenderContext,\n grid: ScalarFieldGrid,\n threshold: number,\n thresholdIndex: number,\n): RenderNode | null {\n const { chart, plot, bounds, nextOrder } = context;\n const segments = computeIsolineSegments(\n {\n values: grid.values,\n columns: grid.columns,\n rows: grid.rows,\n width: plot.width,\n height: plot.height,\n },\n threshold,\n );\n if (!segments.length) {\n return null;\n }\n const chains = stitchIsolineSegments(segments);\n const path = chains\n .map(chain =>\n linePathData(\n chain.map(([x, y]) => ({ x: plot.x + x, y: plot.y + y })),\n ISOLINE_TENSION,\n ),\n )\n .join(' ');\n return {\n type: 'path',\n id: `chart-field-isoline-${chart.id}-${thresholdIndex}`,\n order: nextOrder(),\n bounds,\n d: path,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: 'rgba(15, 23, 42, 0.55)' },\n strokeWidth: 1,\n clip: fieldSurfaceClip(chart, plot),\n },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { CHART_COLORS, mapChartValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\n\nexport function renderVectorField(context: ChartRenderContext, seriesList: ChartSeries[]): RenderNode[] {\n const nodes: RenderNode[] = [];\n seriesList.forEach((series, seriesIndex) => {\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n (series.values as [number, number, number, number][]).forEach((vector, vectorIndex) => {\n nodes.push(createVectorNode(context, series.id, vector, vectorIndex, color));\n });\n });\n return nodes;\n}\n\nfunction createVectorNode(\n context: ChartRenderContext,\n seriesId: string,\n vector: [number, number, number, number],\n vectorIndex: number,\n color: Parameters<typeof paint>[0],\n): RenderNode {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const [x, y, angle, magnitude] = vector;\n const startX = plot.x + mapChartValue(x, chart.axisX, plot.width);\n const startY = plot.y + plot.height - mapChartValue(y, chart.axisY, plot.height);\n const endX = plot.x + mapChartValue(x + Math.cos(angle) * magnitude, chart.axisX, plot.width);\n const endY = plot.y + plot.height - mapChartValue(y + Math.sin(angle) * magnitude, chart.axisY, plot.height);\n return {\n type: 'path',\n id: `chart-field-vector-${chart.id}-${seriesId}-${vectorIndex}`,\n order: nextOrder(),\n bounds,\n d: `M ${startX} ${startY} L ${endX} ${endY}`,\n markerEnd: 'filled_arrow',\n style: {\n fill: { kind: 'none' },\n stroke: paint(color, diagnostics, chart.id),\n strokeWidth: 2,\n },\n };\n}\n","import type { RenderNode } from '../../scene';\nimport { classifyFieldData } from './field/data';\nimport { renderFieldLegend } from './field/legend';\nimport { renderScalarField } from './field/scalar';\nimport { renderVectorField } from './field/vectors';\nimport type { ChartRenderContext } from './types';\n\nexport function renderField(context: ChartRenderContext): RenderNode[] {\n const data = classifyFieldData(context);\n const nodes: RenderNode[] = [];\n\n nodes.push(...renderScalarField(context, data.scalarSamples));\n nodes.push(...renderVectorField(context, data.vectorSeries));\n nodes.push(...renderFieldLegend(context));\n\n return nodes;\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { finite } from '../../../scene';\nimport { chartText, contrastTextColor, zoneColorAtValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { HeatmapLayout } from './types';\n\ninterface HeatmapCell {\n seriesId: string;\n columnIndex: number;\n value: number;\n color: string;\n frame: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport function renderHeatmapCells(context: ChartRenderContext, layout: HeatmapLayout): RenderNode[] {\n const nodes: RenderNode[] = [];\n layout.rows.forEach((series, rowIndex) => {\n nodes.push(...renderRowCells(context, layout, series, rowIndex));\n });\n return nodes;\n}\n\nfunction renderRowCells(\n context: ChartRenderContext,\n layout: HeatmapLayout,\n series: ChartSeries,\n rowIndex: number,\n): RenderNode[] {\n return layout.columns.flatMap((_, columnIndex) => {\n const cell = createHeatmapCell(layout, series, rowIndex, columnIndex);\n return renderHeatmapCell(context, layout, cell);\n });\n}\n\nfunction createHeatmapCell(\n layout: HeatmapLayout,\n series: ChartSeries,\n rowIndex: number,\n columnIndex: number,\n): HeatmapCell {\n const value = (series.values as number[])[columnIndex] ?? 0;\n const { cellGap } = layout.grid;\n return {\n seriesId: series.id,\n columnIndex,\n value,\n color: colorForValue(value, layout),\n frame: {\n x: layout.grid.x + columnIndex * layout.grid.cellWidth + cellGap / 2,\n y: layout.grid.y + rowIndex * layout.grid.cellHeight + cellGap / 2,\n width: Math.max(0, layout.grid.cellWidth - cellGap),\n height: Math.max(0, layout.grid.cellHeight - cellGap),\n },\n };\n}\n\nfunction colorForValue(value: number, layout: HeatmapLayout): string {\n return zoneColorAtValue(value, layout.bands, layout.zones);\n}\n\nfunction renderHeatmapCell(context: ChartRenderContext, layout: HeatmapLayout, cell: HeatmapCell): RenderNode[] {\n const background = createCellBackground(context, layout, cell);\n if (context.chart.config?.showValues === false) {\n return [background];\n }\n return [background, createCellValueLabel(context, layout, cell)];\n}\n\nfunction createCellBackground(context: ChartRenderContext, layout: HeatmapLayout, cell: HeatmapCell): RenderNode {\n const { chart, bounds, nextOrder } = context;\n return {\n type: 'rect',\n id: `chart-heatmap-cell-${chart.id}-${cell.seriesId}-${cell.columnIndex}`,\n order: nextOrder(),\n bounds,\n ...cell.frame,\n rx: layout.grid.cellRadius,\n style: {\n fill: { kind: 'solid', color: cell.color },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n },\n };\n}\n\nfunction createCellValueLabel(context: ChartRenderContext, layout: HeatmapLayout, cell: HeatmapCell): RenderNode {\n const { chart, bounds, nextOrder } = context;\n return {\n ...chartText({\n id: `chart-heatmap-value-${chart.id}-${cell.seriesId}-${cell.columnIndex}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: cell.frame.x,\n y: cell.frame.y + cell.frame.height / 2 - layout.fontSize / 2,\n width: cell.frame.width,\n height: layout.fontSize + 2,\n },\n text: String(cell.value),\n chart,\n align: 'center',\n }),\n color: contrastTextColor(cell.color),\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { chartText } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { HeatmapLayout } from './types';\n\nexport function renderHeatmapHeaders(context: ChartRenderContext, layout: HeatmapLayout): RenderNode[] {\n return [...renderRowHeaders(context, layout), ...renderColumnHeaders(context, layout)];\n}\n\nfunction renderRowHeaders(context: ChartRenderContext, layout: HeatmapLayout): RenderNode[] {\n if (layout.reservedSpace.rowHeaders <= 0) {\n return [];\n }\n return layout.rows.map((series, rowIndex) => createRowHeader(context, layout, series, rowIndex));\n}\n\nfunction createRowHeader(\n context: ChartRenderContext,\n layout: HeatmapLayout,\n series: ChartSeries,\n rowIndex: number,\n): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n return chartText({\n id: `chart-heatmap-row-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: plot.x,\n y: layout.grid.y + rowIndex * layout.grid.cellHeight + layout.grid.cellHeight / 2 - layout.fontSize / 2,\n width: layout.reservedSpace.rowHeaders - 8,\n height: layout.fontSize + 2,\n },\n text: series.label,\n chart,\n });\n}\n\nfunction renderColumnHeaders(context: ChartRenderContext, layout: HeatmapLayout): RenderNode[] {\n if (layout.reservedSpace.columnHeaders <= 0) {\n return [];\n }\n return layout.columns.map((label, columnIndex) => createColumnHeader(context, layout, label, columnIndex));\n}\n\nfunction createColumnHeader(\n context: ChartRenderContext,\n layout: HeatmapLayout,\n label: string,\n columnIndex: number,\n): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n return chartText({\n id: `chart-heatmap-col-${chart.id}-${columnIndex}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: layout.grid.x + columnIndex * layout.grid.cellWidth,\n y: plot.y,\n width: layout.grid.cellWidth,\n height: layout.fontSize + 2,\n },\n text: label,\n chart,\n align: 'center',\n });\n}\n","import { finite } from '../../../scene';\nimport { estimateTextWidth } from '../../../scene/textLayout';\nimport { axisBands, DEFAULT_HEATMAP_ZONES } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { HeatmapGrid, HeatmapLayout, HeatmapReservedSpace } from './types';\n\nexport function createHeatmapLayout(context: ChartRenderContext): HeatmapLayout {\n const { chart } = context;\n const columns = heatmapColumns(context);\n const reservedSpace = heatmapReservedSpace(context);\n\n return {\n rows: chart.series,\n columns,\n bands: axisBands(chart.axisY),\n zones: chart.config?.zones?.length ? chart.config.zones : DEFAULT_HEATMAP_ZONES,\n fontSize: Math.max(9, finite(chart.fontSize, 12)),\n reservedSpace,\n grid: createHeatmapGrid(context, reservedSpace, columns.length),\n };\n}\n\nfunction heatmapColumns(context: ChartRenderContext): string[] {\n const { chart } = context;\n return chart.config?.categories?.length\n ? chart.config.categories\n : ((chart.series[0]?.values as number[] | undefined)?.map((_, index) => String(index + 1)) ?? []);\n}\n\nfunction heatmapReservedSpace(context: ChartRenderContext): HeatmapReservedSpace {\n const { chart } = context;\n const fontSize = Math.max(9, finite(chart.fontSize, 12));\n const longestLabel = chart.series.reduce(\n (max, series) => Math.max(max, estimateTextWidth(series.label ?? '', fontSize, false)),\n 0,\n );\n return {\n rowHeaders: context.showLabels ? Math.min(96, longestLabel + 12) : 0,\n columnHeaders: context.showLabels ? 24 : 0,\n legend: context.showLegend ? 38 : 0,\n };\n}\n\nfunction createHeatmapGrid(\n context: ChartRenderContext,\n reservedSpace: HeatmapReservedSpace,\n columnCount: number,\n): HeatmapGrid {\n const { chart } = context;\n const width = Math.max(1, context.plot.width - reservedSpace.rowHeaders);\n const height = Math.max(1, context.plot.height - reservedSpace.columnHeaders - reservedSpace.legend);\n const rowCount = chart.series.length;\n const cellGap = Math.max(0, finite(chart.config?.cellGap, 0));\n\n let cellWidth = columnCount ? width / columnCount : width;\n let cellHeight = rowCount ? height / rowCount : height;\n let gridWidth = width;\n let gridHeight = height;\n if (chart.config?.squareCells && columnCount && rowCount) {\n const cellSize = Math.min(cellWidth, cellHeight);\n cellWidth = cellSize;\n cellHeight = cellSize;\n gridWidth = cellSize * columnCount;\n gridHeight = cellSize * rowCount;\n }\n\n return {\n x: context.plot.x + reservedSpace.rowHeaders,\n y: context.plot.y + reservedSpace.columnHeaders,\n width: gridWidth,\n height: gridHeight,\n cellWidth,\n cellHeight,\n cellGap,\n cellRadius: Math.max(0, finite(chart.config?.barCornerRadius, cellGap)),\n };\n}\n","import type { RenderNode } from '../../../scene';\nimport { boxBounds } from '../../../scene';\nimport { chartText, DEFAULT_ZONE_FILL, formatFieldValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { HeatmapLayout } from './types';\n\nconst BAR_HEIGHT = 10;\nconst TICK_HEIGHT = 4;\nconst ROW_GAP = 2;\n\nexport function renderHeatmapLegend(context: ChartRenderContext, layout: HeatmapLayout): RenderNode[] {\n if (layout.reservedSpace.legend <= 0 || layout.zones.length === 0) {\n return [];\n }\n\n const barX = layout.grid.x;\n const barWidth = layout.grid.width;\n const labelHeight = layout.fontSize + 2;\n const barY = layout.grid.y + layout.grid.height + 6;\n const barBounds = boxBounds({ x: barX, y: barY, width: barWidth, height: BAR_HEIGHT });\n\n return [\n createGradientBar(context, layout, barX, barY, barWidth, barBounds),\n ...createBoundaryTicks(context, layout, barX, barY, barWidth, labelHeight),\n ];\n}\n\nfunction bandRatio(layout: HeatmapLayout, value: number): number {\n const first = layout.bands[0];\n const last = layout.bands[layout.bands.length - 1];\n return last === first ? 0 : (value - first) / (last - first);\n}\n\nfunction createGradientBar(\n context: ChartRenderContext,\n layout: HeatmapLayout,\n barX: number,\n barY: number,\n barWidth: number,\n barBounds: RenderNode['bounds'],\n): RenderNode {\n const { chart, nextOrder } = context;\n const bandCount = Math.max(0, layout.bands.length - 1);\n const zones = layout.zones.slice(0, bandCount);\n const stops = zones.map((zone, index) => ({\n offset: bandRatio(layout, layout.bands[index + 1] ?? layout.bands[layout.bands.length - 1]) * 100,\n color: zone.color ?? DEFAULT_ZONE_FILL,\n }));\n return {\n type: 'rect',\n id: `chart-heatmap-legend-bar-${chart.id}`,\n order: nextOrder(),\n bounds: barBounds,\n x: barX,\n y: barY,\n width: barWidth,\n height: BAR_HEIGHT,\n rx: 3,\n zoneGradient: { axis: 'y', min: chart.axisY.min, max: chart.axisY.max },\n style: {\n fill: stops.length ? { kind: 'linear-gradient', angle: 0, stops } : { kind: 'solid', color: DEFAULT_ZONE_FILL },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n}\n\nfunction createBoundaryTicks(\n context: ChartRenderContext,\n layout: HeatmapLayout,\n barX: number,\n barY: number,\n barWidth: number,\n labelHeight: number,\n): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const labelY = barY + BAR_HEIGHT + TICK_HEIGHT + ROW_GAP;\n const labelWidth = 48;\n\n return layout.bands.flatMap((value, index) => {\n const x = barX + bandRatio(layout, value) * barWidth;\n const tick: RenderNode = {\n type: 'path',\n id: `chart-heatmap-legend-tick-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n d: `M ${x} ${barY + BAR_HEIGHT} L ${x} ${barY + BAR_HEIGHT + TICK_HEIGHT}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n const isFirst = index === 0;\n const isLast = index === layout.bands.length - 1;\n const align = isFirst ? 'left' : isLast ? 'right' : 'center';\n const frameX = isFirst ? x : isLast ? x - labelWidth : x - labelWidth / 2;\n const label = chartText({\n id: `chart-heatmap-legend-tick-label-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n frame: { x: frameX, y: labelY, width: labelWidth, height: labelHeight },\n text: formatFieldValue(value),\n chart,\n align,\n });\n return [tick, label];\n });\n}\n","import type { RenderNode } from '../../scene';\nimport { renderHeatmapCells } from './heatmap/cells';\nimport { renderHeatmapHeaders } from './heatmap/headers';\nimport { createHeatmapLayout } from './heatmap/layout';\nimport { renderHeatmapLegend } from './heatmap/legend';\nimport type { ChartRenderContext } from './types';\n\nexport function renderHeatmap(context: ChartRenderContext): RenderNode[] {\n const layout = createHeatmapLayout(context);\n const nodes: RenderNode[] = [];\n\n nodes.push(...renderHeatmapCells(context, layout));\n nodes.push(...renderHeatmapHeaders(context, layout));\n nodes.push(...renderHeatmapLegend(context, layout));\n\n return nodes;\n}\n","export interface HexBin {\n cx: number;\n cy: number;\n count: number;\n}\n\nexport function computeHexBins(points: Array<{ x: number; y: number }>, radius: number): HexBin[] {\n if (radius <= 0 || points.length === 0) {\n return [];\n }\n const dx = radius * 1.5,\n dy = radius * Math.sqrt(3);\n const bins = new Map<string, HexBin>();\n\n for (const { x, y } of points) {\n const col = Math.round(x / dx);\n const rowOffset = col % 2 !== 0 ? dy / 2 : 0;\n const row = Math.round((y - rowOffset) / dy);\n const key = `${col}:${row}`;\n const existing = bins.get(key);\n if (existing) {\n existing.count++;\n } else {\n bins.set(key, { cx: col * dx, cy: row * dy + rowOffset, count: 1 });\n }\n }\n\n return [...bins.values()];\n}\n","import type { SankeyGraph } from './types';\n\nexport function assignSankeyColumns(graph: SankeyGraph): Map<string, number> {\n const columns = new Map<string, number>();\n for (const id of graph.ids) {\n columns.set(id, 0);\n }\n for (let pass = 0; pass < graph.ids.size; pass++) {\n let changed = false;\n for (const link of graph.links) {\n const candidate = (columns.get(link.source) ?? 0) + 1;\n if (candidate > (columns.get(link.target) ?? 0)) {\n columns.set(link.target, candidate);\n changed = true;\n }\n }\n if (!changed) {\n break;\n }\n }\n return columns;\n}\n\nexport function groupSankeyColumns(ids: Set<string>, columns: Map<string, number>): Map<number, string[]> {\n const groups = new Map<number, string[]>();\n for (const id of ids) {\n const column = columns.get(id) ?? 0;\n const group = groups.get(column) ?? [];\n group.push(id);\n groups.set(column, group);\n }\n return groups;\n}\n","import type { SankeyGraph, SankeyLinkInput, SankeyNodeInput } from './types';\n\nexport function createSankeyGraph(nodes: SankeyNodeInput[], links: SankeyLinkInput[]): SankeyGraph {\n const ids = new Set(nodes.map(node => node.id));\n for (const link of links) {\n ids.add(link.source);\n ids.add(link.target);\n }\n\n const incoming = new Map<string, SankeyLinkInput[]>();\n const outgoing = new Map<string, SankeyLinkInput[]>();\n for (const id of ids) {\n incoming.set(id, []);\n outgoing.set(id, []);\n }\n const validLinks = links.filter(\n link => ids.has(link.source) && ids.has(link.target) && link.value > 0 && link.source !== link.target,\n );\n for (const link of validLinks) {\n outgoing.get(link.source)?.push(link);\n incoming.get(link.target)?.push(link);\n }\n return { ids, links: validLinks, incoming, outgoing };\n}\n","import { groupSankeyColumns } from './columns';\nimport { SANKEY_NODE_GAP, SANKEY_NODE_WIDTH } from './constants';\nimport type { SankeyGraph, SankeyNodeGeometry } from './types';\n\nfunction nodeValues(graph: SankeyGraph): Map<string, number> {\n const values = new Map<string, number>();\n for (const id of graph.ids) {\n const inflow = (graph.incoming.get(id) ?? []).reduce((sum, link) => sum + link.value, 0);\n const outflow = (graph.outgoing.get(id) ?? []).reduce((sum, link) => sum + link.value, 0);\n values.set(id, Math.max(inflow, outflow, 0.0001));\n }\n return values;\n}\n\nfunction calculateValueScale(groups: Map<number, string[]>, values: Map<string, number>, height: number): number {\n let scale = Infinity;\n for (const ids of groups.values()) {\n const total = ids.reduce((sum, id) => sum + (values.get(id) ?? 0), 0);\n const gaps = Math.max(0, ids.length - 1) * SANKEY_NODE_GAP;\n const usable = Math.max(1, height - gaps);\n if (total > 0) {\n scale = Math.min(scale, usable / total);\n }\n }\n if (!Number.isFinite(scale) || scale <= 0) {\n return 1;\n }\n return scale;\n}\n\nexport function sankeyNodeX(column: number, columnCount: number, width: number): number {\n if (columnCount <= 1) {\n return 0;\n }\n return (column * (width - SANKEY_NODE_WIDTH)) / (columnCount - 1);\n}\n\nexport function calculateNodeGeometry(\n graph: SankeyGraph,\n columns: Map<string, number>,\n height: number,\n): SankeyNodeGeometry {\n const groups = groupSankeyColumns(graph.ids, columns);\n const values = nodeValues(graph);\n const valueScale = calculateValueScale(groups, values, height);\n const y = new Map<string, number>();\n const heights = new Map<string, number>();\n for (const ids of groups.values()) {\n let cursor = 0;\n for (const id of ids) {\n const nodeHeight = Math.max(2, (values.get(id) ?? 0) * valueScale);\n y.set(id, cursor);\n heights.set(id, nodeHeight);\n cursor += nodeHeight + SANKEY_NODE_GAP;\n }\n }\n return {\n columns,\n y,\n heights,\n valueScale,\n columnCount: Math.max(1, ...[...columns.values()].map(column => column + 1)),\n };\n}\n","import { SANKEY_NODE_WIDTH } from './constants';\nimport { sankeyNodeX } from './nodeGeometry';\nimport type { SankeyGraph, SankeyLayoutLink, SankeyNodeGeometry, SankeyNodeOffset } from './types';\n\nexport function layoutSankeyLinks(\n graph: SankeyGraph,\n geometry: SankeyNodeGeometry,\n width: number,\n offsets: Map<string, SankeyNodeOffset>,\n): SankeyLayoutLink[] {\n const outgoingOffsets = new Map<string, number>();\n const incomingOffsets = new Map<string, number>();\n for (const id of graph.ids) {\n outgoingOffsets.set(id, 0);\n incomingOffsets.set(id, 0);\n }\n return graph.links.map(link => {\n const sliceHeight = Math.max(0.5, link.value * geometry.valueScale);\n const sourceOffset = offsets.get(link.source);\n const targetOffset = offsets.get(link.target);\n const sourceTop = (geometry.y.get(link.source) ?? 0) + (sourceOffset?.y ?? 0);\n const targetTop = (geometry.y.get(link.target) ?? 0) + (targetOffset?.y ?? 0);\n const sourceSlice = outgoingOffsets.get(link.source) ?? 0;\n const targetSlice = incomingOffsets.get(link.target) ?? 0;\n outgoingOffsets.set(link.source, sourceSlice + sliceHeight);\n incomingOffsets.set(link.target, targetSlice + sliceHeight);\n return {\n source: link.source,\n target: link.target,\n value: link.value,\n color: link.color,\n x0:\n sankeyNodeX(geometry.columns.get(link.source) ?? 0, geometry.columnCount, width) +\n SANKEY_NODE_WIDTH +\n (sourceOffset?.x ?? 0),\n x1: sankeyNodeX(geometry.columns.get(link.target) ?? 0, geometry.columnCount, width) + (targetOffset?.x ?? 0),\n sourceY0: sourceTop + sourceSlice,\n sourceY1: sourceTop + sourceSlice + sliceHeight,\n targetY0: targetTop + targetSlice,\n targetY1: targetTop + targetSlice + sliceHeight,\n };\n });\n}\n","import { SANKEY_NODE_WIDTH } from './constants';\nimport { sankeyNodeX } from './nodeGeometry';\nimport type { SankeyGraph, SankeyLayoutNode, SankeyNodeGeometry, SankeyNodeInput, SankeyNodeOffset } from './types';\n\nexport function layoutSankeyNodes(\n inputs: SankeyNodeInput[],\n graph: SankeyGraph,\n geometry: SankeyNodeGeometry,\n width: number,\n offsets: Map<string, SankeyNodeOffset>,\n): SankeyLayoutNode[] {\n return [...graph.ids].map(id => {\n const input = inputs.find(node => node.id === id);\n const column = geometry.columns.get(id) ?? 0;\n const offset = offsets.get(id);\n return {\n id,\n label: input?.label ?? id,\n color: input?.color,\n x: sankeyNodeX(column, geometry.columnCount, width) + (offset?.x ?? 0),\n y: (geometry.y.get(id) ?? 0) + (offset?.y ?? 0),\n width: SANKEY_NODE_WIDTH,\n height: geometry.heights.get(id) ?? 2,\n column,\n };\n });\n}\n","import { assignSankeyColumns } from './columns';\nimport { createSankeyGraph } from './graph';\nimport { layoutSankeyLinks } from './links';\nimport { calculateNodeGeometry } from './nodeGeometry';\nimport { layoutSankeyNodes } from './nodes';\nimport type { SankeyLayout, SankeyLinkInput, SankeyNodeInput, SankeyNodeOffset } from './types';\n\nfunction collectOffsets(inputs: SankeyNodeInput[]): Map<string, SankeyNodeOffset> {\n const offsets = new Map<string, SankeyNodeOffset>();\n for (const input of inputs) {\n if (input.offsetX || input.offsetY) {\n offsets.set(input.id, { x: input.offsetX ?? 0, y: input.offsetY ?? 0 });\n }\n }\n return offsets;\n}\n\nexport function layoutSankey(\n nodeInputs: SankeyNodeInput[],\n linkInputs: SankeyLinkInput[],\n width: number,\n height: number,\n): SankeyLayout {\n const graph = createSankeyGraph(nodeInputs, linkInputs);\n if (graph.ids.size === 0) {\n return { nodes: [], links: [] };\n }\n const columns = assignSankeyColumns(graph);\n const geometry = calculateNodeGeometry(graph, columns, height);\n const offsets = collectOffsets(nodeInputs);\n return {\n nodes: layoutSankeyNodes(nodeInputs, graph, geometry, width, offsets),\n links: layoutSankeyLinks(graph, geometry, width, offsets),\n };\n}\n","export interface TreemapRect<T> {\n item: T;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface TreemapBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface SizedTreemapItem<T> {\n item: T;\n area: number;\n}\n\ninterface TreemapRow<T> {\n items: SizedTreemapItem<T>[];\n area: number;\n}\n\ninterface TreemapPlacement<T> {\n rectangles: TreemapRect<T>[];\n remainingBounds: TreemapBounds;\n}\n\nexport function squarifyTreemap<T extends { value: number }>(items: T[], bounds: TreemapBounds): TreemapRect<T>[] {\n const remainingItems = sizeTreemapItems(items, bounds);\n if (!remainingItems.length) {\n return [];\n }\n\n const rectangles: TreemapRect<T>[] = [];\n let remaining = remainingItems;\n let remainingBounds = bounds;\n while (remaining.length) {\n const row = selectTreemapRow(remaining, Math.min(remainingBounds.width, remainingBounds.height));\n const placement = placeTreemapRow(row, remainingBounds);\n rectangles.push(...placement.rectangles);\n remaining = remaining.slice(row.items.length);\n remainingBounds = placement.remainingBounds;\n }\n return rectangles;\n}\n\nfunction sizeTreemapItems<T extends { value: number }>(items: T[], bounds: TreemapBounds): SizedTreemapItem<T>[] {\n const positiveItems = items.filter(item => item.value > 0);\n if (!positiveItems.length || bounds.width <= 0 || bounds.height <= 0) {\n return [];\n }\n const total = positiveItems.reduce((sum, item) => sum + item.value, 0);\n if (total <= 0) {\n return [];\n }\n const areaScale = (bounds.width * bounds.height) / total;\n return [...positiveItems]\n .sort((left, right) => right.value - left.value)\n .map(item => ({ item, area: item.value * areaScale }));\n}\n\nfunction selectTreemapRow<T>(items: SizedTreemapItem<T>[], availableLength: number): TreemapRow<T> {\n const rowItems = [items[0]];\n for (let index = 1; index < items.length; index++) {\n const candidateItems = [...rowItems, items[index]];\n if (worstAspectRatio(candidateItems, availableLength) > worstAspectRatio(rowItems, availableLength)) {\n break;\n }\n rowItems.push(items[index]);\n }\n return {\n items: rowItems,\n area: rowItems.reduce((sum, item) => sum + item.area, 0),\n };\n}\n\nfunction worstAspectRatio<T>(items: SizedTreemapItem<T>[], availableLength: number): number {\n const area = items.reduce((sum, item) => sum + item.area, 0);\n if (area <= 0 || availableLength <= 0) {\n return Infinity;\n }\n const areas = items.map(item => item.area);\n const largestArea = Math.max(...areas);\n const smallestArea = Math.min(...areas);\n const squaredLength = availableLength * availableLength;\n return Math.max((squaredLength * largestArea) / (area * area), (area * area) / (squaredLength * smallestArea));\n}\n\nfunction placeTreemapRow<T>(row: TreemapRow<T>, bounds: TreemapBounds): TreemapPlacement<T> {\n return bounds.width >= bounds.height ? placeVerticalTreemapRow(row, bounds) : placeHorizontalTreemapRow(row, bounds);\n}\n\nfunction placeVerticalTreemapRow<T>(row: TreemapRow<T>, bounds: TreemapBounds): TreemapPlacement<T> {\n const columnWidth = bounds.height > 0 ? row.area / bounds.height : 0;\n let y = bounds.y;\n const rectangles = row.items.map(({ item, area }) => {\n const height = columnWidth > 0 ? area / columnWidth : 0;\n const rectangle = { item, x: bounds.x, y, width: columnWidth, height };\n y += height;\n return rectangle;\n });\n return {\n rectangles,\n remainingBounds: {\n x: bounds.x + columnWidth,\n y: bounds.y,\n width: bounds.width - columnWidth,\n height: bounds.height,\n },\n };\n}\n\nfunction placeHorizontalTreemapRow<T>(row: TreemapRow<T>, bounds: TreemapBounds): TreemapPlacement<T> {\n const rowHeight = bounds.width > 0 ? row.area / bounds.width : 0;\n let x = bounds.x;\n const rectangles = row.items.map(({ item, area }) => {\n const width = rowHeight > 0 ? area / rowHeight : 0;\n const rectangle = { item, x, y: bounds.y, width, height: rowHeight };\n x += width;\n return rectangle;\n });\n return {\n rectangles,\n remainingBounds: {\n x: bounds.x,\n y: bounds.y + rowHeight,\n width: bounds.width,\n height: bounds.height - rowHeight,\n },\n };\n}\n","import type { HexbinChart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { paint } from '../../scene';\nimport { computeHexBins } from '../geometry';\nimport { CHART_COLORS, DEFAULT_HEX_RADIUS, mapChartValue, resolveChartShadow } from '../primitives';\nimport type { ChartRenderContext } from './types';\n\nfunction hexPath(cx: number, cy: number, radius: number): string {\n const points: string[] = [];\n for (let corner = 0; corner < 6; corner++) {\n const angle = ((-60 + 60 * corner) * Math.PI) / 180;\n points.push(`${corner === 0 ? 'M' : 'L'} ${cx + radius * Math.cos(angle)} ${cy + radius * Math.sin(angle)}`);\n }\n return `${points.join(' ')} Z`;\n}\n\nexport function renderHexbin(context: ChartRenderContext<HexbinChart>): RenderNode[] {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const nodes: RenderNode[] = [];\n const hexRadius = Math.max(1, chart.config?.hexRadius ?? DEFAULT_HEX_RADIUS);\n const shadow = resolveChartShadow(chart.shadowStyle);\n const clipPath = shadow\n ? `M ${plot.x} ${plot.y} H ${plot.x + plot.width} V ${plot.y + plot.height} H ${plot.x} Z`\n : undefined;\n chart.series.forEach((series, seriesIndex) => {\n const explicit = series.values.length > 0 && Array.isArray(series.values[0]);\n const pairs = explicit\n ? (series.values as [number, number][])\n : (series.values as number[]).map((y, i) => [chart.axisX.min + i * chart.axisX.step, y] as [number, number]);\n const pixelPoints = pairs.map(([vx, vy]) => ({\n x: mapChartValue(vx, chart.axisX, plot.width),\n y: plot.height - mapChartValue(vy, chart.axisY, plot.height),\n }));\n const bins = computeHexBins(pixelPoints, hexRadius);\n const maxCount = Math.max(1, ...bins.map(bin => bin.count));\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n bins.forEach((bin, i) => {\n nodes.push({\n type: 'path',\n id: `chart-hexbin-${chart.id}-${series.id}-${i}`,\n order: nextOrder(),\n bounds,\n d: hexPath(plot.x + bin.cx, plot.y + bin.cy, hexRadius),\n style: {\n fill: paint(color, diagnostics, chart.id),\n opacity: Math.max(0.15, bin.count / maxCount),\n shadow,\n clip: clipPath ? { type: 'path', d: clipPath } : undefined,\n },\n });\n });\n });\n return nodes;\n}\n","import type { Chart, ChartSeries } from '../../../model/chart';\nimport { mapChartValue } from '../primitives';\nimport type { ChartRenderContext } from './types';\n\nexport interface CartesianPoint {\n x: number;\n y: number;\n}\n\nexport function seriesValuePairs(chart: Chart, series: ChartSeries): [number, number][] {\n if (series.values.length > 0 && Array.isArray(series.values[0])) {\n return series.values as [number, number][];\n }\n return (series.values as number[]).map((value, index) => [chart.axisX.min + index * chart.axisX.step, value]);\n}\n\nexport function pixelPoints(context: ChartRenderContext, pairs: [number, number][]): CartesianPoint[] {\n const { chart, plot } = context;\n return pairs.map(([x, y]) => ({\n x: plot.x + mapChartValue(x, chart.axisX, plot.width),\n y: plot.y + plot.height - mapChartValue(y, chart.axisY, plot.height),\n }));\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport { colorWithAlpha } from '../../../color';\nimport type { Bounds, RenderNode } from '../../../scene';\nimport { linePathData } from '../../primitives/linePath';\nimport type { CartesianPoint } from '../cartesianPoints';\nimport type { ChartRenderContext } from '../types';\n\nexport function createLineAreaFill(\n context: ChartRenderContext,\n series: ChartSeries,\n points: CartesianPoint[],\n color: string,\n tension: number,\n areaOpacity: number,\n): RenderNode {\n const { chart, plot, nextOrder } = context;\n const baselineY = plot.y + plot.height;\n const first = points[0];\n const last = points[points.length - 1];\n const d = `${linePathData(points, tension)} L ${last.x} ${baselineY} L ${first.x} ${baselineY} Z`;\n const top = Math.min(...points.map(point => point.y));\n const centerX = (Math.min(...points.map(point => point.x)) + Math.max(...points.map(point => point.x))) / 2;\n const halfHeight = (baselineY - top) / 2;\n const fillBounds: Bounds = {\n minX: centerX - halfHeight,\n maxX: centerX + halfHeight,\n minY: top,\n maxY: baselineY,\n };\n return {\n type: 'path',\n id: `chart-line-area-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds: fillBounds,\n d,\n detail: { of: 'chartSeries', series: series.id },\n style: {\n fill: {\n kind: 'linear-gradient',\n angle: 90,\n stops: [\n { offset: 0, color: colorWithAlpha(color, areaOpacity) },\n { offset: 100, color: colorWithAlpha(color, 0) },\n ],\n },\n stroke: { kind: 'none' },\n pointerEvents: 'none',\n },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { chartText } from '../../primitives';\nimport { pixelPoints, seriesValuePairs } from '../cartesianPoints';\nimport type { ChartRenderContext } from '../types';\n\nfunction formatHighlight(template: string | undefined, category: string, value: number): string {\n return (template || '{value}')\n .replace('{category}', category)\n .replace('{value}', String(Math.round(value * 100) / 100));\n}\n\ninterface Mark {\n key: string;\n point: { x: number; y: number };\n index: number;\n radius: number;\n color: string;\n}\n\nfunction guideNode(context: ChartRenderContext, mark: Mark): RenderNode {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n return {\n type: 'path',\n id: `chart-highlight-guide-${mark.key}`,\n order: nextOrder(),\n bounds,\n d: `M ${mark.point.x} ${mark.point.y} V ${plot.y + plot.height}`,\n style: {\n fill: { kind: 'none' },\n stroke: paint(mark.color, diagnostics, chart.id),\n strokeWidth: 1,\n dash: [3, 4],\n opacity: 0.55,\n pointerEvents: 'none',\n },\n };\n}\n\nfunction dotNode(context: ChartRenderContext, mark: Mark): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const glow = chart.config?.lineGlow;\n return {\n type: 'ellipse',\n id: `chart-highlight-${mark.key}`,\n order: nextOrder(),\n bounds,\n cx: mark.point.x,\n cy: mark.point.y,\n rx: mark.radius,\n ry: mark.radius,\n style: {\n fill: paint(mark.color, diagnostics, chart.id),\n shadow: glow ? { color: mark.color, opacity: 0.9, blur: glow, dx: 0, dy: 0 } : undefined,\n pointerEvents: 'none',\n },\n };\n}\n\nfunction labelNode(context: ChartRenderContext, mark: Mark, value: number): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const config = chart.config;\n const fontSize = Math.max(9, chart.fontSize ?? 12);\n const text = formatHighlight(config?.highlightLabelFormat, config?.categories?.[mark.index] ?? '', value);\n const width = Math.max(48, text.length * fontSize * 0.62);\n return {\n ...chartText({\n id: `chart-highlight-label-${mark.key}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: mark.point.x - width / 2,\n y: mark.point.y - mark.radius - 6 - fontSize * 1.2,\n width,\n height: fontSize * 1.2,\n },\n text,\n chart,\n align: 'center',\n }),\n color: config?.highlightLabelColor ?? chart.textColor ?? '#0f172a',\n fontWeight: 'bold',\n };\n}\n\nexport function renderLineHighlights(context: ChartRenderContext, series: ChartSeries, color: string): RenderNode[] {\n const { chart } = context;\n const config = chart.config;\n const wanted = config?.highlightPoints;\n if (!wanted?.length) {\n return [];\n }\n const pairs = seriesValuePairs(chart, series);\n const points = pixelPoints(context, pairs);\n const nodes: RenderNode[] = [];\n for (const wantedIndex of wanted) {\n const index = wantedIndex < 0 ? points.length + wantedIndex : wantedIndex;\n const point = points[index];\n if (!point) {\n continue;\n }\n const mark: Mark = {\n key: `${chart.id}-${series.id}-${index}`,\n point,\n index,\n radius: config?.highlightSize ?? 6,\n color: config?.highlightColor ?? color,\n };\n if (config?.highlightGuide) {\n nodes.push(guideNode(context, mark));\n }\n nodes.push(dotNode(context, mark));\n if (config?.highlightLabels) {\n nodes.push(labelNode(context, mark, pairs[index][1]));\n }\n }\n return nodes;\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { createVerticalErrorWhiskerNode, errorBarRange, mapChartValue } from '../../primitives';\nimport type { CartesianPoint } from '../cartesianPoints';\nimport type { ChartRenderContext } from '../types';\n\nexport interface LinePointMark {\n seriesId: string;\n valueIndex: number;\n value: number;\n error: number | [number, number] | null | undefined;\n position: CartesianPoint;\n color: string;\n}\n\nexport function createLinePointMarks(\n series: ChartSeries,\n pairs: [number, number][],\n points: CartesianPoint[],\n color: string,\n): LinePointMark[] {\n return points.map((position, valueIndex) => ({\n seriesId: series.id,\n valueIndex,\n value: pairs[valueIndex][1],\n error: series.error?.[valueIndex],\n position,\n color,\n }));\n}\n\nexport function renderLineMarks(context: ChartRenderContext, marks: LinePointMark[]): RenderNode[] {\n return marks.flatMap(mark => renderLinePointMark(context, mark));\n}\n\nfunction renderLinePointMark(context: ChartRenderContext, mark: LinePointMark): RenderNode[] {\n const nodes: RenderNode[] = [];\n const errorNode = createLineError(context, mark);\n if (errorNode) {\n nodes.push(errorNode);\n }\n nodes.push(createLinePoint(context, mark));\n return nodes;\n}\n\nfunction createLineError(context: ChartRenderContext, mark: LinePointMark): RenderNode | null {\n if (mark.error == null) {\n return null;\n }\n const { chart, plot, bounds, nextOrder } = context;\n const [lower, upper] = errorBarRange(mark.value, mark.error);\n return createVerticalErrorWhiskerNode({\n id: `chart-line-error-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n order: nextOrder(),\n bounds,\n geometry: {\n centerX: mark.position.x,\n startY: plot.y + plot.height - mapChartValue(lower, chart.axisY, plot.height),\n endY: plot.y + plot.height - mapChartValue(upper, chart.axisY, plot.height),\n },\n color: mark.color,\n valueReference: { seriesId: mark.seriesId, valueIndex: mark.valueIndex },\n });\n}\n\nfunction createLinePoint(context: ChartRenderContext, mark: LinePointMark): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const config = chart.config;\n const radius = config?.pointSize ?? 3;\n const strokeWidth = config?.pointStrokeWidth ?? 0;\n const visible = radius > 0;\n const fill = config?.pointFill && config.pointFill !== 'series' ? config.pointFill : mark.color;\n return {\n type: 'ellipse',\n id: `chart-point-${chart.id}-${mark.seriesId}-${mark.valueIndex}`,\n order: nextOrder(),\n bounds,\n cx: mark.position.x,\n cy: mark.position.y,\n rx: visible ? radius : 6,\n ry: visible ? radius : 6,\n detail: { of: 'chartValue', series: mark.seriesId, valueIndex: mark.valueIndex },\n style: {\n fill: visible ? paint(fill, diagnostics, chart.id) : { kind: 'none' },\n stroke: visible && strokeWidth > 0 ? paint(mark.color, diagnostics, chart.id) : undefined,\n strokeWidth: visible && strokeWidth > 0 ? strokeWidth : undefined,\n pointerEvents: visible ? undefined : 'all',\n },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { resolveChartShadow } from '../../primitives';\nimport { linePathData } from '../../primitives/linePath';\nimport type { CartesianPoint } from '../cartesianPoints';\nimport type { ChartRenderContext } from '../types';\n\nexport function createLinePath(\n context: ChartRenderContext,\n series: ChartSeries,\n points: CartesianPoint[],\n color: string,\n tension: number,\n): RenderNode {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const config = chart.config;\n const source = series.color;\n const gradient = source && typeof source !== 'string' && source.type === 'gradient' ? source : undefined;\n const glow = config?.lineGlow;\n return {\n type: 'path',\n id: `chart-line-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds: gradient ? { minX: plot.x, maxX: plot.x + plot.width, minY: plot.y, maxY: plot.y + plot.height } : bounds,\n detail: { of: 'chartSeries', series: series.id, lineTension: tension || undefined },\n d: linePathData(points, tension),\n style: {\n fill: { kind: 'none' },\n stroke: paint(gradient ?? color, diagnostics, chart.id),\n strokeWidth: series.strokeWidth ?? config?.lineWidth ?? 2,\n dash: series.dash,\n lineCap: config?.lineWidth === undefined ? undefined : 'round',\n lineJoin: 'round',\n shadow: glow ? { color, opacity: 0.9, blur: glow, dx: 0, dy: 0 } : resolveChartShadow(chart.shadowStyle),\n },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { CHART_COLORS, representativeColor } from '../../primitives';\nimport { pixelPoints, seriesValuePairs } from '../cartesianPoints';\nimport type { ChartRenderContext } from '../types';\nimport { createLineAreaFill } from './area';\nimport { renderLineHighlights } from './highlights';\nimport { createLinePointMarks, renderLineMarks } from './marks';\nimport { createLinePath } from './path';\n\nfunction seriesColor(series: ChartSeries, seriesIndex: number): string {\n return representativeColor(series.color, CHART_COLORS[seriesIndex % CHART_COLORS.length]);\n}\n\nexport function renderLineSeriesArea(\n context: ChartRenderContext,\n series: ChartSeries,\n seriesIndex: number,\n): RenderNode[] {\n const areaOpacity = context.chart.config?.areaOpacity;\n if (areaOpacity === undefined || areaOpacity <= 0) {\n return [];\n }\n const color = seriesColor(series, seriesIndex);\n const tension = context.chart.config?.lineTension ?? 0;\n const points = pixelPoints(context, seriesValuePairs(context.chart, series));\n return points.length > 1 ? [createLineAreaFill(context, series, points, color, tension, areaOpacity)] : [];\n}\n\nexport function renderLineSeries(context: ChartRenderContext, series: ChartSeries, seriesIndex: number): RenderNode[] {\n const color = seriesColor(series, seriesIndex);\n const tension = context.chart.config?.lineTension ?? 0;\n const pairs = seriesValuePairs(context.chart, series);\n const points = pixelPoints(context, pairs);\n const nodes: RenderNode[] = [];\n if (points.length) {\n nodes.push(createLinePath(context, series, points, color, tension));\n }\n const marks = createLinePointMarks(series, pairs, points, color);\n nodes.push(...renderLineMarks(context, marks));\n nodes.push(...renderLineHighlights(context, series, color));\n return nodes;\n}\n","import type { RenderNode } from '../../scene';\nimport { renderLineSeries, renderLineSeriesArea } from './line/series';\nimport type { ChartRenderContext } from './types';\n\nexport function renderLine(context: ChartRenderContext): RenderNode[] {\n const nodes: RenderNode[] = [];\n context.chart.series.forEach((series, seriesIndex) => {\n nodes.push(...renderLineSeriesArea(context, series, seriesIndex));\n });\n context.chart.series.forEach((series, seriesIndex) => {\n nodes.push(...renderLineSeries(context, series, seriesIndex));\n });\n return nodes;\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite } from '../../../scene';\nimport { chartText } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { MekkoLayout } from './types';\n\nconst PERCENT_TICKS = [0, 25, 50, 75, 100];\n\nexport function renderMekkoGrid(context: ChartRenderContext, layout: MekkoLayout): RenderNode[] {\n const nodes: RenderNode[] = [];\n if (context.chart.showGrid !== false) {\n nodes.push(...renderGridLines(context, layout));\n }\n if (context.showLabels) {\n nodes.push(...renderPercentageLabels(context, layout));\n }\n return nodes;\n}\n\nfunction renderGridLines(context: ChartRenderContext, layout: MekkoLayout): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n return PERCENT_TICKS.map(percent => {\n const y = percentageY(layout, percent);\n return {\n type: 'path',\n id: `chart-mekko-grid-${chart.id}-${percent}`,\n order: nextOrder(),\n bounds,\n d: `M ${layout.grid.x} ${y} L ${layout.grid.x + layout.grid.width} ${y}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n },\n };\n });\n}\n\nfunction renderPercentageLabels(context: ChartRenderContext, layout: MekkoLayout): RenderNode[] {\n const { chart, plot, bounds, nextOrder } = context;\n return PERCENT_TICKS.map(percent => ({\n ...chartText({\n id: `chart-mekko-pct-${chart.id}-${percent}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: plot.x,\n y: percentageY(layout, percent) - layout.smallFontSize / 2,\n width: layout.labelGutterWidth - 6,\n height: layout.smallFontSize + 2,\n },\n text: `${percent}%`,\n chart,\n align: 'right',\n }),\n fontSize: layout.smallFontSize,\n }));\n}\n\nfunction percentageY(layout: MekkoLayout, percent: number): number {\n return layout.grid.y + layout.grid.height * (1 - percent / 100);\n}\n","import type { RenderNode } from '../../../scene';\nimport { wrapText } from '../../../scene/textLayout';\nimport { chartText } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { MekkoColumn, MekkoLayout } from './types';\n\nexport function renderMekkoColumnLabels(\n context: ChartRenderContext,\n layout: MekkoLayout,\n columnIndex: number,\n column: MekkoColumn,\n): RenderNode[] {\n if (!context.showLabels) {\n return [];\n }\n\n return [\n createTotalLabel(context, layout, columnIndex, column),\n createColumnLabel(context, layout, columnIndex, column),\n ];\n}\n\nfunction createTotalLabel(\n context: ChartRenderContext,\n layout: MekkoLayout,\n columnIndex: number,\n column: MekkoColumn,\n): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n return {\n ...chartText({\n id: `chart-mekko-total-${chart.id}-${columnIndex}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: column.x,\n y: plot.y,\n width: column.width,\n height: layout.smallFontSize + 2,\n },\n text: String(column.total),\n chart,\n align: 'center',\n }),\n fontSize: layout.smallFontSize,\n };\n}\n\nfunction createColumnLabel(\n context: ChartRenderContext,\n layout: MekkoLayout,\n columnIndex: number,\n column: MekkoColumn,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const { label, width } = column;\n return {\n ...chartText({\n id: `chart-mekko-col-label-${chart.id}-${columnIndex}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: column.x,\n y: layout.grid.y + layout.grid.height + 4,\n width,\n height: layout.smallFontSize * 2 + 4,\n },\n text: label,\n chart,\n align: 'center',\n }),\n lines: wrapText(label, width, layout.smallFontSize),\n fontSize: layout.smallFontSize,\n };\n}\n","import { finite } from '../../../scene';\nimport type { ChartRenderContext } from '../types';\nimport type { MekkoColumn, MekkoGrid, MekkoLayout } from './types';\n\nconst COLUMN_GAP = 4;\n\nexport function createMekkoLayout(context: ChartRenderContext): MekkoLayout {\n const labels = mekkoColumnLabels(context);\n const labelGutterWidth = context.showLabels ? 30 : 0;\n const grid = createMekkoGrid(context, labelGutterWidth);\n const fontSize = Math.max(9, finite(context.chart.fontSize, 12));\n\n return {\n columns: createMekkoColumns(context, grid, labels),\n fontSize,\n smallFontSize: Math.max(8, fontSize - 1),\n labelGutterWidth,\n grid,\n };\n}\n\nfunction mekkoColumnLabels(context: ChartRenderContext): string[] {\n const { chart } = context;\n return chart.config?.categories?.length\n ? chart.config.categories\n : ((chart.series[0]?.values as number[] | undefined)?.map((_, index) => String(index + 1)) ?? []);\n}\n\nfunction createMekkoGrid(context: ChartRenderContext, labelGutterWidth: number): MekkoGrid {\n const topGutter = context.showLabels ? 18 : 0;\n const bottomGutter = context.showLabels ? 32 : 0;\n return {\n x: context.plot.x + labelGutterWidth,\n y: context.plot.y + topGutter,\n width: Math.max(1, context.plot.width - labelGutterWidth),\n height: Math.max(1, context.plot.height - topGutter - bottomGutter),\n };\n}\n\nfunction createMekkoColumns(context: ChartRenderContext, grid: MekkoGrid, labels: string[]): MekkoColumn[] {\n const totals = labels.map((_, columnIndex) =>\n context.chart.series.reduce((sum, series) => sum + ((series.values as number[])[columnIndex] ?? 0), 0),\n );\n const grandTotal = totals.reduce((sum, total) => sum + total, 0);\n const maximumTotal = Math.max(1, ...totals);\n const availableWidth = Math.max(1, grid.width - COLUMN_GAP * Math.max(0, labels.length - 1));\n let nextX = grid.x;\n\n return labels.map((label, index) => {\n const total = totals[index];\n const width = grandTotal > 0 ? (total / grandTotal) * availableWidth : availableWidth / labels.length;\n const height = context.chart.config?.mekkoVaryHeight ? grid.height * (total / maximumTotal) : grid.height;\n const column = { label, total, x: nextX, y: grid.y + grid.height - height, width, height };\n nextX += width + COLUMN_GAP;\n return column;\n });\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { Bounds, RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport { wrapText } from '../../../scene/textLayout';\nimport {\n barShapePath,\n CHART_COLORS,\n chartText,\n contrastTextColor,\n representativeColor,\n resolveChartShadow,\n} from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { MekkoLayout } from './types';\n\nconst BACKDROP_OPACITY = 0.15;\n\ninterface MekkoSegment {\n columnIndex: number;\n seriesId: string;\n seriesLabel: string;\n value: number;\n color: NonNullable<ChartSeries['color']>;\n isTop: boolean;\n frame: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nexport function renderMekkoColumnSegments(\n context: ChartRenderContext,\n layout: MekkoLayout,\n columnIndex: number,\n): RenderNode[] {\n const showBackdrop = context.chart.config?.showColumnBackdrop !== false;\n const backdrop = showBackdrop ? [createColumnBackdrop(context, layout, columnIndex)] : [];\n const gradientFlow = Boolean(context.chart.config?.tileGradient);\n const columnSegments = calculateColumnSegments(context.chart.series, layout, columnIndex);\n const segments = columnSegments.flatMap((segment, index) =>\n renderSegment(context, layout, segment, gradientFlow ? columnSegments[index + 1]?.color : undefined),\n );\n return [...backdrop, ...segments];\n}\n\nfunction createColumnBackdrop(context: ChartRenderContext, layout: MekkoLayout, columnIndex: number): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const column = layout.columns[columnIndex];\n const cornerRadius = mekkoCornerRadius(context);\n return {\n type: 'path',\n id: `chart-mekko-column-backdrop-${chart.id}-${columnIndex}`,\n order: nextOrder(),\n bounds,\n d: barShapePath(column.x, layout.grid.y, column.width, layout.grid.height, cornerRadius),\n style: { fill: paint(chart.gridColor ?? '#e2e8f0', diagnostics, chart.id), opacity: BACKDROP_OPACITY },\n };\n}\n\nfunction mekkoCornerRadius(context: ChartRenderContext): number {\n return Math.max(0, finite(context.chart.config?.barCornerRadius, 2));\n}\n\nfunction calculateColumnSegments(seriesList: ChartSeries[], layout: MekkoLayout, columnIndex: number): MekkoSegment[] {\n const segments: MekkoSegment[] = [];\n const column = layout.columns[columnIndex];\n let cumulativeHeight = 0;\n\n seriesList.forEach((series, seriesIndex) => {\n const value = (series.values as number[])[columnIndex] ?? 0;\n const height = (column.total > 0 ? value / column.total : 0) * column.height;\n const y = column.y + cumulativeHeight;\n cumulativeHeight += height;\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n segments.push({\n columnIndex,\n seriesId: series.id,\n seriesLabel: series.label,\n value,\n color,\n isTop: seriesIndex === 0,\n frame: {\n x: column.x,\n y,\n width: column.width,\n height,\n },\n });\n });\n\n return segments;\n}\n\nfunction renderSegment(\n context: ChartRenderContext,\n layout: MekkoLayout,\n segment: MekkoSegment,\n nextColor: NonNullable<ChartSeries['color']> | undefined,\n): RenderNode[] {\n return [createSegmentNode(context, segment, nextColor), ...createSegmentLabel(context, layout, segment)];\n}\n\nfunction createSegmentNode(\n context: ChartRenderContext,\n segment: MekkoSegment,\n nextColor: NonNullable<ChartSeries['color']> | undefined,\n): RenderNode {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const shadow = resolveChartShadow(chart.shadowStyle);\n const clipPath = shadow\n ? `M ${plot.x} ${plot.y} H ${plot.x + plot.width} V ${plot.y + plot.height} H ${plot.x} Z`\n : undefined;\n const radius = segment.isTop ? mekkoCornerRadius(context) : 0;\n const { x, y, width, height } = segment.frame;\n const fallback = '#94a3b8';\n const gradientBounds: Bounds = {\n minX: x + width / 2 - height / 2,\n maxX: x + width / 2 + height / 2,\n minY: y,\n maxY: y + height,\n };\n const fill = nextColor\n ? {\n kind: 'linear-gradient' as const,\n angle: 90,\n stops: [\n { offset: 0, color: representativeColor(segment.color, fallback) },\n { offset: 100, color: representativeColor(nextColor, fallback) },\n ],\n }\n : paint(segment.color, diagnostics, chart.id);\n return {\n type: 'path',\n id: `chart-mekko-seg-${chart.id}-${segment.columnIndex}-${segment.seriesId}`,\n order: nextOrder(),\n bounds: nextColor ? gradientBounds : bounds,\n d: barShapePath(x, y, width, height, radius),\n style: {\n fill,\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n shadow,\n clip: clipPath ? { type: 'path', d: clipPath } : undefined,\n },\n };\n}\n\nfunction createSegmentLabel(context: ChartRenderContext, layout: MekkoLayout, segment: MekkoSegment): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const { x, y, width, height } = segment.frame;\n if (!context.showLegend || width < 34) {\n return [];\n }\n const innerWidth = Math.max(1, width - 8);\n const innerHeight = Math.max(1, height - 6);\n const lineHeight = layout.smallFontSize * 1.2;\n const labelLines = wrapText(segment.seriesLabel, innerWidth, layout.smallFontSize);\n if ((labelLines.length + 1) * lineHeight > innerHeight) {\n return [];\n }\n const textColor = contrastTextColor(representativeColor(segment.color, '#ffffff'));\n\n const label: RenderNode = {\n ...chartText({\n id: `chart-mekko-seg-label-${chart.id}-${segment.columnIndex}-${segment.seriesId}`,\n order: nextOrder(),\n bounds,\n frame: { x: x + 4, y: y + 3, width: innerWidth, height: innerHeight },\n text: segment.seriesLabel,\n chart,\n }),\n lines: labelLines,\n fontSize: layout.smallFontSize,\n fontWeight: 'bold',\n color: textColor,\n };\n\n const valueNode: RenderNode = {\n ...chartText({\n id: `chart-mekko-seg-value-${chart.id}-${segment.columnIndex}-${segment.seriesId}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: x + 4,\n y: y + 3 + labelLines.length * lineHeight,\n width: innerWidth,\n height: Math.max(1, innerHeight - labelLines.length * lineHeight),\n },\n text: String(segment.value),\n chart,\n }),\n lines: [String(segment.value)],\n fontSize: layout.smallFontSize,\n color: textColor,\n };\n\n return [label, valueNode];\n}\n","import type { RenderNode } from '../../scene';\nimport { renderMekkoGrid } from './mekko/grid';\nimport { renderMekkoColumnLabels } from './mekko/labels';\nimport { createMekkoLayout } from './mekko/layout';\nimport { renderMekkoColumnSegments } from './mekko/segments';\nimport type { ChartRenderContext } from './types';\n\nexport function renderMekko(context: ChartRenderContext): RenderNode[] {\n const layout = createMekkoLayout(context);\n const nodes = renderMekkoGrid(context, layout);\n\n layout.columns.forEach((column, columnIndex) => {\n nodes.push(...renderMekkoColumnSegments(context, layout, columnIndex));\n nodes.push(...renderMekkoColumnLabels(context, layout, columnIndex, column));\n });\n\n return nodes;\n}\n","import type { PieChart } from '../../../../model/chart';\nimport type { RenderNode, SceneText } from '../../../scene';\nimport { DEFAULT_FONT, finite } from '../../../scene';\nimport type { ChartRenderContext } from '../types';\nimport type { PieGeometry } from './types';\n\nfunction fill(template: string, chart: PieChart): string {\n const values = chart.series.map(series => Math.max(0, finite((series.values as number[])[0], 0)));\n const total = values.reduce((sum, value) => sum + value, 0);\n const first = values[0] ?? 0;\n return template\n .replace(/\\{total\\}/g, String(Math.round(total * 100) / 100))\n .replace(/\\{percent\\}/g, String(total > 0 ? Math.round((first / total) * 100) : 0))\n .replace(/\\{label\\}/g, chart.series[0]?.label ?? '');\n}\n\nexport function renderPieCenter(context: ChartRenderContext<PieChart>, geometry: PieGeometry): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const template = chart.config?.pieCenterText;\n if (!template) {\n return [];\n }\n const lines = fill(template, chart).split(/\\\\n|\\n/);\n const fontSize = finite(chart.config?.pieCenterSize, Math.max(14, Math.min(40, geometry.outerRadius * 0.3)));\n const lineHeight = fontSize * 1.2;\n const width = Math.max(40, (geometry.innerRadius > 0 ? geometry.innerRadius : geometry.outerRadius * 0.6) * 2);\n const text: SceneText = {\n type: 'text',\n id: `chart-pie-center-${chart.id}`,\n order: nextOrder(),\n bounds,\n x: geometry.centerX - width / 2,\n y: geometry.centerY - (lineHeight * lines.length) / 2,\n width,\n height: lineHeight * lines.length,\n lines,\n fontFamily: chart.fontFamily ?? DEFAULT_FONT,\n fontSize,\n fontWeight: 'bold',\n align: 'center',\n verticalAlign: 'middle',\n lineHeight: 1.2,\n color: chart.config?.pieCenterColor ?? chart.textColor ?? '#0f172a',\n detail: { of: 'chartSeries', series: chart.series[0]?.id ?? '', mark: 'pie-center' },\n };\n return [text];\n}\n","import type { PieChart } from '../../../../model/chart';\nimport { finite } from '../../../scene';\nimport { pieArcPoint, resolvePieRadii } from '../../primitives/pieShape';\nimport type { ChartRenderContext } from '../types';\nimport type { PieGeometry } from './types';\n\nexport { pieArcPoint };\n\nexport function createPieGeometry(context: ChartRenderContext<PieChart>): PieGeometry {\n const { chart, plot } = context;\n const resolved = resolvePieRadii(plot.width, plot.height, chart.config?.innerRadius, chart.config?.pieCornerRadius);\n const outside = chart.config?.pieLabelPosition === 'outside' && chart.showAxisLabels !== false;\n const room = outside ? (chart.config?.pieLabelContent === 'inline' ? 0.6 : 0.7) : 1;\n const outerRadius = resolved.outerRadius * room;\n const innerRadius = resolved.innerRadius * room;\n const cornerRadius = resolved.cornerRadius;\n return {\n centerX: plot.x + plot.width / 2,\n centerY: plot.y + plot.height / 2,\n outerRadius,\n innerRadius,\n cornerRadius,\n total: chart.series.reduce((sum, series) => sum + Math.max(0, finite((series.values as number[])[0], 0)), 0) || 1,\n };\n}\n","import type { ChartSeries, PieChart } from '../../../../model/chart';\nimport type { RenderNode, SceneText } from '../../../scene';\nimport { DEFAULT_FONT, finite } from '../../../scene';\nimport {\n clipSegmentToRect,\n contrastTextColor,\n representativeColor,\n sameHueContrastColor,\n sameHueTint,\n} from '../../primitives';\nimport { seriesLabelProp, seriesValueProp } from '../../propPath';\nimport type { ChartRenderContext } from '../types';\nimport { pieArcPoint } from './geometry';\nimport type { PieGeometry } from './types';\n\nconst MIN_LABEL_SWEEP = (14 * Math.PI) / 180;\nexport const LABEL_WIDTH = 80;\nconst LABEL_RADIUS_FRACTION = 0.62;\nconst OUTSIDE_GAP = 14;\nexport const LEADER_INSET = 3;\nconst OUTSIDE_TINT_LIGHTNESS = 0.32;\nconst OUTSIDE_FALLBACK_COLOR = '#334155';\n\nexport interface PieLabelMark {\n seriesId: string;\n label: string;\n color: NonNullable<ChartSeries['color']>;\n share: number;\n start: number;\n end: number;\n labelOffsetX: number;\n labelOffsetY: number;\n shift: { dx: number; dy: number };\n}\n\nexport function renderPieLabels(\n context: ChartRenderContext<PieChart>,\n geometry: PieGeometry,\n marks: PieLabelMark[],\n): RenderNode[] {\n if (context.chart.showAxisLabels === false) {\n return [];\n }\n return marks\n .filter(mark => mark.end - mark.start >= MIN_LABEL_SWEEP)\n .flatMap(mark => createPieLabel(context, geometry, mark));\n}\n\nfunction labelTextPair(\n context: ChartRenderContext,\n mark: PieLabelMark,\n point: { x: number; y: number },\n color: string,\n fontSize: number,\n percent: number,\n outside: boolean,\n midAngle: number,\n): SceneText[] {\n const { chart, bounds, nextOrder } = context;\n const lineHeight = fontSize * 1.2;\n const content = chart.config?.pieLabelContent ?? 'both';\n const width = content === 'inline' ? LABEL_WIDTH * 1.9 : LABEL_WIDTH;\n const base = {\n bounds,\n x: point.x - width / 2,\n width,\n height: lineHeight,\n fontFamily: chart.fontFamily ?? DEFAULT_FONT,\n fontSize,\n align: 'center' as const,\n verticalAlign: 'middle' as const,\n lineHeight: 1.2,\n color,\n };\n const detail = (extra: Record<string, unknown>) => ({\n of: 'chartSeries' as const,\n series: mark.seriesId,\n mark: 'pie-label',\n pulled: outside || undefined,\n midAngle,\n ...extra,\n });\n const nameText: SceneText = {\n type: 'text',\n id: `chart-pie-label-name-${chart.id}-${mark.seriesId}`,\n order: nextOrder(),\n ...base,\n y: content === 'name' ? point.y - lineHeight / 2 : point.y - lineHeight,\n lines: [content === 'inline' ? `${mark.label}, ${percent}%` : mark.label],\n fontWeight: 'bold',\n detail: detail({}),\n prop: seriesLabelProp(mark.seriesId),\n };\n const valueText: SceneText = {\n type: 'text',\n id: `chart-pie-label-value-${chart.id}-${mark.seriesId}`,\n order: nextOrder(),\n ...base,\n y: content === 'percent' ? point.y - lineHeight / 2 : point.y,\n lines: [`${percent}%`],\n fontWeight: 'normal',\n detail: detail({}),\n prop: seriesValueProp(mark.seriesId, 0),\n propKind: 'value',\n };\n if (content === 'inline' || content === 'name') {\n return [nameText];\n }\n return content === 'percent' ? [valueText] : [nameText, valueText];\n}\n\nfunction createTick(\n context: ChartRenderContext,\n mark: PieLabelMark,\n tickStart: { x: number; y: number },\n tickEnd: { x: number; y: number },\n color: string,\n outside: boolean,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n return {\n type: 'path',\n id: `chart-pie-label-tick-${chart.id}-${mark.seriesId}`,\n order: nextOrder(),\n bounds,\n d: `M ${tickStart.x} ${tickStart.y} L ${tickEnd.x} ${tickEnd.y}`,\n detail: { of: 'chartSeries', series: mark.seriesId, mark: 'pie-label-tick' },\n style: outside ? { stroke: { kind: 'solid', color }, strokeWidth: 1.5 } : { stroke: { kind: 'none' } },\n };\n}\n\nfunction createPieLabel(context: ChartRenderContext<PieChart>, base: PieGeometry, mark: PieLabelMark): RenderNode[] {\n const config = context.chart.config;\n const geometry = { ...base, centerX: base.centerX + mark.shift.dx, centerY: base.centerY + mark.shift.dy };\n const mid = (mark.start + mark.end) / 2;\n const fontSize = Math.max(9, finite(context.chart.fontSize, 12));\n const percent = Math.round(mark.share * 100);\n const lineHeight = fontSize * 1.2;\n const tickStart = pieArcPoint(geometry, mid, geometry.outerRadius + LEADER_INSET);\n\n const ringThickness = geometry.outerRadius - geometry.innerRadius;\n const tooThin = ringThickness < lineHeight * 2 + 6;\n const hasManualOffset = mark.labelOffsetX !== 0 || mark.labelOffsetY !== 0;\n const position = config?.pieLabelPosition ?? 'auto';\n const outside = hasManualOffset || position === 'outside' || (position === 'auto' && tooThin);\n\n if (outside) {\n const point = hasManualOffset\n ? addOffset(pieArcPoint(geometry, mid, geometry.outerRadius), mark.labelOffsetX, mark.labelOffsetY)\n : pieArcPoint(\n geometry,\n mid,\n geometry.outerRadius +\n OUTSIDE_GAP +\n (position === 'outside'\n ? Math.abs(Math.cos(mid)) * (config?.pieLabelContent === 'inline' ? LABEL_WIDTH * 0.95 : LABEL_WIDTH / 2)\n : 0),\n );\n const tickEnd = clipSegmentToRect(tickStart, point, LABEL_WIDTH / 2, lineHeight);\n const color =\n config?.pieLabelColor ??\n sameHueTint(representativeColor(mark.color, OUTSIDE_FALLBACK_COLOR), OUTSIDE_TINT_LIGHTNESS) ??\n OUTSIDE_FALLBACK_COLOR;\n const tick = createTick(context, mark, tickStart, tickEnd, color, true);\n return [tick, ...labelTextPair(context, mark, point, color, fontSize, percent, true, mid)];\n }\n\n const labelRadius = geometry.innerRadius + ringThickness * LABEL_RADIUS_FRACTION;\n const point = pieArcPoint(geometry, mid, labelRadius);\n const sliceColor = representativeColor(mark.color, '#0f172a');\n const color = config?.pieLabelColor ?? sameHueContrastColor(sliceColor, contrastTextColor(sliceColor));\n const tick = createTick(context, mark, tickStart, tickStart, color, false);\n return [tick, ...labelTextPair(context, mark, point, color, fontSize, percent, false, mid)];\n}\n\nfunction addOffset(point: { x: number; y: number }, dx: number, dy: number): { x: number; y: number } {\n return { x: point.x + dx, y: point.y + dy };\n}\n","import type { ChartSeries, PieChart } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport type { ResolvedShadow } from '../../primitives';\nimport {\n CHART_COLORS,\n gapInsetAngle,\n maxApexCornerRadius,\n maxPieCornerRadius,\n pieApexRadius,\n pieUsesInnerArc,\n representativeColor,\n resolveChartShadow,\n} from '../../primitives';\nimport { seriesValueProp } from '../../propPath';\nimport type { ChartRenderContext } from '../types';\nimport { renderPieLabels } from './labels';\nimport { createPieSlicePath } from './path';\nimport type { PieGeometry, PieSliceAngles } from './types';\n\nconst TOP = -Math.PI / 2;\nconst FULL = Math.PI * 2;\nconst MAXIMUM_SWEEP = FULL * (359.999 / 360);\nconst radians = (degrees: number) => (degrees * Math.PI) / 180;\n\ninterface PieSliceMark {\n seriesId: string;\n label: string;\n color: NonNullable<ChartSeries['color']>;\n stroke?: string;\n strokeWidth?: number;\n value: number;\n share: number;\n angles: PieSliceAngles;\n labelOffsetX: number;\n labelOffsetY: number;\n explode: number;\n}\n\nexport function renderPieSlices(context: ChartRenderContext<PieChart>, geometry: PieGeometry): RenderNode[] {\n const config = context.chart.config;\n const marks = createPieSliceMarks(context.chart.series, geometry.total, {\n start: TOP + radians(finite(config?.pieStartAngle, 0)),\n sweep: Math.min(FULL, Math.max(radians(1), radians(finite(config?.pieSweep, 360)))),\n explode: Math.max(0, finite(config?.pieExplode, 0)),\n });\n const gapPx = config?.pieSliceGap ?? 0;\n return [\n ...marks.flatMap(mark => createSliceNodes(context, shiftGeometry(geometry, mark), mark, gapPx)),\n ...renderPieLabels(\n context,\n geometry,\n marks.map(mark => ({\n seriesId: mark.seriesId,\n label: mark.label,\n color: mark.color,\n share: mark.share,\n start: mark.angles.start,\n end: mark.angles.end,\n labelOffsetX: mark.labelOffsetX,\n labelOffsetY: mark.labelOffsetY,\n shift: shiftOf(mark),\n })),\n ),\n ];\n}\n\nfunction shiftOf(mark: PieSliceMark): { dx: number; dy: number } {\n const mid = (mark.angles.start + mark.angles.end) / 2;\n return { dx: Math.cos(mid) * mark.explode, dy: Math.sin(mid) * mark.explode };\n}\n\nfunction shiftGeometry(geometry: PieGeometry, mark: PieSliceMark): PieGeometry {\n if (mark.explode === 0) {\n return geometry;\n }\n const { dx, dy } = shiftOf(mark);\n return { ...geometry, centerX: geometry.centerX + dx, centerY: geometry.centerY + dy };\n}\n\nfunction createPieSliceMarks(\n seriesList: ChartSeries[],\n total: number,\n layout: { start: number; sweep: number; explode: number },\n): PieSliceMark[] {\n const marks: PieSliceMark[] = [];\n let angle = layout.start;\n seriesList.forEach((series, seriesIndex) => {\n const value = Math.max(0, finite((series.values as number[])[0], 0));\n const sweep = (value / total) * layout.sweep;\n marks.push({\n seriesId: series.id,\n label: series.label,\n color: series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length],\n stroke: series.stroke,\n strokeWidth: series.strokeWidth,\n value,\n share: value / total,\n angles: { start: angle, end: angle + Math.min(sweep, layout.sweep >= FULL ? MAXIMUM_SWEEP : layout.sweep) },\n explode: Math.max(0, finite(series.offset, layout.explode)),\n labelOffsetX: finite(series.labelOffsetX, 0),\n labelOffsetY: finite(series.labelOffsetY, 0),\n });\n angle += sweep;\n });\n return marks;\n}\n\nfunction fullCirclePath(cx: number, cy: number, r: number): string {\n return `M ${cx - r} ${cy} A ${r} ${r} 0 1 0 ${cx + r} ${cy} A ${r} ${r} 0 1 0 ${cx - r} ${cy} Z`;\n}\n\nfunction pieOuterShadow(shadow: ResolvedShadow, gapPx: number): ResolvedShadow {\n if (gapPx <= 0) {\n return shadow;\n }\n const halfGap = gapPx / 2;\n const blur = Math.min(shadow.blur, halfGap * 2);\n const maxDistance = halfGap;\n const distance = Math.hypot(shadow.dx, shadow.dy);\n const scale = distance > maxDistance ? maxDistance / distance : 1;\n return { ...shadow, blur, dx: shadow.dx * scale, dy: shadow.dy * scale };\n}\n\nfunction sliceCornerRadius(geometry: PieGeometry, mark: PieSliceMark, gapPx: number): number {\n const halfGap = Math.max(0, gapPx) / 2;\n const rawSweep = mark.angles.end - mark.angles.start;\n const usesInnerArc = pieUsesInnerArc(geometry, mark.angles, gapPx);\n const gapSweep = 2 * gapInsetAngle(halfGap, geometry.outerRadius);\n const availableSweep = Math.max(0, rawSweep - gapSweep);\n return Math.min(\n geometry.cornerRadius,\n usesInnerArc\n ? maxPieCornerRadius(geometry.outerRadius, geometry.innerRadius, availableSweep)\n : maxApexCornerRadius(\n geometry.outerRadius,\n pieApexRadius(halfGap, rawSweep, geometry.outerRadius),\n availableSweep,\n ),\n );\n}\n\nfunction sliceStroke(context: ChartRenderContext<PieChart>, mark: PieSliceMark) {\n const config = context.chart.config;\n const strokeColor = mark.stroke ?? config?.pieStroke;\n if (!strokeColor) {\n return {};\n }\n return {\n stroke: { kind: 'solid' as const, color: strokeColor },\n strokeWidth: finite(mark.strokeWidth, finite(config?.pieStrokeWidth, 1)),\n };\n}\n\nfunction createSliceNodes(\n context: ChartRenderContext<PieChart>,\n geometry: PieGeometry,\n mark: PieSliceMark,\n gapPx: number,\n): RenderNode[] {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const fill = paint(mark.color, diagnostics, chart.id);\n const slicePath = createPieSlicePath(geometry, mark.angles, sliceCornerRadius(geometry, mark, gapPx), gapPx);\n const shadow = resolveChartShadow(chart.shadowStyle);\n const strokeStyle = sliceStroke(context, mark);\n const glow = chart.config?.pieGlow;\n\n const shadowCaster: RenderNode | undefined = shadow\n ? {\n type: 'path',\n id: `chart-pie-slice-shadow-${chart.id}-${mark.seriesId}`,\n order: nextOrder(),\n bounds,\n d: slicePath,\n style: {\n fill,\n ...strokeStyle,\n shadow: pieOuterShadow(shadow, gapPx),\n clip: { type: 'path', d: fullCirclePath(geometry.centerX, geometry.centerY, geometry.outerRadius) },\n },\n }\n : undefined;\n\n const slice: RenderNode = {\n type: 'path',\n id: `chart-pie-slice-${chart.id}-${mark.seriesId}`,\n order: nextOrder(),\n bounds,\n d: slicePath,\n detail: {\n of: 'chartValue',\n series: mark.seriesId,\n valueIndex: 0,\n mark: 'pie-slice',\n pieStart: mark.angles.start,\n pieEnd: mark.angles.end,\n pieValue: mark.value,\n },\n prop: seriesValueProp(mark.seriesId, 0),\n style: {\n fill,\n ...strokeStyle,\n innerShadow: shadow,\n shadow: glow\n ? { color: representativeColor(mark.color, '#ffffff'), opacity: 0.85, blur: glow, dx: 0, dy: 0 }\n : undefined,\n },\n };\n\n return shadowCaster ? [shadowCaster, slice] : [slice];\n}\n","import type { PieChart } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { renderPieCenter } from './pie/center';\nimport { createPieGeometry } from './pie/geometry';\nimport { renderPieSlices } from './pie/slices';\nimport type { ChartRenderContext } from './types';\n\nexport function renderPie(context: ChartRenderContext<PieChart>): RenderNode[] {\n const geometry = createPieGeometry(context);\n return [...renderPieSlices(context, geometry), ...renderPieCenter(context, geometry)];\n}\n","import type { ChartSeries, PolarAreaChart } from '../../../model/chart';\nimport type { RenderNode, SceneText } from '../../scene';\nimport { DEFAULT_FONT, finite, paint } from '../../scene';\nimport {\n CHART_COLORS,\n clipSegmentToRect,\n contrastTextColor,\n createPieSlicePath,\n formatFieldValue,\n gapInsetAngle,\n maxApexCornerRadius,\n maxPieCornerRadius,\n pieApexRadius,\n pieArcPoint,\n pieUsesInnerArc,\n representativeColor,\n resolveChartShadow,\n sameHueContrastColor,\n sameHueTint,\n} from '../primitives';\nimport { seriesLabelProp, seriesValueProp } from '../propPath';\nimport type { ChartRenderContext } from './types';\n\nconst START_ANGLE = -Math.PI / 2;\nconst TRACK_COLOR_FALLBACK = '#e2e8f0';\nconst MIN_LABEL_SWEEP = (14 * Math.PI) / 180;\nconst LABEL_WIDTH = 80;\nconst LABEL_RADIUS_FRACTION = 0.62;\nconst OUTSIDE_GAP = 14;\nconst LEADER_INSET = 3;\nconst OUTSIDE_TINT_LIGHTNESS = 0.32;\nconst OUTSIDE_FALLBACK_COLOR = '#334155';\n\ninterface WedgeLayout {\n centerX: number;\n centerY: number;\n maxRadius: number;\n innerRadius: number;\n cornerRadius: number;\n gapPx: number;\n axisMin: number;\n range: number;\n sweep: number;\n}\n\ntype Angles = { start: number; end: number };\ntype WedgeGeometry = { centerX: number; centerY: number; outerRadius: number; innerRadius: number };\ntype FillColor = NonNullable<ChartSeries['color']>;\n\nfunction layoutOf(context: ChartRenderContext<PolarAreaChart>): WedgeLayout {\n const { chart, plot } = context;\n const maxRadius = Math.max(1, Math.min(plot.width, plot.height) / 2 - 4);\n const axisMin = finite(chart.axisY.min, 0);\n return {\n centerX: plot.x + plot.width / 2,\n centerY: plot.y + plot.height / 2,\n maxRadius,\n innerRadius: Math.max(0, Math.min(finite(chart.config?.innerRadius, 0), maxRadius - 1)),\n cornerRadius: Math.max(0, finite(chart.config?.pieCornerRadius, 0)),\n gapPx: Math.max(0, finite(chart.config?.pieSliceGap, 0)),\n axisMin,\n range: finite(chart.axisY.max, 100) - axisMin,\n sweep: chart.series.length > 0 ? (Math.PI * 2) / chart.series.length : 0,\n };\n}\n\nfunction clampedCorner(layout: WedgeLayout, outerRadius: number, angles: Angles): number {\n const { centerX, centerY, innerRadius, cornerRadius, gapPx } = layout;\n const geometry = { centerX, centerY, outerRadius, innerRadius };\n const halfGap = Math.max(0, gapPx) / 2;\n const rawSweep = angles.end - angles.start;\n const availableSweep = Math.max(0, rawSweep - 2 * gapInsetAngle(halfGap, outerRadius));\n if (pieUsesInnerArc(geometry, angles, gapPx)) {\n return Math.min(cornerRadius, maxPieCornerRadius(outerRadius, innerRadius, availableSweep));\n }\n const apexRadius = pieApexRadius(halfGap, rawSweep, outerRadius);\n return Math.min(cornerRadius, maxApexCornerRadius(outerRadius, apexRadius, availableSweep));\n}\n\nfunction wedgeNodes(\n context: ChartRenderContext<PolarAreaChart>,\n layout: WedgeLayout,\n series: ChartSeries,\n angles: Angles,\n outerRadius: number,\n value: number,\n rawColor: FillColor,\n): RenderNode[] {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const { centerX, centerY, innerRadius, maxRadius, gapPx } = layout;\n const color = paint(rawColor, diagnostics, chart.id);\n const shadow = resolveChartShadow(chart.shadowStyle);\n const trackPath = createPieSlicePath(\n { centerX, centerY, outerRadius: maxRadius, innerRadius },\n angles,\n clampedCorner(layout, maxRadius, angles),\n gapPx,\n );\n const track: RenderNode = {\n type: 'path',\n id: `chart-polar-area-track-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: trackPath,\n style: { fill: paint(chart.gridColor ?? TRACK_COLOR_FALLBACK, diagnostics, chart.id) },\n };\n const wedgePath = createPieSlicePath(\n { centerX, centerY, outerRadius, innerRadius },\n angles,\n clampedCorner(layout, outerRadius, angles),\n gapPx,\n );\n const shadowCaster: RenderNode | undefined = shadow\n ? {\n type: 'path',\n id: `chart-polar-area-wedge-shadow-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: wedgePath,\n style: { fill: color, shadow, clip: { type: 'path', d: trackPath } },\n }\n : undefined;\n const wedge: RenderNode = {\n type: 'path',\n id: `chart-polar-area-wedge-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: wedgePath,\n detail: {\n of: 'chartValue',\n series: series.id,\n valueIndex: 0,\n mark: 'polar-area-wedge',\n pieStart: angles.start,\n pieEnd: angles.end,\n pieValue: value,\n },\n prop: seriesValueProp(series.id, 0),\n style: { fill: color, innerShadow: shadow },\n };\n return shadowCaster ? [track, shadowCaster, wedge] : [track, wedge];\n}\n\nexport function renderPolarArea(context: ChartRenderContext<PolarAreaChart>): RenderNode[] {\n const layout = layoutOf(context);\n const { centerX, centerY, innerRadius, maxRadius, axisMin, range, sweep } = layout;\n const showLabels = context.showLabels && sweep >= MIN_LABEL_SWEEP;\n\n return context.chart.series.flatMap((series, index): RenderNode[] => {\n const angles = { start: START_ANGLE + index * sweep, end: START_ANGLE + (index + 1) * sweep };\n const value = Math.max(0, finite((series.values as number[])[0], 0));\n const fraction = range > 0 ? Math.min(1, Math.max(0, (value - axisMin) / range)) : 0;\n const outerRadius = Math.max(innerRadius + 1, innerRadius + (maxRadius - innerRadius) * fraction);\n const rawColor = series.color ?? CHART_COLORS[index % CHART_COLORS.length];\n const nodes = wedgeNodes(context, layout, series, angles, outerRadius, value, rawColor);\n if (!showLabels) {\n return nodes;\n }\n const geometry = { centerX, centerY, outerRadius, innerRadius };\n return [...nodes, ...createWedgeLabel(context, geometry, angles, series, value, rawColor)];\n });\n}\n\ninterface LabelPlacement {\n point: { x: number; y: number };\n color: string;\n outside: boolean;\n mid: number;\n tickStart: { x: number; y: number };\n}\n\nfunction labelPlacement(\n context: ChartRenderContext<PolarAreaChart>,\n geometry: WedgeGeometry,\n angles: Angles,\n series: ChartSeries,\n fillColor: FillColor,\n): LabelPlacement | undefined {\n const mid = (angles.start + angles.end) / 2;\n const fontSize = Math.max(9, finite(context.chart.fontSize, 12));\n const lineHeight = fontSize * 1.2;\n const ringThickness = geometry.outerRadius - geometry.innerRadius;\n const labelOffsetX = finite(series.labelOffsetX, 0);\n const labelOffsetY = finite(series.labelOffsetY, 0);\n const hasManualOffset = labelOffsetX !== 0 || labelOffsetY !== 0;\n const tooThin = ringThickness < lineHeight * 2 + 6;\n const chordWidth = 2 * geometry.outerRadius * Math.sin(Math.abs(angles.end - angles.start) / 2);\n const fitsInline = !tooThin && chordWidth >= LABEL_WIDTH;\n if (!fitsInline && !hasManualOffset) {\n return undefined;\n }\n const outside = hasManualOffset || !fitsInline;\n const tickStart = pieArcPoint(geometry, mid, geometry.outerRadius + LEADER_INSET);\n const point = outside\n ? hasManualOffset\n ? addOffset(pieArcPoint(geometry, mid, geometry.outerRadius), labelOffsetX, labelOffsetY)\n : pieArcPoint(geometry, mid, geometry.outerRadius + OUTSIDE_GAP)\n : pieArcPoint(geometry, mid, geometry.innerRadius + ringThickness * LABEL_RADIUS_FRACTION);\n const color = outside\n ? (sameHueTint(representativeColor(fillColor, OUTSIDE_FALLBACK_COLOR), OUTSIDE_TINT_LIGHTNESS) ??\n OUTSIDE_FALLBACK_COLOR)\n : sameHueContrastColor(\n representativeColor(fillColor, '#0f172a'),\n contrastTextColor(representativeColor(fillColor, '#0f172a')),\n );\n return { point, color, outside, mid, tickStart };\n}\n\nfunction createWedgeLabel(\n context: ChartRenderContext<PolarAreaChart>,\n geometry: WedgeGeometry,\n angles: Angles,\n series: ChartSeries,\n value: number,\n fillColor: FillColor,\n): RenderNode[] {\n const placement = labelPlacement(context, geometry, angles, series, fillColor);\n if (!placement) {\n return [];\n }\n const { chart, bounds, nextOrder } = context;\n const { point, color, outside, mid, tickStart } = placement;\n const fontSize = Math.max(9, finite(chart.fontSize, 12));\n const lineHeight = fontSize * 1.2;\n\n const tickEnd = outside ? clipSegmentToRect(tickStart, point, LABEL_WIDTH / 2, lineHeight) : tickStart;\n const tick: RenderNode = {\n type: 'path',\n id: `chart-polar-area-label-tick-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: `M ${tickStart.x} ${tickStart.y} L ${tickEnd.x} ${tickEnd.y}`,\n detail: { of: 'chartSeries', series: series.id, mark: 'polar-area-label-tick' },\n style: outside ? { stroke: { kind: 'solid', color }, strokeWidth: 1.5 } : { stroke: { kind: 'none' } },\n };\n\n const detail = {\n of: 'chartSeries' as const,\n series: series.id,\n mark: 'polar-area-label',\n pulled: outside || undefined,\n midAngle: mid,\n wedgeRadius: geometry.outerRadius,\n };\n const base = {\n bounds,\n x: point.x - LABEL_WIDTH / 2,\n width: LABEL_WIDTH,\n height: lineHeight,\n fontFamily: chart.fontFamily ?? DEFAULT_FONT,\n fontSize,\n align: 'center' as const,\n verticalAlign: 'middle' as const,\n lineHeight: 1.2,\n color,\n };\n const nameText: SceneText = {\n type: 'text',\n id: `chart-polar-area-label-name-${chart.id}-${series.id}`,\n order: nextOrder(),\n ...base,\n y: point.y - lineHeight,\n lines: [series.label],\n fontWeight: 'bold',\n detail,\n prop: seriesLabelProp(series.id),\n };\n const valueText: SceneText = {\n type: 'text',\n id: `chart-polar-area-label-value-${chart.id}-${series.id}`,\n order: nextOrder(),\n ...base,\n y: point.y,\n lines: [formatFieldValue(value)],\n fontWeight: 'normal',\n detail,\n prop: seriesValueProp(series.id, 0),\n propKind: 'value',\n };\n return [tick, nameText, valueText];\n}\n\nfunction addOffset(point: { x: number; y: number }, dx: number, dy: number): { x: number; y: number } {\n return { x: point.x + dx, y: point.y + dy };\n}\n","import { finite } from '../../../scene';\nimport {\n type RadarFrame,\n radarCategoryCount,\n radarPointAt,\n radarRadius,\n radarRadiusForValue,\n radarSeriesPath,\n} from '../../primitives/radarShape';\nimport type { ChartRenderContext } from '../types';\nimport type { RadarFamilyChart, RadarGeometry, RadarPoint } from './types';\n\nconst DEFAULT_CATEGORIES = ['Speed', 'Quality', 'Cost', 'Reliability', 'Usability'];\n\nexport function radarFrameFor(context: ChartRenderContext<RadarFamilyChart>): RadarFrame {\n const { chart, plot } = context;\n const configuredCount = (chart.config?.categories?.filter(Boolean) ?? []).length;\n const dataCount = Math.max(0, ...chart.series.map(series => series.values.length));\n return {\n centerX: plot.x + plot.width / 2,\n centerY: plot.y + plot.height / 2,\n radius: radarRadius(plot.width, plot.height, finite(chart.fontSize, 12), context.showLabels),\n min: chart.axisY.min,\n max: chart.axisY.max,\n count: radarCategoryCount(configuredCount, dataCount),\n curved: chart.chartType === 'radial',\n };\n}\n\nexport function createRadarGeometry(context: ChartRenderContext<RadarFamilyChart>): RadarGeometry {\n const { chart } = context;\n const configuredCategories = chart.config?.categories?.filter(Boolean) ?? [];\n const frame = radarFrameFor(context);\n const categories = createCategories(configuredCategories, frame.count);\n const pointAt = (pointRadius: number, pointIndex: number): RadarPoint => radarPointAt(frame, pointIndex, pointRadius);\n\n return {\n circular: frame.curved,\n areaOpacity: Math.max(0, Math.min(1, chart.config?.areaOpacity ?? 0.16)),\n categories,\n centerX: frame.centerX,\n centerY: frame.centerY,\n radius: frame.radius,\n radiusForValue: (value: number): number => radarRadiusForValue(frame, value),\n pointAt,\n polygonPath: (pointRadius: number): string =>\n radarSeriesPath(\n categories.map((_, index) => pointAt(pointRadius, index)),\n false,\n ),\n };\n}\n\nfunction createCategories(configured: string[], categoryCount: number): string[] {\n return Array.from(\n { length: categoryCount },\n (_, index) => configured[index] ?? DEFAULT_CATEGORIES[index] ?? `Category ${index + 1}`,\n );\n}\n","import type { RenderNode } from '../../../scene';\nimport { finite } from '../../../scene';\nimport { chartTicks } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { RadarFamilyChart, RadarGeometry } from './types';\n\nexport function renderRadarGrid(context: ChartRenderContext<RadarFamilyChart>, geometry: RadarGeometry): RenderNode[] {\n if (context.chart.showGrid === false) {\n return [];\n }\n\n return [...renderRings(context, geometry), ...renderSpokes(context, geometry)];\n}\n\nfunction renderRings(context: ChartRenderContext<RadarFamilyChart>, geometry: RadarGeometry): RenderNode[] {\n return chartTicks(context.chart.axisY)\n .filter(tick => tick > context.chart.axisY.min)\n .map(tick => createRingNode(context, geometry, tick));\n}\n\nfunction createRingNode(\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n tick: number,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const ringRadius = geometry.radiusForValue(tick);\n const style = {\n fill: { kind: 'none' } as const,\n stroke: { kind: 'solid' as const, color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n };\n\n if (geometry.circular) {\n return {\n type: 'ellipse',\n id: `chart-radial-ring-${chart.id}-${tick}`,\n order: nextOrder(),\n bounds,\n cx: geometry.centerX,\n cy: geometry.centerY,\n rx: ringRadius,\n ry: ringRadius,\n style,\n };\n }\n return {\n type: 'path',\n id: `chart-radar-ring-${chart.id}-${tick}`,\n order: nextOrder(),\n bounds,\n d: geometry.polygonPath(ringRadius),\n style,\n };\n}\n\nfunction renderSpokes(context: ChartRenderContext<RadarFamilyChart>, geometry: RadarGeometry): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n return geometry.categories.map((_, categoryIndex) => {\n const edge = geometry.pointAt(geometry.radius, categoryIndex);\n return {\n type: 'path',\n id: `chart-radar-spoke-${chart.id}-${categoryIndex}`,\n order: nextOrder(),\n bounds,\n d: `M ${geometry.centerX} ${geometry.centerY} L ${edge.x} ${edge.y}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n },\n };\n });\n}\n","import type { RenderNode } from '../../../scene';\nimport { chartText } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { RadarFamilyChart, RadarGeometry } from './types';\n\nexport function renderRadarLabels(\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n): RenderNode[] {\n if (!context.showLabels) {\n return [];\n }\n\n return geometry.categories.map((category, categoryIndex) =>\n createCategoryLabel(context, geometry, category, categoryIndex),\n );\n}\n\nfunction createCategoryLabel(\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n category: string,\n categoryIndex: number,\n): RenderNode {\n const { chart, plot, bounds, nextOrder } = context;\n const labelPoint = geometry.pointAt(geometry.radius + 10, categoryIndex);\n const horizontalOffset = labelPoint.x - geometry.centerX;\n const width = Math.max(64, Math.min(120, plot.width / 3));\n return chartText({\n id: `chart-radar-label-${chart.id}-${categoryIndex}`,\n order: nextOrder(),\n bounds,\n frame: { x: labelX(labelPoint.x, horizontalOffset, width), y: labelPoint.y - 6, width, height: 30 },\n text: category,\n chart,\n align: labelAlignment(horizontalOffset),\n });\n}\n\nfunction labelX(pointX: number, horizontalOffset: number, width: number): number {\n if (horizontalOffset > 8) {\n return pointX;\n }\n if (horizontalOffset < -8) {\n return pointX - width;\n }\n return pointX - width / 2;\n}\n\nfunction labelAlignment(horizontalOffset: number): 'left' | 'center' | 'right' {\n if (horizontalOffset > 8) {\n return 'left';\n }\n if (horizontalOffset < -8) {\n return 'right';\n }\n return 'center';\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { RenderNode } from '../../../scene';\nimport { paint } from '../../../scene';\nimport { CHART_COLORS, resolveChartShadow } from '../../primitives';\nimport { radarSeriesPath } from '../../primitives/radarShape';\nimport { seriesValueProp } from '../../propPath';\nimport type { ChartRenderContext } from '../types';\nimport type { RadarFamilyChart, RadarGeometry, RadarPoint } from './types';\n\nexport function renderRadarSeries(\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n): RenderNode[] {\n const nodes: RenderNode[] = [];\n context.chart.series.forEach((series, seriesIndex) => {\n nodes.push(...renderSeries(context, geometry, series, seriesIndex));\n });\n return nodes;\n}\n\nfunction renderSeries(\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n series: ChartSeries,\n seriesIndex: number,\n): RenderNode[] {\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n const points = seriesPoints(series, context, geometry);\n const path = radarSeriesPath(points, geometry.circular);\n return [\n createSeriesFill(context, geometry, series, path, color),\n createSeriesStroke(context, series, path, color),\n ...createSeriesPoints(context, series, points, color),\n ];\n}\n\nfunction seriesPoints(\n series: ChartSeries,\n context: ChartRenderContext<RadarFamilyChart>,\n geometry: RadarGeometry,\n): RadarPoint[] {\n const values = series.values as number[];\n return geometry.categories.map((_, categoryIndex) =>\n geometry.pointAt(geometry.radiusForValue(values[categoryIndex] ?? context.chart.axisY.min), categoryIndex),\n );\n}\n\nfunction createSeriesFill(\n context: ChartRenderContext,\n geometry: RadarGeometry,\n series: ChartSeries,\n path: string,\n color: Parameters<typeof paint>[0],\n): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n return {\n type: 'path',\n id: `chart-radar-fill-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: path,\n detail: { of: 'chartSeries', series: series.id },\n style: {\n fill: paint(color, diagnostics, chart.id),\n stroke: { kind: 'none' },\n opacity: Math.max(0, Math.min(1, series.opacity ?? geometry.areaOpacity)),\n },\n };\n}\n\nfunction createSeriesStroke(\n context: ChartRenderContext,\n series: ChartSeries,\n path: string,\n color: Parameters<typeof paint>[0],\n): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n return {\n type: 'path',\n id: `chart-radar-series-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: path,\n detail: { of: 'chartSeries', series: series.id },\n style: {\n fill: { kind: 'none' },\n stroke: paint(color, diagnostics, chart.id),\n strokeWidth: 2,\n lineJoin: 'round',\n shadow: resolveChartShadow(chart.shadowStyle),\n },\n };\n}\n\nfunction createSeriesPoints(\n context: ChartRenderContext,\n series: ChartSeries,\n points: RadarPoint[],\n color: Parameters<typeof paint>[0],\n): RenderNode[] {\n const { chart, bounds, diagnostics, nextOrder } = context;\n return points.map((point, pointIndex) => ({\n type: 'ellipse',\n id: `chart-radar-point-${chart.id}-${series.id}-${pointIndex}`,\n order: nextOrder(),\n bounds,\n cx: point.x,\n cy: point.y,\n rx: 3,\n ry: 3,\n detail: { of: 'chartValue', series: series.id, valueIndex: pointIndex, mark: 'radar-vertex' },\n prop: seriesValueProp(series.id, pointIndex),\n style: { fill: paint(color, diagnostics, chart.id) },\n }));\n}\n","import type { RenderNode } from '../../scene';\nimport { createRadarGeometry } from './radar/geometry';\nimport { renderRadarGrid } from './radar/grid';\nimport { renderRadarLabels } from './radar/labels';\nimport { renderRadarSeries } from './radar/series';\nimport type { RadarFamilyChart } from './radar/types';\nimport type { ChartRenderContext } from './types';\n\nexport function renderRadar(context: ChartRenderContext<RadarFamilyChart>): RenderNode[] {\n const geometry = createRadarGeometry(context);\n const nodes: RenderNode[] = [];\n\n nodes.push(...renderRadarGrid(context, geometry));\n nodes.push(...renderRadarLabels(context, geometry));\n nodes.push(...renderRadarSeries(context, geometry));\n\n return nodes;\n}\n","import type { ChartSeries, RadialBarChart } from '../../../model/chart';\nimport type { RenderNode, ScenePaint } from '../../scene';\nimport { finite, paint } from '../../scene';\nimport type { ResolvedShadow } from '../primitives';\nimport { CHART_COLORS, resolveChartShadow } from '../primitives';\nimport { seriesValueProp } from '../propPath';\nimport type { ChartRenderContext } from './types';\n\nconst START_ANGLE = -Math.PI / 2;\nconst DEFAULT_RING_THICKNESS = 14;\nconst DEFAULT_RING_GAP = 4;\nconst TRACK_OPACITY = 0.18;\nconst FULL_SWEEP_EPSILON = 1e-4;\n\ninterface ArcPoint {\n x: number;\n y: number;\n}\n\nfunction arcPoint(cx: number, cy: number, r: number, angle: number): ArcPoint {\n return { x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) };\n}\n\nfunction fullCirclePath(cx: number, cy: number, r: number): string {\n return `M ${cx - r} ${cy} A ${r} ${r} 0 1 0 ${cx + r} ${cy} A ${r} ${r} 0 1 0 ${cx - r} ${cy} Z`;\n}\n\nfunction annulusPath(cx: number, cy: number, outerRadius: number, innerRadius: number): string {\n return `${fullCirclePath(cx, cy, outerRadius)} ${fullCirclePath(cx, cy, Math.max(0, innerRadius))}`;\n}\n\nfunction arcSegmentPath(cx: number, cy: number, r: number, from: number, to: number): string {\n const start = arcPoint(cx, cy, r, from);\n const end = arcPoint(cx, cy, r, to);\n return `M ${start.x} ${start.y} A ${r} ${r} 0 ${to - from > Math.PI ? 1 : 0} 1 ${end.x} ${end.y}`;\n}\n\nfunction ringShadow(shadow: ResolvedShadow, ringThickness: number): ResolvedShadow {\n const blur = Math.min(shadow.blur, ringThickness * 0.6);\n const maxDistance = ringThickness * 0.4;\n const distance = Math.hypot(shadow.dx, shadow.dy);\n const scale = distance > maxDistance ? maxDistance / distance : 1;\n return { ...shadow, blur, dx: shadow.dx * scale, dy: shadow.dy * scale };\n}\n\nfunction ringProgressPath(cx: number, cy: number, r: number, sweep: number): string {\n if (sweep >= Math.PI * 2 - FULL_SWEEP_EPSILON) {\n const start = arcPoint(cx, cy, r, START_ANGLE);\n const mid = arcPoint(cx, cy, r, START_ANGLE + Math.PI);\n return `M ${start.x} ${start.y} A ${r} ${r} 0 1 1 ${mid.x} ${mid.y} A ${r} ${r} 0 1 1 ${start.x} ${start.y}`;\n }\n const start = arcPoint(cx, cy, r, START_ANGLE);\n const end = arcPoint(cx, cy, r, START_ANGLE + sweep);\n const largeArc = sweep > Math.PI ? 1 : 0;\n return `M ${start.x} ${start.y} A ${r} ${r} 0 ${largeArc} 1 ${end.x} ${end.y}`;\n}\n\ninterface RingLayout {\n centerX: number;\n centerY: number;\n outerRadius: number;\n ringThickness: number;\n ringGap: number;\n axisMin: number;\n range: number;\n}\n\nfunction layoutOf(context: ChartRenderContext<RadialBarChart>): RingLayout {\n const { chart, plot } = context;\n const axisMin = finite(chart.axisY.min, 0);\n return {\n centerX: plot.x + plot.width / 2,\n centerY: plot.y + plot.height / 2,\n outerRadius: Math.max(1, Math.min(plot.width, plot.height) / 2 - 4),\n ringThickness: Math.max(1, finite(chart.config?.ringThickness, DEFAULT_RING_THICKNESS)),\n ringGap: Math.max(0, finite(chart.config?.ringGap, DEFAULT_RING_GAP)),\n axisMin,\n range: finite(chart.axisY.max, 100) - axisMin,\n };\n}\n\nfunction ringEndShadows(\n context: ChartRenderContext<RadialBarChart>,\n layout: RingLayout,\n series: ChartSeries,\n radius: number,\n sweep: number,\n color: ScenePaint,\n): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n const { centerX, centerY, ringThickness } = layout;\n const shadow = resolveChartShadow(chart.shadowStyle);\n const isFullCircle = sweep >= Math.PI * 2 - FULL_SWEEP_EPSILON;\n if (!shadow || isFullCircle) {\n return [];\n }\n const clampedShadow = ringShadow(shadow, ringThickness);\n const stubSweep = Math.min(sweep, ringThickness / radius);\n return [\n [START_ANGLE, START_ANGLE + stubSweep],\n [START_ANGLE + sweep - stubSweep, START_ANGLE + sweep],\n ].map(\n ([from, to], endIndex): RenderNode => ({\n type: 'path',\n id: `chart-radial-bar-ring-end-shadow-${chart.id}-${series.id}-${endIndex}`,\n order: nextOrder(),\n bounds,\n d: arcSegmentPath(centerX, centerY, radius, from, to),\n style: {\n fill: { kind: 'none' },\n stroke: color,\n strokeWidth: ringThickness,\n lineCap: 'round',\n shadow: clampedShadow,\n clip: {\n type: 'path',\n d: annulusPath(centerX, centerY, radius + ringThickness / 2, radius - ringThickness / 2),\n },\n },\n }),\n );\n}\n\nfunction ringNodes(\n context: ChartRenderContext<RadialBarChart>,\n layout: RingLayout,\n series: ChartSeries,\n index: number,\n): RenderNode[] {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const { centerX, centerY, outerRadius, ringThickness, ringGap, axisMin, range } = layout;\n const radius = outerRadius - index * (ringThickness + ringGap) - ringThickness / 2;\n if (radius <= ringThickness / 2) {\n return [];\n }\n const color = paint(series.color ?? CHART_COLORS[index % CHART_COLORS.length], diagnostics, chart.id);\n const value = Math.max(0, finite((series.values as number[])[0], 0));\n const fraction = range > 0 ? Math.min(1, Math.max(0, (value - axisMin) / range)) : 0;\n\n const track: RenderNode = {\n type: 'ellipse',\n id: `chart-radial-bar-track-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n cx: centerX,\n cy: centerY,\n rx: radius,\n ry: radius,\n style: { fill: { kind: 'none' }, stroke: color, strokeWidth: ringThickness, opacity: TRACK_OPACITY },\n };\n if (fraction <= 0) {\n return [track];\n }\n\n const sweep = fraction * Math.PI * 2;\n const casters = ringEndShadows(context, layout, series, radius, sweep, color);\n const progress: RenderNode = {\n type: 'path',\n id: `chart-radial-bar-ring-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: ringProgressPath(centerX, centerY, radius, sweep),\n detail: { of: 'chartValue', series: series.id, valueIndex: 0, mark: 'radial-bar-ring' },\n prop: seriesValueProp(series.id, 0),\n style: { fill: { kind: 'none' }, stroke: color, strokeWidth: ringThickness, lineCap: 'round' },\n };\n return [track, ...casters, progress];\n}\n\nexport function renderRadialBar(context: ChartRenderContext<RadialBarChart>): RenderNode[] {\n const layout = layoutOf(context);\n return context.chart.series.flatMap((series, index) => ringNodes(context, layout, series, index));\n}\n","import type { Bounds, RenderNode, ScenePaint } from '../../../scene';\nimport type { SankeyLayoutLink } from '../../geometry/sankey';\nimport { DEFAULT_ZONE_FILL, resolveChartShadow } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { SankeyRenderData } from './types';\n\ninterface SankeyRibbonEdge {\n x: number;\n top: number;\n bottom: number;\n}\n\ninterface SankeyLinkRibbon {\n linkIndex: number;\n fromId: string;\n toId: string;\n source: SankeyRibbonEdge;\n target: SankeyRibbonEdge;\n controlX: number;\n fill: ScenePaint;\n opacity: number;\n}\n\nexport function renderSankeyLinks(context: ChartRenderContext, data: SankeyRenderData): RenderNode[] {\n const shadow = resolveChartShadow(context.chart.shadowStyle);\n const gradient = Boolean(context.chart.config?.linkGradient);\n const { plot } = context;\n const clipPath = shadow\n ? `M ${plot.x} ${plot.y} H ${plot.x + plot.width} V ${plot.y + plot.height} H ${plot.x} Z`\n : undefined;\n return data.links.map((link, linkIndex) => {\n const ribbon = createSankeyLinkRibbon(data, link, linkIndex, gradient);\n return createSankeyRibbonNode(context, ribbon, shadow, clipPath, gradient);\n });\n}\n\nfunction createSankeyLinkRibbon(\n data: SankeyRenderData,\n link: SankeyLayoutLink,\n linkIndex: number,\n gradient: boolean,\n): SankeyLinkRibbon {\n const source = {\n x: data.baseX + link.x0,\n top: data.baseY + link.sourceY0,\n bottom: data.baseY + link.sourceY1,\n };\n const target = {\n x: data.baseX + link.x1,\n top: data.baseY + link.targetY0,\n bottom: data.baseY + link.targetY1,\n };\n const fromColor = link.color || data.nodeColors.get(link.source) || DEFAULT_ZONE_FILL;\n const toColor = data.nodeColors.get(link.target) || DEFAULT_ZONE_FILL;\n const fill: ScenePaint = gradient\n ? {\n kind: 'linear-gradient',\n angle: 0,\n stops: [\n { offset: 0, color: fromColor },\n { offset: 100, color: toColor },\n ],\n }\n : { kind: 'solid', color: link.color || toColor };\n return {\n linkIndex,\n fromId: link.source,\n toId: link.target,\n source,\n target,\n controlX: (source.x + target.x) / 2,\n fill,\n opacity: link.color ? 0.85 : 0.45,\n };\n}\n\nfunction createSankeyRibbonNode(\n context: ChartRenderContext,\n ribbon: SankeyLinkRibbon,\n shadow: ReturnType<typeof resolveChartShadow>,\n clipPath: string | undefined,\n gradient: boolean,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const gradientBounds: Bounds = {\n minX: Math.min(ribbon.source.x, ribbon.target.x),\n maxX: Math.max(ribbon.source.x, ribbon.target.x),\n minY: Math.min(ribbon.source.top, ribbon.target.top),\n maxY: Math.max(ribbon.source.bottom, ribbon.target.bottom),\n };\n return {\n type: 'path',\n id: `chart-sankey-link-${chart.id}-${ribbon.linkIndex}`,\n order: nextOrder(),\n bounds: gradient ? gradientBounds : bounds,\n d: sankeyRibbonPath(ribbon),\n detail: { of: 'link', fromId: ribbon.fromId, toId: ribbon.toId },\n style: {\n fill: ribbon.fill,\n opacity: ribbon.opacity,\n shadow,\n clip: clipPath ? { type: 'path', d: clipPath } : undefined,\n },\n };\n}\n\nfunction sankeyRibbonPath(ribbon: SankeyLinkRibbon): string {\n const { source, target, controlX } = ribbon;\n return [\n `M ${source.x} ${source.top}`,\n `C ${controlX} ${source.top} ${controlX} ${target.top} ${target.x} ${target.top}`,\n `L ${target.x} ${target.bottom}`,\n `C ${controlX} ${target.bottom} ${controlX} ${source.bottom} ${source.x} ${source.bottom}`,\n 'Z',\n ].join(' ');\n}\n","import { leftRoundedRectPath, rightRoundedRectPath } from '../../../artifacts/containers';\nimport type { RenderNode, SceneText } from '../../../scene';\nimport { finite } from '../../../scene';\nimport { estimateTextWidth } from '../../../scene/textLayout';\nimport type { SankeyLayoutNode } from '../../geometry/sankey';\nimport {\n chartText,\n contrastTextColor,\n DEFAULT_ZONE_FILL,\n isLightColor,\n resolveChartShadow,\n sameHueTint,\n} from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { SankeyRenderData } from './types';\n\nconst OUTSIDE_LABEL_LIGHTNESS_ON_LIGHT_BG = 0.3;\nconst OUTSIDE_LABEL_LIGHTNESS_ON_DARK_BG = 0.78;\n\nexport function renderSankeyNodes(context: ChartRenderContext, data: SankeyRenderData): RenderNode[] {\n const cornerRadius = Math.max(0, finite(context.chart.config?.barCornerRadius, 0));\n const nodes: RenderNode[] = [];\n data.nodes.forEach(node => {\n nodes.push(createNodeRect(context, data, node, cornerRadius));\n const label = context.showLabels ? createNodeLabel(context, data, node) : undefined;\n if (label) {\n nodes.push(label);\n }\n });\n return nodes;\n}\n\nfunction createNodeRect(\n context: ChartRenderContext,\n data: SankeyRenderData,\n node: SankeyLayoutNode,\n cornerRadius: number,\n): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const x = data.baseX + node.x;\n const y = data.baseY + node.y;\n const style = {\n fill: { kind: 'solid' as const, color: node.color || DEFAULT_ZONE_FILL },\n shadow: resolveChartShadow(chart.shadowStyle),\n };\n const isFirstColumn = node.column === 0;\n const isLastColumn = node.column === data.columnCount - 1;\n const detail = { of: 'chartSeries' as const, series: node.id, mark: 'sankey-node' };\n if (cornerRadius > 0 && isFirstColumn && isLastColumn) {\n return {\n type: 'rect',\n id: `chart-sankey-node-${chart.id}-${node.id}`,\n order: nextOrder(),\n bounds,\n x,\n y,\n width: node.width,\n height: node.height,\n rx: cornerRadius,\n style,\n detail,\n };\n }\n if (cornerRadius > 0 && isFirstColumn) {\n return {\n type: 'path',\n id: `chart-sankey-node-${chart.id}-${node.id}`,\n order: nextOrder(),\n bounds,\n d: leftRoundedRectPath(x, y, node.width, node.height, cornerRadius),\n style,\n detail,\n };\n }\n if (cornerRadius > 0 && isLastColumn) {\n return {\n type: 'path',\n id: `chart-sankey-node-${chart.id}-${node.id}`,\n order: nextOrder(),\n bounds,\n d: rightRoundedRectPath(x, y, node.width, node.height, cornerRadius),\n style,\n detail,\n };\n }\n return {\n type: 'rect',\n id: `chart-sankey-node-${chart.id}-${node.id}`,\n order: nextOrder(),\n bounds,\n x,\n y,\n width: node.width,\n height: node.height,\n style,\n detail,\n };\n}\n\nfunction createNodeLabel(\n context: ChartRenderContext,\n data: SankeyRenderData,\n node: SankeyLayoutNode,\n): RenderNode | undefined {\n const { chart } = context;\n const position = chart.config?.labelPosition ?? 'outside';\n const label =\n position === 'inside'\n ? createInsideLabel(context, data, node, chart.config?.labelOrientation ?? 'horizontal')\n : createOutsideLabel(context, data, node);\n if (!label) {\n return undefined;\n }\n const fallback = chart.textColor ?? '#0f172a';\n const defaultColor =\n position === 'inside'\n ? contrastTextColor(node.color)\n : (sameHueTint(\n node.color,\n isLightColor(fallback) ? OUTSIDE_LABEL_LIGHTNESS_ON_DARK_BG : OUTSIDE_LABEL_LIGHTNESS_ON_LIGHT_BG,\n ) ?? fallback);\n const color = chart.config?.labelColor ?? defaultColor;\n return { ...label, color, detail: { of: 'chartSeries', series: node.id, mark: 'sankey-node-label' } };\n}\n\nfunction createOutsideLabel(context: ChartRenderContext, data: SankeyRenderData, node: SankeyLayoutNode): SceneText {\n const { chart, bounds, nextOrder } = context;\n const isLastColumn = node.column === data.columnCount - 1;\n const x = data.baseX + node.x;\n const y = data.baseY + node.y;\n const labelX = isLastColumn ? x - data.labelGutter + 8 : x + node.width + 6;\n return {\n ...chartText({\n id: `chart-sankey-label-${chart.id}-${node.id}`,\n order: nextOrder(),\n bounds,\n frame: { x: labelX, y, width: data.labelGutter - 12, height: Math.max(1, node.height) },\n text: node.label,\n chart,\n align: isLastColumn ? 'right' : 'left',\n }),\n fontSize: data.fontSize - 2,\n fontWeight: 'bold',\n verticalAlign: 'middle',\n };\n}\n\nfunction createInsideLabel(\n context: ChartRenderContext,\n data: SankeyRenderData,\n node: SankeyLayoutNode,\n orientation: 'horizontal' | 'vertical',\n): SceneText | undefined {\n const { chart, bounds, nextOrder } = context;\n const x = data.baseX + node.x;\n const y = data.baseY + node.y;\n const centerX = x + node.width / 2;\n const centerY = y + node.height / 2;\n const fontSize = data.fontSize - 2;\n const id = `chart-sankey-label-${chart.id}-${node.id}`;\n if (orientation === 'vertical') {\n const thickness = fontSize * 1.4;\n const width = Math.max(1, node.height - 8);\n if (estimateTextWidth(node.label, fontSize, false) > width) {\n return undefined;\n }\n return {\n ...chartText({\n id,\n order: nextOrder(),\n bounds,\n frame: { x: centerX - width / 2, y: centerY - thickness / 2, width, height: thickness },\n text: node.label,\n chart,\n align: 'center',\n rotation: -90,\n }),\n fontSize,\n fontWeight: 'bold',\n verticalAlign: 'middle',\n rotationCenter: { x: centerX, y: centerY },\n };\n }\n return {\n ...chartText({\n id,\n order: nextOrder(),\n bounds,\n frame: { x: x + 4, y: centerY - fontSize / 2 - 2, width: Math.max(1, node.width - 8), height: fontSize + 4 },\n text: node.label,\n chart,\n align: 'center',\n }),\n fontSize,\n fontWeight: 'bold',\n verticalAlign: 'middle',\n };\n}\n","import { finite } from '../../../scene';\nimport { layoutSankey, type SankeyLinkInput, type SankeyNodeInput } from '../../geometry/sankey';\nimport { DEFAULT_ZONE_FILL, representativeColor } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { SankeyRenderData } from './types';\n\nexport function createSankeyRenderData(context: ChartRenderContext): SankeyRenderData {\n const { chart, plot, showLabels } = context;\n const labelGutter = showLabels ? 92 : 0;\n const availableWidth = Math.max(1, plot.width - labelGutter * 2);\n const layout = layoutSankey(createNodeInputs(context), createLinkInputs(context), availableWidth, plot.height);\n return {\n ...layout,\n baseX: plot.x + labelGutter,\n baseY: plot.y,\n labelGutter,\n fontSize: Math.max(9, finite(chart.fontSize, 12)),\n columnCount: Math.max(1, ...layout.nodes.map(node => node.column + 1)),\n nodeColors: new Map(layout.nodes.map(node => [node.id, node.color || DEFAULT_ZONE_FILL])),\n };\n}\n\nfunction createNodeInputs(context: ChartRenderContext): SankeyNodeInput[] {\n return (context.chart.config?.zones ?? []).map(zone => ({\n id: zone.label,\n label: zone.label,\n color: zone.color,\n offsetX: zone.offsetX,\n offsetY: zone.offsetY,\n }));\n}\n\nfunction createLinkInputs(context: ChartRenderContext): SankeyLinkInput[] {\n const inputs: SankeyLinkInput[] = [];\n context.chart.series.forEach(series => {\n if (!series.source || !series.target) {\n return;\n }\n inputs.push({\n source: series.source,\n target: series.target,\n value: (series.values as number[])[0] ?? 0,\n color: series.color ? representativeColor(series.color, DEFAULT_ZONE_FILL) : undefined,\n });\n });\n return inputs;\n}\n","import type { RenderNode } from '../../scene';\nimport { renderSankeyLinks } from './sankey/links';\nimport { renderSankeyNodes } from './sankey/nodes';\nimport { createSankeyRenderData } from './sankey/prepare';\nimport type { ChartRenderContext } from './types';\n\nexport function renderSankey(context: ChartRenderContext): RenderNode[] {\n const data = createSankeyRenderData(context);\n const nodes: RenderNode[] = [];\n\n nodes.push(...renderSankeyLinks(context, data));\n nodes.push(...renderSankeyNodes(context, data));\n\n return nodes;\n}\n","import type { ChartSeries } from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { paint } from '../../scene';\nimport { CHART_COLORS, resolveChartShadow } from '../primitives';\nimport { type CartesianPoint, pixelPoints, seriesValuePairs } from './cartesianPoints';\nimport type { ChartRenderContext } from './types';\n\nexport function renderScatter(context: ChartRenderContext, radius = 4): RenderNode[] {\n const nodes: RenderNode[] = [];\n const shadow = resolveChartShadow(context.chart.shadowStyle);\n context.chart.series.forEach((series, seriesIndex) => {\n const color = series.color ?? CHART_COLORS[seriesIndex % CHART_COLORS.length];\n const points = pixelPoints(context, seriesValuePairs(context.chart, series));\n points.forEach((point, pointIndex) => {\n nodes.push(createScatterPoint(context, series, point, pointIndex, color, radius, shadow));\n });\n });\n return nodes;\n}\n\nfunction createScatterPoint(\n context: ChartRenderContext,\n series: ChartSeries,\n point: CartesianPoint,\n pointIndex: number,\n color: Parameters<typeof paint>[0],\n radius: number,\n shadow: ReturnType<typeof resolveChartShadow>,\n): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n return {\n type: 'ellipse',\n id: `chart-point-${chart.id}-${series.id}-${pointIndex}`,\n order: nextOrder(),\n bounds,\n cx: point.x,\n cy: point.y,\n rx: radius,\n ry: radius,\n detail: { of: 'chartValue', series: series.id, valueIndex: pointIndex },\n style: { fill: paint(color, diagnostics, chart.id), shadow },\n };\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport { finite } from '../../../scene';\nimport { axisBands, DEFAULT_HEATMAP_ZONES, zoneColorAtValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { TreemapLayout } from './types';\n\nexport function createTreemapLayout(context: ChartRenderContext): TreemapLayout {\n const { chart, plot, showLegend } = context;\n const fontSize = Math.max(9, finite(chart.fontSize, 12));\n const legendPosition: 'bottom' | 'left' | 'right' =\n chart.legendPosition === 'left' ? 'left' : chart.legendPosition === 'right' ? 'right' : 'bottom';\n const legendHeight = showLegend && legendPosition === 'bottom' ? 48 : 0;\n const cellGap = Math.max(0, finite(chart.config?.cellGap, 0));\n return {\n leaves: chart.series,\n bands: axisBands(chart.axisY),\n zones: chart.config?.zones?.length ? chart.config.zones : DEFAULT_HEATMAP_ZONES,\n fontSize,\n smallFontSize: Math.max(8, fontSize - 1),\n legendPosition,\n legendHeight,\n gridWidth: Math.max(1, plot.width),\n gridHeight: Math.max(1, plot.height - legendHeight),\n cellGap,\n cellRadius: Math.max(0, finite(chart.config?.barCornerRadius, cellGap)),\n };\n}\n\nexport function treemapLeafValue(leaf: ChartSeries): number {\n return (leaf.values as number[])[0] ?? 0;\n}\n\nexport function treemapLeafColor(leaf: ChartSeries, layout: TreemapLayout) {\n return leaf.color ?? zoneColorAtValue(treemapLeafValue(leaf), layout.bands, layout.zones);\n}\n","import type { RenderNode } from '../../../scene';\nimport { boxBounds } from '../../../scene';\nimport { chartText, DEFAULT_ZONE_FILL, formatFieldValue } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport type { TreemapLayout } from './types';\n\nconst BAR_THICKNESS = 10;\nconst TICK_LENGTH = 4;\nconst ROW_GAP = 2;\nconst CHART_GAP = 16;\nconst LABEL_SIZE = 34;\n\nexport function renderTreemapLegend(context: ChartRenderContext, layout: TreemapLayout): RenderNode[] {\n if (layout.zones.length === 0 || (layout.legendPosition === 'bottom' && layout.legendHeight <= 0)) {\n return [];\n }\n return layout.legendPosition === 'bottom' ? renderBottomLegend(context, layout) : renderSideLegend(context, layout);\n}\n\nfunction bandRatio(layout: TreemapLayout, value: number): number {\n const first = layout.bands[0];\n const last = layout.bands[layout.bands.length - 1];\n return last === first ? 0 : (value - first) / (last - first);\n}\n\nfunction bandStops(layout: TreemapLayout) {\n const bandCount = Math.max(0, layout.bands.length - 1);\n const zones = layout.zones.slice(0, bandCount);\n return zones.map((zone, index) => ({\n offset: bandRatio(layout, layout.bands[index + 1] ?? layout.bands[layout.bands.length - 1]) * 100,\n color: zone.color ?? DEFAULT_ZONE_FILL,\n }));\n}\n\nfunction renderBottomLegend(context: ChartRenderContext, layout: TreemapLayout): RenderNode[] {\n const { chart, plot, bounds, nextOrder } = context;\n const barX = plot.x;\n const barWidth = layout.gridWidth;\n const labelHeight = layout.fontSize + 2;\n const barY = plot.y + layout.gridHeight + CHART_GAP;\n const barBounds = boxBounds({ x: barX, y: barY, width: barWidth, height: BAR_THICKNESS });\n const stops = bandStops(layout);\n\n const bar: RenderNode = {\n type: 'rect',\n id: `chart-treemap-legend-bar-${chart.id}`,\n order: nextOrder(),\n bounds: barBounds,\n x: barX,\n y: barY,\n width: barWidth,\n height: BAR_THICKNESS,\n rx: 3,\n zoneGradient: { axis: 'y', min: chart.axisY.min, max: chart.axisY.max },\n style: {\n fill: stops.length ? { kind: 'linear-gradient', angle: 0, stops } : { kind: 'solid', color: DEFAULT_ZONE_FILL },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n\n const ticks: RenderNode[] = layout.bands.flatMap((value, index) => {\n const x = barX + bandRatio(layout, value) * barWidth;\n const tick: RenderNode = {\n type: 'path',\n id: `chart-treemap-legend-tick-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n d: `M ${x} ${barY + BAR_THICKNESS} L ${x} ${barY + BAR_THICKNESS + TICK_LENGTH}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n const isFirst = index === 0;\n const isLast = index === layout.bands.length - 1;\n const align = isFirst ? 'left' : isLast ? 'right' : 'center';\n const frameX = isFirst ? x : isLast ? x - LABEL_SIZE : x - LABEL_SIZE / 2;\n const label = chartText({\n id: `chart-treemap-legend-tick-label-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n frame: { x: frameX, y: barY + BAR_THICKNESS + TICK_LENGTH + ROW_GAP, width: LABEL_SIZE, height: labelHeight },\n text: formatFieldValue(value),\n chart,\n align,\n });\n return [tick, label];\n });\n\n return [bar, ...ticks];\n}\n\nfunction renderSideLegend(context: ChartRenderContext, layout: TreemapLayout): RenderNode[] {\n const { chart, plot, bounds, nextOrder } = context;\n const side = layout.legendPosition as 'left' | 'right';\n const barTop = plot.y;\n const barHeight = layout.gridHeight;\n const barX = side === 'left' ? plot.x - CHART_GAP - BAR_THICKNESS : plot.x + layout.gridWidth + CHART_GAP;\n const barBounds = boxBounds({ x: barX, y: barTop, width: BAR_THICKNESS, height: barHeight });\n const stops = bandStops(layout);\n\n const bar: RenderNode = {\n type: 'rect',\n id: `chart-treemap-legend-bar-${chart.id}`,\n order: nextOrder(),\n bounds: barBounds,\n x: barX,\n y: barTop,\n width: BAR_THICKNESS,\n height: barHeight,\n rx: 3,\n zoneGradient: { axis: 'y', min: chart.axisY.min, max: chart.axisY.max },\n style: {\n fill: stops.length ? { kind: 'linear-gradient', angle: 270, stops } : { kind: 'solid', color: DEFAULT_ZONE_FILL },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n\n const tickX = side === 'left' ? barX : barX + BAR_THICKNESS;\n const tickEndX = side === 'left' ? tickX - TICK_LENGTH : tickX + TICK_LENGTH;\n const labelX = side === 'left' ? tickEndX - ROW_GAP - LABEL_SIZE : tickEndX + ROW_GAP;\n\n const ticks: RenderNode[] = layout.bands.flatMap((value, index) => {\n const y = barTop + (1 - bandRatio(layout, value)) * barHeight;\n const tick: RenderNode = {\n type: 'path',\n id: `chart-treemap-legend-tick-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n d: `M ${tickX} ${y} L ${tickEndX} ${y}`,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: 1,\n },\n };\n const label = chartText({\n id: `chart-treemap-legend-tick-label-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n frame: { x: labelX, y: y - layout.fontSize / 2, width: LABEL_SIZE, height: layout.fontSize + 2 },\n text: formatFieldValue(value),\n chart,\n align: side === 'left' ? 'right' : 'left',\n });\n return [tick, label];\n });\n\n return [bar, ...ticks];\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { Bounds, RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport { wrapText } from '../../../scene/textLayout';\nimport { squarifyTreemap } from '../../geometry';\nimport { chartText, contrastTextColor, representativeColor, resolveChartShadow } from '../../primitives';\nimport type { ChartRenderContext } from '../types';\nimport { treemapLeafColor, treemapLeafValue } from './layout';\nimport type { TreemapLayout } from './types';\n\nconst HEADER_HEIGHT = 20;\n\ninterface TreemapTile {\n x: number;\n y: number;\n width: number;\n height: number;\n item: { leaf: ChartSeries; value: number };\n}\n\ninterface TreemapHeader {\n key: string;\n label: string;\n x: number;\n y: number;\n width: number;\n}\n\nexport function renderTreemapTiles(context: ChartRenderContext, layout: TreemapLayout): RenderNode[] {\n const { tiles, headers } = layoutTreemapTiles(context, layout);\n const nodes: RenderNode[] = [];\n const gradientFlow = Boolean(context.chart.config?.tileGradient);\n tiles.forEach((tile, index) => {\n const next = tiles[index + 1];\n const sameGroup = next && (tile.item.leaf.group ?? '') === (next.item.leaf.group ?? '');\n const nextTile = gradientFlow && sameGroup ? next : undefined;\n nodes.push(...renderTile(context, layout, tile, nextTile));\n });\n headers.forEach((header, index) => {\n nodes.push(...renderTreemapHeader(context, layout, header, index));\n });\n return nodes;\n}\n\nfunction layoutTreemapTiles(\n context: ChartRenderContext,\n layout: TreemapLayout,\n): { tiles: TreemapTile[]; headers: TreemapHeader[] } {\n if (!layout.leaves.some(leaf => leaf.group)) {\n const items = layout.leaves.map(leaf => ({ leaf, value: treemapLeafValue(leaf) }));\n const tiles = squarifyTreemap(items, { x: 0, y: 0, width: layout.gridWidth, height: layout.gridHeight });\n return { tiles, headers: [] };\n }\n\n const groupOrder: string[] = [];\n for (const leaf of layout.leaves) {\n const key = leaf.group ?? '';\n if (!groupOrder.includes(key)) {\n groupOrder.push(key);\n }\n }\n const groupItems = groupOrder.map(key => ({\n key,\n label: key || 'Other',\n value: layout.leaves\n .filter(leaf => (leaf.group ?? '') === key)\n .reduce((sum, leaf) => sum + treemapLeafValue(leaf), 0),\n }));\n const groupRects = squarifyTreemap(groupItems, { x: 0, y: 0, width: layout.gridWidth, height: layout.gridHeight });\n\n const groupGap = layout.cellGap;\n\n const tiles: TreemapTile[] = [];\n const headers: TreemapHeader[] = [];\n groupRects.forEach(groupRect => {\n const headerHeight = context.showLabels ? Math.min(HEADER_HEIGHT, groupRect.height) : 0;\n if (context.showLabels) {\n headers.push({\n key: groupRect.item.key,\n label: groupRect.item.label,\n x: groupRect.x + groupGap / 2,\n y: groupRect.y,\n width: Math.max(0, groupRect.width - groupGap),\n });\n }\n const innerLeaves = layout.leaves.filter(leaf => (leaf.group ?? '') === groupRect.item.key);\n const leafItems = innerLeaves.map(leaf => ({ leaf, value: treemapLeafValue(leaf) }));\n tiles.push(\n ...squarifyTreemap(leafItems, {\n x: groupRect.x,\n y: groupRect.y + headerHeight,\n width: groupRect.width,\n height: Math.max(0, groupRect.height - headerHeight),\n }),\n );\n });\n return { tiles, headers };\n}\n\nfunction renderTreemapHeader(\n context: ChartRenderContext,\n layout: TreemapLayout,\n header: TreemapHeader,\n index: number,\n): RenderNode[] {\n const { chart, plot, bounds, nextOrder } = context;\n const fill = chart.config?.headerColor ?? chart.gridColor ?? '#e2e8f0';\n const background: RenderNode = {\n type: 'rect',\n id: `chart-treemap-header-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n x: plot.x + header.x,\n y: plot.y + header.y,\n width: header.width,\n height: HEADER_HEIGHT,\n rx: layout.cellRadius,\n style: { fill: { kind: 'solid', color: fill } },\n };\n const smallFontSize = Math.max(8, Math.max(9, chart.fontSize ?? 12) - 1);\n const label: RenderNode = {\n ...chartText({\n id: `chart-treemap-header-label-${chart.id}-${index}`,\n order: nextOrder(),\n bounds,\n frame: {\n x: plot.x + header.x,\n y: plot.y + header.y + (HEADER_HEIGHT - smallFontSize) / 2,\n width: header.width,\n height: smallFontSize + 2,\n },\n text: header.label,\n chart,\n align: 'center',\n }),\n fontSize: smallFontSize,\n color: contrastTextColor(fill),\n };\n return [background, label];\n}\n\nfunction renderTile(\n context: ChartRenderContext,\n layout: TreemapLayout,\n tile: TreemapTile,\n nextTile: TreemapTile | undefined,\n): RenderNode[] {\n const color = treemapLeafColor(tile.item.leaf, layout);\n const nextColor = nextTile ? treemapLeafColor(nextTile.item.leaf, layout) : undefined;\n const nodes = [createTileNode(context, layout, tile, color, nextColor)];\n if (context.showLabels && tile.width >= 34 && tile.height >= 18) {\n nodes.push(...createTileLabel(context, layout, tile, color));\n }\n return nodes;\n}\n\nfunction createTileNode(\n context: ChartRenderContext,\n layout: TreemapLayout,\n tile: TreemapTile,\n color: Parameters<typeof representativeColor>[0],\n nextColor: Parameters<typeof representativeColor>[0] | undefined,\n): RenderNode {\n const { chart, plot, bounds, diagnostics, nextOrder } = context;\n const gap = layout.cellGap;\n const shadow = resolveChartShadow(chart.shadowStyle);\n const clipPath = shadow\n ? `M ${plot.x} ${plot.y} H ${plot.x + plot.width} V ${plot.y + plot.height} H ${plot.x} Z`\n : undefined;\n const tileX = plot.x + tile.x + gap / 2;\n const tileY = plot.y + tile.y + gap / 2;\n const tileWidth = Math.max(0, tile.width - gap);\n const tileHeight = Math.max(0, tile.height - gap);\n const fallback = '#94a3b8';\n const gradientBounds: Bounds = {\n minX: tileX,\n maxX: tileX + tileWidth,\n minY: tileY + tileHeight / 2 - tileWidth / 2,\n maxY: tileY + tileHeight / 2 + tileWidth / 2,\n };\n const fill = nextColor\n ? {\n kind: 'linear-gradient' as const,\n angle: 0,\n stops: [\n { offset: 0, color: representativeColor(color, fallback) },\n { offset: 100, color: representativeColor(nextColor, fallback) },\n ],\n }\n : paint(color, diagnostics, chart.id);\n return {\n type: 'rect',\n id: `chart-treemap-tile-${chart.id}-${tile.item.leaf.id}`,\n order: nextOrder(),\n bounds: nextColor ? gradientBounds : bounds,\n x: tileX,\n y: tileY,\n width: tileWidth,\n height: tileHeight,\n rx: layout.cellRadius,\n style: {\n fill,\n stroke: { kind: 'solid', color: chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.gridWidth, 1),\n shadow,\n clip: clipPath ? { type: 'path', d: clipPath } : undefined,\n },\n };\n}\n\nfunction createTileLabel(\n context: ChartRenderContext,\n layout: TreemapLayout,\n tile: TreemapTile,\n color: Parameters<typeof representativeColor>[0],\n): RenderNode[] {\n const { chart, plot, bounds, nextOrder } = context;\n const { leaf, value } = tile.item;\n const gap = layout.cellGap;\n const width = Math.max(1, tile.width - gap - 8);\n const height = Math.max(1, tile.height - gap - 6);\n const x = plot.x + tile.x + gap / 2 + 4;\n const y = plot.y + tile.y + gap / 2 + 3;\n const textColor = contrastTextColor(representativeColor(color, '#ffffff'));\n const labelLines = wrapText(leaf.label, width, layout.smallFontSize);\n const lineHeight = layout.smallFontSize * 1.2;\n\n const label: RenderNode = {\n ...chartText({\n id: `chart-treemap-label-${chart.id}-${leaf.id}`,\n order: nextOrder(),\n bounds,\n frame: { x, y, width, height },\n text: leaf.label,\n chart,\n }),\n lines: labelLines,\n fontSize: layout.smallFontSize,\n fontWeight: 'bold',\n color: textColor,\n };\n\n const valueNode: RenderNode = {\n ...chartText({\n id: `chart-treemap-value-${chart.id}-${leaf.id}`,\n order: nextOrder(),\n bounds,\n frame: {\n x,\n y: y + labelLines.length * lineHeight,\n width,\n height: Math.max(1, height - labelLines.length * lineHeight),\n },\n text: String(value),\n chart,\n }),\n lines: [String(value)],\n fontSize: layout.smallFontSize,\n color: textColor,\n };\n\n return [label, valueNode];\n}\n","import type { RenderNode } from '../../scene';\nimport { createTreemapLayout } from './treemap/layout';\nimport { renderTreemapLegend } from './treemap/legend';\nimport { renderTreemapTiles } from './treemap/tiles';\nimport type { ChartRenderContext } from './types';\n\nexport function renderTreemap(context: ChartRenderContext): RenderNode[] {\n const layout = createTreemapLayout(context);\n const nodes: RenderNode[] = [];\n\n nodes.push(...renderTreemapTiles(context, layout));\n nodes.push(...renderTreemapLegend(context, layout));\n\n return nodes;\n}\n","import type {\n ChartType,\n HexbinChart,\n PieChart,\n PolarAreaChart,\n RadarChart,\n RadialBarChart,\n RadialChart,\n} from '../../../model/chart';\nimport type { RenderNode } from '../../scene';\nimport { renderBar } from './bar';\nimport { renderBoxplot } from './boxplot';\nimport { renderCustom } from './custom';\nimport { renderField } from './field';\nimport { renderHeatmap } from './heatmap';\nimport { renderHexbin } from './hexbin';\nimport { renderLine } from './line';\nimport { renderMekko } from './mekko';\nimport { renderPie } from './pie';\nimport { renderPolarArea } from './polarArea';\nimport { renderRadar } from './radar';\nimport { renderRadialBar } from './radialBar';\nimport { renderSankey } from './sankey';\nimport { renderScatter } from './scatter';\nimport { renderTreemap } from './treemap';\nimport type { ChartRenderContext, ChartRenderer } from './types';\n\nexport type { ChartRenderContext, ChartRenderer } from './types';\n\nconst RENDERERS: Record<ChartType, ChartRenderer> = {\n bar: renderBar,\n boxplot: renderBoxplot,\n custom: renderCustom,\n field: renderField,\n heatmap: renderHeatmap,\n hexbin: context => renderHexbin(context as ChartRenderContext<HexbinChart>),\n line: renderLine,\n mekko: renderMekko,\n pie: context => renderPie(context as ChartRenderContext<PieChart>),\n polarArea: context => renderPolarArea(context as ChartRenderContext<PolarAreaChart>),\n radar: context => renderRadar(context as ChartRenderContext<RadarChart>),\n radial: context => renderRadar(context as ChartRenderContext<RadialChart>),\n radialBar: context => renderRadialBar(context as ChartRenderContext<RadialBarChart>),\n sankey: renderSankey,\n scatter: renderScatter,\n treemap: renderTreemap,\n};\n\nconst POLAR_TYPES: ReadonlySet<ChartType> = new Set<ChartType>(['radar', 'radial']);\n\nexport function isPolarChart(chartType: ChartType): boolean {\n return POLAR_TYPES.has(chartType);\n}\n\nexport function renderChartMarks(context: ChartRenderContext): RenderNode[] {\n return RENDERERS[context.chart.chartType](context);\n}\n","import type { RenderNode } from '../scene';\nimport type { ChartFoundation } from './chartFoundation';\nimport { buildChartAxes, buildChartGrid, buildChartRules } from './decorations';\nimport { renderChartMarks } from './renderers';\n\nexport function buildCartesianChart(foundation: ChartFoundation): RenderNode[] {\n const { chart, context, layout, nodes, renderOrder } = foundation;\n const gridNodes = buildChartGrid(chart, layout.plot, layout.bounds, renderOrder.current());\n nodes.push(...gridNodes);\n renderOrder.advance(gridNodes.length);\n\n nodes.push(...renderChartMarks(context));\n\n const ruleNodes = buildChartRules({\n chart,\n plot: layout.plot,\n bounds: layout.bounds,\n order: renderOrder.current(),\n });\n nodes.push(...ruleNodes);\n renderOrder.advance(ruleNodes.length);\n\n nodes.push(...buildChartAxes(chart, layout, renderOrder.current()));\n return nodes;\n}\n","import type { Chart, PieChart, PolarAreaChart, RadarChart, RadialChart } from '../../model/chart';\nimport type { Bounds, SceneRect } from '../scene';\nimport { finite, paint } from '../scene';\nimport { CARTESIAN_VALUE_TYPES } from './decorations';\nimport { isHorizontalBar } from './primitives';\nimport { resolvePieRadii } from './primitives/pieShape';\nimport { radarCategoryCount, radarRadius } from './primitives/radarShape';\n\ntype Plot = { x: number; y: number; width: number; height: number };\ntype FrameDetail = NonNullable<SceneRect['detail']>;\n\nfunction scaleDetail(chart: Chart, plot: Plot): FrameDetail {\n const horizontal = isHorizontalBar(chart);\n const range = horizontal ? `${plot.x},${plot.width}` : `${plot.y},${plot.height}`;\n return {\n of: 'chartScale',\n valueScale: `${range},${chart.axisY.min},${chart.axisY.max}${horizontal ? ',horizontal' : ''}`,\n };\n}\n\nfunction pieDetail(chart: PieChart, plot: Plot): FrameDetail {\n const { outerRadius, innerRadius, cornerRadius } = resolvePieRadii(\n plot.width,\n plot.height,\n chart.config?.innerRadius,\n chart.config?.pieCornerRadius,\n );\n return {\n of: 'pieGeometry',\n pieGeometry: `${plot.x + plot.width / 2},${plot.y + plot.height / 2},${outerRadius},${innerRadius},${cornerRadius}`,\n };\n}\n\nfunction polarAreaDetail(chart: PolarAreaChart, plot: Plot): FrameDetail {\n const maxRadius = Math.max(1, Math.min(plot.width, plot.height) / 2 - 4);\n const innerRadius = Math.max(0, Math.min(finite(chart.config?.innerRadius, 0), maxRadius - 1));\n const cornerRadius = Math.max(0, finite(chart.config?.pieCornerRadius, 0));\n return {\n of: 'pieGeometry',\n pieGeometry: `${plot.x + plot.width / 2},${plot.y + plot.height / 2},${maxRadius},${innerRadius},${cornerRadius}`,\n };\n}\n\nfunction radarDetail(chart: RadarChart | RadialChart, plot: Plot): FrameDetail {\n const configuredCount = (chart.config?.categories?.filter(Boolean) ?? []).length;\n const dataCount = Math.max(0, ...chart.series.map(series => series.values.length));\n const count = radarCategoryCount(configuredCount, dataCount);\n const radius = radarRadius(plot.width, plot.height, finite(chart.fontSize, 12), chart.showAxisLabels !== false);\n const centerX = plot.x + plot.width / 2;\n const centerY = plot.y + plot.height / 2;\n const curved = chart.chartType === 'radial' ? 1 : 0;\n return {\n of: 'radarGeometry',\n radarGeometry: `${centerX},${centerY},${radius},${chart.axisY.min},${chart.axisY.max},${count},${curved}`,\n };\n}\n\nfunction frameDetail(chart: Chart, plot: Plot): FrameDetail | undefined {\n if (chart.chartType === 'pie') {\n return pieDetail(chart, plot);\n }\n if (chart.chartType === 'polarArea') {\n return polarAreaDetail(chart, plot);\n }\n if (chart.chartType === 'radar' || chart.chartType === 'radial') {\n return radarDetail(chart, plot);\n }\n return CARTESIAN_VALUE_TYPES.has(chart.chartType) ? scaleDetail(chart, plot) : undefined;\n}\n\nexport function buildChartFrame(chart: Chart, bounds: Bounds, plot: Plot, order: number): SceneRect {\n const frame: SceneRect = {\n type: 'rect',\n id: `chart-${chart.id}`,\n order,\n bounds,\n x: chart.x,\n y: chart.y,\n width: chart.width,\n height: chart.height,\n rx: chart.cornerRadius ?? 12,\n style: {\n fill: paint(chart.fillColor ?? '#ffffff', [], chart.id),\n stroke: { kind: 'solid', color: chart.strokeColor ?? '#475569' },\n strokeWidth: finite(chart.strokeWidth, 1),\n },\n };\n const detail = frameDetail(chart, plot);\n if (detail) {\n frame.detail = detail;\n }\n return frame;\n}\n","import type { Chart } from '../../model/chart';\nimport type { RenderDiagnostic, RenderNode } from '../scene';\nimport type { ChartRenderOrder } from './chartRenderOrder';\nimport { buildLegend, type ChartLayout } from './decorations';\n\nexport function buildOrderedChartLegend(\n chart: Chart,\n layout: ChartLayout,\n renderOrder: ChartRenderOrder,\n diagnostics: RenderDiagnostic[],\n): RenderNode[] {\n const nodes = buildLegend({\n chart,\n plot: layout.plot,\n bounds: layout.bounds,\n order: renderOrder.current(),\n diagnostics,\n });\n renderOrder.advance(nodes.length);\n return nodes;\n}\n","import type { TypedChart } from '../../model/chart';\nimport type { RenderDiagnostic } from '../scene';\nimport type { ChartRenderOrder } from './chartRenderOrder';\nimport type { ChartLayout } from './decorations';\nimport type { ChartRenderContext } from './renderers';\n\nexport function createChartRenderContext(\n chart: TypedChart,\n layout: ChartLayout,\n renderOrder: ChartRenderOrder,\n diagnostics: RenderDiagnostic[],\n): ChartRenderContext {\n return {\n chart,\n plot: layout.plot,\n bounds: layout.bounds,\n diagnostics,\n showLabels: layout.showLabels,\n showLegend: layout.showLegend,\n stackedMode: chart.config?.stacked && chart.config.stacked !== 'none' ? chart.config.stacked : undefined,\n nextOrder: renderOrder.next,\n };\n}\n","export class ChartRenderOrder {\n readonly #baseOrder: number;\n #offset = 0.01;\n\n constructor(baseOrder: number) {\n this.#baseOrder = baseOrder;\n }\n\n readonly next = (): number => this.#baseOrder + this.#offset++;\n\n current(): number {\n return this.#baseOrder + this.#offset;\n }\n\n advance(nodeCount: number): void {\n this.#offset += nodeCount;\n }\n}\n","import type { Chart } from '../../model/chart';\nimport type { Bounds, RenderNode } from '../scene';\nimport { finite } from '../scene';\nimport type { ChartRenderOrder } from './chartRenderOrder';\nimport { chartText } from './primitives';\nimport { CHART_TITLE_PROP } from './propPath';\n\nexport function buildChartTitle(\n chart: Chart,\n bounds: Bounds,\n plot: { x: number; width: number },\n renderOrder: ChartRenderOrder,\n): RenderNode[] {\n if (!chart.title) {\n return [];\n }\n\n return [\n {\n ...chartText({\n id: `chart-title-${chart.id}`,\n order: renderOrder.next(),\n bounds,\n frame: { x: plot.x, y: chart.y + 12, width: plot.width, height: 20 },\n text: chart.title,\n chart,\n }),\n ...(chart.titleColor ? { color: chart.titleColor } : {}),\n fontWeight: chart.titleWeight ?? 'bold',\n fontSize: finite(chart.titleSize, Math.max(10, finite(chart.fontSize, 12)) + 2),\n prop: CHART_TITLE_PROP,\n },\n ];\n}\n","import type { Chart } from '../../model/chart';\nimport type { RenderDiagnostic, RenderNode } from '../scene';\n\nimport { buildChartBackdrop } from './chartBackdrop';\nimport { buildChartFrame } from './chartFrame';\nimport { buildOrderedChartLegend } from './chartLegend';\nimport { createChartRenderContext } from './chartRenderContext';\nimport { ChartRenderOrder } from './chartRenderOrder';\nimport { buildChartTitle } from './chartTitle';\nimport { type ChartLayout, decorations } from './decorations';\nimport type { ChartRenderContext } from './renderers';\n\nexport interface ChartFoundation {\n chart: Chart;\n layout: ChartLayout;\n context: ChartRenderContext;\n nodes: RenderNode[];\n renderOrder: ChartRenderOrder;\n}\n\nexport function createChartFoundation(chart: Chart, index: number, diagnostics: RenderDiagnostic[]): ChartFoundation {\n const baseOrder = 20_000 + index;\n const layout = decorations(chart);\n const renderOrder = new ChartRenderOrder(baseOrder);\n const nodes: RenderNode[] = [buildChartFrame(chart, layout.bounds, layout.plot, baseOrder)];\n nodes.push(...buildChartBackdrop(chart, layout.bounds, renderOrder));\n nodes.push(...buildChartTitle(chart, layout.bounds, layout.plot, renderOrder));\n nodes.push(...buildOrderedChartLegend(chart, layout, renderOrder, diagnostics));\n\n return {\n chart,\n layout,\n nodes,\n renderOrder,\n context: createChartRenderContext(chart, layout, renderOrder, diagnostics),\n };\n}\n","import type { RenderNode } from '../scene';\nimport type { ChartFoundation } from './chartFoundation';\nimport { renderChartMarks } from './renderers';\n\nexport function buildPolarChart(foundation: ChartFoundation): RenderNode[] {\n foundation.nodes.push(...renderChartMarks(foundation.context));\n return foundation.nodes;\n}\n","import type { RenderNode } from '../scene';\nimport type { ChartFoundation } from './chartFoundation';\nimport { renderChartMarks } from './renderers';\n\nexport function buildUndecoratedChart(foundation: ChartFoundation): RenderNode[] {\n foundation.nodes.push(...renderChartMarks(foundation.context));\n return foundation.nodes;\n}\n","import type { Chart } from '../../model/chart';\nimport type { RenderDiagnostic, RenderNode } from '../scene';\nimport { buildCartesianChart } from './cartesianChart';\nimport { createChartFoundation } from './chartFoundation';\nimport { hasCartesianDecorations } from './decorations';\nimport { buildPolarChart } from './polarChart';\nimport { isPolarChart } from './renderers';\nimport { buildUndecoratedChart } from './undecoratedChart';\n\nexport function buildChart(chart: Chart, index: number, diagnostics: RenderDiagnostic[]): RenderNode[] {\n if (chart.isVisible === false) {\n return [];\n }\n\n const foundation = createChartFoundation(chart, index, diagnostics);\n if (isPolarChart(chart.chartType)) {\n return buildPolarChart(foundation);\n }\n if (hasCartesianDecorations(chart)) {\n return buildCartesianChart(foundation);\n }\n\n return buildUndecoratedChart(foundation);\n}\n","import type { Chart } from '../../model/chart';\nimport type { RenderDiagnostic, RenderNode } from '../scene';\nimport { tag } from '../scene/tagging';\nimport { buildChart } from './buildChart';\n\nexport function buildCharts(charts: readonly Chart[], diagnostics: RenderDiagnostic[]): RenderNode[] {\n return charts.flatMap((chart, index) =>\n tag(buildChart(chart, index, diagnostics), 'chart', chart.id, chart.chartType, chart.title ?? 'Chart'),\n );\n}\n","import type { RenderInput } from '../../renderInput/types';\nimport { buildContainers } from '../artifacts/containers';\nimport { buildIsometricObjects } from '../artifacts/isometric';\nimport { buildLinks } from '../artifacts/link';\nimport { buildFreeformPaths } from '../artifacts/path';\nimport { buildShapes } from '../artifacts/shape';\nimport { buildWidgets } from '../artifacts/widget';\nimport { buildCharts } from '../charts';\nimport { EMPTY_BOUNDS } from './bounds';\nimport { stackRank, stackSequence } from './order';\nimport type { MeasureTextFactory } from './textMetrics';\nimport type { Bounds, RenderDiagnostic, RenderNode, RenderScene } from './types';\n\nfunction sceneBounds(nodes: RenderNode[]): Bounds {\n if (!nodes.length) {\n return EMPTY_BOUNDS;\n }\n return {\n minX: Math.min(...nodes.map(n => n.bounds.minX)),\n minY: Math.min(...nodes.map(n => n.bounds.minY)),\n maxX: Math.max(...nodes.map(n => n.bounds.maxX)),\n maxY: Math.max(...nodes.map(n => n.bounds.maxY)),\n };\n}\n\ninterface Stacking {\n rank: number;\n sequence: number;\n}\n\nfunction stackingOf(input: RenderInput): Map<string, Stacking> {\n const stacking = new Map<string, Stacking>();\n const add = (\n role: string,\n objects: ReadonlyArray<Parameters<typeof stackRank>[0] & { id: string }>,\n legacyBase: number,\n ): void => {\n objects.forEach((object, index) => {\n stacking.set(`${role}:${object.id}`, {\n rank: stackRank(object),\n sequence: stackSequence(object, legacyBase + index),\n });\n });\n };\n add('frame', input.frames, 0);\n add('swimlane', input.swimlanes, 5_000);\n add('shape', input.shapes, 10_000);\n add('widget', input.widgets ?? [], 10_000);\n add('isometric', input.isometricObjects ?? [], 15_000);\n add(\n 'link',\n input.links.map(item => item.link),\n 20_000,\n );\n add('chart', input.charts ?? [], 20_000);\n add('path', input.paths ?? [], 30_000);\n return stacking;\n}\n\nfunction stampStacking(nodes: RenderNode[], input: RenderInput): void {\n const stacking = stackingOf(input);\n for (const node of nodes) {\n const stack = node.identity ? stacking.get(`${node.identity.role}:${node.identity.id}`) : undefined;\n node.rank = stack?.rank ?? 0;\n node.sequence = stack?.sequence ?? 0;\n }\n}\n\nexport interface BuildRenderSceneOptions {\n measureText?: MeasureTextFactory;\n}\n\nexport function buildRenderScene(input: RenderInput, options: BuildRenderSceneOptions = {}): RenderScene {\n const { measureText } = options;\n const diagnostics: RenderDiagnostic[] = [...(input.diagnostics ?? [])];\n const nodes: RenderNode[] = [\n ...buildContainers(input),\n ...buildFreeformPaths(input.paths ?? []),\n ...buildCharts(input.charts ?? [], diagnostics),\n ...buildLinks(input.links, measureText),\n ...buildShapes(input.shapes, diagnostics, measureText),\n ...buildWidgets(input.widgets ?? []),\n ...buildIsometricObjects(input.isometricObjects ?? []),\n ];\n stampStacking(nodes, input);\n nodes.sort(\n (a, b) =>\n (a.rank ?? 0) - (b.rank ?? 0) ||\n (a.sequence ?? 0) - (b.sequence ?? 0) ||\n a.order - b.order ||\n (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),\n );\n return { nodes, bounds: sceneBounds(nodes), diagnostics };\n}\n","export const xml = (value: unknown): string =>\n String(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nexport const num = (value: number): string => Number(value.toFixed(3)).toString();\n\nexport const safeId = (value: string): string => `sf-${value.replace(/[^A-Za-z0-9_.:-]/g, '-')}`;\n","import type { SceneStyle } from '../renderScene/scene';\nimport { num, safeId, xml } from './format';\n\nexport class SvgClipDefinitions {\n private readonly ids = new Map<string, string>();\n\n constructor(\n private readonly addDefinition: (definition: string) => void,\n private readonly prefix: string,\n ) {}\n\n clip(style: SceneStyle): string | undefined {\n if (!style.clip) {\n return undefined;\n }\n\n const key = JSON.stringify(style.clip);\n let id = this.ids.get(key);\n if (!id) {\n id = safeId(`${this.prefix}clip-${this.ids.size}`);\n this.ids.set(key, id);\n const clip = style.clip;\n const shape =\n clip.type === 'path'\n ? `<path clip-rule=\"evenodd\" d=\"${xml(clip.d)}\"/>`\n : `<rect x=\"${num(clip.x)}\" y=\"${num(clip.y)}\" width=\"${num(clip.width)}\" height=\"${num(clip.height)}\" rx=\"${num(clip.rx)}\"/>`;\n this.addDefinition(`<clipPath id=\"${id}\">${shape}</clipPath>`);\n }\n return id;\n }\n}\n","import type { SceneStyle } from '../renderScene/scene';\nimport { num, safeId, xml } from './format';\n\nexport class SvgFilterDefinitions {\n private readonly ids = new Map<string, string>();\n\n constructor(\n private readonly addDefinition: (definition: string) => void,\n private readonly prefix: string,\n ) {}\n\n filter(style: SceneStyle, nodeId: string, size?: number): string | undefined {\n if (style.innerShadow) {\n return this.define(nodeId, style.innerShadow, innerShadowPrimitives);\n }\n if (style.shadow) {\n const reach = style.shadow.blur * 1.5 + Math.max(Math.abs(style.shadow.dx), Math.abs(style.shadow.dy));\n return this.define(\n nodeId,\n style.shadow,\n outerShadowPrimitives,\n size && size > 0 ? Math.max(0.5, reach / size) : 0.5,\n );\n }\n if (style.blur || style.saturate !== undefined) {\n return this.define(nodeId, { blur: style.blur ?? 0, saturate: style.saturate ?? 1 }, blurPrimitives);\n }\n return undefined;\n }\n\n private define<T>(nodeId: string, value: T, primitives: (value: T) => string, margin = 0.5): string {\n const key = JSON.stringify(value) + primitives.name + margin;\n let id = this.ids.get(key);\n if (!id) {\n id = safeId(`${this.prefix}shadow-${nodeId}-${this.ids.size}`);\n this.ids.set(key, id);\n this.addDefinition(\n `<filter id=\"${id}\" x=\"${num(-margin * 100)}%\" y=\"${num(-margin * 100)}%\" width=\"${num((1 + margin * 2) * 100)}%\" height=\"${num((1 + margin * 2) * 100)}%\">${primitives(value)}</filter>`,\n );\n }\n return id;\n }\n}\n\nfunction outerShadowPrimitives(shadow: NonNullable<SceneStyle['shadow']>): string {\n return `<feDropShadow dx=\"${num(shadow.dx)}\" dy=\"${num(shadow.dy)}\" stdDeviation=\"${num(shadow.blur / 2)}\" flood-color=\"${xml(shadow.color)}\" flood-opacity=\"${num(shadow.opacity)}\"/>`;\n}\n\nfunction blurPrimitives(effect: { blur: number; saturate: number }): string {\n const blur = effect.blur > 0 ? `<feGaussianBlur stdDeviation=\"${num(effect.blur / 2)}\"/>` : '';\n const saturate = effect.saturate === 1 ? '' : `<feColorMatrix type=\"saturate\" values=\"${num(effect.saturate)}\"/>`;\n return blur + saturate;\n}\n\nfunction innerShadowPrimitives(shadow: NonNullable<SceneStyle['shadow']>): string {\n return [\n '<feComponentTransfer in=\"SourceAlpha\" result=\"sf-inverted-alpha\">',\n '<feFuncA type=\"table\" tableValues=\"1 0\"/>',\n '</feComponentTransfer>',\n `<feGaussianBlur in=\"sf-inverted-alpha\" stdDeviation=\"${num(shadow.blur / 2)}\" result=\"sf-blurred\"/>`,\n `<feOffset in=\"sf-blurred\" dx=\"${num(shadow.dx)}\" dy=\"${num(shadow.dy)}\" result=\"sf-offset\"/>`,\n `<feFlood flood-color=\"${xml(shadow.color)}\" flood-opacity=\"${num(shadow.opacity)}\" result=\"sf-color\"/>`,\n '<feComposite in=\"sf-color\" in2=\"sf-offset\" operator=\"in\" result=\"sf-halo\"/>',\n '<feComposite in=\"sf-halo\" in2=\"SourceGraphic\" operator=\"in\" result=\"sf-inset\"/>',\n '<feComposite in=\"sf-inset\" in2=\"SourceGraphic\" operator=\"over\"/>',\n ].join('');\n}\n","import type { MarkerType } from '../model/link';\nimport { num } from './format';\n\nexport function markerBody(\n type: Exclude<MarkerType, 'none'>,\n size: number,\n color: string,\n strokeWidth: number,\n): string {\n const bodies: Record<Exclude<MarkerType, 'none'>, string> = {\n arrow: `<path d=\"M ${num(-size)} ${num(-size * 0.6)} L 0 0 L ${num(-size)} ${num(size * 0.6)}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n filled_arrow: `<path d=\"M ${num(-size)} ${num(-size * 0.6)} L 0 0 L ${num(-size)} ${num(size * 0.6)} Z\" fill=\"${color}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth * 0.5)}\" stroke-linejoin=\"round\"/>`,\n circle: `<circle cx=\"0\" cy=\"0\" r=\"${num(size * 0.5)}\" fill=\"white\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/>`,\n filled_circle: `<circle cx=\"0\" cy=\"0\" r=\"${num(size * 0.5)}\" fill=\"${color}\"/>`,\n diamond: `<path d=\"M ${num(-size * 0.6)} 0 L 0 ${num(-size * 0.6)} L ${num(size * 0.6)} 0 L 0 ${num(size * 0.6)} Z\" fill=\"white\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/>`,\n filled_diamond: `<path d=\"M ${num(-size * 0.6)} 0 L 0 ${num(-size * 0.6)} L ${num(size * 0.6)} 0 L 0 ${num(size * 0.6)} Z\" fill=\"${color}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth * 0.5)}\"/>`,\n bar: `<path d=\"M 0 ${num(-size * 0.6)} V ${num(size * 0.6)}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linecap=\"round\"/>`,\n triangle: `<path d=\"M ${num(-size)} ${num(-size * 0.72)} L 0 0 L ${num(-size)} ${num(size * 0.72)} Z\" fill=\"white\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linejoin=\"round\"/>`,\n one: `<path d=\"M 0 ${num(-size * 0.62)} V ${num(size * 0.62)} M ${num(-size * 0.72)} ${num(-size * 0.62)} V ${num(size * 0.62)}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/>`,\n zero_one: `<circle cx=\"${num(-size * 0.8)}\" cy=\"0\" r=\"${num(size * 0.38)}\" fill=\"white\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/><path d=\"M 0 ${num(-size * 0.62)} V ${num(size * 0.62)}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/>`,\n many: `<path d=\"M ${num(-size)} ${num(-size * 0.72)} L 0 0 M ${num(-size)} 0 L 0 0 M ${num(-size)} ${num(size * 0.72)} L 0 0\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linecap=\"round\"/>`,\n one_many: `<path d=\"M ${num(-size)} ${num(-size * 0.72)} L 0 0 M ${num(-size)} 0 L 0 0 M ${num(-size)} ${num(size * 0.72)} L 0 0 M ${num(-size * 1.45)} ${num(-size * 0.62)} V ${num(size * 0.62)}\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linecap=\"round\"/>`,\n zero_many: `<circle cx=\"${num(-size * 1.45)}\" cy=\"0\" r=\"${num(size * 0.38)}\" fill=\"white\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\"/><path d=\"M ${num(-size)} ${num(-size * 0.72)} L 0 0 M ${num(-size)} 0 L 0 0 M ${num(-size)} ${num(size * 0.72)} L 0 0\" stroke=\"${color}\" stroke-width=\"${num(strokeWidth)}\" stroke-linecap=\"round\"/>`,\n };\n return bodies[type];\n}\n","import type { MarkerType } from '../model/link';\nimport { num, safeId, xml } from './format';\nimport { markerBody } from './markerBodies';\n\nfunction markerExtent(type: Exclude<MarkerType, 'none'>, size: number, strokeWidth: number): number {\n const isCompoundErMarker = type === 'one_many' || type === 'zero_many';\n return Math.max(size * (isCompoundErMarker ? 2 : 1.4), strokeWidth * 2);\n}\n\nfunction markerAttributes(id: string, extent: number): string {\n return `id=\"${id}\" markerWidth=\"${num(extent * 2)}\" markerHeight=\"${num(extent * 2)}\" viewBox=\"${num(-extent)} ${num(-extent)} ${num(extent * 2)} ${num(extent * 2)}\" refX=\"0\" refY=\"0\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\" overflow=\"visible\"`;\n}\n\nexport class SvgMarkerDefinitions {\n private readonly ids = new Map<string, string>();\n\n constructor(\n private readonly addDefinition: (definition: string) => void,\n private readonly prefix: string,\n ) {}\n\n marker(type: MarkerType | undefined, color: string, strokeWidth: number): string | undefined {\n if (!type || type === 'none') {\n return undefined;\n }\n\n const key = `${type}:${color}:${strokeWidth}`;\n let id = this.ids.get(key);\n if (id) {\n return id;\n }\n\n id = safeId(`${this.prefix}marker-${type}-${this.ids.size}`);\n this.ids.set(key, id);\n const size = 12 + (strokeWidth - 2) * 3;\n const extent = markerExtent(type, size, strokeWidth);\n const attributes = markerAttributes(id, extent);\n this.addDefinition(`<marker ${attributes}>${markerBody(type, size, xml(color), strokeWidth)}</marker>`);\n return id;\n }\n}\n","import type { RenderNode, ScenePaint } from '../renderScene/scene';\nimport { num, safeId, xml } from './format';\n\ntype GradientPaint = Exclude<ScenePaint, { kind: 'none' } | { kind: 'solid' }>;\n\nfunction meshGradientDefinition(id: string, paint: Extract<GradientPaint, { kind: 'mesh-gradient' }>): string {\n const radialIds = paint.points.map((_point, index) => safeId(`${id}-point-${index}`));\n const radialDefinitions = paint.points\n .map((point, index) => {\n const centerX = Math.max(0, Math.min(100, point.x));\n const centerY = Math.max(0, Math.min(100, point.y));\n return `<radialGradient id=\"${radialIds[index]}\" gradientUnits=\"objectBoundingBox\" cx=\"${num(centerX)}%\" cy=\"${num(centerY)}%\" r=\"75%\"><stop offset=\"0%\" stop-color=\"${xml(point.color)}\" stop-opacity=\"1\"/><stop offset=\"100%\" stop-color=\"${xml(point.color)}\" stop-opacity=\"0\"/></radialGradient>`;\n })\n .join('');\n const layers = paint.points\n .map((_point, index) => `<rect width=\"1\" height=\"1\" fill=\"url(#${radialIds[index]})\"/>`)\n .join('');\n return `${radialDefinitions}<pattern id=\"${id}\" patternUnits=\"objectBoundingBox\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\"><rect width=\"1\" height=\"1\" fill=\"${xml(paint.points[0]?.color ?? 'transparent')}\"/>${layers}</pattern>`;\n}\n\nfunction linearGradientDefinition(\n id: string,\n paint: Extract<GradientPaint, { kind: 'linear-gradient' }>,\n bounds: RenderNode['bounds'],\n): string {\n const angle = (paint.angle * Math.PI) / 180;\n const centerX = (bounds.minX + bounds.maxX) / 2;\n const centerY = (bounds.minY + bounds.maxY) / 2;\n const radius = Math.max(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY) / 2;\n const deltaX = Math.cos(angle) * radius;\n const deltaY = Math.sin(angle) * radius;\n const stops = paint.stops\n .map(stop => `<stop offset=\"${num(Math.max(0, Math.min(100, stop.offset)))}%\" stop-color=\"${xml(stop.color)}\"/>`)\n .join('');\n return `<linearGradient id=\"${id}\" gradientUnits=\"userSpaceOnUse\" x1=\"${num(centerX - deltaX)}\" y1=\"${num(centerY - deltaY)}\" x2=\"${num(centerX + deltaX)}\" y2=\"${num(centerY + deltaY)}\">${stops}</linearGradient>`;\n}\n\nexport class SvgPaintDefinitions {\n private readonly ids = new Map<string, string>();\n\n constructor(\n private readonly addDefinition: (definition: string) => void,\n private readonly prefix: string,\n ) {}\n\n paint(value: ScenePaint | undefined, nodeId: string, bounds: RenderNode['bounds']): string {\n if (!value || value.kind === 'none') {\n return 'none';\n }\n if (value.kind === 'solid') {\n return value.color;\n }\n\n const key = JSON.stringify(value) + JSON.stringify(bounds);\n let id = this.ids.get(key);\n if (!id) {\n id = safeId(`${this.prefix}gradient-${nodeId}-${this.ids.size}`);\n this.ids.set(key, id);\n const definition =\n value.kind === 'mesh-gradient'\n ? meshGradientDefinition(id, value)\n : linearGradientDefinition(id, value, bounds);\n this.addDefinition(definition);\n }\n return `url(#${id})`;\n }\n}\n","import type { MarkerType } from '../model/link';\nimport type { RenderNode, ScenePaint, SceneStyle } from '../renderScene/scene';\nimport { SvgClipDefinitions } from './clipDefinitions';\nimport { SvgFilterDefinitions } from './filterDefinitions';\nimport { safeId } from './format';\nimport { SvgMarkerDefinitions } from './markerDefinitions';\nimport { SvgPaintDefinitions } from './paintDefinitions';\n\nexport class SvgDefinitionRegistry {\n entries: string[] = [];\n private readonly paints: SvgPaintDefinitions;\n private readonly filters: SvgFilterDefinitions;\n private readonly markers: SvgMarkerDefinitions;\n private readonly clips: SvgClipDefinitions;\n\n constructor(private readonly prefix: string) {\n const addDefinition = (definition: string): void => {\n this.entries.push(definition);\n };\n this.paints = new SvgPaintDefinitions(addDefinition, prefix);\n this.filters = new SvgFilterDefinitions(addDefinition, prefix);\n this.markers = new SvgMarkerDefinitions(addDefinition, prefix);\n this.clips = new SvgClipDefinitions(addDefinition, prefix);\n }\n\n elementId(id: string): string {\n return safeId(`${this.prefix}${id}`);\n }\n\n paint(value: ScenePaint | undefined, nodeId: string, bounds: RenderNode['bounds']): string {\n return this.paints.paint(value, nodeId, bounds);\n }\n\n filter(style: SceneStyle, nodeId: string, size?: number): string | undefined {\n return this.filters.filter(style, nodeId, size);\n }\n\n marker(type: MarkerType | undefined, color: string, strokeWidth: number): string | undefined {\n return this.markers.marker(type, color, strokeWidth);\n }\n\n clip(style: SceneStyle): string | undefined {\n return this.clips.clip(style);\n }\n}\n","import type { RenderNode, ScenePath } from '../renderScene/scene';\n\nconst HIT_WIDTH = 16;\n\nfunction hitAreaFor(path: ScenePath, linkId: string): ScenePath {\n return {\n type: 'path',\n id: `link-hit-${linkId}`,\n order: path.order,\n rank: path.rank,\n sequence: path.sequence,\n bounds: path.bounds,\n d: path.d,\n identity: { role: 'link', id: linkId },\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: '#000000' },\n strokeWidth: HIT_WIDTH,\n opacity: 0,\n pointerEvents: 'stroke',\n },\n };\n}\n\nexport function withLinkHitAreas(nodes: RenderNode[]): RenderNode[] {\n return nodes.flatMap(node =>\n node.type === 'path' && node.identity?.role === 'link' && node.identity.primary\n ? [node, hitAreaFor(node, node.identity.id)]\n : [node],\n );\n}\n","import type { RenderNode, SceneShaderSurface, SceneStyle, SceneText } from '../renderScene/scene';\nimport type { SvgDefinitionRegistry } from './definitions';\nimport { num, xml } from './format';\n\nfunction strokeColorAt(style: SceneStyle, edge: 'start' | 'end'): string {\n const paint = style.stroke;\n if (paint?.kind === 'solid') {\n return paint.color;\n }\n if (paint?.kind === 'linear-gradient' && paint.stops.length) {\n const pick =\n edge === 'start'\n ? paint.stops.reduce((a, b) => (a.offset <= b.offset ? a : b))\n : paint.stops.reduce((a, b) => (a.offset >= b.offset ? a : b));\n return pick.color;\n }\n if (paint?.kind === 'mesh-gradient' && paint.points.length) {\n return paint.points[0].color;\n }\n return '#64748b';\n}\n\ntype StyledRenderNode = Exclude<\n RenderNode,\n SceneText | SceneShaderSurface | Extract<RenderNode, { type: 'rolling-number' | 'image' }>\n>;\n\nexport function styleAttrs(node: StyledRenderNode, defs: SvgDefinitionRegistry): string {\n const stroke = defs.paint(node.style.stroke, `${node.id}-stroke`, node.bounds);\n const fill = defs.paint(node.style.fill, `${node.id}-fill`, node.bounds);\n const attrs = [`fill=\"${xml(fill)}\"`, `stroke=\"${xml(stroke)}\"`];\n addStrokeAttrs(attrs, node.style);\n addVisualEffectAttrs(attrs, node, defs);\n addPathMarkerAttrs(attrs, node, defs);\n return attrs.join(' ');\n}\n\nfunction addStrokeAttrs(attrs: string[], style: SceneStyle): void {\n if (style.strokeWidth !== undefined) {\n attrs.push(`stroke-width=\"${num(style.strokeWidth)}\"`);\n }\n if (style.dash?.length) {\n attrs.push(`stroke-dasharray=\"${style.dash.map(num).join(' ')}\"`);\n }\n if (style.lineCap) {\n attrs.push(`stroke-linecap=\"${style.lineCap}\"`);\n }\n if (style.lineJoin) {\n attrs.push(`stroke-linejoin=\"${style.lineJoin}\"`);\n }\n if (style.opacity !== undefined) {\n attrs.push(`opacity=\"${num(style.opacity)}\"`);\n }\n if (style.pointerEvents) {\n attrs.push(`pointer-events=\"${style.pointerEvents}\"`);\n }\n}\n\nfunction elementSize(node: object): number | undefined {\n const shape = node as { type?: string; rx?: number; ry?: number; width?: number; height?: number };\n if (shape.type === 'ellipse' && shape.rx !== undefined && shape.ry !== undefined) {\n return Math.min(shape.rx, shape.ry) * 2;\n }\n if (shape.type === 'rect' && shape.width !== undefined && shape.height !== undefined) {\n return Math.min(shape.width, shape.height);\n }\n return undefined;\n}\n\nfunction addVisualEffectAttrs(\n attrs: string[],\n node: { id: string; style: SceneStyle },\n defs: SvgDefinitionRegistry,\n): void {\n const filter = defs.filter(node.style, node.id, elementSize(node));\n if (filter) {\n attrs.push(`filter=\"url(#${filter})\"`);\n }\n const clip = defs.clip(node.style);\n if (clip) {\n attrs.push(`clip-path=\"url(#${clip})\"`);\n }\n}\n\nfunction addPathMarkerAttrs(attrs: string[], node: StyledRenderNode, defs: SvgDefinitionRegistry): void {\n if (node.type !== 'path') {\n return;\n }\n const start = defs.marker(node.markerStart, strokeColorAt(node.style, 'start'), node.style.strokeWidth ?? 1);\n const end = defs.marker(node.markerEnd, strokeColorAt(node.style, 'end'), node.style.strokeWidth ?? 1);\n if (start) {\n attrs.push(`marker-start=\"url(#${start})\"`);\n }\n if (end) {\n attrs.push(`marker-end=\"url(#${end})\"`);\n }\n}\n\nexport function transform(rotation?: number, center?: { x: number; y: number }): string {\n return rotation && center ? ` transform=\"rotate(${num(rotation)} ${num(center.x)} ${num(center.y)})\"` : '';\n}\n\nexport function imageAttrs(node: Extract<RenderNode, { type: 'image' }>, defs: SvgDefinitionRegistry): string {\n const attrs: string[] = [];\n if (node.style.opacity !== undefined) {\n attrs.push(`opacity=\"${num(node.style.opacity)}\"`);\n }\n if (node.style.pointerEvents) {\n attrs.push(`pointer-events=\"${node.style.pointerEvents}\"`);\n }\n addVisualEffectAttrs(attrs, node, defs);\n return attrs.join(' ');\n}\n","export const SYMBOL_POINTS_ATTR = 'data-sf-symbol-points';\nexport const SYMBOL_TENSION_ATTR = 'data-sf-symbol-tension';\nexport const SYMBOL_BOUNDS_ATTR = 'data-sf-symbol-bounds';\nexport const CORNER_RADIUS_ATTR = 'data-sf-corner-radius';\nexport const SQUARE_CORNER_ATTR = 'data-sf-square-corner';\nexport const PATH_POINTS_ATTR = 'data-sf-path-points';\nexport const PATH_TENSION_ATTR = 'data-sf-path-tension';\nexport const PATH_CLOSED_ATTR = 'data-sf-path-closed';\nexport const PATH_POINT_INDEX_ATTR = 'data-sf-path-point';\nexport const ISOMETRIC_SIZE_ATTR = 'data-sf-isometric-size';\nexport const ISOMETRIC_LABEL_OFFSET_ATTR = 'data-sf-isometric-label-offset';\n","import type { RenderNode, SceneDetail, SceneIdentity } from '../renderScene/scene';\nimport {\n CORNER_RADIUS_ATTR,\n ISOMETRIC_LABEL_OFFSET_ATTR,\n ISOMETRIC_SIZE_ATTR,\n PATH_CLOSED_ATTR,\n PATH_POINTS_ATTR,\n PATH_TENSION_ATTR,\n SQUARE_CORNER_ATTR,\n SYMBOL_BOUNDS_ATTR,\n SYMBOL_POINTS_ATTR,\n SYMBOL_TENSION_ATTR,\n} from './domContract/attributes';\nimport { num, xml } from './format';\n\nfunction domRole(identity: SceneIdentity): string {\n return identity.role === 'shape' ? 'entity' : identity.role;\n}\n\nfunction identityAttrs(identity: SceneIdentity): Array<string | undefined> {\n return [\n `data-sf-role=\"${domRole(identity)}\"`,\n `data-sf-id=\"${xml(identity.id)}\"`,\n identity.kind ? `data-sf-kind=\"${xml(identity.kind)}\"` : undefined,\n identity.primary ? 'data-sf-primary=\"true\"' : undefined,\n identity.parentFrameId ? `data-sf-parent-frame=\"${xml(identity.parentFrameId)}\"` : undefined,\n ];\n}\n\nfunction detailAttrs(detail: SceneDetail): Array<string | undefined> {\n switch (detail.of) {\n case 'chartValue':\n return chartValueAttrs(detail);\n case 'chartScale':\n return chartScaleAttrs(detail);\n case 'chartSeries':\n return chartSeriesAttrs(detail);\n case 'pieGeometry':\n return pieGeometryAttrs(detail);\n case 'radarGeometry':\n return radarGeometryAttrs(detail);\n case 'link':\n return linkDetailAttrs(detail);\n case 'frameBoundary':\n return frameBoundaryAttrs(detail);\n case 'symbolGeometry':\n return symbolGeometryAttrs(detail);\n case 'declaredBounds':\n return [declaredBoundsAttr(detail.bounds)];\n case 'pathGeometry':\n return pathGeometryAttrs(detail);\n case 'isometricGeometry':\n return isometricGeometryAttrs(detail);\n }\n}\n\nfunction chartValueAttrs(detail: Extract<SceneDetail, { of: 'chartValue' }>): Array<string | undefined> {\n return [\n `data-sf-series=\"${xml(detail.series)}\"`,\n `data-sf-value-index=\"${detail.valueIndex}\"`,\n detail.mark ? `data-sf-mark=\"${detail.mark}\"` : undefined,\n detail.radius !== undefined ? `data-sf-bar-radius=\"${num(detail.radius)}\"` : undefined,\n detail.colorProp ? `data-sf-color-prop=\"${xml(detail.colorProp)}\"` : undefined,\n detail.hasColorOverride ? 'data-sf-color-override=\"true\"' : undefined,\n detail.pieStart !== undefined ? `data-sf-pie-start=\"${num(detail.pieStart)}\"` : undefined,\n detail.pieEnd !== undefined ? `data-sf-pie-end=\"${num(detail.pieEnd)}\"` : undefined,\n detail.pieValue !== undefined ? `data-sf-pie-value=\"${num(detail.pieValue)}\"` : undefined,\n ];\n}\n\nfunction pieGeometryAttrs(detail: Extract<SceneDetail, { of: 'pieGeometry' }>): string[] {\n return [`data-sf-pie-geometry=\"${detail.pieGeometry}\"`];\n}\n\nfunction radarGeometryAttrs(detail: Extract<SceneDetail, { of: 'radarGeometry' }>): string[] {\n return [`data-sf-radar-geometry=\"${detail.radarGeometry}\"`];\n}\n\nfunction chartScaleAttrs(detail: Extract<SceneDetail, { of: 'chartScale' }>): string[] {\n return [`data-sf-value-scale=\"${detail.valueScale}\"`];\n}\n\nfunction chartSeriesAttrs(detail: Extract<SceneDetail, { of: 'chartSeries' }>): Array<string | undefined> {\n return [\n `data-sf-series=\"${xml(detail.series)}\"`,\n detail.lineTension !== undefined ? `data-sf-line-tension=\"${num(detail.lineTension)}\"` : undefined,\n detail.mark ? `data-sf-mark=\"${xml(detail.mark)}\"` : undefined,\n detail.pulled ? 'data-sf-label-pulled=\"true\"' : undefined,\n detail.midAngle !== undefined ? `data-sf-pie-mid-angle=\"${num(detail.midAngle)}\"` : undefined,\n detail.wedgeRadius !== undefined ? `data-sf-pie-wedge-radius=\"${num(detail.wedgeRadius)}\"` : undefined,\n ];\n}\n\nfunction frameBoundaryAttrs(detail: Extract<SceneDetail, { of: 'frameBoundary' }>): string[] {\n return [`${CORNER_RADIUS_ATTR}=\"${num(detail.cornerRadius)}\"`, `${SQUARE_CORNER_ATTR}=\"${detail.squareCorner}\"`];\n}\n\nfunction declaredBoundsAttr(bounds: { x: number; y: number; width: number; height: number }): string {\n return `${SYMBOL_BOUNDS_ATTR}=\"${num(bounds.x)},${num(bounds.y)},${num(bounds.width)},${num(bounds.height)}\"`;\n}\n\nfunction symbolGeometryAttrs(detail: Extract<SceneDetail, { of: 'symbolGeometry' }>): string[] {\n return [\n `${SYMBOL_POINTS_ATTR}=\"${xml(JSON.stringify(detail.points))}\"`,\n `${SYMBOL_TENSION_ATTR}=\"${num(detail.tension)}\"`,\n declaredBoundsAttr(detail.declaredBounds),\n ];\n}\n\nfunction pathGeometryAttrs(detail: Extract<SceneDetail, { of: 'pathGeometry' }>): string[] {\n return [\n `${PATH_POINTS_ATTR}=\"${xml(JSON.stringify(detail.points))}\"`,\n `${PATH_TENSION_ATTR}=\"${num(detail.tension)}\"`,\n `${PATH_CLOSED_ATTR}=\"${detail.closed}\"`,\n ];\n}\n\nfunction isometricGeometryAttrs(detail: Extract<SceneDetail, { of: 'isometricGeometry' }>): string[] {\n return [\n `${ISOMETRIC_SIZE_ATTR}=\"${num(detail.width)},${num(detail.height)},${num(detail.depth)}\"`,\n `${CORNER_RADIUS_ATTR}=\"${num(detail.cornerRadius)}\"`,\n declaredBoundsAttr(detail.bounds),\n `${ISOMETRIC_LABEL_OFFSET_ATTR}=\"${num(detail.labelOffsetX)},${num(detail.labelOffsetY)}\"`,\n ];\n}\n\nfunction linkDetailAttrs(detail: Extract<SceneDetail, { of: 'link' }>): Array<string | undefined> {\n return [\n detail.fromId ? `data-sf-from=\"${xml(detail.fromId)}\"` : undefined,\n detail.toId ? `data-sf-to=\"${xml(detail.toId)}\"` : undefined,\n detail.route ? `data-sf-route=\"${detail.route}\"` : undefined,\n detail.fromSide ? `data-sf-from-side=\"${detail.fromSide}\"` : undefined,\n detail.toSide ? `data-sf-to-side=\"${detail.toSide}\"` : undefined,\n detail.segments ? `data-sf-link-segments=\"${xml(JSON.stringify(detail.segments))}\"` : undefined,\n detail.fromFace ? `data-sf-from-face=\"${detail.fromFace}\"` : undefined,\n detail.toFace ? `data-sf-to-face=\"${detail.toFace}\"` : undefined,\n detail.labelGap ? 'data-sf-label-gap=\"true\"' : undefined,\n ];\n}\n\nexport function contractAttrs(node: RenderNode): string {\n const label = node.identity?.label;\n const attributes = [\n ...(node.identity ? identityAttrs(node.identity) : []),\n ...(node.detail ? detailAttrs(node.detail) : []),\n node.prop ? `data-sf-prop=\"${xml(node.prop)}\"` : undefined,\n node.propKind ? `data-sf-prop-kind=\"${node.propKind}\"` : undefined,\n node.propSolidOnly ? 'data-sf-prop-solid-only=\"true\"' : undefined,\n node.mark ? `data-sf-mark=\"${xml(node.mark)}\"` : undefined,\n node.zoneGradient ? 'data-sf-zone-gradient=\"true\"' : undefined,\n node.zoneGradient ? `data-sf-zone-axis-min=\"${num(node.zoneGradient.min)}\"` : undefined,\n node.zoneGradient ? `data-sf-zone-axis-max=\"${num(node.zoneGradient.max)}\"` : undefined,\n label ? `tabindex=\"0\" aria-label=\"${xml(label.replace(/\\s+/g, ' ').trim())}\"` : undefined,\n ].filter((attribute): attribute is string => attribute !== undefined);\n\n return attributes.length ? ` ${attributes.join(' ')}` : '';\n}\n","import type { SceneText } from '../renderScene/scene';\nimport { transform } from './attributes';\nimport { contractAttrs } from './contract';\nimport type { SvgDefinitionRegistry } from './definitions';\nimport { num, xml } from './format';\n\ntype TextPosition = {\n x: number;\n firstY: number;\n linePx: number;\n anchor: 'start' | 'middle' | 'end';\n};\n\nfunction richLineTspans(\n words: Array<{ text: string; bold: boolean }>,\n x: number,\n dy: string,\n fontSize: string,\n): string {\n if (!words.length) {\n return `<tspan x=\"${num(x)}\"${dy} font-size=\"${fontSize}\"></tspan>`;\n }\n const groups: Array<{ text: string; bold: boolean }> = [];\n for (const word of words) {\n const prev = groups[groups.length - 1];\n if (prev && prev.bold === word.bold) {\n prev.text += ` ${word.text}`;\n } else {\n if (prev) {\n prev.text += ' ';\n }\n groups.push({ text: word.text, bold: word.bold });\n }\n }\n return groups\n .map(\n (group, i) =>\n `<tspan${i === 0 ? ` x=\"${num(x)}\"${dy}` : ''} font-size=\"${fontSize}\" font-weight=\"${group.bold ? 'bold' : 'normal'}\">${xml(group.text)}</tspan>`,\n )\n .join('');\n}\n\nexport function textSvg(node: SceneText, defs: SvgDefinitionRegistry): string {\n const position = textPosition(node);\n const fontSize = `${num(node.fontSize)}px`;\n const content = textContent(node, position, fontSize);\n const preserve = node.richLines ? ' xml:space=\"preserve\"' : '';\n return `<text id=\"${defs.elementId(node.id)}\"${contractAttrs(node)} x=\"${num(position.x)}\" y=\"${num(position.firstY)}\" font-family=\"${xml(node.fontFamily)}\" font-size=\"${fontSize}\" font-weight=\"${node.fontWeight}\"${node.letterSpacing ? ` letter-spacing=\"${num(node.letterSpacing)}\"` : ''} fill=\"${xml(node.color)}\" text-anchor=\"${position.anchor}\" data-sf-valign=\"${node.verticalAlign}\" data-sf-line-height=\"${num(node.lineHeight)}\"${preserve}${transform(node.rotation, node.rotationCenter)}>${content}</text>`;\n}\n\nfunction textPosition(node: SceneText): TextPosition {\n const linePx = node.fontSize * node.lineHeight;\n const lineCount = node.richLines ? node.richLines.length : node.lines.length;\n const contentHeight = lineCount * linePx;\n const x = node.align === 'left' ? node.x : node.align === 'right' ? node.x + node.width : node.x + node.width / 2;\n const anchor = node.align === 'left' ? 'start' : node.align === 'right' ? 'end' : 'middle';\n return { x, firstY: firstTextBaseline(node, contentHeight), linePx, anchor };\n}\n\nfunction firstTextBaseline(node: SceneText, contentHeight: number): number {\n if (node.verticalAlign === 'top') {\n return node.y + node.fontSize;\n }\n if (node.verticalAlign === 'bottom') {\n return node.y + node.height - contentHeight + node.fontSize;\n }\n return node.y + (node.height - contentHeight) / 2 + node.fontSize;\n}\n\nfunction textContent(node: SceneText, position: TextPosition, fontSize: string): string {\n if (node.richLines) {\n return node.richLines\n .map((words, index) => richLineTspans(words, position.x, lineOffset(index, position.linePx), fontSize))\n .join('');\n }\n return node.lines.map((line, index) => lineTspan(line, index, position, fontSize)).join('');\n}\n\nfunction lineTspan(line: string, index: number, position: TextPosition, fontSize: string): string {\n return `<tspan x=\"${num(position.x)}\" font-size=\"${fontSize}\"${lineOffset(index, position.linePx)}>${xml(line)}</tspan>`;\n}\n\nfunction lineOffset(index: number, linePx: number): string {\n return index ? ` dy=\"${num(linePx)}px\"` : '';\n}\n","import type { RenderNode } from '../renderScene/scene';\nimport { imageAttrs, styleAttrs, transform } from './attributes';\nimport { contractAttrs } from './contract';\nimport type { SvgDefinitionRegistry } from './definitions';\nimport { num, xml } from './format';\nimport { textSvg } from './text';\n\nfunction shaderSurfaceSvg(node: Extract<RenderNode, { type: 'shader-surface' }>, defs: SvgDefinitionRegistry): string {\n const rotation = transform(node.rotation, { x: node.x + node.width / 2, y: node.y + node.height / 2 });\n const parameters = xml(JSON.stringify(node.shader.parameters));\n const fillColor = node.fillColor ? ` data-sf-shader-fill=\"${xml(node.fillColor)}\"` : '';\n return `<foreignObject id=\"${defs.elementId(node.id)}\"${contractAttrs(node)} data-sf-shader=\"${xml(node.shader.program)}\" data-sf-shader-name=\"${xml(node.shader.name)}\" data-sf-shader-params=\"${parameters}\" data-sf-shader-mask=\"${node.mask}\"${fillColor} x=\"${num(node.x)}\" y=\"${num(node.y)}\" width=\"${num(node.width)}\" height=\"${num(node.height)}\"${rotation} pointer-events=\"${node.shader.program === 'ruler' ? 'all' : 'none'}\"><canvas xmlns=\"http://www.w3.org/1999/xhtml\" data-sf-shader-canvas=\"true\" style=\"display:block;width:100%;height:100%;pointer-events:none\"></canvas></foreignObject>`;\n}\n\nfunction rollingDigitSvg(character: string, node: Extract<RenderNode, { type: 'rolling-number' }>): string {\n const style = node.widgetStyle;\n if (style.variant === 'plain') {\n return `<span xmlns=\"http://www.w3.org/1999/xhtml\" data-sf-rolling-digit=\"true\" style=\"position:relative;display:inline-block;width:.62em;height:1.1em;overflow:hidden\"><span data-sf-rolling-current=\"true\" style=\"position:absolute;inset:0;display:grid;place-items:center;color:${xml(style.color)};font-weight:${xml(style.fontWeight)};line-height:1\">${xml(character)}</span></span>`;\n }\n return `<span xmlns=\"http://www.w3.org/1999/xhtml\" data-sf-rolling-digit=\"true\" style=\"position:relative;display:inline-block;width:.72em;height:1.2em;overflow:hidden;border:1px solid ${xml(style.divider)};border-radius:.09em;background:${xml(style.surface)};box-shadow:inset 0 1px 0 rgba(255,255,255,.7),inset 0 -.16em .38em rgba(0,0,0,.12)\"><span data-sf-rolling-current=\"true\" style=\"position:absolute;inset:0;display:grid;place-items:center;color:${xml(style.color)};font-weight:300;line-height:1\">${xml(character)}</span><span style=\"position:absolute;z-index:2;left:0;right:0;top:50%;height:1px;background:${xml(style.divider)};pointer-events:none\"></span></span>`;\n}\n\nfunction rollingNumberSvg(node: Extract<RenderNode, { type: 'rolling-number' }>, defs: SvgDefinitionRegistry): string {\n const rotation = transform(node.rotation, { x: node.x + node.width / 2, y: node.y + node.height / 2 });\n const fontSize = Math.max(1, Math.min(node.width, node.height) * 0.28);\n const label = node.label\n ? `<span xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin-bottom:.14em;color:${xml(node.widgetStyle.labelColor)};font-size:.16em;font-weight:600;letter-spacing:.24em;line-height:1\">${xml(node.label)}</span>`\n : '';\n const digits = [...node.value].map(character => rollingDigitSvg(character, node)).join('');\n const widgetStyle = xml(JSON.stringify(node.widgetStyle));\n return `<foreignObject id=\"${defs.elementId(node.id)}\"${contractAttrs(node)} data-sf-widget=\"rollingNumber\" data-sf-widget-value=\"${xml(node.value)}\" data-sf-widget-digits=\"${node.digits ?? ''}\" data-sf-widget-duration=\"${num(node.duration)}\" data-sf-widget-style=\"${widgetStyle}\" x=\"${num(node.x)}\" y=\"${num(node.y)}\" width=\"${num(node.width)}\" height=\"${num(node.height)}\"${rotation}><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:${xml(node.widgetStyle.fontFamily)};font-size:${num(fontSize)}px\">${label}<div data-sf-rolling-digits=\"true\" aria-label=\"${xml(node.value)}\" style=\"display:flex;gap:${node.widgetStyle.variant === 'plain' ? '.02em' : '.1em'};font-size:1em\">${digits}</div></div></foreignObject>`;\n}\n\nexport function nodeSvg(node: RenderNode, defs: SvgDefinitionRegistry): string {\n if (node.type === 'text') {\n return textSvg(node, defs);\n }\n if (node.type === 'shader-surface') {\n return shaderSurfaceSvg(node, defs);\n }\n if (node.type === 'rolling-number') {\n return rollingNumberSvg(node, defs);\n }\n if (node.type === 'image') {\n return `<image id=\"${defs.elementId(node.id)}\"${contractAttrs(node)} ${imageAttrs(node, defs)} href=\"${xml(node.href)}\" x=\"${num(node.x)}\" y=\"${num(node.y)}\" width=\"${num(node.width)}\" height=\"${num(node.height)}\" preserveAspectRatio=\"xMidYMid slice\"/>`;\n }\n const attrs = `id=\"${defs.elementId(node.id)}\"${contractAttrs(node)} ${styleAttrs(node, defs)}`;\n if (node.type === 'rect') {\n return `<rect ${attrs} x=\"${num(node.x)}\" y=\"${num(node.y)}\" width=\"${num(node.width)}\" height=\"${num(node.height)}\"${node.rx ? ` rx=\"${num(node.rx)}\"` : ''}${transform(node.rotation, { x: node.x + node.width / 2, y: node.y + node.height / 2 })}/>`;\n }\n if (node.type === 'ellipse') {\n return `<ellipse ${attrs} cx=\"${num(node.cx)}\" cy=\"${num(node.cy)}\" rx=\"${num(node.rx)}\" ry=\"${num(node.ry)}\"${transform(node.rotation, { x: node.cx, y: node.cy })}/>`;\n }\n return `<path ${attrs} d=\"${xml(node.d)}\"${transform(node.rotation, node.rotationCenter)}/>`;\n}\n","import type { RenderScene } from '../renderScene/scene';\nimport { SvgDefinitionRegistry } from './definitions';\nimport { DOM_CONTRACT_VERSION } from './domContract/version';\nimport { num } from './format';\nimport { withLinkHitAreas } from './linkHitAreas';\nimport { nodeSvg } from './nodes';\nimport type { SvgRenderOptions, SvgRenderResult } from './types';\n\nexport function renderSvgDocument(scene: RenderScene, options: SvgRenderOptions = {}): SvgRenderResult {\n const padding = options.padding ?? 16;\n const width = Math.max(1, scene.bounds.maxX - scene.bounds.minX + padding * 2);\n const height = Math.max(1, scene.bounds.maxY - scene.bounds.minY + padding * 2);\n const viewBox = `${num(scene.bounds.minX - padding)} ${num(scene.bounds.minY - padding)} ${num(width)} ${num(height)}`;\n const defs = new SvgDefinitionRegistry(options.idPrefix ? `${options.idPrefix}-` : '');\n const nodes = options.linkHitAreas ? withLinkHitAreas(scene.nodes) : scene.nodes;\n const body = nodes.map(node => nodeSvg(node, defs)).join('\\n ');\n const declaration = options.includeXmlDeclaration === false ? '' : '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n const svg = `${declaration}<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${num(width)}px\" height=\"${num(height)}px\" viewBox=\"${viewBox}\" role=\"img\" data-sf-contract=\"${DOM_CONTRACT_VERSION}\">\\n <defs>${defs.entries.join('')}</defs>\\n ${body}\\n</svg>`;\n return { svg, width, height, diagnostics: scene.diagnostics };\n}\n","import type { RenderScene } from '../renderScene/scene';\nimport { renderSvgDocument } from './document';\nimport type { SvgRenderOptions, SvgRenderResult } from './types';\n\nexport type { SvgRenderOptions, SvgRenderResult } from './types';\n\nexport function renderSceneToSvg(scene: RenderScene, options: SvgRenderOptions = {}): SvgRenderResult {\n return renderSvgDocument(scene, options);\n}\n","import { sflToRenderInput } from './renderInput/fromSfl';\nimport type { RenderInput } from './renderInput/types';\nimport type { MeasureTextFactory, RenderDiagnostic, RenderScene } from './renderScene/scene';\nimport { buildRenderScene } from './renderScene/scene/build';\nimport { renderSceneToSvg } from './svg';\n\nexport interface RenderResult {\n svg: string;\n width: number;\n height: number;\n diagnostics: RenderDiagnostic[];\n scene: RenderScene;\n}\n\nexport interface RenderOptions {\n padding?: number;\n includeXmlDeclaration?: boolean;\n idPrefix?: string;\n measureText?: MeasureTextFactory;\n linkHitAreas?: boolean;\n}\n\nexport function renderCanvas(input: RenderInput, options: RenderOptions = {}): RenderResult {\n const scene = buildRenderScene(input, { measureText: options.measureText });\n const { svg, width, height, diagnostics } = renderSceneToSvg(scene, options);\n return { svg, width, height, diagnostics, scene };\n}\n\nconst SCENE_CACHE_LIMIT = 50;\nconst sceneCache = new Map<string, RenderScene>();\n\nfunction cachedRenderScene(source: string): RenderScene {\n const cached = sceneCache.get(source);\n if (cached) {\n sceneCache.delete(source);\n sceneCache.set(source, cached);\n return cached;\n }\n const scene = buildRenderScene(sflToRenderInput(source));\n sceneCache.set(source, scene);\n if (sceneCache.size > SCENE_CACHE_LIMIT) {\n const oldest = sceneCache.keys().next().value;\n if (oldest !== undefined) {\n sceneCache.delete(oldest);\n }\n }\n return scene;\n}\n\nexport function render(source: string, options: RenderOptions = {}): RenderResult {\n if (options.measureText) {\n return renderCanvas(sflToRenderInput(source), options);\n }\n const scene = cachedRenderScene(source);\n const { svg, width, height, diagnostics } = renderSceneToSvg(scene, options);\n return { svg, width, height, diagnostics, scene };\n}\n","const CAMERA_OWNED_ATTRIBUTES = new Set(['viewbox', 'width', 'height']);\n\nexport function patchRootAttributes(svg: SVGSVGElement, next: SVGSVGElement): void {\n for (const attribute of Array.from(svg.attributes)) {\n if (!CAMERA_OWNED_ATTRIBUTES.has(attribute.name.toLowerCase())) {\n svg.removeAttribute(attribute.name);\n }\n }\n for (const attribute of Array.from(next.attributes)) {\n if (!CAMERA_OWNED_ATTRIBUTES.has(attribute.name.toLowerCase())) {\n svg.setAttribute(attribute.name, attribute.value);\n }\n }\n}\n","import type { SceneDiff } from './types';\n\nexport function classifySceneDiff(\n oldOwnerIds: ReadonlySet<string>,\n newOwnerIds: ReadonlySet<string>,\n touchedOwnerIds: ReadonlySet<string>,\n): SceneDiff {\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n for (const id of touchedOwnerIds) {\n const wasPresent = oldOwnerIds.has(id);\n const isPresent = newOwnerIds.has(id);\n if (isPresent && !wasPresent) {\n added.push(id);\n } else if (wasPresent && !isPresent) {\n removed.push(id);\n } else if (wasPresent && isPresent) {\n changed.push(id);\n }\n }\n return { added, removed, changed };\n}\n","export function patchDefinitions(svg: SVGSVGElement, next: SVGSVGElement): Element | null {\n const currentDefinitions = svg.querySelector(':scope > defs');\n const nextDefinitions = next.querySelector(':scope > defs');\n if (nextDefinitions) {\n if (currentDefinitions) {\n currentDefinitions.replaceWith(nextDefinitions);\n } else {\n svg.insertBefore(nextDefinitions, svg.firstChild);\n }\n return nextDefinitions;\n }\n currentDefinitions?.remove();\n return currentDefinitions;\n}\n","function patchAttributes(current: Element, next: Element): boolean {\n let changed = false;\n for (const attribute of Array.from(current.attributes)) {\n if (!next.hasAttribute(attribute.name)) {\n current.removeAttribute(attribute.name);\n changed = true;\n }\n }\n for (const attribute of Array.from(next.attributes)) {\n if (current.getAttribute(attribute.name) !== attribute.value) {\n current.setAttribute(attribute.name, attribute.value);\n changed = true;\n }\n }\n return changed;\n}\n\nfunction childrenEqual(a: Element, b: Element): boolean {\n const aChildren = Array.from(a.childNodes);\n const bChildren = Array.from(b.childNodes);\n if (aChildren.length !== bChildren.length) {\n return false;\n }\n for (let i = 0; i < aChildren.length; i++) {\n const x = aChildren[i];\n const y = bChildren[i];\n if (x.nodeType !== y.nodeType) {\n return false;\n }\n if (x.nodeType === Node.TEXT_NODE) {\n if (x.textContent !== y.textContent) {\n return false;\n }\n continue;\n }\n if (x.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n const xElement = x as Element;\n const yElement = y as Element;\n if (xElement.tagName !== yElement.tagName) {\n return false;\n }\n if (xElement.attributes.length !== yElement.attributes.length) {\n return false;\n }\n for (const attribute of Array.from(xElement.attributes)) {\n if (yElement.getAttribute(attribute.name) !== attribute.value) {\n return false;\n }\n }\n if (!childrenEqual(xElement, yElement)) {\n return false;\n }\n }\n return true;\n}\n\nfunction replaceTextContent(current: Element, next: Element): void {\n while (current.firstChild) {\n current.removeChild(current.firstChild);\n }\n while (next.firstChild) {\n current.appendChild(next.firstChild);\n }\n}\n\nexport function patchSceneElement(current: Element, next: Element): boolean {\n const widgetRestyled =\n next.hasAttribute('data-sf-widget') &&\n (current.getAttribute('data-sf-widget-style') !== next.getAttribute('data-sf-widget-style') ||\n current.getAttribute('data-sf-widget-value') !== next.getAttribute('data-sf-widget-value'));\n const attributesChanged = patchAttributes(current, next);\n let contentChanged = false;\n if (widgetRestyled) {\n contentChanged = true;\n replaceTextContent(current, next);\n }\n if (next.tagName.toLowerCase() === 'text' && !childrenEqual(current, next)) {\n contentChanged = true;\n replaceTextContent(current, next);\n }\n return attributesChanged || contentChanged;\n}\n","import { classifySceneDiff } from './classifySceneDiff';\nimport { patchDefinitions } from './definitionsPatch';\nimport { patchSceneElement } from './elementPatch';\nimport type { SceneDiff } from './types';\n\nfunction ownerIdOf(element: Element): string {\n return element.getAttribute('data-sf-id') ?? element.id;\n}\n\nfunction currentElementsById(svg: SVGSVGElement): Map<string, Element> {\n const elements = new Map<string, Element>();\n for (const element of svg.querySelectorAll(':scope > [id]')) {\n elements.set(element.id, element);\n }\n return elements;\n}\n\nfunction reusableElement(current: Element | undefined, next: Element, markTouched: (ownerId: string) => void): Element {\n if (current && current.tagName === next.tagName) {\n if (patchSceneElement(current, next)) {\n markTouched(ownerIdOf(next));\n }\n return current;\n }\n current?.remove();\n markTouched(ownerIdOf(next));\n return next;\n}\n\nfunction placeAfter(svg: SVGSVGElement, element: Element, previousSibling: Node | null): void {\n const wantedNext = previousSibling ? previousSibling.nextSibling : svg.firstChild;\n if (wantedNext !== element) {\n svg.insertBefore(element, wantedNext);\n }\n}\n\nexport function patchSceneNodes(svg: SVGSVGElement, next: SVGSVGElement): SceneDiff {\n const definitions = patchDefinitions(svg, next);\n const currentById = currentElementsById(svg);\n const retainedIds = new Set<string>();\n\n const oldOwnerIds = new Set<string>();\n for (const element of currentById.values()) {\n oldOwnerIds.add(ownerIdOf(element));\n }\n const newOwnerIds = new Set<string>();\n const touchedOwnerIds = new Set<string>();\n const markTouched = (ownerId: string): void => {\n touchedOwnerIds.add(ownerId);\n };\n\n let previousSibling: Node | null = definitions;\n for (const nextElement of next.querySelectorAll(':scope > [id]')) {\n retainedIds.add(nextElement.id);\n newOwnerIds.add(ownerIdOf(nextElement));\n const liveElement = reusableElement(currentById.get(nextElement.id), nextElement, markTouched);\n placeAfter(svg, liveElement, previousSibling);\n previousSibling = liveElement;\n }\n\n for (const [id, element] of currentById) {\n if (!retainedIds.has(id)) {\n touchedOwnerIds.add(ownerIdOf(element));\n element.remove();\n }\n }\n\n return classifySceneDiff(oldOwnerIds, newOwnerIds, touchedOwnerIds);\n}\n","import { patchRootAttributes } from './rootAttributesPatch';\nimport { patchSceneNodes } from './sceneNodesPatch';\nimport type { SceneDiff } from './types';\n\nexport function patchDisplayContent(svg: SVGSVGElement, next: SVGSVGElement): SceneDiff {\n patchRootAttributes(svg, next);\n return patchSceneNodes(svg, next);\n}\n","import type { ViewBox } from './types';\n\nexport function parseSvg(svgString: string): SVGSVGElement {\n const document = new DOMParser().parseFromString(svgString, 'image/svg+xml');\n const root = document.documentElement as unknown as SVGSVGElement;\n if (root.nodeName.toLowerCase() !== 'svg') {\n throw new Error('viewer: source did not parse to an <svg> root');\n }\n return root;\n}\n\nexport function readViewBox(svg: SVGSVGElement): ViewBox {\n const values = (svg.getAttribute('viewBox') ?? '0 0 100 100').split(/\\s+/).map(Number);\n return { x: values[0], y: values[1], w: values[2], h: values[3] };\n}\n","import type { ViewBox } from './types';\n\nexport class ViewportController {\n readonly #svg: SVGSVGElement;\n #natural: ViewBox;\n #view: ViewBox;\n\n constructor(svg: SVGSVGElement, natural: ViewBox) {\n this.#svg = svg;\n this.#natural = natural;\n this.#view = { ...natural };\n }\n\n apply(): void {\n this.#svg.setAttribute('viewBox', `${this.#view.x} ${this.#view.y} ${this.#view.w} ${this.#view.h}`);\n }\n\n fit(): void {\n this.#view = { ...this.#natural };\n this.apply();\n }\n\n get(): ViewBox {\n return { ...this.#view };\n }\n\n setNatural(natural: ViewBox): void {\n this.#natural = natural;\n }\n\n zoomBy(factor: number, clientX?: number, clientY?: number): void {\n const rect = this.#svg.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return;\n }\n const centerX = clientX ?? rect.left + rect.width / 2;\n const centerY = clientY ?? rect.top + rect.height / 2;\n const worldX = this.#view.x + ((centerX - rect.left) / rect.width) * this.#view.w;\n const worldY = this.#view.y + ((centerY - rect.top) / rect.height) * this.#view.h;\n this.#view = { w: this.#view.w / factor, h: this.#view.h / factor, x: 0, y: 0 };\n this.#view.x = worldX - ((centerX - rect.left) / rect.width) * this.#view.w;\n this.#view.y = worldY - ((centerY - rect.top) / rect.height) * this.#view.h;\n this.apply();\n }\n\n panBy(dxPixels: number, dyPixels: number): void {\n const rect = this.#svg.getBoundingClientRect();\n const pixelsPerUnit = rect.width > 0 ? rect.width / this.#view.w : 1;\n this.#view.x -= dxPixels / pixelsPerUnit;\n this.#view.y -= dyPixels / pixelsPerUnit;\n this.apply();\n }\n}\n","import { patchDisplayContent } from './scenePatch';\nimport { parseSvg, readViewBox } from './svgDocument';\nimport type { DisplayHandle, ViewBox } from './types';\nimport { ViewportController } from './viewport';\n\nexport { classifySceneDiff } from './classifySceneDiff';\nexport type { DisplayHandle, SceneDiff, ViewBox } from './types';\n\nexport function mountDisplay(container: HTMLElement, svgString: string): DisplayHandle {\n const svg = parseSvg(svgString);\n svg.setAttribute('width', '100%');\n svg.setAttribute('height', '100%');\n svg.style.display = 'block';\n svg.style.touchAction = 'none';\n const viewport = new ViewportController(svg, readViewBox(svg));\n container.appendChild(svg);\n viewport.apply();\n return {\n svg,\n fit: () => viewport.fit(),\n getViewport: (): ViewBox => viewport.get(),\n zoomBy: (factor, clientX, clientY) => viewport.zoomBy(factor, clientX, clientY),\n panBy: (dxPixels, dyPixels) => viewport.panBy(dxPixels, dyPixels),\n updateContent(nextSvgString) {\n const next = parseSvg(nextSvgString);\n const diff = patchDisplayContent(svg, next);\n viewport.setNatural(readViewBox(next));\n return diff;\n },\n destroy() {\n svg.remove();\n },\n };\n}\n","export type Unsubscribe = () => void;\n\nexport class Emitter<EventMap extends object> {\n private handlers = new Map<keyof EventMap, Set<(event: never) => void>>();\n\n on<T extends keyof EventMap>(name: T, handler: (event: EventMap[T]) => void): Unsubscribe {\n const eventHandlers = this.handlers.get(name) ?? new Set<(event: never) => void>();\n this.handlers.set(name, eventHandlers);\n\n const storedHandler = handler as (event: never) => void;\n eventHandlers.add(storedHandler);\n return () => eventHandlers.delete(storedHandler);\n }\n\n emit<T extends keyof EventMap>(name: T, event: EventMap[T]): void {\n const registered = this.handlers.get(name);\n if (registered === undefined) {\n return;\n }\n\n for (const handler of [...registered]) {\n try {\n (handler as (event: EventMap[T]) => void)(event);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n","import type { Modifiers, OwnerRef } from '../dom';\nimport { Emitter as GenericEmitter, type Unsubscribe } from '../eventing/emitter';\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\nexport type { Modifiers, OwnerRef };\n\nexport interface OwnerPointerEvent {\n diagramId: string;\n owner: OwnerRef;\n modifiers: Modifiers;\n}\n\nexport interface SelectionChangeEvent {\n diagramId: string;\n selection: OwnerRef[];\n}\n\nexport interface ViewerErrorEvent {\n diagramId: string;\n code: 'contract-mismatch' | 'render-failed' | 'no-svg';\n message: string;\n}\n\nexport interface SceneDiffEvent {\n diagramId: string;\n added: string[];\n removed: string[];\n changed: string[];\n}\n\nexport interface ViewerEventMap {\n ready: { diagramId: string };\n canvasObjectClick: OwnerPointerEvent;\n linkClick: OwnerPointerEvent;\n ownerHover: OwnerPointerEvent | { diagramId: string; owner: null };\n selectionChange: SelectionChangeEvent;\n sceneDiff: SceneDiffEvent;\n error: ViewerErrorEvent;\n}\n\nexport type ViewerEventName = keyof ViewerEventMap;\nexport type ViewerEventHandler<T extends ViewerEventName> = (event: ViewerEventMap[T]) => void;\nexport type { Unsubscribe };\n\nexport const NO_MODIFIERS: Modifiers = { shift: false, ctrl: false, meta: false, alt: false };\n\nexport function ownerPointerEvent(diagramId: string, owner: OwnerRef, modifiers: Modifiers): OwnerPointerEvent {\n return { diagramId, owner, modifiers };\n}\n\nexport class Emitter extends GenericEmitter<ViewerEventMap> {}\n","import { readViewBox } from '../display/svgDocument';\nimport type { ViewerImageExportOptions } from './types';\n\nfunction positive(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction loadImage(document: Document, source: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const ImageConstructor = document.defaultView?.Image;\n if (!ImageConstructor) {\n reject(new Error('viewer export: Image is unavailable in this environment.'));\n return;\n }\n const image = new ImageConstructor();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('viewer export: the SVG snapshot could not be decoded.'));\n image.src = source;\n });\n}\n\nfunction canvasBlob(canvas: HTMLCanvasElement, mimeType: string, quality: number | undefined): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n blob => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(`viewer export: ${mimeType} encoding failed.`));\n }\n },\n mimeType,\n quality,\n );\n });\n}\n\nexport async function rasterizeSvgSnapshot(\n svg: SVGSVGElement,\n snapshot: string,\n options: ViewerImageExportOptions = {},\n): Promise<Blob> {\n const viewBox = readViewBox(svg);\n const scale = positive(options.scale, 1);\n const width = Math.max(1, Math.round(viewBox.w * scale));\n const height = Math.max(1, Math.round(viewBox.h * scale));\n const canvas = svg.ownerDocument.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('viewer export: a 2D canvas context is unavailable.');\n }\n const blob = new Blob([snapshot], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n const image = await loadImage(svg.ownerDocument, url);\n const background = options.backgroundColor ?? (options.format === 'jpeg' ? '#ffffff' : undefined);\n if (background) {\n context.fillStyle = background;\n context.fillRect(0, 0, width, height);\n }\n context.drawImage(image, 0, 0, width, height);\n const mimeType = options.format === 'jpeg' ? 'image/jpeg' : 'image/png';\n return await canvasBlob(canvas, mimeType, options.quality);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n","import { DEFAULT_ROLLING_NUMBER_STYLE, type RollingNumberWidgetStyle } from '../../../model/widget';\n\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nfunction copyAttributes(source: Element, target: Element): void {\n for (const attribute of source.attributes) {\n if (!attribute.name.startsWith('data-sf-shader')) {\n target.setAttribute(attribute.name, attribute.value);\n }\n }\n}\n\nfunction removeRuntimeOverlays(svg: SVGSVGElement): void {\n for (const overlay of svg.querySelectorAll(\n '[data-sf-selection-overlay], [data-sf-change-overlay], [id*=\"link-hit-\"]',\n )) {\n overlay.remove();\n }\n}\n\nfunction svgElement(document: Document, name: string, attributes: Record<string, string | number>): SVGElement {\n const element = document.createElementNS(SVG_NAMESPACE, name);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n return element;\n}\n\nfunction readWidgetStyle(surface: Element): Required<RollingNumberWidgetStyle> {\n try {\n return {\n ...DEFAULT_ROLLING_NUMBER_STYLE,\n ...(JSON.parse(surface.getAttribute('data-sf-widget-style') ?? '{}') as RollingNumberWidgetStyle),\n };\n } catch {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n}\n\ninterface Cells {\n size: number;\n plain: boolean;\n cellWidth: number;\n cellHeight: number;\n gap: number;\n}\n\ninterface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nfunction cellsOf(box: Box, plain: boolean): Cells {\n const size = Math.max(1, Math.min(box.width, box.height) * 0.28);\n return {\n size,\n plain,\n cellWidth: plain ? size * 0.62 : size * 0.72 + 2,\n cellHeight: plain ? size * 1.1 : size * 1.2 + 2,\n gap: size * (plain ? 0.02 : 0.1),\n };\n}\n\nfunction groupOf(document: Document, surface: Element, style: Required<RollingNumberWidgetStyle>): SVGElement {\n const group = svgElement(document, 'g', { 'font-family': style.fontFamily });\n for (const attribute of ['id', 'transform', 'data-sf-id', 'data-sf-role', 'data-sf-kind']) {\n const attributeValue = surface.getAttribute(attribute);\n if (attributeValue !== null) {\n group.setAttribute(attribute, attributeValue);\n }\n }\n return group;\n}\n\nfunction labelText(\n document: Document,\n label: string,\n box: Box,\n top: number,\n cells: Cells,\n style: Required<RollingNumberWidgetStyle>,\n): SVGElement {\n const text = svgElement(document, 'text', {\n x: box.x + box.width / 2,\n y: top - cells.size * 0.14,\n 'text-anchor': 'middle',\n 'font-size': cells.size * 0.16,\n 'font-weight': 600,\n 'letter-spacing': cells.size * 0.04,\n fill: style.labelColor,\n });\n text.textContent = label;\n return text;\n}\n\nfunction digitCell(\n document: Document,\n character: string,\n cellX: number,\n top: number,\n cells: Cells,\n style: Required<RollingNumberWidgetStyle>,\n): SVGElement[] {\n const { size, plain, cellWidth, cellHeight } = cells;\n const nodes: SVGElement[] = [];\n if (!plain) {\n nodes.push(\n svgElement(document, 'rect', {\n x: cellX + 0.5,\n y: top + 0.5,\n width: cellWidth - 1,\n height: cellHeight - 1,\n rx: size * 0.09,\n fill: style.surface,\n stroke: style.divider,\n 'stroke-width': 1,\n }),\n );\n }\n const digit = svgElement(document, 'text', {\n x: cellX + cellWidth / 2,\n y: top + cellHeight / 2,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'central',\n 'font-size': size,\n 'font-weight': style.fontWeight,\n fill: style.color,\n });\n digit.textContent = character;\n nodes.push(digit);\n if (!plain) {\n nodes.push(\n svgElement(document, 'line', {\n x1: cellX + 0.5,\n x2: cellX + cellWidth - 0.5,\n y1: top + cellHeight / 2,\n y2: top + cellHeight / 2,\n stroke: style.divider,\n 'stroke-width': 1,\n }),\n );\n }\n return nodes;\n}\n\nfunction flattenRollingNumbers(svg: SVGSVGElement): void {\n const document = svg.ownerDocument;\n for (const surface of svg.querySelectorAll('foreignObject[data-sf-widget=\"rollingNumber\"]')) {\n const box: Box = {\n x: Number(surface.getAttribute('x')),\n y: Number(surface.getAttribute('y')),\n width: Number(surface.getAttribute('width')),\n height: Number(surface.getAttribute('height')),\n };\n const value = surface.getAttribute('data-sf-widget-value') ?? '';\n const style = readWidgetStyle(surface);\n const label = surface.querySelector('div > span:not([data-sf-rolling-digit])')?.textContent ?? '';\n const cells = cellsOf(box, style.variant === 'plain');\n const labelBlock = label ? cells.size * 0.3 : 0;\n const rowWidth = value.length * cells.cellWidth + Math.max(0, value.length - 1) * cells.gap;\n const left = box.x + (box.width - rowWidth) / 2;\n const top = box.y + (box.height - (labelBlock + cells.cellHeight)) / 2 + labelBlock;\n const group = groupOf(document, surface, style);\n if (label) {\n group.appendChild(labelText(document, label, box, top, cells, style));\n }\n [...value].forEach((character, index) => {\n const cellX = left + index * (cells.cellWidth + cells.gap);\n for (const node of digitCell(document, character, cellX, top, cells, style)) {\n group.appendChild(node);\n }\n });\n surface.replaceWith(group);\n }\n}\n\nexport function freezeShaderSurfaces(svg: SVGSVGElement, captures: readonly (string | undefined)[]): SVGSVGElement {\n const clone = svg.cloneNode(true) as SVGSVGElement;\n removeRuntimeOverlays(clone);\n const surfaces = [...clone.querySelectorAll<SVGForeignObjectElement>('foreignObject[data-sf-shader]')];\n surfaces.forEach((surface, index) => {\n const capture = captures[index];\n if (!capture) {\n surface.remove();\n return;\n }\n const image = clone.ownerDocument.createElementNS(SVG_NAMESPACE, 'image');\n copyAttributes(surface, image);\n image.setAttribute('href', capture);\n image.setAttribute('preserveAspectRatio', 'none');\n surface.replaceWith(image);\n });\n flattenRollingNumbers(clone);\n const viewBox = (clone.getAttribute('viewBox') ?? '').split(/\\s+/).map(Number);\n if (viewBox.length === 4 && viewBox.every(Number.isFinite)) {\n clone.setAttribute('width', String(viewBox[2]));\n clone.setAttribute('height', String(viewBox[3]));\n }\n clone.setAttribute('xmlns', SVG_NAMESPACE);\n return clone;\n}\n\nexport function serializeSvgSnapshot(svg: SVGSVGElement, captures: readonly (string | undefined)[]): string {\n return new XMLSerializer().serializeToString(freezeShaderSurfaces(svg, captures));\n}\n","export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n","import type { SceneRole } from '../../renderScene/scene';\n\nexport const DERIVED_HEIGHT_ROLES: ReadonlySet<SceneRole> = new Set([]);\n","import { SVG_NAMESPACE } from '../svgNamespace';\n\nexport function svgElement<K extends keyof SVGElementTagNameMap>(document: Document, tag: K): SVGElementTagNameMap[K] {\n return document.createElementNS(SVG_NAMESPACE, tag) as SVGElementTagNameMap[K];\n}\n\nexport function selectionOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-selection-overlay', id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n","import { svgElement } from './selectionOverlay/dom';\n\nconst OVERLAY_ATTR = 'data-sf-change-overlay';\n\nexport const CHANGE_COLOR = '#f59e0b';\n\nexport const FLASH_DURATION_MS = 1300;\n\nexport const REDUCED_MOTION_DURATION_MS = 400;\n\nfunction changeOverlayGroup(document: Document, id: string, primary: SVGGraphicsElement): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(OVERLAY_ATTR, id);\n group.setAttribute('pointer-events', 'none');\n const transform = primary.getAttribute('transform');\n if (transform) {\n group.setAttribute('transform', transform);\n }\n return group;\n}\n\nexport function startChangeFade(target: SVGGElement, reducedMotion: boolean): void {\n if (reducedMotion) {\n return;\n }\n target.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: FLASH_DURATION_MS,\n easing: 'linear',\n fill: 'forwards',\n });\n}\n\nexport function shapeChangeOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const bounds = primary.getBBox();\n const group = changeOverlayGroup(document, id, primary);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - 4));\n ring.setAttribute('y', String(bounds.y - 4));\n ring.setAttribute('width', String(bounds.width + 8));\n ring.setAttribute('height', String(bounds.height + 8));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', color);\n ring.setAttribute('stroke-width', '3');\n group.appendChild(ring);\n return group;\n}\n\nexport function linkChangeOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n color: string = CHANGE_COLOR,\n): SVGGElement {\n const group = changeOverlayGroup(document, id, primary);\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', color);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + 6));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.6');\n group.appendChild(halo);\n return group;\n}\n","import type { SceneRole } from '../../renderScene/scene';\nimport {\n CORNER_RADIUS_ATTR,\n ISOMETRIC_LABEL_OFFSET_ATTR,\n ISOMETRIC_SIZE_ATTR,\n PATH_CLOSED_ATTR,\n PATH_POINTS_ATTR,\n PATH_TENSION_ATTR,\n SYMBOL_BOUNDS_ATTR,\n} from '../../svg/domContract/attributes';\nimport { DOM_CONTRACT_VERSION } from '../../svg/domContract/version';\nimport type { OwnerRef } from './types';\n\nexport interface AttrElement {\n getAttribute(name: string): string | null;\n closest(selector: string): AttrElement | null;\n}\n\nexport function isCameraGesture(e: { ctrlKey: boolean; metaKey: boolean }): boolean {\n return e.ctrlKey || e.metaKey;\n}\n\nexport function parseContractVersion(svg: string): number | null {\n const match = /data-sf-contract=\"(\\d+)\"/.exec(svg);\n return match ? Number(match[1]) : null;\n}\n\nexport function isContractCompatible(version: number | null): boolean {\n return version === DOM_CONTRACT_VERSION;\n}\n\nconst ROLES: ReadonlySet<string> = new Set([\n 'entity',\n 'link',\n 'frame',\n 'swimlane',\n 'chart',\n 'path',\n 'widget',\n 'isometric',\n]);\n\nfunction sceneRole(domRole: string): SceneRole {\n return domRole === 'entity' ? 'shape' : (domRole as SceneRole);\n}\n\nexport function symbolDeclaredBounds(el: {\n getAttribute(name: string): string | null;\n}): { x: number; y: number; width: number; height: number } | null {\n const raw = el.getAttribute(SYMBOL_BOUNDS_ATTR);\n if (!raw) {\n return null;\n }\n const [x, y, width, height] = raw.split(',').map(Number);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(width) && Number.isFinite(height)\n ? { x, y, width, height }\n : null;\n}\n\nexport interface PathGeometry {\n points: Array<[number, number]>;\n tension: number;\n closed: boolean;\n}\n\nexport function pathGeometryOf(el: { getAttribute(name: string): string | null }): PathGeometry | null {\n const raw = el.getAttribute(PATH_POINTS_ATTR);\n if (!raw) {\n return null;\n }\n let points: unknown;\n try {\n points = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!Array.isArray(points) || !points.every(point => Array.isArray(point) && point.length === 2)) {\n return null;\n }\n return {\n points: points as Array<[number, number]>,\n tension: Number(el.getAttribute(PATH_TENSION_ATTR)) || 0,\n closed: el.getAttribute(PATH_CLOSED_ATTR) === 'true',\n };\n}\n\nexport interface IsometricGeometry {\n width: number;\n height: number;\n depth: number;\n cornerRadius: number;\n bounds: { x: number; y: number; width: number; height: number } | null;\n labelOffsetX: number;\n labelOffsetY: number;\n}\n\nexport function isometricGeometryOf(el: { getAttribute(name: string): string | null }): IsometricGeometry | null {\n const raw = el.getAttribute(ISOMETRIC_SIZE_ATTR);\n if (raw === null) {\n return null;\n }\n const [width, height, depth] = raw.split(',').map(Number);\n if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(depth)) {\n return null;\n }\n const cornerRadius = Number(el.getAttribute(CORNER_RADIUS_ATTR)) || 0;\n const [labelOffsetX, labelOffsetY] = (el.getAttribute(ISOMETRIC_LABEL_OFFSET_ATTR) ?? '0,0').split(',').map(Number);\n return {\n width,\n height,\n depth,\n cornerRadius,\n bounds: symbolDeclaredBounds(el),\n labelOffsetX: Number.isFinite(labelOffsetX) ? labelOffsetX : 0,\n labelOffsetY: Number.isFinite(labelOffsetY) ? labelOffsetY : 0,\n };\n}\n\nexport function resolveOwner(target: AttrElement | null): OwnerRef | null {\n const el = target?.closest('[data-sf-id]');\n if (!el) {\n return null;\n }\n const id = el.getAttribute('data-sf-id');\n const role = el.getAttribute('data-sf-role');\n if (!id || !role || !ROLES.has(role)) {\n return null;\n }\n return {\n role: sceneRole(role),\n id,\n kind: el.getAttribute('data-sf-kind') ?? undefined,\n label: el.getAttribute('aria-label') ?? undefined,\n };\n}\n","import { AXIS_COS } from '../../model/isometricObject';\nimport { isometricGeometryOf } from './contract';\n\nexport function findOwnerNode(\n svg: SVGSVGElement,\n id: string,\n predicate: (el: Element) => boolean,\n): SVGGraphicsElement | null {\n const nodes = svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`);\n for (const el of nodes) {\n if (predicate(el)) {\n return el as unknown as SVGGraphicsElement;\n }\n }\n return null;\n}\n\nexport function findAllOwnerNodes(svg: SVGSVGElement, id: string): SVGGraphicsElement[] {\n return Array.from(svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(id)}\"]`)) as unknown as SVGGraphicsElement[];\n}\n\nexport const isPrimary = (el: Element): boolean => el.hasAttribute('data-sf-primary');\nexport const isTextLabel = (el: Element): boolean =>\n el.tagName.toLowerCase() === 'text' && !el.hasAttribute('data-sf-primary');\n\nexport function pointerUserPoint(svg: SVGSVGElement, event: PointerEvent): { x: number; y: number } | null {\n const ctm = svg.getScreenCTM();\n if (!ctm) {\n return null;\n }\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(ctm.inverse());\n return { x: point.x, y: point.y };\n}\n\nexport function screenRectOf(el: SVGGraphicsElement): { left: number; top: number; width: number; height: number } {\n const bbox = el.getBBox();\n const ctm = el.getScreenCTM();\n if (!ctm) {\n return { left: 0, top: 0, width: 0, height: 0 };\n }\n const topLeft = new DOMPoint(bbox.x, bbox.y).matrixTransform(ctm);\n const bottomRight = new DOMPoint(bbox.x + bbox.width, bbox.y + bbox.height).matrixTransform(ctm);\n return { left: topLeft.x, top: topLeft.y, width: bottomRight.x - topLeft.x, height: bottomRight.y - topLeft.y };\n}\n\nexport function pxPerUnit(svg: SVGSVGElement): number {\n const rect = svg.getBoundingClientRect();\n const { width: viewBoxWidth, height: viewBoxHeight } = svg.viewBox.baseVal;\n if (rect.width <= 0 || viewBoxWidth <= 0) {\n return 1;\n }\n const horizontal = rect.width / viewBoxWidth;\n return rect.height > 0 && viewBoxHeight > 0 ? Math.min(horizontal, rect.height / viewBoxHeight) : horizontal;\n}\n\nexport function findIsometricApexCandidates(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ id: string; apex: { x: number; y: number } }> {\n const results: Array<{ id: string; apex: { x: number; y: number } }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id][data-sf-role=\"isometric\"]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n if (!id || excludeIds.has(id)) {\n return;\n }\n const geometry = isometricGeometryOf(node);\n const bounds = geometry?.bounds ?? (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ id, apex: { x: bounds.x + (geometry?.depth ?? 0) * AXIS_COS, y: bounds.y } });\n });\n return results;\n}\n\nexport function findSnapCandidateBounds(\n svg: SVGSVGElement,\n excludeIds: Set<string>,\n): Array<{ x: number; y: number; width: number; height: number }> {\n const results: Array<{ x: number; y: number; width: number; height: number }> = [];\n svg.querySelectorAll('[data-sf-primary][data-sf-id]').forEach(node => {\n const id = node.getAttribute('data-sf-id');\n const role = node.getAttribute('data-sf-role');\n if (!id || role === 'link' || excludeIds.has(id)) {\n return;\n }\n const bbox = (node as unknown as SVGGraphicsElement).getBBox();\n results.push({ x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height });\n });\n return results;\n}\n","import { pxPerUnit } from '../domQuery';\n\nexport function screenPx(svg: SVGSVGElement, px: number): number {\n return px / pxPerUnit(svg);\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, QuickDuplicateDirection } from './types';\n\nexport const BUBBLE_RADIUS_PX = 8;\nconst BUBBLE_MARGIN_PX = 15;\nexport const PLUS_HALF_SIZE_PX = 4;\nexport const BUBBLE_STROKE_WIDTH_PX = 1.5;\n\nfunction quickDuplicatePositions(\n bounds: OverlayBounds,\n offset: number,\n): Array<[number, number, QuickDuplicateDirection]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [centerX, bounds.y - offset, 'top'],\n [bounds.x + bounds.width + offset, centerY, 'right'],\n [centerX, bounds.y + bounds.height + offset, 'bottom'],\n [bounds.x - offset, centerY, 'left'],\n ];\n}\n\nexport function plusPath(x: number, y: number, halfSize: number): string {\n return `M ${x - halfSize} ${y} L ${x + halfSize} ${y} M ${x} ${y - halfSize} L ${x} ${y + halfSize}`;\n}\n\nconst BUBBLE_FILL = '#e8e8e8';\nconst BUBBLE_STROKE = '#ccc';\nconst BUBBLE_HOVER_FILL = '#9b42df';\nconst BUBBLE_HOVER_STROKE = '#7c2fb5';\nconst BUBBLE_HOVER_SCALE = 1.2;\n\nexport function duplicateBubble(\n document: Document,\n x: number,\n y: number,\n radius: number,\n strokeWidth: number,\n direction: string,\n): SVGCircleElement {\n const bubble = svgElement(document, 'circle');\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n bubble.setAttribute('stroke-width', String(strokeWidth));\n bubble.setAttribute('data-sf-quick-duplicate', direction);\n bubble.style.pointerEvents = 'auto';\n bubble.style.cursor = 'pointer';\n bubble.style.transition = 'r 120ms ease, fill 120ms ease, stroke 120ms ease';\n bubble.addEventListener('pointerenter', () => {\n bubble.setAttribute('r', String(radius * BUBBLE_HOVER_SCALE));\n bubble.setAttribute('fill', BUBBLE_HOVER_FILL);\n bubble.setAttribute('stroke', BUBBLE_HOVER_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#ffffff');\n });\n bubble.addEventListener('pointerleave', () => {\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#999');\n });\n return bubble;\n}\n\nexport function duplicatePlus(\n document: Document,\n x: number,\n y: number,\n halfSize: number,\n strokeWidth: number,\n): SVGPathElement {\n const plus = svgElement(document, 'path');\n plus.setAttribute('d', plusPath(x, y, halfSize));\n plus.setAttribute('stroke', '#999');\n plus.setAttribute('stroke-width', String(strokeWidth));\n plus.setAttribute('stroke-linecap', 'round');\n return plus;\n}\n\nexport function quickDuplicateBubbles(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const offset = radius + screenPx(svg, BUBBLE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n for (const [x, y, direction] of quickDuplicatePositions(bounds, offset)) {\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function updateQuickDuplicateBubbles(group: SVGGElement, bounds: OverlayBounds): void {\n const bubbles = group.querySelectorAll('circle[data-sf-quick-duplicate]');\n const firstRadius = Number(bubbles[0]?.getAttribute('r')) || BUBBLE_RADIUS_PX;\n const offset = firstRadius * ((BUBBLE_RADIUS_PX + BUBBLE_MARGIN_PX) / BUBBLE_RADIUS_PX);\n const halfSize = firstRadius * (PLUS_HALF_SIZE_PX / BUBBLE_RADIUS_PX);\n for (const [index, [x, y]] of quickDuplicatePositions(bounds, offset).entries()) {\n const bubble = bubbles[index];\n if (!bubble) {\n continue;\n }\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n const plus = bubble.nextElementSibling;\n if (plus) {\n plus.setAttribute('d', plusPath(x, y, halfSize));\n }\n }\n}\n","import { isometricFaces } from '../../../model/isometricObject';\nimport { isometricGeometryOf, symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport {\n BUBBLE_RADIUS_PX,\n BUBBLE_STROKE_WIDTH_PX,\n duplicateBubble,\n duplicatePlus,\n PLUS_HALF_SIZE_PX,\n} from './quickDuplicate';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 2;\nconst SHAFT_WIDTH_PX = 3.25;\nconst HIT_WIDTH_PX = 14;\nconst ARROW_LENGTH_PX = 34;\nconst ARROWHEAD_LENGTH_PX = 10.5;\nconst ARROWHEAD_WIDTH_PX = 8.5;\n\nexport type IsometricAxis = 'width' | 'height' | 'depth';\n\nexport interface Vec {\n x: number;\n y: number;\n}\n\nexport function normalizeVec(v: Vec): Vec {\n const length = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / length, y: v.y / length };\n}\n\nfunction axisCursorUrl(direction: Vec): string {\n const angleDeg = (Math.atan2(direction.y, direction.x) * 180) / Math.PI;\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\">` +\n `<g transform=\"rotate(${angleDeg} 13 13)\" stroke-linejoin=\"round\" stroke-linecap=\"round\">` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"white\" stroke-width=\"4.5\"/>` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"black\" stroke-width=\"1.6\"/>` +\n `<path d=\"M4 13 L9.5 8.5 L9.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `<path d=\"M22 13 L16.5 8.5 L16.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `</g></svg>`;\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\") 13 13, pointer`;\n}\n\nfunction centroid(points: readonly Vec[]): Vec {\n const sum = points.reduce((acc, p) => ({ x: acc.x + p.x, y: acc.y + p.y }), { x: 0, y: 0 });\n return { x: sum.x / points.length, y: sum.y / points.length };\n}\n\nexport const ISO_HALO_ATTR = 'data-sf-iso-halo';\n\ninterface ArrowElements {\n group: SVGGElement;\n hit: SVGLineElement;\n shaft: SVGLineElement;\n head: SVGPolygonElement;\n}\n\nfunction createAxisArrow(document: Document, axis: IsometricAxis, direction: Vec, svg: SVGSVGElement): ArrowElements {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-resize-handle', `iso-${axis}`);\n group.style.cursor = axisCursorUrl(direction);\n\n const hit = svgElement(document, 'line');\n hit.setAttribute('stroke', 'transparent');\n hit.setAttribute('stroke-width', String(screenPx(svg, HIT_WIDTH_PX)));\n hit.setAttribute('stroke-linecap', 'round');\n hit.style.pointerEvents = 'stroke';\n group.appendChild(hit);\n\n const shaft = svgElement(document, 'line');\n shaft.setAttribute('stroke', RING_COLOR);\n shaft.setAttribute('stroke-width', String(screenPx(svg, SHAFT_WIDTH_PX)));\n shaft.setAttribute('stroke-linecap', 'round');\n shaft.style.pointerEvents = 'none';\n group.appendChild(shaft);\n\n const head = svgElement(document, 'polygon');\n head.setAttribute('fill', RING_COLOR);\n head.style.pointerEvents = 'none';\n group.appendChild(head);\n\n return { group, hit, shaft, head };\n}\n\nfunction positionAxisArrow(elements: ArrowElements, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const length = screenPx(svg, ARROW_LENGTH_PX);\n const headLength = screenPx(svg, ARROWHEAD_LENGTH_PX);\n const headWidth = screenPx(svg, ARROWHEAD_WIDTH_PX);\n const tip: Vec = { x: origin.x + direction.x * length, y: origin.y + direction.y * length };\n const shaftEnd: Vec = {\n x: origin.x + direction.x * (length - headLength),\n y: origin.y + direction.y * (length - headLength),\n };\n const normal: Vec = { x: -direction.y, y: direction.x };\n const headLeft: Vec = { x: shaftEnd.x + (normal.x * headWidth) / 2, y: shaftEnd.y + (normal.y * headWidth) / 2 };\n const headRight: Vec = { x: shaftEnd.x - (normal.x * headWidth) / 2, y: shaftEnd.y - (normal.y * headWidth) / 2 };\n\n elements.hit.setAttribute('x1', String(origin.x));\n elements.hit.setAttribute('y1', String(origin.y));\n elements.hit.setAttribute('x2', String(tip.x));\n elements.hit.setAttribute('y2', String(tip.y));\n\n elements.shaft.setAttribute('x1', String(origin.x));\n elements.shaft.setAttribute('y1', String(origin.y));\n elements.shaft.setAttribute('x2', String(shaftEnd.x));\n elements.shaft.setAttribute('y2', String(shaftEnd.y));\n\n elements.head.setAttribute('points', `${tip.x},${tip.y} ${headLeft.x},${headLeft.y} ${headRight.x},${headRight.y}`);\n}\n\nfunction axisArrow(\n document: Document,\n origin: Vec,\n direction: Vec,\n axis: IsometricAxis,\n svg: SVGSVGElement,\n): SVGGElement {\n const elements = createAxisArrow(document, axis, direction, svg);\n positionAxisArrow(elements, origin, direction, svg);\n return elements.group;\n}\n\nexport function updateAxisArrowGroup(group: SVGGElement, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const hit = group.querySelector('line:nth-child(1)') as SVGLineElement | null;\n const shaft = group.querySelector('line:nth-child(2)') as SVGLineElement | null;\n const head = group.querySelector('polygon') as SVGPolygonElement | null;\n if (!hit || !shaft || !head) {\n return;\n }\n positionAxisArrow({ group, hit, shaft, head }, origin, direction, svg);\n}\n\nexport function updateHalo(halo: SVGPathElement, d: string): void {\n halo.setAttribute('d', d);\n}\n\nexport interface IsometricSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport function axisArrowPlacements(object: IsometricSize): Record<IsometricAxis, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const apex = faces.top[0];\n const right = faces.top[1];\n const left = faces.top[3];\n const bottom = faces.front[2];\n return {\n width: { origin: centroid(faces.right), direction: normalizeVec({ x: right.x - apex.x, y: right.y - apex.y }) },\n height: { origin: bottom, direction: { x: 0, y: 1 } },\n depth: { origin: centroid(faces.front), direction: normalizeVec({ x: left.x - apex.x, y: left.y - apex.y }) },\n };\n}\n\nconst DUPLICATE_MARGIN_PX = ARROW_LENGTH_PX + BUBBLE_RADIUS_PX + 10;\n\nexport type IsometricQuickDuplicateDirection =\n | 'iso-width-pos'\n | 'iso-width-neg'\n | 'iso-depth-pos'\n | 'iso-depth-neg'\n | 'iso-height-pos'\n | 'iso-height-neg';\n\nfunction reflect(point: Vec, through: Vec): Vec {\n return { x: through.x * 2 - point.x, y: through.y * 2 - point.y };\n}\n\nexport function quickDuplicatePlacements(\n object: IsometricSize,\n): Record<IsometricQuickDuplicateDirection, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const placements = axisArrowPlacements(object);\n const visualCenter = centroid([\n faces.top[0],\n faces.top[1],\n faces.top[2],\n faces.top[3],\n faces.front[2],\n faces.front[3],\n faces.right[2],\n ]);\n return {\n 'iso-width-pos': placements.width,\n 'iso-width-neg': {\n origin: reflect(placements.width.origin, visualCenter),\n direction: { x: -placements.width.direction.x, y: -placements.width.direction.y },\n },\n 'iso-depth-pos': placements.depth,\n 'iso-depth-neg': {\n origin: reflect(placements.depth.origin, visualCenter),\n direction: { x: -placements.depth.direction.x, y: -placements.depth.direction.y },\n },\n 'iso-height-pos': placements.height,\n 'iso-height-neg': {\n origin: reflect(placements.height.origin, visualCenter),\n direction: { x: -placements.height.direction.x, y: -placements.height.direction.y },\n },\n };\n}\n\nexport const ISO_DUPLICATE_BUBBLES_ATTR = 'data-sf-iso-duplicate-bubbles';\n\nconst VISIBLE_FACE_DIRECTIONS: readonly IsometricQuickDuplicateDirection[] = [\n 'iso-height-neg',\n 'iso-depth-pos',\n 'iso-width-pos',\n];\n\nexport function isometricQuickDuplicateBubbles(\n document: Document,\n object: IsometricSize,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(ISO_DUPLICATE_BUBBLES_ATTR, '');\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const margin = screenPx(svg, DUPLICATE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const placements = quickDuplicatePlacements(object);\n for (const direction of VISIBLE_FACE_DIRECTIONS) {\n const { origin, direction: dir } = placements[direction];\n const x = origin.x + dir.x * margin;\n const y = origin.y + dir.y * margin;\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function isometricSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const geometry = isometricGeometryOf(primary);\n const group = selectionOverlayGroup(document, id, primary);\n\n const halo = svgElement(document, 'path');\n halo.setAttribute(ISO_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('opacity', '0.6');\n halo.style.pointerEvents = 'none';\n group.appendChild(halo);\n\n const placements = axisArrowPlacements({\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n });\n group.appendChild(axisArrow(document, placements.width.origin, placements.width.direction, 'width', svg));\n group.appendChild(axisArrow(document, placements.height.origin, placements.height.direction, 'height', svg));\n group.appendChild(axisArrow(document, placements.depth.origin, placements.depth.direction, 'depth', svg));\n group.appendChild(\n isometricQuickDuplicateBubbles(\n document,\n {\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n },\n svg,\n ),\n );\n return group;\n}\n","import { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { LinkEndpoint } from './types';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst ENDPOINT_RADIUS_PX = 5;\nconst ENDPOINT_STROKE_WIDTH_PX = 1.5;\n\nfunction linkHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction endpointHandle(\n document: Document,\n primary: SVGPathElement,\n atLength: number,\n endpoint: LinkEndpoint,\n svg: SVGSVGElement,\n): SVGCircleElement {\n const point = primary.getPointAtLength(atLength);\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(point.x));\n handle.setAttribute('cy', String(point.y));\n handle.setAttribute('r', String(screenPx(svg, ENDPOINT_RADIUS_PX)));\n handle.setAttribute('fill', RING_COLOR);\n handle.setAttribute('stroke', 'white');\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-endpoint', endpoint);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'crosshair';\n return handle;\n}\n\nconst SEGMENT_LENGTH_PX = 22;\nconst SEGMENT_THICKNESS_PX = 8;\n\ninterface LinkSegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n movable: boolean;\n}\n\nfunction readSegments(primary: SVGPathElement): LinkSegmentData[] {\n try {\n return JSON.parse(primary.getAttribute('data-sf-link-segments') ?? '[]') as LinkSegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction segmentHandles(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGRectElement[] {\n const handles: SVGRectElement[] = [];\n readSegments(primary).forEach((segment, index) => {\n if (!segment.movable) {\n return;\n }\n const horizontal = Math.abs(segment.bx - segment.ax) > Math.abs(segment.by - segment.ay);\n const length = screenPx(svg, SEGMENT_LENGTH_PX);\n const thickness = screenPx(svg, SEGMENT_THICKNESS_PX);\n const width = horizontal ? length : thickness;\n const height = horizontal ? thickness : length;\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n handle.setAttribute('width', String(width));\n handle.setAttribute('height', String(height));\n handle.setAttribute('rx', String(thickness / 2));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-segment', String(index));\n handle.setAttribute('data-sf-link-segment-axis', horizontal ? 'y' : 'x');\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = horizontal ? 'ns-resize' : 'ew-resize';\n handles.push(handle);\n });\n return handles;\n}\n\nexport function linkSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const length = primary.getTotalLength();\n group.append(\n linkHalo(document, primary, svg),\n ...segmentHandles(document, primary, svg),\n endpointHandle(document, primary, 0, 'from', svg),\n endpointHandle(document, primary, length, 'to', svg),\n );\n return group;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { pathGeometryOf } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst POINT_RADIUS_PX = 5;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport const PATH_HALO_ATTR = 'data-sf-path-halo';\n\nfunction pathHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute(PATH_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction pointHandle(document: Document, x: number, y: number, index: number, svg: SVGSVGElement): SVGCircleElement {\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(x));\n handle.setAttribute('cy', String(y));\n handle.setAttribute('r', String(screenPx(svg, POINT_RADIUS_PX)));\n handle.setAttribute('fill', '#ffffff');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, POINT_STROKE_WIDTH_PX)));\n handle.setAttribute(PATH_POINT_INDEX_ATTR, String(index));\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'move';\n return handle;\n}\n\nexport function pathSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n group.appendChild(pathHalo(document, primary, svg));\n const geometry = pathGeometryOf(primary);\n for (const [index, [x, y]] of (geometry?.points ?? []).entries()) {\n group.appendChild(pointHandle(document, x, y, index, svg));\n }\n return group;\n}\n","import { svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, ResizeHandle } from './types';\n\nconst HANDLE_SIZE_PX = 6;\nconst HANDLE_STROKE_WIDTH_PX = 1;\nconst HANDLE_STROKE = '#992dff';\nconst HANDLE_CURSORS: Record<ResizeHandle, string> = {\n 'top-left': 'nwse-resize',\n top: 'ns-resize',\n 'top-right': 'nesw-resize',\n right: 'ew-resize',\n 'bottom-right': 'nwse-resize',\n bottom: 'ns-resize',\n 'bottom-left': 'nesw-resize',\n left: 'ew-resize',\n};\n\nexport function resizeHandlePositions(bounds: OverlayBounds): Array<[number, number, ResizeHandle]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [bounds.x, bounds.y, 'top-left'],\n [centerX, bounds.y, 'top'],\n [bounds.x + bounds.width, bounds.y, 'top-right'],\n [bounds.x + bounds.width, centerY, 'right'],\n [bounds.x + bounds.width, bounds.y + bounds.height, 'bottom-right'],\n [centerX, bounds.y + bounds.height, 'bottom'],\n [bounds.x, bounds.y + bounds.height, 'bottom-left'],\n [bounds.x, centerY, 'left'],\n ];\n}\n\nconst LOCKED_HEIGHT_HANDLES: ReadonlySet<ResizeHandle> = new Set(['top', 'bottom']);\n\nexport function renderResizeHandles(\n document: Document,\n bounds: OverlayBounds,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGRectElement[] {\n const size = screenPx(svg, HANDLE_SIZE_PX);\n const strokeWidth = screenPx(svg, HANDLE_STROKE_WIDTH_PX);\n const positions = lockHeight\n ? resizeHandlePositions(bounds).filter(([, , name]) => !LOCKED_HEIGHT_HANDLES.has(name))\n : resizeHandlePositions(bounds);\n return positions.map(([centerX, centerY, name]) => {\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n handle.setAttribute('width', String(size));\n handle.setAttribute('height', String(size));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', HANDLE_STROKE);\n handle.setAttribute('stroke-width', String(strokeWidth));\n handle.setAttribute('data-sf-resize-handle', name);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = lockHeight ? 'ew-resize' : HANDLE_CURSORS[name];\n return handle;\n });\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { renderResizeHandles } from './resizeHandles';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst RING_STROKE_WIDTH_PX = 3;\nconst RING_OFFSET_PX = 1;\n\nexport function shapeSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const group = selectionOverlayGroup(document, id, primary);\n const offset = screenPx(svg, RING_OFFSET_PX);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - offset));\n ring.setAttribute('y', String(bounds.y - offset));\n ring.setAttribute('width', String(bounds.width + offset * 2));\n ring.setAttribute('height', String(bounds.height + offset * 2));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', RING_COLOR);\n ring.setAttribute('stroke-width', String(screenPx(svg, RING_STROKE_WIDTH_PX)));\n group.appendChild(ring);\n group.append(...renderResizeHandles(document, bounds, svg, lockHeight));\n return group;\n}\n","import {\n CHANGE_COLOR,\n FLASH_DURATION_MS,\n findOwnerNode,\n isPrimary,\n linkChangeOverlay,\n REDUCED_MOTION_DURATION_MS,\n shapeChangeOverlay,\n startChangeFade,\n} from '../../dom';\n\nexport interface ChangeFlash {\n flash(ownerIds: readonly string[], color?: string): void;\n destroy(): void;\n}\n\nexport function createChangeFlash(svg: SVGSVGElement): ChangeFlash {\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n const flash = (ownerIds: readonly string[], color: string = CHANGE_COLOR): void => {\n const ids = [...new Set(ownerIds)];\n if (ids.length === 0) {\n return;\n }\n const doc = svg.ownerDocument;\n const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n for (const id of ids) {\n const primary = findOwnerNode(svg, id, isPrimary);\n if (!primary) {\n continue;\n }\n const pending = timers.get(id);\n if (pending) {\n clearTimeout(pending);\n }\n for (const stale of svg.querySelectorAll(`[data-sf-change-overlay=\"${CSS.escape(id)}\"]`)) {\n stale.remove();\n }\n const overlay =\n primary.getAttribute('data-sf-role') === 'link'\n ? linkChangeOverlay(doc, primary as unknown as SVGPathElement, id, color)\n : shapeChangeOverlay(doc, primary, id, color);\n svg.appendChild(overlay);\n startChangeFade(overlay, reducedMotion);\n const duration = reducedMotion ? REDUCED_MOTION_DURATION_MS : FLASH_DURATION_MS;\n timers.set(\n id,\n setTimeout(() => {\n overlay.remove();\n timers.delete(id);\n }, duration),\n );\n }\n };\n\n return {\n flash,\n destroy(): void {\n for (const timer of timers.values()) {\n clearTimeout(timer);\n }\n timers.clear();\n },\n };\n}\n","import type { SelectionController } from './selectionController';\n\nexport function bindKeyboardSelection(\n svg: SVGSVGElement,\n selection: SelectionController,\n selectable: boolean,\n): () => void {\n const onKeyDown = (event: KeyboardEvent) => {\n if (selectable && event.key === 'Escape') {\n selection.dispatch({ type: 'clear' });\n }\n };\n svg.addEventListener('keydown', onKeyDown);\n return () => {\n svg.removeEventListener('keydown', onKeyDown);\n };\n}\n","import type { Modifiers } from '../events';\n\nexport function modifiersOf(event: MouseEvent | KeyboardEvent): Modifiers {\n return {\n shift: event.shiftKey,\n ctrl: event.ctrlKey,\n meta: event.metaKey,\n alt: event.altKey,\n };\n}\n","export type SelectionAction =\n | { type: 'clear' }\n | { type: 'set'; ids: string[] }\n | { type: 'select'; id: string }\n | { type: 'toggle'; id: string }\n | { type: 'add'; id: string };\n\nexport function selectionReducer(current: ReadonlySet<string>, action: SelectionAction): Set<string> {\n switch (action.type) {\n case 'clear':\n return new Set();\n case 'set':\n return new Set(action.ids);\n case 'select':\n return new Set([action.id]);\n case 'add':\n return new Set([...current, action.id]);\n case 'toggle': {\n const next = new Set(current);\n if (next.has(action.id)) {\n next.delete(action.id);\n } else {\n next.add(action.id);\n }\n return next;\n }\n }\n}\n\nexport function clickAction(id: string, modifiers: { shift: boolean; ctrl: boolean; meta: boolean }): SelectionAction {\n return modifiers.ctrl || modifiers.meta || modifiers.shift ? { type: 'toggle', id } : { type: 'select', id };\n}\n","import { findOwnerNode, isPrimary, resolveOwner } from '../../dom';\nimport type { Emitter, OwnerRef } from '../events';\nimport { modifiersOf } from './modifiers';\nimport { clickAction } from './selection';\nimport type { SelectionController } from './selectionController';\n\nconst SELECTION_OVERLAY_CONTROL_SELECTOR =\n '[data-sf-resize-handle], [data-sf-link-endpoint], [data-sf-link-segment], [data-sf-quick-duplicate]';\n\nexport function isSelectionOverlayControl(target: Element | null): boolean {\n return Boolean(target?.closest(SELECTION_OVERLAY_CONTROL_SELECTOR));\n}\n\nexport class OwnerPointerController {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #diagramId: string;\n readonly #selection: SelectionController;\n\n constructor(svg: SVGSVGElement, emitter: Emitter, diagramId: string, selection: SelectionController) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#diagramId = diagramId;\n this.#selection = selection;\n }\n\n hover(event: PointerEvent): void {\n const owner = resolveOwner(event.target as Element | null);\n this.#emitter.emit(\n 'ownerHover',\n owner\n ? { diagramId: this.#diagramId, owner, modifiers: modifiersOf(event) }\n : { diagramId: this.#diagramId, owner: null },\n );\n }\n\n select(event: PointerEvent): void {\n const target = event.target as Element | null;\n const owner = resolveOwner(target);\n if (!owner) {\n this.#clearWhenOutsideOverlay(target);\n return;\n }\n this.#selectOwner(owner, event);\n }\n\n #clearWhenOutsideOverlay(target: Element | null): void {\n if (!isSelectionOverlayControl(target)) {\n this.#selection.dispatch({ type: 'clear' });\n }\n }\n\n #selectOwner(owner: OwnerRef, event: PointerEvent): void {\n this.#selection.remember(owner);\n const modifiers = modifiersOf(event);\n this.#selection.dispatch(clickAction(owner.id, modifiers));\n this.#emitter.emit(owner.role === 'link' ? 'linkClick' : 'canvasObjectClick', {\n diagramId: this.#diagramId,\n owner,\n modifiers,\n });\n const node = findOwnerNode(this.#svg, owner.id, isPrimary);\n if (node && !node.hasAttribute('tabindex')) {\n node.setAttribute('tabindex', '-1');\n }\n node?.focus({ preventScroll: true });\n }\n}\n","import { isCameraGesture, resolveOwner } from '../../dom';\nimport type { DisplayHandle } from '../display';\nimport type { Emitter } from '../events';\nimport { isSelectionOverlayControl, OwnerPointerController } from './pointerSelection';\nimport type { SelectionController } from './selectionController';\n\nconst DRAG_THRESHOLD = 4;\ninterface PointerDownState {\n x: number;\n y: number;\n moved: boolean;\n panable: boolean;\n}\n\nexport interface PointerInteractionBinding {\n display: DisplayHandle;\n emitter: Emitter;\n diagramId: string;\n selection: SelectionController;\n selectable: boolean;\n}\n\nclass PointerInteractionSession {\n readonly #display: DisplayHandle;\n readonly #ownerPointer: OwnerPointerController;\n readonly #selectable: boolean;\n #down: PointerDownState | null = null;\n\n constructor(display: DisplayHandle, ownerPointer: OwnerPointerController, selectable: boolean) {\n this.#display = display;\n this.#ownerPointer = ownerPointer;\n this.#selectable = selectable;\n }\n\n bind(): () => void {\n this.#display.svg.addEventListener('pointerdown', this.#onPointerDown);\n this.#display.svg.addEventListener('pointermove', this.#onPointerMove);\n this.#display.svg.addEventListener('pointerup', this.#onPointerUp);\n return () => this.#destroy();\n }\n\n readonly #onPointerDown = (event: PointerEvent): void => {\n const target = event.target as Element | null;\n const overContent = Boolean(resolveOwner(target)) || isSelectionOverlayControl(target);\n this.#down = {\n x: event.clientX,\n y: event.clientY,\n moved: false,\n panable: isCameraGesture(event) || !overContent,\n };\n };\n\n readonly #onPointerMove = (event: PointerEvent): void => {\n if (this.#continueDrag(event)) {\n return;\n }\n if (this.#selectable) {\n this.#ownerPointer.hover(event);\n }\n };\n\n readonly #onPointerUp = (event: PointerEvent): void => {\n const wasDrag = this.#down?.moved ?? false;\n this.#down = null;\n if (!wasDrag && this.#selectable) {\n this.#ownerPointer.select(event);\n }\n };\n\n #continueDrag(event: PointerEvent): boolean {\n if (!this.#down) {\n return false;\n }\n if (!this.#down.moved && Math.hypot(event.clientX - this.#down.x, event.clientY - this.#down.y) > DRAG_THRESHOLD) {\n this.#down.moved = true;\n }\n if (!this.#down.moved) {\n return false;\n }\n if (this.#down.panable && isCameraGesture(event)) {\n this.#display.panBy(event.movementX, event.movementY);\n }\n return true;\n }\n\n #destroy(): void {\n this.#display.svg.removeEventListener('pointerdown', this.#onPointerDown);\n this.#display.svg.removeEventListener('pointermove', this.#onPointerMove);\n this.#display.svg.removeEventListener('pointerup', this.#onPointerUp);\n }\n}\n\nexport function bindPointerInteraction(binding: PointerInteractionBinding): () => void {\n const { display, emitter, diagramId, selection, selectable } = binding;\n const ownerPointer = new OwnerPointerController(display.svg, emitter, diagramId, selection);\n return new PointerInteractionSession(display, ownerPointer, selectable).bind();\n}\n","import {\n DERIVED_HEIGHT_ROLES,\n findOwnerNode,\n isometricSelectionOverlay,\n isPrimary,\n linkSelectionOverlay,\n pathSelectionOverlay,\n quickDuplicateBubbles,\n shapeSelectionOverlay,\n} from '../../dom';\nimport type { OwnerRef } from '../events';\n\nexport function paintSelectionOverlays(\n svg: SVGSVGElement,\n selectedIds: ReadonlySet<string>,\n owners: ReadonlyMap<string, OwnerRef>,\n): void {\n for (const overlay of svg.querySelectorAll('[data-sf-selection-overlay]')) {\n overlay.remove();\n }\n const document = svg.ownerDocument;\n for (const id of selectedIds) {\n const primary = findOwnerNode(svg, id, isPrimary);\n if (!primary) {\n continue;\n }\n const owner = owners.get(id);\n const overlay =\n owner?.role === 'link'\n ? linkSelectionOverlay(document, primary as unknown as SVGPathElement, id, svg)\n : owner?.role === 'path'\n ? pathSelectionOverlay(document, primary as unknown as SVGPathElement, id, svg)\n : owner?.role === 'isometric'\n ? isometricSelectionOverlay(document, primary, id, svg)\n : shapeSelectionOverlay(document, primary, id, svg, owner ? DERIVED_HEIGHT_ROLES.has(owner.role) : false);\n svg.appendChild(overlay);\n if (owner?.role === 'shape' && selectedIds.size === 1) {\n svg.appendChild(quickDuplicateBubbles(document, primary, id, svg));\n }\n }\n}\n","import { resolveOwner } from '../../dom';\nimport type { Emitter, OwnerRef } from '../events';\nimport { paintSelectionOverlays } from './overlayPainter';\nimport { type SelectionAction, selectionReducer } from './selection';\n\nexport class SelectionController {\n readonly #svg: SVGSVGElement;\n readonly #emitter: Emitter;\n readonly #diagramId: string;\n readonly #owners = new Map<string, OwnerRef>();\n #ids = new Set<string>();\n\n constructor(svg: SVGSVGElement, emitter: Emitter, diagramId: string) {\n this.#svg = svg;\n this.#emitter = emitter;\n this.#diagramId = diagramId;\n }\n\n getOwners(): OwnerRef[] {\n return [...this.#ids].map(id => this.#owners.get(id)).filter((owner): owner is OwnerRef => Boolean(owner));\n }\n\n remember(owner: OwnerRef): void {\n this.#owners.set(owner.id, owner);\n }\n\n dispatch(action: SelectionAction): void {\n this.#ids = selectionReducer(this.#ids, action);\n paintSelectionOverlays(this.#svg, this.#ids, this.#owners);\n this.#emitter.emit('selectionChange', {\n diagramId: this.#diagramId,\n selection: this.getOwners(),\n });\n }\n\n repaint(): void {\n if (this.#ids.size > 0) {\n paintSelectionOverlays(this.#svg, this.#ids, this.#owners);\n }\n }\n\n selectIds(ids: string[]): void {\n for (const id of ids) {\n const element = this.#svg.querySelector(`[data-sf-id=\"${CSS.escape(id)}\"]`);\n const owner = resolveOwner(element);\n if (owner) {\n this.remember(owner);\n }\n }\n this.dispatch({ type: 'set', ids });\n }\n}\n","import { isCameraGesture } from '../../dom';\nimport type { DisplayHandle } from '../display';\nimport type { SelectionController } from './selectionController';\n\nexport function bindWheelZoom(display: DisplayHandle, selection: SelectionController): () => void {\n const onWheel = (event: WheelEvent) => {\n if (!isCameraGesture(event)) {\n return;\n }\n event.preventDefault();\n display.zoomBy(event.deltaY < 0 ? 1.1 : 1 / 1.1, event.clientX, event.clientY);\n selection.repaint();\n };\n display.svg.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n display.svg.removeEventListener('wheel', onWheel);\n };\n}\n","import type { DisplayHandle } from '../display';\nimport type { Emitter, OwnerRef } from '../events';\nimport { createChangeFlash } from './changeFlash';\nimport { bindKeyboardSelection } from './keyboard';\nimport { bindPointerInteraction } from './pointer';\nimport { SelectionController } from './selectionController';\nimport { bindWheelZoom } from './wheel';\n\nexport interface InteractionHandle {\n getSelection(): OwnerRef[];\n select(ids: string[]): void;\n repaint(): void;\n flashChanged(ownerIds: readonly string[], color?: string): void;\n destroy(): void;\n}\n\nexport interface BindInteractionOptions {\n selectable?: boolean;\n}\n\nexport function bindInteraction(\n display: DisplayHandle,\n emitter: Emitter,\n diagramId: string,\n options: BindInteractionOptions = {},\n): InteractionHandle {\n const selectable = options.selectable ?? true;\n const selection = new SelectionController(display.svg, emitter, diagramId);\n const unbindPointer = bindPointerInteraction({ display, emitter, diagramId, selection, selectable });\n const unbindWheel = bindWheelZoom(display, selection);\n const unbindKeyboard = bindKeyboardSelection(display.svg, selection, selectable);\n const changeFlash = createChangeFlash(display.svg);\n return {\n getSelection: () => selection.getOwners(),\n select: ids => selection.selectIds(ids),\n repaint: () => selection.repaint(),\n flashChanged: (ownerIds, color) => changeFlash.flash(ownerIds, color),\n destroy() {\n unbindPointer();\n unbindWheel();\n unbindKeyboard();\n changeFlash.destroy();\n },\n };\n}\n","export const SHADER_DEFAULTS = {\n numbers: {\n intensity: 0.85,\n speed: 0.18,\n progress: -1,\n boost: 0,\n dent: -1,\n day: -1,\n light: 135,\n gloss: 0.15,\n depth: 0.4,\n rim: 0.2,\n },\n colors: {\n color: [0.08, 0.02, 0.22],\n accent: [0.58, 0.31, 1],\n hot: [1, 0.45, 0.82],\n },\n} as const;\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uLight;\nuniform float uGloss;\nuniform float uDepth;\nuniform float uRim;\nuniform float uPressed;\nuniform vec3 uColor;\nvarying vec2 vUv;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float pixel = 2.0 / max(uResolution.y, 1.0);\n float pressed = clamp(uPressed, 0.0, 1.0);\n\n float radius = 0.9 * (1.0 - 0.025 * pressed);\n float r = length(p);\n vec2 direction = r > 0.0001 ? p / r : vec2(0.0, 1.0);\n float angle = radians(uLight);\n vec2 toLight = vec2(cos(angle), sin(angle));\n vec3 light = normalize(vec3(toLight, 0.85));\n\n vec3 base = dot(uColor, uColor) > 0.0 ? uColor : vec3(0.15, 0.15, 0.17);\n float depth = max(uDepth, 0.0) * (1.0 - 0.65 * pressed);\n float inside = clamp(r / radius, 0.0, 1.0);\n\n vec3 normal = normalize(vec3(direction * pow(inside, 1.6) * depth * 1.4, 1.0));\n float diffuse = clamp(dot(normal, light), 0.0, 1.0);\n vec3 color = base * (0.5 + 0.7 * diffuse) * (1.0 - 0.18 * pressed);\n\n vec3 reflected = reflect(-light, normal);\n float specular = pow(max(reflected.z, 0.0), 26.0) * max(uGloss, 0.0) * (1.0 - 0.8 * pressed);\n color += vec3(specular) * 0.9;\n\n float lit = max(dot(direction, toLight), 0.0);\n float away = max(dot(direction, -toLight), 0.0);\n float edge = smoothstep(0.55, 1.0, inside);\n color *= 1.0 - 0.45 * edge * away * min(depth, 1.5) - 0.12 * edge;\n color += mix(base, vec3(1.0), 0.6) * max(uRim, 0.0) * smoothstep(0.9, 1.0, inside) * lit * (1.0 - 0.7 * pressed);\n\n float disc = 1.0 - smoothstep(radius - pixel, radius + pixel, r);\n\n vec2 shadowAt = -toLight * 0.06 * (1.0 - 0.7 * pressed);\n float shadowDistance = length(p - shadowAt);\n float shadow = (1.0 - smoothstep(radius * 0.55, 0.99, shadowDistance)) * 0.55 * (1.0 - 0.4 * pressed);\n\n float alpha = clamp(disc + shadow * (1.0 - disc), 0.0, 1.0);\n gl_FragColor = vec4(clamp(color * disc, 0.0, 1.0), alpha);\n}\n`;\n\nexport const buttonProgram: ShaderProgram = {\n name: 'button',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform sampler2D uBackdrop;\nuniform vec2 uBackdropOrigin;\nuniform vec2 uBackdropScale;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uThickness;\nuniform float uRefraction;\nuniform vec3 uPinkColor;\nuniform vec3 uVioletColor;\nuniform vec3 uBlueColor;\nuniform vec3 uEdgeColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float depth = mix(0.025, 0.105, clamp(uThickness, 0.0, 1.0));\n float radius = 0.79;\n float distance = length(p) - radius;\n float pixel = 2.0 / max(min(uResolution.x, uResolution.y), 1.0);\n float alpha = 1.0 - smoothstep(-pixel, pixel, distance);\n if (alpha < 0.001) discard;\n\n float edge = smoothstep(0.66, 0.995, length(p) / radius);\n vec2 normal = p / max(length(p), 0.001);\n vec2 opticalWarp = normal * edge * max(uRefraction, 0.0) * 0.12;\n opticalWarp += vec2(sin(p.y * 8.0 + time * 0.35), cos(p.x * 7.0 - time * 0.27)) * 0.002;\n vec2 backdropUv = clamp(uBackdropOrigin + (vUv + opticalWarp) * uBackdropScale, 0.001, 0.999);\n vec3 backdrop = texture2D(uBackdrop, backdropUv).rgb;\n\n float wave = sin(p.x * 3.1 - time * 0.38) * 0.025;\n float pinkBand = bell(p.y - 0.42 + wave, 0.20);\n float pinkShelf = smoothstep(0.16, 0.30, p.y + wave);\n float whiteCap = smoothstep(0.59, 0.75, p.y + wave) * 0.95;\n vec3 face = backdrop * 0.19 + vec3(0.004, 0.002, 0.011);\n face += uVioletColor * bell(p.y + 0.56, 0.18) * 0.10;\n face += uBlueColor * bell(p.x - 0.49, 0.18) * bell(p.y + 0.22, 0.39) * 0.09;\n face += uPinkColor * pinkBand * pinkShelf * 1.05;\n face += uEdgeColor * whiteCap * 0.88;\n\n float left = 1.0 - smoothstep(-0.68, -0.34, p.x);\n float right = smoothstep(0.36, 0.68, p.x);\n float upper = smoothstep(0.0, 0.58, p.y);\n float lower = 1.0 - smoothstep(-0.52, -0.04, p.y);\n float rim = bell(distance + 0.004, 0.007);\n float bevel = bell(distance + depth * 0.55, depth * 0.48);\n float innerArc = bell(distance + depth * 1.13, depth * 0.23) * right * lower;\n face += uEdgeColor * rim * (0.61 + 0.35 * upper);\n face += uPinkColor * bevel * (0.18 + 0.58 * left * upper);\n face += uBlueColor * bevel * right * lower * 0.49;\n face += uVioletColor * innerArc * 0.27;\n face += uEdgeColor * bell(distance + depth * 1.3, depth * 0.31) * left * upper * 0.22;\n float movingGlint = bell(p.x + 0.42 - sin(time * 0.47) * 0.075, 0.055);\n face += uEdgeColor * movingGlint * bell(p.y - 0.26, 0.48) * left * 0.15;\n gl_FragColor = vec4(clamp(face * max(uIntensity, 0.0), 0.0, 1.0) * alpha, alpha);\n}\n`;\n\nexport const chromaticGlassPlateProgram: ShaderProgram = {\n name: 'chromaticGlassPlate',\n fragmentSource,\n usesBackdrop: true,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uRingRadius;\nuniform float uRingWidth;\nuniform float uBloom;\nuniform float uMotion;\nuniform bool uLightMode;\nuniform vec3 uWarmColor;\nuniform vec3 uCoolColor;\nuniform vec3 uAccentColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nfloat displacedRing(vec2 point, float radius, float width, float phase, float time, float motion) {\n float angle = atan(point.y, point.x);\n float wave = sin(angle * 2.0 + phase + time * 0.4) * 0.052;\n wave += sin(angle * 3.0 - phase * 0.45 + time * 0.27) * 0.025;\n wave += sin(angle * 6.0 - phase * 0.7 - time * 0.23) * 0.011;\n return bell(length(point) - radius - wave * motion, width);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float radius = clamp(uRingRadius, 0.25, 0.88);\n float width = max(uRingWidth, 0.025);\n float motion = max(uMotion, 0.0);\n\n vec2 coolOffset = vec2(-0.052, -0.012) * (0.7 + motion * 0.3);\n vec2 warmOffset = vec2(0.042, 0.024) * (0.7 + motion * 0.3);\n vec2 accentOffset = vec2(0.016, -0.044) * (0.7 + motion * 0.3);\n float coolRing = displacedRing(p + coolOffset, radius, width * 1.18, 0.4, time, motion);\n float warmRing = displacedRing(p + warmOffset, radius, width * 1.05, 2.6, time, motion);\n float accentRing = displacedRing(p + accentOffset, radius, width, 4.8, time, motion);\n float coreRing = displacedRing(p, radius, width * 0.48, 1.7, time, motion);\n\n vec3 color = uCoolColor * coolRing * 0.72;\n color += uWarmColor * warmRing * 0.68;\n color += uAccentColor * accentRing * 0.64;\n if (!uLightMode) {\n color += uHighlightColor * coreRing * 1.35;\n }\n float broadBloom = displacedRing(p, radius, width * 2.35, 0.0, time, motion);\n color += mix(uCoolColor, uWarmColor, smoothstep(-0.8, 0.8, p.y)) * broadBloom * max(uBloom, 0.0) * 0.2;\n\n float ringAlpha = max(max(coolRing, warmRing), max(accentRing, coreRing));\n float alpha = clamp(ringAlpha * 0.9 + broadBloom * max(uBloom, 0.0) * 0.18, 0.0, 1.0);\n if (uLightMode) {\n color = mix(color, uHighlightColor, smoothstep(0.16, 0.82, coreRing));\n }\n float circleMask = 1.0 - smoothstep(0.965, 1.0, length(p));\n alpha *= circleMask * max(uIntensity, 0.0);\n color *= circleMask * max(uIntensity, 0.0);\n\n gl_FragColor = vec4(clamp(color, 0.0, 1.0), clamp(alpha, 0.0, 1.0));\n}\n`;\n\nexport const chromaticHaloProgram: ShaderProgram = {\n name: 'chromaticHalo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uGlow;\nuniform float uDay;\nuniform vec3 uTopColor;\nuniform vec3 uMiddleColor;\nuniform vec3 uBottomColor;\nuniform vec3 uRimColor;\nvarying vec2 vUv;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n float time = uTime * max(uSpeed, 0.0);\n float glow = max(uGlow, 0.0);\n float intensity = max(uIntensity, 0.0);\n\n float current = sin(p.x * 4.2 - time * 0.75) * 0.025;\n current += sin(p.y * 5.0 + p.x * 2.3 + time * 0.55) * 0.018;\n float vertical = p.y + current;\n float useDay = step(0.0, uDay);\n float day = clamp(uDay, 0.0, 1.0);\n float capStart = mix(-0.04, -0.62 + day * 0.98, useDay);\n float tone = mix(1.0, mix(0.2, 1.2, day), useDay);\n vec3 bodyColor = mix(uBottomColor, uMiddleColor, smoothstep(-0.69, -0.06, vertical)) * tone;\n bodyColor = mix(bodyColor, uTopColor, smoothstep(capStart, capStart + 0.42, vertical));\n\n float side = smoothstep(0.35, 0.9, abs(p.x) / max(radius, 0.001));\n float lower = 1.0 - smoothstep(-0.35, 0.38, p.y);\n float ring = exp(-pow((radius - 0.765) / 0.03, 2.0));\n float rimLight = ring * (0.28 + side * 0.55 + lower * 0.52) * mix(1.0, 0.35 + 0.65 * day, useDay);\n float crest = ring * smoothstep(0.3, 0.68, p.y) * mix(1.0, 0.15 + 0.85 * day, useDay);\n bodyColor = mix(bodyColor, uRimColor, clamp(rimLight * 0.78 * intensity, 0.0, 1.0));\n bodyColor = mix(bodyColor, vec3(1.0, 0.94, 0.86), clamp(crest * 0.84 * intensity, 0.0, 1.0));\n\n float bodyAlpha = 1.0 - smoothstep(0.758, 0.778, radius);\n float halo = exp(-pow(max(radius - 0.765, 0.0) / 0.12, 2.0));\n halo *= (0.14 + rimLight * 0.28 + crest * 0.2) * glow * intensity;\n float crownGlow = exp(-pow(p.x / 0.48, 2.0) - pow((p.y - 0.83) / 0.16, 2.0));\n halo += crownGlow * 0.16 * glow * intensity;\n float outsideAlpha = clamp(halo, 0.0, 0.85) * (1.0 - smoothstep(0.84, 1.0, radius));\n vec3 haloColor = mix(uRimColor, vec3(1.0, 0.91, 0.77), crest * 0.55 + crownGlow * 0.45);\n float alpha = bodyAlpha + (1.0 - bodyAlpha) * outsideAlpha;\n vec3 premultipliedColor = bodyColor * bodyAlpha;\n premultipliedColor += haloColor * (1.0 - bodyAlpha) * outsideAlpha;\n\n gl_FragColor = vec4(premultipliedColor, alpha);\n}\n`;\n\nexport const eclipseOrbProgram: ShaderProgram = {\n name: 'eclipseOrb',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uCellCount;\nuniform float uGrain;\nuniform vec3 uBaseColor;\nuniform vec3 uTopColor;\nuniform vec3 uCoreColor;\nuniform vec3 uBottomColor;\nuniform vec3 uCoolColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat pixelNoise(vec2 uv) {\n vec2 pixel = floor(uv * uResolution);\n return fract(sin(dot(pixel, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float cells = max(uCellCount, 1.0);\n vec2 grid = (p + 1.0) * cells * 0.5;\n vec2 cell = fract(grid) - 0.5;\n vec2 samplePoint = (floor(grid) + 0.5) * 2.0 / cells - 1.0;\n vec2 q = samplePoint;\n q.x += sin(samplePoint.y * 3.4 + time * 0.34) * 0.035;\n q.y += sin(samplePoint.x * 4.0 - time * 0.29) * 0.045;\n\n float upperCurve = 0.56 + 0.11 * sin(q.x * 3.1 + time * 0.41);\n float topLight = band(q.y - upperCurve, 0.25) * (0.48 + 0.52 * abs(q.x));\n topLight += band(q.x + 0.77, 0.28) * band(q.y - 0.46, 0.35) * 0.58;\n topLight += band(q.x - 0.76, 0.28) * band(q.y - 0.43, 0.36) * 0.68;\n topLight *= 1.0 - band(q.x + 0.02, 0.45) * band(q.y - 0.78, 0.28) * 0.88;\n\n float coreLight = band(q.x + 0.02 + 0.08 * sin(time * 0.28), 0.58);\n coreLight *= band(q.y + 0.19 + 0.07 * sin(q.x * 3.0 - time * 0.31), 0.44);\n float bottomLight = band(q.y + 0.82, 0.38) * band(q.x - 0.02, 0.85);\n float coolLight = band(q.x + 0.79, 0.31) * band(q.y + 0.03, 0.29);\n coolLight += band(q.x - 0.89, 0.23) * band(q.y + 0.02, 0.25) * 0.48;\n\n float centerCut = band(q.y - 0.12 + 0.08 * sin(q.x * 3.2 + time * 0.33), 0.16);\n centerCut *= band(q.x + 0.03, 0.99);\n float rightCut = band(q.x - 0.68, 0.35) * band(q.y + 0.37, 0.26);\n float occlusion = clamp(centerCut * 0.78 + rightCut * 0.79, 0.0, 0.9);\n\n vec3 color = uBaseColor;\n color += uTopColor * topLight * 0.91;\n color += uCoreColor * coreLight * 1.05;\n color += uBottomColor * bottomLight * 0.86;\n color += uCoolColor * coolLight * 0.68;\n color *= 1.0 - occlusion;\n\n float squareRadius = max(abs(cell.x), abs(cell.y));\n float dot = 1.0 - smoothstep(0.23, 0.43, squareRadius);\n color *= 0.21 + dot * 0.79;\n float noise = (pixelNoise(vUv) - 0.5) * max(uGrain, 0.0);\n color += vec3(noise) * (0.25 + dot * 0.75);\n\n float edge = 1.0 - smoothstep(0.955, 0.995, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * edge, 0.0, 1.0), edge);\n}\n`;\n\nexport const emberMatrixProgram: ShaderProgram = {\n name: 'emberMatrix',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uSlitCount;\nuniform float uOrientation;\nuniform bool uHole;\nuniform float uHoleSize;\nuniform float uGlow;\nuniform float uMotion;\nuniform vec3 uHotColor;\nuniform vec3 uCoreColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float radius = length(p);\n\n float wave = sin(p.y * 6.4 - time * 0.9) * 0.04 * motion;\n wave += sin(p.x * 5.1 + time * 0.6) * 0.026 * motion;\n float ringRadius = length(p + vec2(wave, 0.0));\n float holeSize = clamp(uHoleSize, 0.0, 0.72);\n float ring = uHole ? smoothstep(holeSize - 0.08, holeSize + 0.08, ringRadius) : 1.0;\n ring *= 1.0 - smoothstep(0.65, 0.83, ringRadius);\n float ringCore = bell(ringRadius - 0.56, 0.19);\n\n float count = clamp(uSlitCount, 12.0, 90.0);\n vec2 slitPoint = uOrientation < 0.5 ? p : vec2(p.y, p.x);\n float phase = slitPoint.x * count * 3.14159265;\n phase += sin(slitPoint.y * 3.6 - time * 0.95) * 0.75 * motion;\n phase += time * 2.2 * motion;\n float bars = pow(0.5 + 0.5 * cos(phase), 1.9);\n float slit = 0.12 + 0.88 * bars;\n float sideFade = 1.0 - smoothstep(0.67, 0.91, abs(p.x));\n\n float upperLight = bell(p.y - 0.45 - sin(time * 0.6) * 0.1 * motion, 0.21);\n float lowerLight = bell(p.y + 0.48 + sin(time * 0.5 + 1.7) * 0.1 * motion, 0.24);\n vec3 heat = mix(uHotColor, uCoreColor, smoothstep(-0.57, 0.55, p.y));\n heat = mix(heat, uHighlightColor, upperLight * 0.45 + lowerLight * 0.28);\n float molten = ring * slit * sideFade;\n vec3 color = heat * molten * (0.64 + ringCore * 0.68);\n\n float verticalTrail = bell(max(ringRadius - 0.69, 0.0), 0.24);\n verticalTrail *= smoothstep(0.25, 0.75, abs(p.y));\n verticalTrail *= slit * sideFade;\n float bloom = bell(ringRadius - 0.57, 0.29) * ring;\n float glow = max(uGlow, 0.0);\n float glowMask = (verticalTrail * 0.25 + bloom * 0.17) * glow;\n color += heat * glowMask;\n\n float frameFade = 1.0 - smoothstep(0.89, 1.0, max(abs(p.x), abs(p.y)));\n float alpha = clamp((molten * 0.92 + glowMask) * frameFade * max(uIntensity, 0.0), 0.0, 1.0);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0), 0.0, 1.0) * alpha, alpha);\n}\n`;\n\nexport const emberSlitsProgram: ShaderProgram = {\n name: 'emberSlits',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform sampler2D uBackdrop;\nuniform vec2 uBackdropOrigin;\nuniform vec2 uBackdropScale;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uIor;\nuniform float uRefraction;\nuniform float uRoughness;\nuniform float uChromaticAberration;\nuniform float uEdgeLight;\nuniform vec3 uTint;\nuniform vec3 uEdgeColor;\nvarying vec2 vUv;\n\nfloat hash(vec2 point) {\n return fract(sin(dot(point, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat smoothNoise(vec2 point) {\n vec2 cell = floor(point);\n vec2 local = fract(point);\n local = local * local * (3.0 - 2.0 * local);\n float a = hash(cell);\n float b = hash(cell + vec2(1.0, 0.0));\n float c = hash(cell + vec2(0.0, 1.0));\n float d = hash(cell + vec2(1.0, 1.0));\n return mix(mix(a, b, local.x), mix(c, d, local.x), local.y);\n}\n\nvoid main() {\n float time = uTime * max(uSpeed, 0.0);\n vec2 sphereOffset = vec2(\n sin(time * 0.72) * 0.04,\n cos(time * 0.56) * 0.026\n );\n float sphereScale = 0.95;\n vec2 p = (vUv * 2.0 - 1.0 - sphereOffset) / sphereScale;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float roughness = max(uRoughness, 0.0);\n vec2 flow = vec2(\n smoothNoise(p * 2.4 + vec2(0.7, -0.3)),\n smoothNoise(p * 2.8 + vec2(-0.4, 0.8))\n ) - 0.5;\n float sphereDepth = sqrt(max(1.0 - radius * radius, 0.0));\n vec2 glassMotion = vec2(\n sin(p.y * 3.2 + 0.6),\n cos(p.x * 2.8 - 0.35)\n ) * 0.014;\n vec3 surfaceNormal = normalize(vec3(p + glassMotion + flow * roughness * 0.22, sphereDepth));\n float eta = 1.0 / max(uIor, 1.001);\n vec3 refracted = refract(vec3(0.0, 0.0, -1.0), surfaceNormal, eta);\n vec2 distortion = refracted.xy * max(uRefraction, 0.0);\n distortion += flow * (0.008 + roughness * 0.025);\n\n vec2 backdropUv = uBackdropOrigin + vUv * uBackdropScale;\n vec2 refractedUv = clamp(backdropUv + distortion * uBackdropScale, 0.001, 0.999);\n float chroma = max(uChromaticAberration, 0.0) * 0.012;\n vec2 chromaOffset = normalize(distortion + vec2(0.0001)) * chroma * uBackdropScale;\n float red = texture2D(uBackdrop, clamp(refractedUv + chromaOffset, 0.001, 0.999)).r;\n float green = texture2D(uBackdrop, refractedUv).g;\n float blue = texture2D(uBackdrop, clamp(refractedUv - chromaOffset, 0.001, 0.999)).b;\n vec3 sharpBackdrop = vec3(red, green, blue);\n vec2 texel = uBackdropScale / max(uResolution, vec2(1.0));\n vec2 blurOffset = texel * (0.65 + roughness * 5.0);\n vec3 blurredBackdrop = texture2D(uBackdrop, refractedUv + vec2(blurOffset.x, 0.0)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv - vec2(blurOffset.x, 0.0)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv + vec2(0.0, blurOffset.y)).rgb;\n blurredBackdrop += texture2D(uBackdrop, refractedUv - vec2(0.0, blurOffset.y)).rgb;\n blurredBackdrop *= 0.25;\n vec3 backdrop = mix(sharpBackdrop, blurredBackdrop, clamp(roughness * 1.15, 0.0, 1.0));\n\n float fresnel = pow(1.0 - sphereDepth, 2.35);\n float innerRim = smoothstep(0.72, 0.995, radius);\n vec2 fixedLightPosition = vec2(-0.46, 0.7);\n vec2 surfacePosition = sphereOffset + p * sphereScale * 0.22;\n vec3 lightDirection = normalize(vec3(fixedLightPosition - surfacePosition, 0.62));\n float highlight = pow(max(dot(lightDirection, surfaceNormal), 0.0), 28.0);\n float hotSpot = pow(max(dot(lightDirection, surfaceNormal), 0.0), 92.0);\n float angle = atan(p.y, p.x);\n float lightAngle = atan(lightDirection.y, lightDirection.x);\n float movingRim = 0.68 + 0.32 * sin(angle * 2.0 - lightAngle);\n float rimGlint = pow(max(cos(angle - lightAngle), 0.0), 20.0) * innerRim;\n vec3 color = mix(backdrop, backdrop * uTint, 0.025 + fresnel * 0.09);\n color += uEdgeColor * innerRim * max(uEdgeLight, 0.0) * (0.1 + fresnel * 0.5) * movingRim;\n color += uEdgeColor * rimGlint * max(uEdgeLight, 0.0) * 0.72;\n color += uEdgeColor * highlight * 0.5;\n color += vec3(1.0) * hotSpot * 0.58;\n color += vec3(1.0) * fresnel * 0.05;\n color *= max(uIntensity, 0.0);\n\n float edgeWidth = 2.2 / max(min(uResolution.x, uResolution.y), 1.0);\n float edgeAlpha = 1.0 - smoothstep(1.0 - edgeWidth, 1.0, radius);\n vec3 finalColor = clamp(color, 0.0, 1.0) * edgeAlpha;\n gl_FragColor = vec4(finalColor, edgeAlpha);\n}\n`;\n\nexport const glassRefractionProgram: ShaderProgram = {\n name: 'glassRefraction',\n fragmentSource,\n usesBackdrop: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uDotCount;\nuniform float uRingRadius;\nuniform float uRingWidth;\nuniform float uGlow;\nuniform float uMotion;\nuniform vec3 uWarmColor;\nuniform vec3 uLightColor;\nuniform vec3 uCoolColor;\nvarying vec2 vUv;\n\nmat2 rotate(float angle) {\n float sine = sin(angle);\n float cosine = cos(angle);\n return mat2(cosine, -sine, sine, cosine);\n}\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n\n float speed = max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float time = uTime * speed;\n float rotation = time * 0.08 * motion;\n vec2 gridPosition = rotate(rotation) * p;\n float cells = max(uDotCount, 8.0);\n vec2 grid = (gridPosition + 1.0) * cells * 0.5;\n vec2 cell = fract(grid) - 0.5;\n vec2 samplePoint = (floor(grid) + 0.5) * 2.0 / cells - 1.0;\n samplePoint = rotate(-rotation) * samplePoint;\n\n float angle = atan(samplePoint.y, samplePoint.x);\n float radius = length(samplePoint);\n float travelingWave = sin(angle * 3.0 - time * 0.72) * 0.024 * motion;\n travelingWave += sin(angle * 7.0 + time * 0.31) * 0.009 * motion;\n float ringRadius = clamp(uRingRadius, 0.2, 0.92) + travelingWave;\n float ringWidth = max(uRingWidth, 0.025);\n float ring = bell(radius - ringRadius, ringWidth);\n\n float lowerBloom = bell(samplePoint.x + 0.08, 0.72) * bell(samplePoint.y + 0.56, 0.42);\n float upperArc = bell(radius - ringRadius + 0.025, ringWidth * 0.7) * smoothstep(-0.18, 0.72, samplePoint.y);\n float light = clamp(ring * (0.58 + lowerBloom * 0.64 + upperArc * 0.25), 0.0, 1.0);\n float shimmer = 0.9 + 0.1 * sin(angle * 9.0 + time * 0.48);\n float dotRadius = mix(0.055, 0.43, pow(light, 0.72) * shimmer);\n float dotDistance = length(cell);\n float dot = 1.0 - smoothstep(dotRadius - 0.045, dotRadius + 0.045, dotDistance);\n\n float warmWeight = smoothstep(-0.22, 0.72, samplePoint.y);\n warmWeight *= 0.76 + 0.24 * (1.0 - smoothstep(-0.45, 0.72, samplePoint.x));\n float coolWeight = smoothstep(-0.85, 0.42, samplePoint.x);\n coolWeight *= 1.0 - smoothstep(-0.78, 0.3, samplePoint.y);\n vec3 color = mix(uLightColor, uWarmColor, clamp(warmWeight, 0.0, 1.0));\n color = mix(color, uCoolColor, clamp(coolWeight * 0.72, 0.0, 0.82));\n color = mix(color, uLightColor, lowerBloom * ring * 0.58);\n\n float circleMask = 1.0 - smoothstep(0.965, 1.0, length(p));\n float dotAlpha = dot * pow(light, 0.82) * smoothstep(0.06, 0.24, light) * circleMask;\n float glow = bell(length(p) - ringRadius, ringWidth * 1.75) * max(uGlow, 0.0) * 0.17;\n glow *= circleMask;\n float alpha = clamp((dotAlpha + glow) * max(uIntensity, 0.0), 0.0, 1.0);\n vec3 glowColor = mix(uWarmColor, uCoolColor, 1.0 - smoothstep(-0.75, 0.55, samplePoint.y));\n vec3 finalColor = color * dotAlpha + glowColor * glow;\n\n gl_FragColor = vec4(clamp(finalColor * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const halftoneHaloProgram: ShaderProgram = {\n name: 'halftoneHalo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform float uIntensity;\nuniform float uSpeed;\nuniform float uThickness;\nuniform float uProgress;\nuniform float uBoost;\nvarying vec2 vUv;\n\nconst float TWO_PI = 6.28318530718;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius > 1.0) discard;\n\n float angle = atan(p.y, p.x);\n float time = uTime * max(uSpeed, 0.0);\n float controlled = step(0.0, uProgress);\n float progress = clamp(uProgress, 0.0, 1.0);\n float boost = clamp(uBoost, 0.0, 1.0);\n float width = max(uThickness, 0.015);\n float wave = sin(angle * 2.0 - time * 2.4) * 0.5 + 0.5;\n float fineWave = sin(angle * 7.0 + time * 1.15) * 0.5 + 0.5;\n float ringRadius = 0.72 + sin(angle * 3.0 - time * 1.5) * (0.025 + boost * 0.012);\n float ring = exp(-pow((radius - ringRadius) / width, 2.0));\n float outerRim = exp(-pow((radius - 0.94) / 0.025, 2.0));\n\n float startAngle = -2.35;\n float sweep = 4.70;\n float arcPosition = mod(startAngle - angle + TWO_PI, TWO_PI);\n float arcHead = progress * sweep;\n float idleTravel = sin(time * 0.82) * 0.025 * (1.0 - boost);\n float displayedHead = clamp(arcHead + idleTravel, 0.0, sweep);\n float arcEdge = 0.025;\n float arcMask = (1.0 - smoothstep(displayedHead - arcEdge, displayedHead + arcEdge, arcPosition));\n arcMask *= 1.0 - step(sweep, arcPosition);\n float arcActive = smoothstep(0.0, 0.012, progress);\n arcMask *= arcActive;\n\n float ambientHead = -2.25 + sin(time * 0.45) * 0.35;\n float progressHead = startAngle - displayedHead;\n float headAngle = mix(ambientHead, progressHead, controlled);\n float angleFromHead = atan(sin(angle - headAngle), cos(angle - headAngle));\n float flare = exp(-pow(angleFromHead / (0.18 + boost * 0.035), 2.0));\n flare *= exp(-pow((radius - 0.73) / 0.12, 2.0));\n float ambientBand = ring * (0.32 + wave * 0.38);\n float startDelta = atan(sin(angle - startAngle), cos(angle - startAngle));\n float radialDelta = radius - ringRadius;\n float startCapDistance = length(vec2(radialDelta, startDelta * ringRadius));\n float endCapDistance = length(vec2(radialDelta, angleFromHead * ringRadius));\n float roundedCaps = max(\n exp(-pow(startCapDistance / width, 2.0)),\n exp(-pow(endCapDistance / width, 2.0))\n ) * arcActive;\n float progressShape = max(ring * arcMask, roundedCaps);\n float progressBand = progressShape * (0.72 + boost * 0.55);\n float idleBand = ring * (0.16 + wave * 0.16 + fineWave * 0.06);\n float band = mix(ambientBand, idleBand + progressBand, controlled);\n float pulse = 1.0 + boost * (0.18 + sin(time * 8.0) * 0.08);\n float energy = clamp((band + outerRim * (0.24 + boost * 0.12) + flare * (1.35 + boost * 0.55) + fineWave * ring * 0.12) * uIntensity * pulse, 0.0, 1.0);\n vec3 base = uColor * (0.1 + 0.28 * (1.0 - radius));\n vec3 color = mix(base, uAccent, energy);\n color += uAccent * flare * (0.3 + boost * 0.35);\n float alpha = 1.0 - smoothstep(0.96, 1.0, radius);\n gl_FragColor = vec4(color, alpha);\n}\n`;\n\nexport const haloProgram: ShaderProgram = {\n name: 'halo',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n vec2 q = p;\n q.x += sin(p.y * 4.0 + time * 0.58) * 0.02;\n q.y += sin(p.x * 3.3 - time * 0.43) * 0.013;\n float distance = length(q) - 0.64;\n float body = 1.0 - smoothstep(-0.012, 0.01, distance);\n float nearGlow = band(max(distance, 0.0), 0.19) * 0.62;\n float wideGlow = band(max(distance, 0.0), 0.48) * 0.3;\n float frameFade = 1.0 - smoothstep(0.88, 1.0, length(p));\n float halo = max(nearGlow, wideGlow) * frameFade;\n float alpha = body + (1.0 - body) * halo;\n if (alpha < 0.002) discard;\n\n float vertical = 0.5 + 0.5 * q.y;\n float warmWeight = smoothstep(-0.44, 0.42, q.x + q.y * 0.14 + sin(time * 0.62 + q.y * 3.0) * 0.065);\n vec3 glowColor = mix(uCoolColor, uWarmColor, warmWeight);\n float breath = 0.78 + 0.22 * sin(time * 1.12 + q.y * 3.0);\n float rim = band(distance + 0.014, 0.042);\n float edge = band(distance + 0.006, 0.014);\n float bevel = band(distance + 0.092, 0.07);\n\n vec3 color = uBaseColor * (0.62 + 0.23 * vertical);\n color += uWarmColor * smoothstep(-0.68, 0.6, q.x) * 0.13;\n color += uWarmColor * band(q.x - 0.38, 0.32) * band(q.y + 0.14, 0.74) * 0.11;\n color += uCoolColor * band(q.x + 0.28, 0.42) * band(q.y - 0.47, 0.35) * 0.11;\n color *= 1.0 - band(q.x - 0.06, 0.3) * band(q.y + 0.2, 0.5) * 0.46;\n color += glowColor * bevel * 0.14;\n color += glowColor * rim * 0.41 * breath;\n color += mix(uCoolColor, vec3(1.0), 0.45) * edge * (1.0 - warmWeight) * 0.43;\n color += mix(uWarmColor, vec3(1.0), 0.38) * edge * warmWeight * 0.45;\n\n float topFlare = band(q.y - 0.6, 0.07) * band(q.x + 0.2, 0.28);\n float bottomFlare = band(q.y + 0.61, 0.07) * band(q.x - 0.15, 0.35);\n color += uCoolColor * topFlare * 0.39;\n color += uWarmColor * bottomFlare * 0.31;\n vec3 premultiplied = color * body + glowColor * (1.0 - body) * halo * breath;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const lumenPortalProgram: ShaderProgram = {\n name: 'lumenPortal',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nuniform vec3 uShadowColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n vec2 q = p;\n q.x += sin(p.y * 4.1 + time * 0.55) * 0.013;\n q.y += sin(p.x * 3.4 - time * 0.41) * 0.01;\n float distance = length(q) - 0.65;\n float body = 1.0 - smoothstep(-0.012, 0.012, distance);\n float nearHalo = band(max(distance, 0.0), 0.12) * 0.19;\n float wideHalo = band(max(distance, 0.0), 0.28) * 0.055;\n float frameFade = 1.0 - smoothstep(0.89, 1.0, length(p));\n float outside = max(nearHalo, wideHalo) * frameFade;\n float alpha = body * 0.96 + (1.0 - body) * outside;\n if (alpha < 0.002) discard;\n\n float warmWeight = smoothstep(-0.46, 0.47, q.x + q.y * 0.17 + sin(time * 0.58 + q.y * 3.0) * 0.052);\n vec3 rimColor = mix(uCoolColor, uWarmColor, warmWeight);\n float breath = 0.84 + 0.16 * sin(time * 0.91 + q.y * 2.5);\n float innerRim = band(distance + 0.038, 0.052);\n float outerRim = band(distance + 0.002, 0.025);\n float fineEdge = band(distance + 0.008, 0.01);\n float bevelShade = band(distance + 0.11, 0.055);\n\n vec3 color = uBaseColor;\n color = mix(color, uCoolColor, band(q.x + 0.27, 0.39) * band(q.y - 0.35, 0.43) * 0.09);\n color = mix(color, uWarmColor, band(q.x - 0.31, 0.43) * band(q.y + 0.31, 0.48) * 0.085);\n color = mix(color, uShadowColor, bevelShade * 0.11);\n color = mix(color, rimColor, innerRim * 0.46 * breath);\n color = mix(color, rimColor, outerRim * 0.62 * breath);\n color = mix(color, uShadowColor, fineEdge * 0.12);\n\n float topGlint = band(q.y - 0.6, 0.06) * band(q.x + 0.2, 0.22);\n float bottomGlint = band(q.y + 0.61, 0.06) * band(q.x - 0.16, 0.29);\n color += uCoolColor * topGlint * 0.12;\n color += uWarmColor * bottomGlint * 0.1;\n\n vec3 premultiplied = color * body * 0.96;\n premultiplied += mix(uShadowColor, rimColor, 0.58) * (1.0 - body) * outside * breath;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const lumenPortalLightProgram: ShaderProgram = {\n name: 'lumenPortalLight',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform float uIntensity;\nuniform float uSpeed;\nvarying vec2 vUv;\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius > 1.0) discard;\n\n float angle = atan(p.y, p.x);\n float time = uTime * max(uSpeed, 0.0);\n float fold = sin(angle * 3.0 - time * 1.7 + radius * 7.0);\n float ribbon = exp(-pow(radius - (0.69 + fold * 0.07), 2.0) * 95.0);\n float rim = smoothstep(0.58, 0.98, radius) * (1.0 - smoothstep(0.94, 1.0, radius));\n float light = exp(-length(p - vec2(-0.42, -0.34)) * 4.2);\n float grain = (hash(gl_FragCoord.xy + time) - 0.5) * 0.035;\n float energy = clamp((ribbon * 0.8 + rim * 0.55 + light * 0.7) * uIntensity, 0.0, 1.0);\n vec3 color = mix(uColor * (0.12 + 0.32 * (1.0 - radius)), uAccent, energy);\n color += grain;\n float alpha = 1.0 - smoothstep(0.94, 1.0, radius);\n gl_FragColor = vec4(color, alpha);\n}\n`;\n\nexport const orbProgram: ShaderProgram = {\n name: 'orb',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uCellCount;\nuniform float uDensity;\nuniform vec3 uBaseColor;\nuniform vec3 uTopColor;\nuniform vec3 uWarmColor;\nuniform vec3 uCenterColor;\nuniform vec3 uVioletColor;\nuniform vec3 uBottomColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nfloat noise(vec2 p) {\n vec2 cell = floor(p);\n vec2 blend = fract(p);\n blend = blend * blend * (3.0 - 2.0 * blend);\n float lower = mix(hash(cell), hash(cell + vec2(1.0, 0.0)), blend.x);\n float upper = mix(hash(cell + vec2(0.0, 1.0)), hash(cell + vec2(1.0, 1.0)), blend.x);\n return mix(lower, upper, blend.y);\n}\n\nvec3 strandColor(float y) {\n vec3 color = mix(uBottomColor, uVioletColor, smoothstep(-0.9, -0.43, y));\n color = mix(color, uCenterColor, smoothstep(-0.38, 0.05, y));\n color = mix(color, uWarmColor, smoothstep(0.14, 0.48, y));\n return mix(color, uTopColor, smoothstep(0.64, 0.9, y));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n\n float time = uTime * max(uSpeed, 0.0);\n float cells = max(uCellCount, 1.0);\n vec2 grid = (p + 1.0) * cells * 0.5;\n vec2 cellId = floor(grid);\n vec2 q = (cellId + 0.5) * 2.0 / cells - 1.0;\n vec2 flow = vec2(\n 0.1 * sin(time * 0.48 + q.y * 2.6),\n 0.08 * cos(time * 0.4 + q.x * 2.1)\n );\n vec2 movingQ = q + flow;\n\n float path = -0.29 + 0.19 * sin(movingQ.y * 4.0 + time * 0.27);\n path += 0.09 * sin(movingQ.y * 7.7 - time * 0.19);\n float strand = band(movingQ.x - path, 0.26) * 0.11;\n float top = band(movingQ.x + 0.52, 0.28) * band(movingQ.y - 0.78, 0.19) * 0.75;\n float warm = band(movingQ.x + 0.46, 0.2) * band(movingQ.y - 0.47, 0.23) * 0.76;\n float center = band(movingQ.x + 0.06, 0.25) * band(movingQ.y - 0.02, 0.21) * 1.14;\n float lower = band(movingQ.x + 0.38, 0.32) * band(movingQ.y + 0.48, 0.27) * 0.86;\n float bottom = band(movingQ.x + 0.56, 0.36) * band(movingQ.y + 0.85, 0.19) * 0.88;\n float blue = band(movingQ.x - 0.28, 0.19) * band(movingQ.y + 0.64, 0.18) * 0.94;\n float field = strand + top + warm + center + lower + bottom + blue;\n field *= 0.35 + 1.25 * noise(movingQ * 5.1 + vec2(time * 0.075, -time * 0.04));\n\n float chance = clamp(field * max(uDensity, 0.0), 0.0, 0.96);\n float seed = hash(cellId);\n float active = smoothstep(seed - 0.055, seed + 0.055, chance);\n vec2 local = fract(grid) - 0.5;\n local -= vec2(\n 0.11 * sin(time * 0.72 + seed * 6.28318),\n 0.11 * cos(time * 0.61 + seed * 4.71239)\n );\n float growth = 0.78 + 0.34 * (0.5 + 0.5 * sin(time * 0.83 + seed * 5.3));\n float size = mix(0.27, 0.34, hash(cellId + vec2(19.3, 7.1))) * growth;\n float squareRadius = max(abs(local.x), abs(local.y));\n float outer = 1.0 - smoothstep(size - 0.045, size + 0.015, squareRadius);\n float inner = 1.0 - smoothstep(size - 0.17, size - 0.105, squareRadius);\n float outline = max(outer - inner, 0.0);\n float glow = band(squareRadius - size + 0.075, 0.115) * 0.24;\n\n float pulse = 0.76 + 0.24 * sin(time * 1.1 - q.y * 5.1 + seed * 6.28318);\n float variation = 0.43 + 0.57 * hash(cellId + vec2(3.7, 27.4));\n float highlight = band(movingQ.x + 0.07, 0.25) * band(movingQ.y - 0.02, 0.24);\n vec3 colorSum = strandColor(movingQ.y) * strand;\n colorSum += uTopColor * top + uWarmColor * warm + uCenterColor * center;\n colorSum += uVioletColor * lower + uBottomColor * (bottom + blue);\n vec3 cellColor = colorSum / max(strand + top + warm + center + lower + bottom + blue, 0.001);\n cellColor = mix(cellColor, vec3(1.0, 0.96, 0.76), highlight * 0.54);\n vec3 color = uBaseColor + cellColor * active * variation * pulse * (outline + glow);\n\n float edge = 1.0 - smoothstep(0.965, 0.997, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * edge, 0.0, 1.0), edge);\n}\n`;\n\nexport const pixelConstellationProgram: ShaderProgram = {\n name: 'pixelConstellation',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uDent;\nuniform float uBoost;\nuniform float uFlare;\nuniform float uStart;\nuniform float uSweep;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uHot;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nfloat wrap(float angle) {\n return atan(sin(angle), cos(angle));\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float radius = length(p);\n float angle = atan(p.y, p.x);\n\n float sweep = radians(uSweep > 0.0 ? uSweep : 270.0);\n float start = radians(uStart != 0.0 ? uStart : 225.0);\n float progress = clamp(uProgress < 0.0 ? 0.35 : uProgress, 0.0, 1.0);\n float needleAngle = start - progress * sweep;\n float delta = wrap(angle - needleAngle);\n\n float dentValue = clamp(uDent < 0.0 ? progress : uDent, 0.0, 1.0);\n float engage = smoothstep(0.0, 0.28, dentValue);\n float boost = smoothstep(0.0, 1.0, clamp(uBoost, 0.0, 1.0));\n float energy = smoothstep(0.0, 1.0, dentValue);\n float level = (uFlare > 0.0 ? uFlare : 1.0) * engage * (0.45 + 0.5 * energy + 0.3 * boost);\n\n float heat = smoothstep(0.15, 1.0, clamp(0.75 * energy + 0.5 * boost, 0.0, 1.0));\n vec3 cool = mix(uAccent, vec3(0.18, 0.28, 0.95), 0.55);\n vec3 hot = uHot;\n vec3 tint = mix(cool, hot, heat);\n\n float ripple = 0.5 + 0.5 * sin(delta * 9.0 - time * 1.4);\n float wake = (progress - dentValue) * sweep;\n float lo = min(0.0, wake);\n float hi = max(0.0, wake);\n float segment = delta < lo ? lo - delta : (delta > hi ? delta - hi : 0.0);\n float wakePos = hi > lo ? clamp((delta - lo) / (hi - lo), 0.0, 1.0) : 0.0;\n float fromNeedle = wake >= 0.0 ? wakePos : 1.0 - wakePos;\n float taper = mix(1.0, 0.45, fromNeedle * smoothstep(0.02, 0.2, abs(wake)));\n float dent = bell(segment, 0.13 + 0.02 * ripple) * (0.82 + 0.18 * ripple) * taper;\n float shoulder = bell(delta, 0.34);\n float ahead = wake >= 0.0 ? -1.0 : 1.0;\n float pile = bell(delta - ahead * 0.17, 0.15) * clamp(abs(wake) * 2.2, 0.0, 1.0) * engage;\n float baseRadius = 0.72;\n float orbRadius = baseRadius * (1.0 - 0.32 * level * dent - 0.07 * level * shoulder + 0.13 * pile);\n float body = 1.0 - smoothstep(orbRadius - 0.012, orbRadius + 0.012, radius);\n float depth = clamp(radius / orbRadius, 0.0, 1.25);\n float roundDepth = clamp(radius / baseRadius, 0.0, 1.2);\n\n float local = clamp(heat * (0.7 + 0.3 * bell(delta, 0.9)) + 0.25 * heat * bell(delta, 0.3), 0.0, 1.0);\n vec3 rim = mix(cool, hot, local);\n vec3 bodyColor = mix(uColor, rim * (0.5 + 0.25 * energy), pow(roundDepth, 2.6));\n bodyColor += mix(uAccent, hot, local) * (0.26 + 0.3 * energy) * bell(roundDepth - 0.93, 0.13);\n bodyColor *= (0.82 + 0.18 * smoothstep(-0.5, 0.5, -p.x)) * (0.9 + 0.6 * energy * energy);\n\n float ribbons = 0.5 + 0.5 * sin(depth * 24.0 - delta * 8.0 + time * 1.1);\n float zone = max(bell(delta, 0.3), dent * 0.8) * bell(depth - 0.84, 0.32) * level * (1.0 + 0.9 * energy);\n vec3 ribbonColor = mix(tint, hot, smoothstep(0.2, 0.9, ribbons) * (0.35 + 0.65 * heat));\n bodyColor = mix(bodyColor, ribbonColor, clamp(zone * (0.4 + 0.45 * ribbons), 0.0, 1.0));\n float edge = max(max(bell(delta, 0.2), dent * 0.7), pile * 0.8) * bell(depth - 0.99, 0.09) * level;\n bodyColor += mix(hot, vec3(1.0, 0.92, 1.0), 0.45) * edge * (0.45 + 1.3 * energy);\n\n float outside = max(radius - orbRadius, 0.0);\n float notchLight = max(max(bell(delta, 0.2), dent * 0.8), pile * 0.6) * level;\n float halo = exp(-outside * (12.0 - 6.0 * notchLight * (0.4 + energy))) * (1.0 - body) * (0.2 + 0.5 * energy * energy + 0.9 * notchLight * (0.5 + energy));\n vec3 haloColor = mix(tint, hot, clamp(notchLight * 1.2, 0.0, 1.0));\n\n float cross = abs(p.x * sin(needleAngle) - p.y * cos(needleAngle));\n float along = p.x * cos(needleAngle) + p.y * sin(needleAngle);\n float needleSpan = smoothstep(0.1, 0.2, along) * (1.0 - smoothstep(0.9, 0.96, along));\n float needle = smoothstep(0.0055, 0.0008, cross) * needleSpan;\n float needleGlow = bell(cross, 0.02) * needleSpan * (0.25 + 0.35 * energy);\n\n vec3 color = bodyColor * body + haloColor * halo + vec3(1.0, 0.94, 1.0) * needle + hot * needleGlow;\n float alpha = max(max(body, clamp(halo, 0.0, 1.0)), max(needle, needleGlow * 0.8));\n\n float fade = 1.0 - smoothstep(0.88, 0.99, radius);\n float gain = max(uIntensity, 0.0) * fade;\n gl_FragColor = vec4(clamp(color * gain, 0.0, 1.0), clamp(alpha * gain, 0.0, 1.0));\n}\n`;\n\nexport const plasmaGaugeProgram: ShaderProgram = {\n name: 'plasmaGauge',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uRibCount;\nuniform float uGrain;\nuniform vec3 uBaseColor;\nuniform vec3 uCoolColor;\nuniform vec3 uWarmColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat lightField(vec2 p, float time) {\n float upperCurve = 0.43 + 0.16 * sin(p.x * 2.8 + time * 0.58) - p.x * 0.08;\n float lowerCurve = -0.46 + 0.13 * sin(p.x * 2.9 - time * 0.43 + 1.4);\n float upper = band(p.y - upperCurve, 0.2) * band(p.x + 0.03, 0.88);\n float lower = band(p.y - lowerCurve, 0.19) * band(p.x - 0.05, 0.85);\n float leftColumn = band(p.x + 0.39 + 0.1 * sin(p.y * 2.9 + time * 0.5), 0.23);\n leftColumn *= band(p.y + 0.01, 0.59);\n float centerShadow = 1.0 - band(p.x - 0.35, 0.46) * band(p.y + 0.01, 0.28) * 0.9;\n float drift = 0.84 + 0.16 * sin(p.x * 3.5 - p.y * 2.2 + time * 0.72);\n return clamp((upper + lower + leftColumn * 0.74) * centerShadow * drift, 0.0, 1.5);\n}\n\nfloat grain(vec2 uv) {\n vec2 pixel = floor(uv * uResolution);\n return fract(sin(dot(pixel, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float radius = length(p);\n if (radius >= 1.0) discard;\n float time = uTime * max(uSpeed, 0.0);\n\n float field = lightField(p, time);\n float redField = lightField(p + vec2(0.027, 0.0), time);\n float blueField = lightField(p - vec2(0.027, 0.0), time);\n float coolRegion = band(p.x + 0.58, 0.38) * 0.74;\n float warmRegion = band(p.x + 0.02, 0.34) * band(p.y + 0.08, 0.75) * 0.88;\n vec3 spectralTint = mix(uHighlightColor, uCoolColor, coolRegion);\n spectralTint = mix(spectralTint, uWarmColor, warmRegion);\n vec3 light = spectralTint * field * 1.25;\n light += uWarmColor * max(redField - blueField, 0.0) * 2.6;\n light += uCoolColor * max(blueField - redField, 0.0) * 2.6;\n\n float ribCoordinate = (p.x + 1.0) * max(uRibCount, 1.0) * 0.5;\n float rib = fract(ribCoordinate);\n float glassFace = smoothstep(0.08, 0.18, rib) * (1.0 - smoothstep(0.77, 0.94, rib));\n float groove = 1.0 - glassFace;\n float refraction = 0.8 + 0.2 * sin(rib * 3.14159);\n vec3 color = uBaseColor + light * (0.12 + glassFace * 0.95) * refraction;\n color *= 1.0 - groove * 0.83;\n\n float leftEdge = band(rib - 0.18, 0.028);\n float rightEdge = band(rib - 0.79, 0.04);\n color += mix(uCoolColor, uHighlightColor, 0.48) * leftEdge * (0.07 + field * 0.19);\n color += uHighlightColor * rightEdge * (0.025 + field * 0.075);\n color += uCoolColor * band(p.x + 0.78, 0.28) * band(p.y, 0.7) * 0.09;\n\n float noise = (grain(vUv) - 0.5) * max(uGrain, 0.0);\n color += vec3(noise) * (0.18 + field * 0.82);\n float fade = 1.0 - smoothstep(0.88, 1.0, radius);\n gl_FragColor = vec4(clamp(color * max(uIntensity, 0.0) * fade, 0.0, 1.0), fade);\n}\n`;\n\nexport const prismSlatsProgram: ShaderProgram = {\n name: 'prismSlats',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uTicks;\nuniform float uMajor;\nuniform float uLength;\nuniform float uThickness;\nuniform float uRound;\nuniform float uDent;\nuniform float uSpread;\nuniform float uInset;\nuniform float uLine;\nuniform float uGap;\nuniform float uKnobRadius;\nuniform float uAxis;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nuniform vec3 uGlow;\nuniform vec3 uCore;\nvarying vec2 vUv;\n\nfloat wireAt(float at, float lineAt, float depth, float radius, float knob, float spread) {\n float reach = abs(at - knob);\n if (uKnobRadius > 0.0) {\n float outline = max(sqrt(max(radius * radius - reach * reach, 0.0)) - (radius - depth), 0.0);\n float shoulder = max(sqrt(2.0 * depth * radius) * 0.9, 1.0);\n float soft = depth * exp(-(reach * reach) / (shoulder * shoulder));\n float k = max(depth * 0.15, 1.0);\n float h = max(k - abs(outline - soft), 0.0) / k;\n return lineAt - (max(outline, soft) + h * h * k * 0.25);\n }\n float away = reach / spread;\n return lineAt - depth * exp(-away * away);\n}\n\nvoid main() {\n vec2 px = vUv * uResolution;\n float horizontal = step(0.5, uAxis);\n float along = mix(px.y, px.x, horizontal);\n float across = mix(px.x, uResolution.y - px.y, horizontal);\n float extent = mix(uResolution.y, uResolution.x, horizontal);\n float width = mix(uResolution.x, uResolution.y, horizontal);\n\n float inset = uInset > 0.0 ? uInset : 0.05;\n float lineAt = (uLine > 0.0 ? uLine : 0.7) * width;\n float count = max(uTicks > 0.0 ? uTicks : 50.0, 2.0);\n float every = max(uMajor > 0.0 ? uMajor : 5.0, 1.0);\n float unit = (uThickness > 0.0 ? uThickness : 0.012) * width;\n float halfLine = max(unit * 0.5, 0.75);\n float spread = (uSpread > 0.0 ? uSpread : 0.07) * extent;\n float depth = (uDent < 0.0 ? 1.0 : uDent) * 0.16 * width;\n\n float start = inset * extent;\n float span = (1.0 - 2.0 * inset) * extent;\n float knob = start + span * clamp(uProgress, 0.0, 1.0);\n\n float away = (along - knob) / spread;\n float bump = exp(-away * away);\n float radius = (uKnobRadius + (uGap > 0.0 ? uGap : 0.04)) * width;\n float wire = wireAt(along, lineAt, depth, radius, knob, spread);\n float slope = (wireAt(along + 1.0, lineAt, depth, radius, knob, spread) - wireAt(along - 1.0, lineAt, depth, radius, knob, spread)) * 0.5;\n float lineDistance = abs(across - wire) / sqrt(1.0 + slope * slope);\n float line = 1.0 - smoothstep(halfLine - 0.75, halfLine + 0.75, lineDistance);\n float wireDistance = abs(across - wire);\n vec3 lineColor = mix(uColor, uAccent, bump);\n\n vec3 glowColor = dot(uGlow, uGlow) > 0.0 ? uGlow : uAccent;\n float glowSide = across < wire ? 1.0 : 0.35;\n float glow = bump * exp(-wireDistance / (0.1 * width)) * glowSide * 1.3 * max(uIntensity, 0.0);\n vec3 coreColor = dot(uCore, uCore) > 0.0 ? uCore : mix(glowColor, vec3(1.0), 0.55);\n float core = bump * bump * exp(-wireDistance / (0.035 * width)) * glowSide * 1.6 * max(uIntensity, 0.0);\n float reachEdge = min(min(along, extent - along), min(across, width - across));\n float fade = smoothstep(0.0, 0.14 * width, reachEdge);\n glow *= fade;\n core *= fade;\n\n float spacing = span / count;\n float position = (along - start) / spacing;\n float index = floor(position + 0.5);\n float inRange = step(0.0, index) * step(index, count);\n float tickAlong = abs(position - index) * spacing;\n float major = 1.0 - step(0.5, mod(index, every));\n float tickLength = (uLength > 0.0 ? uLength : 0.1) * width * mix(1.0, 1.9, major);\n float tickDistance = (start + index * spacing - knob) / spread;\n float tickBump = exp(-tickDistance * tickDistance);\n float tickEnd = lineAt - 0.12 * width - depth * 0.4 * tickBump;\n float halfTick = halfLine * mix(0.75, 1.2, major);\n float corner = halfTick * clamp(uRound, 0.0, 1.0);\n vec2 q = abs(vec2(across - (tickEnd - tickLength * 0.5), tickAlong)) - vec2(tickLength * 0.5, halfTick) + corner;\n float edge = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - corner;\n float tick = (1.0 - smoothstep(-0.75, 0.75, edge)) * inRange * mix(0.4, 1.0, tickBump);\n vec3 tickColor = mix(uColor, vec3(1.0), tickBump);\n\n float alpha = clamp(tick + line * 0.95 + glow + core, 0.0, 1.0);\n vec3 rgb = tickColor * tick + lineColor * line * 0.95 + glowColor * glow + coreColor * core;\n gl_FragColor = vec4(clamp(rgb, 0.0, 1.0), alpha);\n}\n`;\n\nexport const rulerProgram: ShaderProgram = {\n name: 'ruler',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform float uBlur;\nuniform float uGlow;\nuniform float uMotion;\nuniform float uDirection;\nuniform float uReach;\nuniform vec3 uShapeColor;\nvarying vec2 vUv;\n\nfloat bell(float value, float width) {\n return exp(-pow(value / max(width, 0.001), 2.0));\n}\n\nmat2 rotate(float angle) {\n float sine = sin(angle);\n float cosine = cos(angle);\n return mat2(cosine, -sine, sine, cosine);\n}\n\nvec2 orient(vec2 point, float direction) {\n if (direction < 0.5) return point;\n if (direction < 1.5) return vec2(-point.x, point.y);\n if (direction < 2.5) return vec2(-point.y, point.x);\n return vec2(point.y, -point.x);\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float time = uTime * max(uSpeed, 0.0);\n float motion = max(uMotion, 0.0);\n float blur = clamp(uBlur, 0.02, 0.55);\n\n vec2 q = orient(p, uDirection) - vec2(0.12, 0.0);\n float sweep = sin(time * 0.55) * 0.42 * motion;\n vec2 qb = rotate(sweep) * q;\n float radius = length(q);\n float reach = clamp(uReach + sin(time * 0.41 + 1.3) * 0.16 * motion, 0.0, 1.0);\n float left = 1.0 - smoothstep(-0.42, mix(-0.24, 0.46, reach), qb.x);\n float upper = smoothstep(-0.05, 0.46, qb.y);\n float lower = 1.0 - smoothstep(-0.46, 0.05, qb.y);\n float blurSide = left * (0.50 + 0.50 * max(upper, lower));\n float breathing = 1.0 + sin(time * 0.72) * 0.28 * motion;\n float edgeWidth = mix(0.015, blur * breathing, blurSide);\n float body = 1.0 - smoothstep(0.49 - edgeWidth, 0.49 + edgeWidth, radius);\n\n float upperPlume = bell(qb.x + 0.33 + sin(time * 0.62) * 0.07 * motion, 0.37 + blur * 0.42);\n upperPlume *= bell(qb.y - 0.28 + sin(time * 0.47) * 0.05 * motion, 0.24 + blur * 0.5);\n float lowerPlume = bell(qb.x + 0.32 - sin(time * 0.58) * 0.07 * motion, 0.34 + blur * 0.42);\n lowerPlume *= bell(qb.y + 0.34 - sin(time * 0.44) * 0.05 * motion, 0.26 + blur * 0.5);\n float plume = (upperPlume * 0.44 + lowerPlume * 0.40) * left * max(uGlow, 0.0);\n\n vec3 lightColor = mix(uShapeColor, vec3(1.0), 0.24);\n vec3 darkColor = mix(uShapeColor, vec3(0.0), 0.7);\n float vertical = smoothstep(-0.45, 0.44, q.y);\n vec3 orbColor = mix(uShapeColor * 0.82, lightColor, vertical * 0.48);\n float shade = bell(q.x + 0.22, 0.38) * bell(q.y, 0.28);\n orbColor = mix(orbColor, darkColor, shade * 0.43);\n orbColor *= 0.76 + bell(q.x - 0.27, 0.36) * 0.32;\n\n vec3 plumeColor = mix(uShapeColor, lightColor, smoothstep(-0.26, 0.30, q.y) * 0.35);\n float alpha = body + (1.0 - body) * plume;\n float frameFade = 1.0 - smoothstep(0.85, 1.0, max(abs(p.x), abs(p.y)));\n alpha = clamp(alpha * frameFade * max(uIntensity, 0.0), 0.0, 1.0);\n vec3 premultiplied = orbColor * body + plumeColor * (1.0 - body) * plume;\n gl_FragColor = vec4(clamp(premultiplied * frameFade * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const smearOrbProgram: ShaderProgram = {\n name: 'smearOrb',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uIntensity;\nuniform float uProgress;\nuniform float uTicks;\nuniform float uMajor;\nuniform float uStart;\nuniform float uSweep;\nuniform float uRadius;\nuniform float uLength;\nuniform float uThickness;\nuniform float uRound;\nuniform vec3 uColor;\nuniform vec3 uAccent;\nvarying vec2 vUv;\n\nconst float TAU = 6.28318530718;\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.x *= uResolution.x / max(uResolution.y, 1.0);\n float radius = length(p);\n float angle = atan(p.y, p.x);\n float pixel = 2.0 / max(uResolution.y, 1.0);\n\n float sweep = radians(uSweep > 0.0 ? uSweep : 270.0);\n float start = radians(uStart != 0.0 ? uStart : 225.0);\n float gap = TAU - sweep;\n float fraction = (mod(start - angle + gap * 0.5, TAU) - gap * 0.5) / sweep;\n\n float count = max(uTicks, 2.0);\n float inArc = step(-0.25 / count, fraction) * step(fraction, 1.0 + 0.25 / count);\n float phase = fraction * count;\n float index = floor(phase + 0.5);\n float arcDistance = abs(fract(phase + 0.5) - 0.5) / count * sweep * radius;\n float every = max(uMajor, 1.0);\n float major = 1.0 - step(0.5, mod(index, every));\n\n float outer = uRadius > 0.0 ? uRadius : 0.9;\n float tickLength = (uLength > 0.0 ? uLength : 0.05) * mix(1.0, 1.8, major);\n float halfWidth = max((uThickness > 0.0 ? uThickness : 0.003) * mix(1.0, 1.4, major), pixel * 0.9);\n float halfLength = tickLength * 0.5;\n float corner = min(halfWidth, halfLength) * clamp(uRound, 0.0, 1.0);\n vec2 q = vec2(arcDistance, abs(radius - (outer - halfLength))) - vec2(halfWidth, halfLength) + corner;\n float edge = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - corner;\n float tick = (1.0 - smoothstep(-pixel, pixel, edge)) * inArc;\n\n float progress = uProgress < 0.0 ? 1.0 : clamp(uProgress, 0.0, 1.0);\n float lit = clamp(progress * count - index + 1.0, 0.0, 1.0);\n vec3 base = uColor;\n vec3 color = mix(base, uAccent, lit);\n float alpha = tick * mix(0.32, 1.0, lit) * max(uIntensity, 0.0);\n gl_FragColor = vec4(color * alpha, clamp(alpha, 0.0, 1.0));\n}\n`;\n\nexport const tickScaleProgram: ShaderProgram = {\n name: 'tickScale',\n fragmentSource,\n replacesBaseFill: true,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uColor;\nuniform vec3 uHighlightColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat glassDistance(vec2 p, float time) {\n float angle = atan(p.y, p.x);\n float edge = 0.72;\n edge += sin(angle * 3.0 + time * 0.52) * 0.038;\n edge += sin(angle * 5.0 - time * 0.37 + 1.6) * 0.025;\n edge += sin(angle * 9.0 + time * 0.29) * 0.008;\n return length(p) - edge;\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n p.y += 0.025;\n float time = uTime * max(uSpeed, 0.0);\n float distance = glassDistance(p, time);\n float body = 1.0 - smoothstep(-0.012, 0.01, distance);\n float halo = band(max(distance, 0.0), 0.12) * 0.24;\n float alpha = body + (1.0 - body) * halo;\n if (alpha < 0.002) discard;\n\n float lowerLight = 1.0 - smoothstep(-0.6, 0.45, p.y);\n float liquid = 0.5 + 0.5 * sin(p.x * 3.5 - p.y * 2.2 + time * 0.61);\n vec3 color = mix(uBaseColor, uColor, 0.17 + lowerLight * 0.3 + liquid * 0.09);\n color += uColor * band(p.x + 0.36, 0.42) * band(p.y + 0.12, 0.5) * 0.16;\n color *= 0.55 + 0.45 * smoothstep(-0.52, 0.5, p.y + 0.2);\n\n float innerFold = p.y + 0.22 + 0.19 * sin(p.x * 4.0 + time * 0.53);\n float secondFold = p.y - 0.42 + 0.11 * sin(p.x * 5.5 - time * 0.42);\n float foldLight = band(innerFold, 0.041) * smoothstep(-0.65, -0.1, p.x);\n foldLight += band(secondFold, 0.027) * smoothstep(0.05, 0.6, p.x);\n color += uHighlightColor * foldLight * 0.64;\n color += uColor * band(innerFold + 0.07, 0.065) * 0.31;\n float softReflection = band(p.x + 0.3 + 0.1 * sin(p.y * 3.5 + time * 0.35), 0.2);\n softReflection *= band(p.y - 0.38, 0.35);\n color += uHighlightColor * softReflection * 0.1;\n\n float dome = sqrt(max(0.04, 1.0 - dot(p, p) / 0.62));\n vec3 surfaceNormal = normalize(vec3(p.x * 1.18, p.y * 1.18, dome));\n surfaceNormal.xy += vec2(sin(p.y * 8.0 + time * 0.31), cos(p.x * 7.0 - time * 0.27)) * 0.065;\n surfaceNormal = normalize(surfaceNormal);\n vec3 reflection = reflect(vec3(0.0, 0.0, -1.0), surfaceNormal);\n float softbox = band(reflection.x + 0.42, 0.34) * band(reflection.y - 0.43, 0.24);\n float sidebox = band(reflection.x - 0.57, 0.19) * band(reflection.y + 0.11, 0.5);\n color += uHighlightColor * softbox * 0.21;\n color += uColor * sidebox * 0.22;\n\n float e = 0.008;\n vec2 normal = normalize(vec2(\n glassDistance(p + vec2(e, 0.0), time) - glassDistance(p - vec2(e, 0.0), time),\n glassDistance(p + vec2(0.0, e), time) - glassDistance(p - vec2(0.0, e), time)\n ));\n float light = pow(max(0.0, dot(normal, normalize(vec2(-0.62, 0.78)))), 2.0);\n float sideLight = pow(max(0.0, dot(normal, normalize(vec2(0.8, -0.58)))), 4.0);\n float rim = band(distance + 0.012, 0.031);\n float sharpRim = band(distance + 0.004, 0.009);\n color += uColor * rim * (0.25 + light * 0.53);\n color += uHighlightColor * sharpRim * (light * 0.78 + sideLight * 0.38);\n color += uHighlightColor * band(distance + 0.09, 0.025) * light * 0.23;\n color += uColor * band(length(p - vec2(0.27, -0.31)) - 0.26, 0.09) * 0.1;\n\n vec3 premultiplied = color * body + uColor * (1.0 - body) * halo * 0.48;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const violetGlassProgram: ShaderProgram = {\n name: 'violetGlass',\n fragmentSource,\n};\n","import type { ShaderProgram } from '../types';\n\nconst fragmentSource = `\nprecision highp float;\n\nuniform float uTime;\nuniform float uSpeed;\nuniform float uIntensity;\nuniform vec3 uBaseColor;\nuniform vec3 uColor;\nuniform vec3 uHighlightColor;\nuniform vec3 uShadowColor;\nvarying vec2 vUv;\n\nfloat band(float distance, float width) {\n return exp(-pow(distance / width, 2.0));\n}\n\nfloat glassDistance(vec2 p, float time) {\n float angle = atan(p.y, p.x);\n float edge = 0.69;\n edge += sin(angle * 3.0 + time * 0.48) * 0.025;\n edge += sin(angle * 5.0 - time * 0.36 + 1.7) * 0.016;\n return length(p) - edge;\n}\n\nvoid main() {\n vec2 p = vUv * 2.0 - 1.0;\n float time = uTime * max(uSpeed, 0.0);\n float distance = glassDistance(p, time);\n float body = 1.0 - smoothstep(-0.012, 0.012, distance);\n float outside = band(max(distance, 0.0), 0.13) * 0.16;\n outside *= 1.0 - smoothstep(0.86, 1.0, length(p));\n float alpha = body * 0.94 + (1.0 - body) * outside;\n if (alpha < 0.002) discard;\n\n float lowerTint = 1.0 - smoothstep(-0.54, 0.46, p.y);\n float flow = 0.5 + 0.5 * sin(p.x * 3.8 - p.y * 2.4 + time * 0.57);\n vec3 color = mix(uBaseColor, uColor, 0.08 + lowerTint * 0.19 + flow * 0.045);\n color *= 1.0 - band(p.x - 0.27, 0.31) * band(p.y + 0.25, 0.48) * 0.11;\n\n float fold = p.y + 0.17 + 0.15 * sin(p.x * 4.1 + time * 0.49);\n float secondFold = p.y - 0.43 + 0.08 * sin(p.x * 5.2 - time * 0.32);\n float foldShade = band(fold + 0.045, 0.055) * smoothstep(-0.55, 0.18, p.x);\n foldShade += band(secondFold + 0.03, 0.038) * smoothstep(-0.1, 0.58, p.x);\n color = mix(color, uShadowColor, foldShade * 0.13);\n color += uHighlightColor * band(fold, 0.028) * 0.11;\n color += uHighlightColor * band(secondFold, 0.019) * 0.09;\n\n float dome = sqrt(max(0.04, 1.0 - dot(p, p) / 0.57));\n vec3 normal = normalize(vec3(p.x * 1.15, p.y * 1.15, dome));\n normal.xy += vec2(sin(p.y * 7.0 + time * 0.29), cos(p.x * 6.0 - time * 0.24)) * 0.04;\n vec3 reflection = reflect(vec3(0.0, 0.0, -1.0), normalize(normal));\n float softbox = band(reflection.x + 0.45, 0.28) * band(reflection.y - 0.39, 0.22);\n color += uHighlightColor * softbox * 0.12;\n\n float rim = band(distance + 0.018, 0.041);\n float thinRim = band(distance + 0.004, 0.012);\n float innerShade = band(distance + 0.094, 0.055);\n float upperLight = smoothstep(-0.34, 0.78, p.y - p.x * 0.24);\n color = mix(color, uShadowColor, innerShade * (0.08 + (1.0 - upperLight) * 0.1));\n color = mix(color, uColor, rim * (0.36 + upperLight * 0.15));\n color = mix(color, uShadowColor, thinRim * (1.0 - upperLight) * 0.29);\n color += uHighlightColor * thinRim * upperLight * 0.17;\n\n vec3 premultiplied = color * body * 0.94;\n premultiplied += mix(uShadowColor, uColor, 0.36) * (1.0 - body) * outside;\n gl_FragColor = vec4(clamp(premultiplied * max(uIntensity, 0.0), 0.0, 1.0), alpha);\n}\n`;\n\nexport const violetGlassLightProgram: ShaderProgram = {\n name: 'violetGlassLight',\n fragmentSource,\n};\n","import { buttonProgram } from './builtins/button';\nimport { chromaticGlassPlateProgram } from './builtins/chromaticGlassPlate';\nimport { chromaticHaloProgram } from './builtins/chromaticHalo';\nimport { eclipseOrbProgram } from './builtins/eclipseOrb';\nimport { emberMatrixProgram } from './builtins/emberMatrix';\nimport { emberSlitsProgram } from './builtins/emberSlits';\nimport { glassRefractionProgram } from './builtins/glassRefraction';\nimport { halftoneHaloProgram } from './builtins/halftoneHalo';\nimport { haloProgram } from './builtins/halo';\nimport { lumenPortalProgram } from './builtins/lumenPortal';\nimport { lumenPortalLightProgram } from './builtins/lumenPortalLight';\nimport { orbProgram } from './builtins/orb';\nimport { pixelConstellationProgram } from './builtins/pixelConstellation';\nimport { plasmaGaugeProgram } from './builtins/plasmaGauge';\nimport { prismSlatsProgram } from './builtins/prismSlats';\nimport { rulerProgram } from './builtins/ruler';\nimport { smearOrbProgram } from './builtins/smearOrb';\nimport { tickScaleProgram } from './builtins/tickScale';\nimport { violetGlassProgram } from './builtins/violetGlass';\nimport { violetGlassLightProgram } from './builtins/violetGlassLight';\nimport type { ShaderProgram } from './types';\n\nconst builtins = [\n orbProgram,\n haloProgram,\n halftoneHaloProgram,\n chromaticHaloProgram,\n chromaticGlassPlateProgram,\n glassRefractionProgram,\n emberSlitsProgram,\n smearOrbProgram,\n pixelConstellationProgram,\n plasmaGaugeProgram,\n tickScaleProgram,\n rulerProgram,\n buttonProgram,\n prismSlatsProgram,\n eclipseOrbProgram,\n emberMatrixProgram,\n violetGlassProgram,\n violetGlassLightProgram,\n lumenPortalProgram,\n lumenPortalLightProgram,\n];\nconst programs = new Map<string, ShaderProgram>(builtins.map(program => [program.name, program]));\n\nexport function registerShaderProgram(program: ShaderProgram): () => void {\n if (!program.name.trim()) {\n throw new Error('registerShaderProgram: name must not be empty.');\n }\n if (!program.fragmentSource.includes('void main')) {\n throw new Error(`registerShaderProgram: \"${program.name}\" has no main function.`);\n }\n programs.set(program.name, program);\n return () => {\n if (programs.get(program.name) === program) {\n programs.delete(program.name);\n }\n };\n}\n\nexport function shaderProgram(name: string): ShaderProgram | undefined {\n return programs.get(name);\n}\n","export interface ShaderBackdrop {\n image: HTMLImageElement;\n height: number;\n width: number;\n}\n\nconst MIN_BACKDROP_DENSITY = 2.5;\nconst MAX_BACKDROP_PIXELS = 4096;\n\nconst TRANSPARENT = /^rgba?(s*d+,s*d+,s*d+,s*0s*)$|^transparent$/;\n\nfunction hostBackground(svg: SVGSVGElement): string | undefined {\n const view = svg.ownerDocument.defaultView;\n for (let element: Element | null = svg.parentElement; element && view; element = element.parentElement) {\n const color = view.getComputedStyle(element).backgroundColor;\n if (color && !TRANSPARENT.test(color.trim())) {\n return color;\n }\n }\n return undefined;\n}\n\nfunction backdropClone(svg: SVGSVGElement, owner: Element, width: number, height: number): SVGSVGElement {\n const clone = svg.cloneNode(true) as SVGSVGElement;\n const ownerIndex = [...svg.children].indexOf(owner);\n if (ownerIndex >= 0) {\n while (clone.children.length > ownerIndex) {\n clone.lastElementChild?.remove();\n }\n }\n for (const surface of clone.querySelectorAll('foreignObject[data-sf-shader]')) {\n surface.remove();\n }\n const background = hostBackground(svg);\n if (background) {\n const { x, y, width: viewWidth, height: viewHeight } = svg.viewBox.baseVal;\n const fill = svg.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'rect');\n fill.setAttribute('x', String(x));\n fill.setAttribute('y', String(y));\n fill.setAttribute('width', String(viewWidth));\n fill.setAttribute('height', String(viewHeight));\n fill.setAttribute('fill', background);\n clone.insertBefore(fill, clone.firstChild);\n }\n clone.setAttribute('width', String(width));\n clone.setAttribute('height', String(height));\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n return clone;\n}\n\nexport function captureShaderBackdrop(svg: SVGSVGElement, owner: Element): Promise<ShaderBackdrop | undefined> {\n const density = Math.max(globalThis.devicePixelRatio || 1, MIN_BACKDROP_DENSITY);\n const scale = Math.min(density, MAX_BACKDROP_PIXELS / Math.max(1, Math.max(svg.clientWidth, svg.clientHeight)));\n const width = Math.max(1, Math.round(svg.clientWidth * scale));\n const height = Math.max(1, Math.round(svg.clientHeight * scale));\n const view = svg.ownerDocument.defaultView;\n if (!view) {\n return Promise.resolve(undefined);\n }\n\n const markup = new XMLSerializer().serializeToString(backdropClone(svg, owner, width, height));\n const image = svg.ownerDocument.createElement('img');\n const source = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n\n return new Promise(resolve => {\n image.onload = () => resolve({ image, width, height });\n image.onerror = () => resolve(undefined);\n image.src = source;\n });\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport type { Surface } from './surfaceTypes';\n\nexport function color(\n value: ShaderParameter | undefined,\n fallback: [number, number, number],\n): [number, number, number] {\n if (typeof value !== 'string') {\n return fallback;\n }\n const match = /^#([0-9a-f]{6})$/i.exec(value);\n if (!match) {\n return fallback;\n }\n const integer = Number.parseInt(match[1], 16);\n return [((integer >> 16) & 255) / 255, ((integer >> 8) & 255) / 255, (integer & 255) / 255];\n}\n\nexport function number(value: ShaderParameter | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nexport function uniform1f(surface: Surface, name: string, value: number): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform1f(location, value);\n }\n}\n\nexport function uniform3f(surface: Surface, name: string, value: [number, number, number]): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform3f(location, ...value);\n }\n}\n\nexport function uniform2f(surface: Surface, name: string, value: [number, number]): void {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform2f(location, ...value);\n }\n}\n\nexport function uniformName(parameter: string): string {\n return `u${parameter.charAt(0).toUpperCase()}${parameter.slice(1)}`;\n}\n\nfunction enumParameter(name: string, value: string): number | undefined {\n const values: Record<string, Record<string, number>> = {\n direction: { left: 0, right: 1, top: 2, bottom: 3 },\n orientation: { vertical: 0, horizontal: 1 },\n axis: { vertical: 0, horizontal: 1 },\n };\n return values[name]?.[value];\n}\n\nexport function applyParameters(surface: Surface, elapsed: number): void {\n for (const [key, value] of Object.entries(surface.parameters)) {\n const name = uniformName(key);\n if (typeof value === 'number') {\n const lag = surface.parameters[`${key}Lag`];\n if (typeof lag === 'number' && lag > 0) {\n const current = surface.smoothed.get(key) ?? value;\n const next = current + (value - current) * (1 - Math.exp(-elapsed / lag));\n surface.smoothed.set(key, next);\n uniform1f(surface, name, next);\n continue;\n }\n uniform1f(surface, name, value);\n continue;\n }\n if (typeof value === 'boolean') {\n const location = surface.gl.getUniformLocation(surface.program, name);\n if (location) {\n surface.gl.uniform1i(location, value ? 1 : 0);\n }\n continue;\n }\n const enumValue = enumParameter(key, value);\n if (enumValue !== undefined) {\n uniform1f(surface, name, enumValue);\n continue;\n }\n if (/^#[0-9a-f]{6}$/i.test(value)) {\n uniform3f(surface, name, color(value, [0, 0, 0]));\n }\n }\n}\n","const VERTEX_SOURCE = `\nattribute vec2 aPosition;\nvarying vec2 vUv;\n\nvoid main() {\n vUv = aPosition * 0.5 + 0.5;\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}\n`;\n\nfunction compile(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n const shader = gl.createShader(type);\n if (!shader) {\n return undefined;\n }\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n gl.deleteShader(shader);\n return undefined;\n }\n return shader;\n}\n\nexport function linkProgram(gl: WebGLRenderingContext, fragmentSource: string): WebGLProgram | undefined {\n const vertex = compile(gl, gl.VERTEX_SHADER, VERTEX_SOURCE);\n const fragment = compile(gl, gl.FRAGMENT_SHADER, fragmentSource);\n if (!vertex || !fragment) {\n if (vertex) {\n gl.deleteShader(vertex);\n }\n if (fragment) {\n gl.deleteShader(fragment);\n }\n return undefined;\n }\n const program = gl.createProgram();\n if (!program) {\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n return undefined;\n }\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return undefined;\n }\n return program;\n}\n\nexport function transparentTexture(gl: WebGLRenderingContext): WebGLTexture | undefined {\n const texture = gl.createTexture();\n if (!texture) {\n return undefined;\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));\n return texture;\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport { shaderProgram } from './programs';\nimport type { Surface } from './surfaceTypes';\nimport type { ShaderProgram } from './types';\nimport { color } from './uniforms';\nimport { linkProgram, transparentTexture } from './webgl';\n\nconst FULL_SCREEN_QUAD = new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]);\n\nfunction parametersOf(owner: Element): Record<string, ShaderParameter> {\n try {\n return JSON.parse(owner.getAttribute('data-sf-shader-params') ?? '{}') as Record<string, ShaderParameter>;\n } catch {\n return {};\n }\n}\n\nfunction bindFullScreenQuad(gl: WebGLRenderingContext, program: WebGLProgram): WebGLBuffer | undefined {\n const buffer = gl.createBuffer();\n if (!buffer) {\n return undefined;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, FULL_SCREEN_QUAD, gl.STATIC_DRAW);\n const position = gl.getAttribLocation(program, 'aPosition');\n if (position < 0) {\n gl.deleteBuffer(buffer);\n return undefined;\n }\n gl.enableVertexAttribArray(position);\n gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);\n return buffer;\n}\n\nfunction findBaseGeometry(owner: Element, definition: ShaderProgram): Element | undefined {\n const ownerId = owner.getAttribute('data-sf-id');\n if (!definition.replacesBaseFill || !ownerId) {\n return undefined;\n }\n const candidates = [...(owner.closest('svg')?.querySelectorAll('[data-sf-primary=\"true\"]') ?? [])];\n return candidates.find(element => element !== owner && element.getAttribute('data-sf-id') === ownerId);\n}\n\nexport function createSurface(canvas: HTMLCanvasElement): Surface | undefined {\n const owner = canvas.closest('[data-sf-shader]');\n const name = owner?.getAttribute('data-sf-shader');\n const definition = name ? shaderProgram(name) : undefined;\n const gl = canvas.getContext('webgl', { alpha: true, antialias: true, premultipliedAlpha: true });\n if (!owner || !definition || !gl) {\n return undefined;\n }\n const program = linkProgram(gl, definition.fragmentSource);\n if (!program) {\n return undefined;\n }\n gl.useProgram(program);\n const buffer = bindFullScreenQuad(gl, program);\n if (!buffer) {\n gl.deleteProgram(program);\n return undefined;\n }\n const usesBackdrop = definition.usesBackdrop === true;\n const baseGeometry = findBaseGeometry(owner, definition);\n const baseFill = baseGeometry?.getAttribute('fill');\n baseGeometry?.setAttribute('fill', 'none');\n return {\n owner,\n canvas,\n gl,\n program,\n buffer,\n parameters: parametersOf(owner),\n smoothed: new Map(),\n backdropTexture: usesBackdrop ? transparentTexture(gl) : undefined,\n backdropOrigin: [0, 0],\n backdropScale: [1, 1],\n usesBackdrop,\n shapeColor: color(owner.getAttribute('data-sf-shader-fill') ?? undefined, [1, 1, 1]),\n baseGeometry,\n baseFill,\n };\n}\n\nexport function releaseSurface(surface: Surface): void {\n if (surface.backdropTexture) {\n surface.gl.deleteTexture(surface.backdropTexture);\n }\n surface.gl.deleteBuffer(surface.buffer);\n surface.gl.deleteProgram(surface.program);\n if (!surface.baseGeometry) {\n return;\n }\n if (surface.baseFill === null || surface.baseFill === undefined) {\n surface.baseGeometry.removeAttribute('fill');\n } else {\n surface.baseGeometry.setAttribute('fill', surface.baseFill);\n }\n}\n","import type { ShaderBackdrop } from './backdrop';\nimport { SHADER_DEFAULTS } from './defaults';\nimport type { Surface } from './surfaceTypes';\nimport { applyParameters, color, number, uniform1f, uniform2f, uniform3f, uniformName } from './uniforms';\n\nfunction syncBackdropBounds(surface: Surface): void {\n const svg = surface.canvas.closest('svg');\n if (!svg) {\n return;\n }\n const svgBounds = svg.getBoundingClientRect();\n const surfaceBounds = surface.canvas.getBoundingClientRect();\n if (svgBounds.width <= 0 || svgBounds.height <= 0) {\n return;\n }\n surface.backdropOrigin = [\n (surfaceBounds.left - svgBounds.left) / svgBounds.width,\n (svgBounds.bottom - surfaceBounds.bottom) / svgBounds.height,\n ];\n surface.backdropScale = [surfaceBounds.width / svgBounds.width, surfaceBounds.height / svgBounds.height];\n}\n\nexport function applyBackdrop(surface: Surface, backdrop: ShaderBackdrop): void {\n if (!surface.backdropTexture) {\n return;\n }\n syncBackdropBounds(surface);\n const { gl } = surface;\n gl.bindTexture(gl.TEXTURE_2D, surface.backdropTexture);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, backdrop.image);\n}\n\nconst MAX_SURFACE_PIXELS = 2560;\n\nexport function renderSurface(surface: Surface, seconds: number): void {\n const { canvas, gl, parameters } = surface;\n const shown = canvas.getBoundingClientRect();\n const density = Math.min(globalThis.devicePixelRatio || 1, 3);\n const fit = Math.min(1, MAX_SURFACE_PIXELS / Math.max(1, shown.width * density, shown.height * density));\n const width = Math.max(1, Math.round((shown.width || canvas.clientWidth) * density * fit));\n const height = Math.max(1, Math.round((shown.height || canvas.clientHeight) * density * fit));\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n }\n gl.viewport(0, 0, width, height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.useProgram(surface.program);\n const resolution = gl.getUniformLocation(surface.program, 'uResolution');\n if (resolution) {\n gl.uniform2f(resolution, width, height);\n }\n uniform1f(surface, 'uTime', seconds);\n if (surface.backdropTexture) {\n syncBackdropBounds(surface);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, surface.backdropTexture);\n const sampler = gl.getUniformLocation(surface.program, 'uBackdrop');\n if (sampler) {\n gl.uniform1i(sampler, 0);\n }\n uniform2f(surface, 'uBackdropOrigin', surface.backdropOrigin);\n uniform2f(surface, 'uBackdropScale', surface.backdropScale);\n }\n for (const [key, fallback] of Object.entries(SHADER_DEFAULTS.numbers)) {\n uniform1f(surface, uniformName(key), number(parameters[key], fallback));\n }\n for (const [key, fallback] of Object.entries(SHADER_DEFAULTS.colors)) {\n uniform3f(surface, uniformName(key), color(parameters[key], [...fallback] as [number, number, number]));\n }\n uniform3f(surface, 'uShapeColor', surface.shapeColor);\n const elapsed = surface.lastSeconds === undefined ? 0 : Math.max(0, Math.min(seconds - surface.lastSeconds, 0.1));\n surface.lastSeconds = seconds;\n applyParameters(surface, elapsed);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n}\n","export interface SurfaceClock {\n now(): number;\n paused(): boolean;\n spent(): number;\n setPaused(paused: boolean): void;\n}\n\nexport function createSurfaceClock(view: Window | null | undefined): SurfaceClock {\n let pausedSince: number | null = null;\n let spentPaused = 0;\n const real = () => (view?.performance.now() ?? 0) / 1000;\n return {\n now: () => (pausedSince ?? real()) - spentPaused,\n paused: () => pausedSince !== null,\n spent: () => spentPaused,\n setPaused(paused) {\n if (paused && pausedSince === null) {\n pausedSince = real();\n } else if (!paused && pausedSince !== null) {\n spentPaused += real() - pausedSince;\n pausedSince = null;\n }\n },\n };\n}\n","import type { ShaderParameter } from '../../../model/shader';\nimport { captureShaderBackdrop } from './backdrop';\nimport { createSurface, releaseSurface } from './createSurface';\nimport { applyBackdrop, renderSurface } from './renderSurface';\nimport { createSurfaceClock } from './surfaceClock';\nimport type { Surface } from './surfaceTypes';\n\nexport interface ShaderSurfaceHandle {\n capture(): Array<string | undefined>;\n setParameters(ownerId: string, parameters: Record<string, ShaderParameter>): boolean;\n setPaused(paused: boolean): void;\n refresh(): void;\n destroy(): void;\n}\n\nconst RECAPTURE_DELAY_MS = 120;\n\nfunction capturePngs(svg: SVGSVGElement, surfaces: Surface[], seconds: number): Array<string | undefined> {\n const surfaceByCanvas = new Map(surfaces.map(surface => [surface.canvas, surface]));\n return [...svg.querySelectorAll<HTMLCanvasElement>('canvas[data-sf-shader-canvas]')].map(canvas => {\n const surface = surfaceByCanvas.get(canvas);\n if (!surface) {\n return undefined;\n }\n try {\n renderSurface(surface, seconds);\n return surface.canvas.toDataURL('image/png');\n } catch {\n return undefined;\n }\n });\n}\n\nfunction updateParameters(\n surfaces: Surface[],\n ownerId: string,\n parameters: Record<string, ShaderParameter>,\n seconds: number,\n): boolean {\n let changed = false;\n for (const surface of surfaces) {\n if (surface.owner.getAttribute('data-sf-id') !== ownerId) {\n continue;\n }\n Object.assign(surface.parameters, parameters);\n surface.owner.setAttribute('data-sf-shader-params', JSON.stringify(surface.parameters));\n renderSurface(surface, seconds);\n changed = true;\n }\n return changed;\n}\n\nfunction watchSvgChanges(\n svg: SVGSVGElement,\n view: (Window & typeof globalThis) | null,\n onChange: () => void,\n): () => void {\n if (!view) {\n return () => undefined;\n }\n const mutations = new view.MutationObserver(onChange);\n mutations.observe(svg, { attributes: true, attributeFilter: ['viewBox'] });\n const sizes = view.ResizeObserver ? new view.ResizeObserver(onChange) : undefined;\n sizes?.observe(svg);\n return () => {\n mutations.disconnect();\n sizes?.disconnect();\n };\n}\n\nexport function mountShaderSurfaces(svg: SVGSVGElement): ShaderSurfaceHandle {\n let surfaces: Surface[] = [];\n let frame: number | undefined;\n let backdropGeneration = 0;\n let recapture: number | undefined;\n const view = svg.ownerDocument.defaultView;\n const clock = createSurfaceClock(view);\n\n const draw = (milliseconds: number) => {\n if (!clock.paused()) {\n for (const surface of surfaces) {\n renderSurface(surface, milliseconds / 1000 - clock.spent());\n }\n }\n frame = view?.requestAnimationFrame(draw);\n };\n\n const stop = () => {\n if (frame !== undefined) {\n view?.cancelAnimationFrame(frame);\n frame = undefined;\n }\n for (const surface of surfaces) {\n releaseSurface(surface);\n }\n surfaces = [];\n };\n\n const captureBackdrops = (generation: number) => {\n for (const surface of surfaces) {\n if (!surface.usesBackdrop) {\n continue;\n }\n void captureShaderBackdrop(svg, surface.owner).then(backdrop => {\n if (backdrop && generation === backdropGeneration) {\n applyBackdrop(surface, backdrop);\n }\n });\n }\n };\n\n const startFrames = () => {\n if (!view?.requestAnimationFrame) {\n for (const surface of surfaces) {\n renderSurface(surface, 0);\n }\n return;\n }\n if (clock.paused()) {\n for (const surface of surfaces) {\n renderSurface(surface, clock.now());\n }\n }\n frame = view.requestAnimationFrame(draw);\n };\n\n const refresh = () => {\n stop();\n const generation = ++backdropGeneration;\n surfaces = [...svg.querySelectorAll<HTMLCanvasElement>('canvas[data-sf-shader-canvas]')].flatMap(canvas => {\n const surface = createSurface(canvas);\n return surface ? [surface] : [];\n });\n captureBackdrops(generation);\n if (surfaces.length > 0) {\n startFrames();\n }\n };\n\n const scheduleRecapture = () => {\n if (recapture !== undefined) {\n view?.clearTimeout(recapture);\n }\n recapture = view?.setTimeout(() => {\n recapture = undefined;\n captureBackdrops(backdropGeneration);\n }, RECAPTURE_DELAY_MS);\n };\n const unwatch = watchSvgChanges(svg, view, scheduleRecapture);\n\n refresh();\n\n const destroy = () => {\n backdropGeneration += 1;\n unwatch();\n if (recapture !== undefined) {\n view?.clearTimeout(recapture);\n }\n stop();\n };\n\n return {\n capture: () => capturePngs(svg, surfaces, clock.now()),\n setParameters: (ownerId, parameters) => updateParameters(surfaces, ownerId, parameters, clock.now()),\n setPaused: clock.setPaused,\n refresh,\n destroy,\n };\n}\n","import { type RenderOptions, render } from '../../render';\nimport { isContractCompatible, parseContractVersion } from '../dom';\nimport type { ViewerSource } from './types';\n\nexport function renderViewerSource(next: ViewerSource, defaultRenderOptions?: RenderOptions): string {\n const svg =\n next.svg ??\n (next.source != null\n ? render(next.source, { ...(next.renderOptions ?? defaultRenderOptions), linkHitAreas: true }).svg\n : null);\n if (svg == null) {\n throw new Error('createViewer: provide either `source` (SFL) or `svg`.');\n }\n return svg;\n}\n\nexport function assertCreateViewerContract(svg: string): void {\n const version = parseContractVersion(svg);\n if (!isContractCompatible(version)) {\n throw new Error(`createViewer: incompatible DOM contract (svg=${version}). Renderer and viewer versions differ.`);\n }\n}\n\nexport function assertViewerUpdateContract(svg: string): void {\n const version = parseContractVersion(svg);\n if (!isContractCompatible(version)) {\n throw new Error(`viewer.update: incompatible DOM contract (svg=${version}). Renderer and viewer versions differ.`);\n }\n}\n","import type { RollingNumberWidgetStyle } from '../../../model/widget';\n\ntype RollingNumberTheme = Required<RollingNumberWidgetStyle>;\n\nconst HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n\nconst setStyles = (element: HTMLElement, styles: Partial<CSSStyleDeclaration>): void => {\n Object.assign(element.style, styles);\n};\n\nfunction createDigit(document: Document, character: string, theme: RollingNumberTheme): HTMLSpanElement {\n const digit = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n digit.setAttribute('data-sf-rolling-current', 'true');\n digit.textContent = character;\n setStyles(digit, {\n position: 'absolute',\n inset: '0',\n display: 'grid',\n placeItems: 'center',\n color: theme.color,\n fontWeight: theme.fontWeight,\n lineHeight: '1',\n });\n return digit;\n}\n\nfunction createDigitCell(document: Document, character: string, theme: RollingNumberTheme): HTMLSpanElement {\n const cell = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n cell.setAttribute('data-sf-rolling-digit', 'true');\n if (theme.variant === 'plain') {\n setStyles(cell, {\n position: 'relative',\n display: 'inline-block',\n width: '0.62em',\n height: '1.1em',\n overflow: 'hidden',\n });\n cell.appendChild(createDigit(document, character, theme));\n return cell;\n }\n setStyles(cell, {\n position: 'relative',\n display: 'inline-block',\n width: '0.72em',\n height: '1.2em',\n overflow: 'hidden',\n border: `1px solid ${theme.divider}`,\n borderRadius: '0.09em',\n background: theme.surface,\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.7), inset 0 -0.16em 0.38em rgba(0,0,0,0.12)',\n });\n cell.appendChild(createDigit(document, character, theme));\n\n const divider = document.createElementNS(HTML_NAMESPACE, 'span') as HTMLSpanElement;\n setStyles(divider, {\n position: 'absolute',\n zIndex: '2',\n left: '0',\n right: '0',\n top: '50%',\n height: '1px',\n background: theme.divider,\n pointerEvents: 'none',\n });\n cell.appendChild(divider);\n return cell;\n}\n\nfunction animateDigit(element: HTMLElement, keyframes: Keyframe[], duration: number): Animation | null {\n if (duration === 0 || typeof element.animate !== 'function') {\n return null;\n }\n return element.animate(keyframes, {\n duration,\n easing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n fill: 'forwards',\n });\n}\n\nfunction fadeDigit(cell: HTMLSpanElement, character: string, theme: RollingNumberTheme, duration: number): void {\n const previous = cell.querySelector<HTMLSpanElement>('[data-sf-rolling-current]');\n previous?.removeAttribute('data-sf-rolling-current');\n const next = createDigit(cell.ownerDocument, character, theme);\n next.style.opacity = '0';\n cell.insertBefore(next, cell.lastElementChild ?? null);\n const hidden = { opacity: 0, filter: 'blur(0.025em)', transform: 'scale(0.985)' };\n const shown = { opacity: 1, filter: 'blur(0)', transform: 'scale(1)' };\n const incoming = animateDigit(next, [hidden, shown], duration);\n const outgoing = previous ? animateDigit(previous, [shown, hidden], duration) : null;\n const finish = (): void => {\n previous?.remove();\n next.style.opacity = '1';\n };\n if (incoming) {\n incoming.finished.then(finish, finish);\n } else {\n outgoing?.cancel();\n finish();\n }\n}\n\nfunction replaceDigit(cell: HTMLSpanElement, character: string, theme: RollingNumberTheme, duration: number): void {\n if (theme.motion === 'fade') {\n fadeDigit(cell, character, theme, duration);\n return;\n }\n const previous = cell.querySelector<HTMLSpanElement>('[data-sf-rolling-current]');\n previous?.removeAttribute('data-sf-rolling-current');\n const next = createDigit(cell.ownerDocument, character, theme);\n next.style.transform = 'translateY(100%)';\n next.style.opacity = '0.25';\n cell.insertBefore(next, cell.lastElementChild);\n\n const incoming = animateDigit(\n next,\n [\n { transform: 'translateY(100%)', opacity: 0.25 },\n { transform: 'translateY(0)', opacity: 1 },\n ],\n duration,\n );\n const outgoing = previous\n ? animateDigit(\n previous,\n [\n { transform: 'translateY(0)', opacity: 1 },\n { transform: 'translateY(-100%)', opacity: 0.25 },\n ],\n duration,\n )\n : null;\n\n const finish = (): void => {\n previous?.remove();\n next.style.transform = 'translateY(0)';\n next.style.opacity = '1';\n };\n if (incoming) {\n incoming.finished.then(finish, finish);\n } else {\n outgoing?.cancel();\n finish();\n }\n}\n\nexport function updateRollingDigits(\n digits: HTMLDivElement,\n previousValue: string,\n nextValue: string,\n theme: RollingNumberTheme,\n duration: number,\n): void {\n if (previousValue.length !== nextValue.length) {\n digits.replaceChildren(...[...nextValue].map(character => createDigitCell(digits.ownerDocument, character, theme)));\n digits.setAttribute('aria-label', nextValue);\n return;\n }\n\n const cells = [...digits.querySelectorAll<HTMLSpanElement>('[data-sf-rolling-digit]')];\n [...nextValue].forEach((character, index) => {\n if (previousValue[index] !== character) {\n replaceDigit(cells[index], character, theme, duration);\n }\n });\n digits.setAttribute('aria-label', nextValue);\n}\n","import {\n DEFAULT_ROLLING_NUMBER_STYLE,\n formatRollingNumber,\n type RollingNumberWidgetStyle,\n} from '../../../model/widget';\nimport { updateRollingDigits } from './rollingNumberDom';\n\ntype RollingNumberSurface = SVGForeignObjectElement;\n\nexport interface DocumentWidgetsHandle {\n setValue(widgetId: string, value: string | number): boolean;\n refresh(): void;\n clearValues(): void;\n destroy(): void;\n}\n\nfunction findRollingNumber(svg: SVGSVGElement, widgetId: string): RollingNumberSurface | undefined {\n return [...svg.querySelectorAll<RollingNumberSurface>('foreignObject[data-sf-widget=\"rollingNumber\"]')].find(\n surface => surface.getAttribute('data-sf-id') === widgetId,\n );\n}\n\nconst FADE_INTERVAL = 140;\n\nfunction widgetDigits(surface: RollingNumberSurface): HTMLDivElement | undefined {\n return surface.querySelector<HTMLDivElement>('[data-sf-rolling-digits]') ?? undefined;\n}\n\nfunction widgetStyle(surface: RollingNumberSurface): Required<RollingNumberWidgetStyle> {\n const encoded = surface.getAttribute('data-sf-widget-style');\n if (!encoded) {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n try {\n return { ...DEFAULT_ROLLING_NUMBER_STYLE, ...(JSON.parse(encoded) as RollingNumberWidgetStyle) };\n } catch {\n return DEFAULT_ROLLING_NUMBER_STYLE;\n }\n}\n\nfunction positiveInteger(value: string | null): number | undefined {\n if (!value) {\n return undefined;\n }\n const number = Number(value);\n return Number.isInteger(number) && number > 0 ? number : undefined;\n}\n\nfunction durationFor(surface: RollingNumberSurface): number {\n const duration = Number(surface.getAttribute('data-sf-widget-duration'));\n if (!Number.isFinite(duration) || duration < 0) {\n return 420;\n }\n const reduceMotion = surface.ownerDocument.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n return reduceMotion ? 0 : duration;\n}\n\nfunction setRollingNumber(surface: RollingNumberSurface, value: string | number, animate: boolean): boolean {\n const digits = widgetDigits(surface);\n if (!digits) {\n return false;\n }\n const previousValue = surface.getAttribute('data-sf-widget-value') ?? '';\n const nextValue = formatRollingNumber(value, positiveInteger(surface.getAttribute('data-sf-widget-digits')));\n if (previousValue === nextValue) {\n return true;\n }\n updateRollingDigits(digits, previousValue, nextValue, widgetStyle(surface), animate ? durationFor(surface) : 0);\n surface.setAttribute('data-sf-widget-value', nextValue);\n return true;\n}\n\nexport function mountDocumentWidgets(svg: SVGSVGElement): DocumentWidgetsHandle {\n const valueOverrides = new Map<string, string | number>();\n const lastApplied = new Map<string, number>();\n const pending = new Map<string, ReturnType<typeof setTimeout>>();\n return {\n setValue(widgetId: string, value: string | number): boolean {\n const surface = findRollingNumber(svg, widgetId);\n if (!surface) {\n return false;\n }\n valueOverrides.set(widgetId, value);\n if (widgetStyle(surface).motion !== 'fade') {\n return setRollingNumber(surface, value, true);\n }\n const now = Date.now();\n const wait = (lastApplied.get(widgetId) ?? 0) + FADE_INTERVAL - now;\n if (wait <= 0) {\n lastApplied.set(widgetId, now);\n return setRollingNumber(surface, value, true);\n }\n if (!pending.has(widgetId)) {\n pending.set(\n widgetId,\n setTimeout(() => {\n pending.delete(widgetId);\n lastApplied.set(widgetId, Date.now());\n const current = findRollingNumber(svg, widgetId);\n const latest = valueOverrides.get(widgetId);\n if (current && latest !== undefined) {\n setRollingNumber(current, latest, true);\n }\n }, wait),\n );\n }\n return true;\n },\n refresh(): void {\n for (const [widgetId, value] of valueOverrides) {\n const surface = findRollingNumber(svg, widgetId);\n if (surface) {\n setRollingNumber(surface, value, false);\n }\n }\n },\n clearValues(): void {\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n valueOverrides.clear();\n },\n destroy(): void {\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n valueOverrides.clear();\n },\n };\n}\n","const bases = new WeakMap<Element, string>();\nconst written = new WeakMap<Element, string>();\nconst fills = new WeakMap<Element, string>();\n\nfunction clamp01(value: number): number {\n return Math.min(1, Math.max(0, Number.isFinite(value) ? value : 0));\n}\n\nfunction parameters(surface: Element): Record<string, unknown> {\n try {\n return JSON.parse(surface.getAttribute('data-sf-shader-params') ?? '{}') as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nfunction positive(value: unknown, fallback: number): number {\n return Number(value) > 0 ? Number(value) : fallback;\n}\n\nexport function rulerProgress(surface: Element, value: number): number {\n const params = parameters(surface);\n const min = Number(params.min) || 0;\n const max = Number.isFinite(Number(params.max)) && params.max !== undefined ? Number(params.max) : 100;\n return clamp01(max === min ? 0 : (value - min) / (max - min));\n}\n\nfunction move(node: Element, dx: number, dy: number): void {\n const current = node.getAttribute('transform') ?? '';\n const base = current === written.get(node) ? (bases.get(node) ?? '') : current;\n bases.set(node, base);\n const next = `translate(${dx} ${dy}) ${base}`.trim();\n written.set(node, next);\n node.setAttribute('transform', next);\n}\n\nfunction hexToRgb(value: string): [number, number, number] | null {\n const match = /^#([0-9a-f]{6})$/i.exec(value.trim());\n if (!match) {\n return null;\n }\n const number = parseInt(match[1], 16);\n return [(number >> 16) & 255, (number >> 8) & 255, number & 255];\n}\n\nfunction shade(node: SVGElement, bump: number): void {\n const base = fills.get(node) ?? node.getAttribute('fill') ?? '';\n fills.set(node, base);\n const rgb = hexToRgb(base);\n if (!rgb) {\n return;\n }\n const mixed = rgb.map(channel => Math.round(channel + (255 - channel) * bump));\n const fill = `rgb(${mixed[0]}, ${mixed[1]}, ${mixed[2]})`;\n node.style.fill = fill;\n for (const child of node.querySelectorAll<SVGElement>('tspan')) {\n child.style.fill = fill;\n }\n}\n\nexport function placeRulerKnobs(\n svg: SVGSVGElement,\n progressOf: (id: string) => number | undefined,\n): Map<string, number> {\n const radii = new Map<string, number>();\n for (const surface of svg.querySelectorAll('foreignObject[data-sf-shader=\"ruler\"]')) {\n const params = parameters(surface);\n const id = surface.getAttribute('data-sf-id') ?? '';\n const x = Number(surface.getAttribute('x'));\n const y = Number(surface.getAttribute('y'));\n const width = Number(surface.getAttribute('width'));\n const height = Number(surface.getAttribute('height'));\n const horizontal = params.axis === 'horizontal';\n const progress = clamp01(progressOf(id) ?? Number(params.progress));\n const inset = positive(params.inset, 0.05);\n const line = positive(params.line, 0.7);\n const extent = horizontal ? width : height;\n const across = horizontal ? height : width;\n const along = inset + (1 - 2 * inset) * progress;\n const dent = params.dent === undefined ? 1 : Number(params.dent);\n const depth = (dent < 0 ? 1 : dent) * 0.16 * across;\n\n const knobId = typeof params.knob === 'string' ? params.knob : '';\n if (knobId) {\n const nodes = [...svg.querySelectorAll(`[data-sf-id=\"${CSS.escape(knobId)}\"]`)];\n const primary = nodes.find(node => node.hasAttribute('data-sf-primary')) as SVGGraphicsElement | undefined;\n if (primary?.getBBox) {\n move(primary, 0, 0);\n const box = primary.getBBox();\n const half = (horizontal ? box.height : box.width) / 2;\n radii.set(id, half / across);\n const gap = (params.gap === undefined ? 0.04 : Number(params.gap)) * across;\n const side = line * across - depth + half + gap;\n const target = horizontal\n ? { x: x + width * along, y: y + side }\n : { x: x + side, y: y + height * (1 - along) };\n const dx = target.x - (box.x + box.width / 2);\n const dy = target.y - (box.y + box.height / 2);\n for (const node of nodes) {\n move(node, dx, dy);\n }\n }\n }\n\n const min = Number(params.min) || 0;\n const max = Number.isFinite(Number(params.max)) && params.max !== undefined ? Number(params.max) : 100;\n const spread = positive(params.spread, 0.07) * extent;\n const start = inset * extent;\n const span = (1 - 2 * inset) * extent;\n const knobAt = start + span * progress;\n for (const label of svg.querySelectorAll<SVGTextElement>(`text[data-sf-id=\"${CSS.escape(id)}\"]`)) {\n const value = Number(label.textContent);\n if (!Number.isFinite(value) || max === min) {\n continue;\n }\n const labelAt = start + span * clamp01((value - min) / (max - min));\n const bump = Math.exp(-(((labelAt - knobAt) / spread) ** 2));\n const shift = depth * 0.4 * bump;\n move(label, horizontal ? 0 : -shift, horizontal ? -shift : 0);\n shade(label, bump);\n }\n }\n return radii;\n}\n","import type { ShaderParameter } from '../../model/shader';\nimport type { DisplayHandle, ViewBox } from './display';\nimport { mountDisplay } from './display';\nimport { Emitter, type OwnerRef, type Unsubscribe, type ViewerEventHandler, type ViewerEventName } from './events';\nimport { rasterizeSvgSnapshot, serializeSvgSnapshot, type ViewerImageExportOptions } from './export';\nimport { bindInteraction, type InteractionHandle } from './interaction';\nimport { mountShaderSurfaces, type ShaderSurfaceHandle } from './shaders';\nimport { assertViewerUpdateContract, renderViewerSource } from './source';\nimport type { Viewer, ViewerOptions, ViewerSource } from './types';\nimport { type DocumentWidgetsHandle, mountDocumentWidgets } from './widgets';\nimport { placeRulerKnobs, rulerProgress } from './widgets/rulerKnob';\n\nexport class ViewerSession implements Viewer {\n private readonly emitter = new Emitter();\n private readonly display: DisplayHandle;\n private readonly interaction: InteractionHandle | null;\n private readonly shaderSurfaces: ShaderSurfaceHandle;\n private readonly documentWidgets: DocumentWidgetsHandle;\n private readonly shaderParameterOverrides = new Map<string, Record<string, ShaderParameter>>();\n private readonly rulerProgressOverrides = new Map<string, number>();\n\n constructor(\n private readonly options: ViewerOptions,\n initialSvg: string,\n private readonly diagramId: string,\n ) {\n this.display = mountDisplay(options.container, initialSvg);\n this.shaderSurfaces = mountShaderSurfaces(this.display.svg);\n this.documentWidgets = mountDocumentWidgets(this.display.svg);\n this.interaction = options.interactive\n ? bindInteraction(this.display, this.emitter, diagramId, { selectable: options.selectable })\n : null;\n this.placeKnobs();\n }\n\n private placeKnobs(): void {\n const radii = placeRulerKnobs(this.display.svg, id => this.rulerProgressOverrides.get(id));\n for (const [id, knobRadius] of radii) {\n this.setShaderParameters(id, { knobRadius });\n }\n }\n\n get svg(): SVGSVGElement {\n return this.display.svg;\n }\n\n on<T extends ViewerEventName>(name: T, handler: ViewerEventHandler<T>): Unsubscribe {\n return this.emitter.on(name, handler);\n }\n\n getSelection(): OwnerRef[] {\n return this.interaction?.getSelection() ?? [];\n }\n\n select(ids: string[]): void {\n this.interaction?.select(ids);\n }\n\n fit(): void {\n this.display.fit();\n this.interaction?.repaint();\n }\n\n getViewport(): ViewBox {\n return this.display.getViewport();\n }\n\n exportSvg(): string {\n return serializeSvgSnapshot(this.svg, this.shaderSurfaces.capture());\n }\n\n exportImage(options?: ViewerImageExportOptions): Promise<Blob> {\n return rasterizeSvgSnapshot(this.svg, this.exportSvg(), options);\n }\n\n setShaderParameters(ownerId: string, parameters: Record<string, ShaderParameter>): boolean {\n const merged = { ...this.shaderParameterOverrides.get(ownerId), ...parameters };\n this.shaderParameterOverrides.set(ownerId, merged);\n return this.shaderSurfaces.setParameters(ownerId, parameters);\n }\n\n setWidgetValue(widgetId: string, value: string | number): boolean {\n if (this.documentWidgets.setValue(widgetId, value)) {\n return true;\n }\n const ruler = [...this.svg.querySelectorAll('foreignObject[data-sf-shader=\"ruler\"]')].find(\n element => element.getAttribute('data-sf-id') === widgetId,\n );\n if (ruler) {\n const progress = rulerProgress(ruler, Number(value));\n this.rulerProgressOverrides.set(widgetId, progress);\n const applied = this.setShaderParameters(widgetId, { progress });\n this.placeKnobs();\n return applied;\n }\n const scale = [...this.svg.querySelectorAll('foreignObject[data-sf-shader=\"tickScale\"]')].find(\n element => element.getAttribute('data-sf-id') === widgetId,\n );\n if (!scale) {\n return false;\n }\n let max = 100;\n try {\n max = Number((JSON.parse(scale.getAttribute('data-sf-shader-params') ?? '{}') as { max?: number }).max) || 100;\n } catch {\n max = 100;\n }\n return this.setShaderParameters(widgetId, { progress: Math.min(1, Math.max(0, Number(value) / max)) });\n }\n\n setPaused(paused: boolean): void {\n this.shaderSurfaces.setPaused(paused);\n }\n\n clearOverrides(): void {\n this.shaderParameterOverrides.clear();\n this.rulerProgressOverrides.clear();\n this.documentWidgets.clearValues();\n }\n\n update(next: ViewerSource): void {\n const svg = renderViewerSource(next, this.options.renderOptions);\n assertViewerUpdateContract(svg);\n const diff = this.display.updateContent(svg);\n this.shaderSurfaces.refresh();\n this.documentWidgets.refresh();\n this.placeKnobs();\n for (const [ownerId, parameters] of this.shaderParameterOverrides) {\n this.shaderSurfaces.setParameters(ownerId, parameters);\n }\n if (next.resetView) {\n this.display.fit();\n }\n const selectedIds = this.interaction?.getSelection().map(owner => owner.id) ?? [];\n if (selectedIds.length > 0) {\n this.interaction?.select(selectedIds);\n }\n this.emitter.emit('sceneDiff', { diagramId: this.diagramId, ...diff });\n if (next.highlightChanges) {\n const color = typeof next.highlightChanges === 'object' ? next.highlightChanges.color : undefined;\n this.interaction?.flashChanged([...diff.added, ...diff.changed], color);\n }\n }\n\n announceReady(): void {\n queueMicrotask(() => this.emitter.emit('ready', { diagramId: this.diagramId }));\n }\n\n destroy(): void {\n this.interaction?.destroy();\n this.shaderSurfaces.destroy();\n this.documentWidgets.destroy();\n this.shaderParameterOverrides.clear();\n this.display.destroy();\n this.emitter.clear();\n }\n}\n","import { ViewerSession } from './session';\nimport { assertCreateViewerContract, renderViewerSource } from './source';\nimport type { Viewer, ViewerOptions } from './types';\n\nexport function createViewer(options: ViewerOptions): Viewer {\n const diagramId = options.diagramId ?? 'diagram';\n const svg = renderViewerSource(options, options.renderOptions);\n assertCreateViewerContract(svg);\n const viewer = new ViewerSession(options, svg, diagramId);\n viewer.announceReady();\n return viewer;\n}\n\nexport { connectInteraction, type InteractionOptions } from './connectInteraction';\nexport type { SceneDiff, ViewBox } from './display';\nexport type {\n Modifiers,\n OwnerPointerEvent,\n OwnerRef,\n SceneDiffEvent,\n SelectionChangeEvent,\n Unsubscribe,\n ViewerErrorEvent,\n ViewerEventHandler,\n ViewerEventMap,\n ViewerEventName,\n} from './events';\nexport type { ViewerImageExportOptions, ViewerImageFormat } from './export';\nexport { registerShaderProgram, SHADER_DEFAULTS, type ShaderProgram, shaderProgram } from './shaders';\nexport type { Viewer, ViewerOptions, ViewerSource } from './types';\n","import { render } from '../../render';\nimport { createViewer, type Viewer } from '../viewer';\nimport type { DiagramConfig } from './config';\n\nconst SHADOW_STYLE = `\n :host { display: block; position: relative; }\n .sf-container { width: 100%; height: 100%; }\n svg { display: block; max-width: 100%; }\n .sf-error { color: #b91c1c; font: 13px/1.4 system-ui, sans-serif; padding: 8px; white-space: pre-wrap; }\n [data-sf-role=\"entity\"], [data-sf-role=\"link\"] { cursor: pointer; }\n [data-sf-selected] { stroke: #2563eb !important; stroke-width: 4 !important; }\n`;\n\nexport interface ShadowDiagramMount {\n viewer: Viewer | null;\n rendered: boolean;\n}\n\nfunction createShadowContainer(root: ShadowRoot): HTMLDivElement {\n const style = document.createElement('style');\n style.textContent = SHADOW_STYLE;\n const container = document.createElement('div');\n container.className = 'sf-container';\n root.append(style, container);\n return container;\n}\n\nfunction showRenderError(container: HTMLDivElement, error: unknown): void {\n const box = document.createElement('div');\n box.className = 'sf-error';\n box.textContent = `stickyflow: ${(error as Error).message ?? error}`;\n container.replaceChildren(box);\n}\n\nfunction mountInteractiveDiagram(container: HTMLDivElement, source: string, config: DiagramConfig): Viewer {\n return createViewer({\n container,\n source,\n interactive: true,\n diagramId: config.diagramId,\n renderOptions: { padding: config.padding },\n });\n}\n\nfunction mountStaticDiagram(container: HTMLDivElement, source: string, config: DiagramConfig): void {\n container.innerHTML = render(source, { padding: config.padding }).svg;\n}\n\nexport function mountShadowDiagram(root: ShadowRoot, config: DiagramConfig): ShadowDiagramMount {\n const container = createShadowContainer(root);\n if (config.source === null) {\n return { viewer: null, rendered: false };\n }\n\n try {\n const viewer = config.interactive ? mountInteractiveDiagram(container, config.source, config) : null;\n if (!config.interactive) {\n mountStaticDiagram(container, config.source, config);\n }\n return { viewer, rendered: true };\n } catch (error) {\n showRenderError(container, error);\n return { viewer: null, rendered: false };\n }\n}\n","import type { Viewer } from '../viewer';\nimport { type DiagramConfig, OBSERVED_ATTRS, readConfig } from './config';\nimport { mountShadowDiagram } from './shadowView';\n\nconst ElementBase: typeof HTMLElement =\n typeof HTMLElement === 'undefined' ? (class {} as unknown as typeof HTMLElement) : HTMLElement;\n\nexport class StickyflowDiagram extends ElementBase {\n static get observedAttributes(): string[] {\n return [...OBSERVED_ATTRS];\n }\n\n private readonly root: ShadowRoot;\n private view: Viewer | null = null;\n private sourceProp: string | null = null;\n\n constructor() {\n super();\n this.root = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n this.rerender();\n }\n\n disconnectedCallback(): void {\n this.teardown();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.rerender();\n }\n }\n\n set source(value: string | null) {\n this.sourceProp = value;\n if (this.isConnected) {\n this.rerender();\n }\n }\n\n get source(): string | null {\n return this.sourceProp ?? this.getAttribute('source');\n }\n\n get viewer(): Viewer | null {\n return this.view;\n }\n\n private config(): DiagramConfig {\n const config = readConfig(name => this.getAttribute(name));\n return { ...config, source: this.sourceProp ?? config.source };\n }\n\n private teardown(): void {\n this.view?.destroy();\n this.view = null;\n this.root.replaceChildren();\n }\n\n private rerender(): void {\n this.teardown();\n const config = this.config();\n const mount = mountShadowDiagram(this.root, config);\n this.view = mount.viewer;\n if (mount.rendered) {\n this.dispatchEvent(new CustomEvent('sf-render', { detail: { interactive: config.interactive } }));\n }\n }\n}\n","export type { DiagramConfig } from './config';\nexport { StickyflowDiagram } from './element';\n\nimport { StickyflowDiagram } from './element';\n\nexport function defineStickyflowDiagram(tagName = 'stickyflow-diagram'): void {\n if (typeof customElements === 'undefined') {\n return;\n }\n if (!customElements.get(tagName)) {\n customElements.define(tagName, StickyflowDiagram);\n }\n}\n"],"mappings":"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","names":["iife_exports","__export","StickyflowDiagram","defineStickyflowDiagram","OBSERVED_ATTRS","boolAttr","value","readConfig","getAttribute","paddingRaw","padding","NAMED_BLOCK_KINDS","BLOCK_KINDS","SIDES","isSide","s","isNamedBlockKind","s","NAMED_BLOCK_KINDS","SourceCursor","input","ahead","value","character","SflLexError","message","line","col","isLetter","character","isDigit","isIdentPart","createToken","type","value","start","detail","withTokenEnd","token","cursor","startsIdentifier","cursor","isLetter","readIdentifier","start","value","isIdentPart","createToken","isLineBreak","character","readLineBreak","cursor","start","createToken","startsLineComment","cursor","consumeLineComment","startsNumber","cursor","character","isDigit","readNumber","start","value","createToken","OPERATORS","startsNumber","character","readOperator","cursor","start","match","text","type","index","createToken","PUNCTUATION","readPunctuation","cursor","start","character","type","createToken","isSpacing","character","consumeSpacing","cursor","indentationWidth","line","width","dedent","text","lines","margin","readLongString","cursor","start","consumeLongStringDelimiter","body","SflLexError","readShortString","value","character","readEscapedCharacter","escaped","readString","readStringToken","createToken","readNextToken","cursor","character","start","isLineBreak","readLineBreak","consumeLexerTrivia","token","readSymbolToken","readWordToken","SflLexError","isSpacing","consumeSpacing","startsLineComment","consumeLineComment","punctuation","readPunctuation","readStringToken","readOperator","startsNumber","readNumber","startsIdentifier","readIdentifier","tokenizeSource","input","cursor","SourceCursor","tokens","token","readNextToken","withTokenEnd","createToken","SflParseError","message","line","col","TokenCursor","tokens","offset","type","description","token","SflParseError","parsePathSegments","cursor","segments","parseEndpoint","side","fraction","sideToken","isSide","SflParseError","parseList","values","parseValue","allowTuple","token","firstValue","COMPARISONS","atOperator","cursor","operators","token","parseBinaryLevel","parseOperand","left","OR","AND","ADDITIVE","MULTIPLICATIVE","parseExpression","parseAnd","parseComparison","parseAdditive","parseMultiplicative","parseUnary","parsePrimary","parseCallArguments","args","SflParseError","inner","path","parsePathSegments","BINDING_OPERATORS","atBinding","parseBinding","key","operator","expr","next","parseAssignment","start","target","atHandler","parseHandler","event","assignments","expectEnd","what","PropertyParser","cursor","properties","bindings","token","SflParseError","atBinding","parseBinding","key","value","parseEndpoint","parseValue","kind","BlockParser","cursor","PropertyParser","kind","isNamedBlockKind","SflParseError","name","composition","entries","parseEntry","token","atBinding","parseBinding","atHandler","parseHandler","offset","DocumentParser","cursor","BlockParser","header","SflParseError","version","blocks","parseSource","input","DocumentParser","TokenCursor","tokenizeSource","asString","value","asNumber","tupleValues","listNumbers","item","namedPortReference","segments","context","portName","canvasObjectName","canvasObjectId","port","readLinkEndpoint","value","namedPort","endpointName","directProperties","block","properties","entry","styleProperties","property","layoutProperties","childBlocks","dataEntryBlock","contentChildren","data","contentProperty","key","direct","CANVAS_OBJECT_BLOCK_KINDS","canvasObjectBlockKinds","isCanvasObjectBlockKind","kind","indexLinkableNames","blocks","idByName","block","isCanvasObjectBlockKind","asString","directProperties","childBlocks","buildLinkNameIndex","model","STRUCTURAL_LINK_PROPERTIES","readLinkPresentation","properties","presentation","key","value","text","asString","FACES","readFace","value","readConnections","model","connectionBlocks","canvasObjects","context","sourceIndexes","endpointContext","buildLinkNameIndex","canvasObject","block","index","properties","asString","readLinkEndpoint","asNumber","readLinkPresentation","readLinkBlock","block","canvasObjectContext","endpointContext","properties","from","readLinkEndpoint","to","asString","asNumber","listNumbers","readLinkPresentation","readLinks","model","linkBlocks","canvasObjects","context","sourceIndexes","endpointContext","buildLinkNameIndex","canvasObject","block","index","readLinkBlock","netMembers","block","context","membersValue","value","netLink","from","to","index","text","entries","expandNetLinks","members","asString","member","createFlowPositioner","block","context","axis","asString","gap","asNumber","cursor","size","position","CHART_TYPES","isChartType","value","numberList","value","numbers","item","number","asNumber","stringList","text","asString","readBoolean","readAxis","block","properties","directProperties","asNumber","asString","numberList","readChartRules","block","contentChildren","child","rule","properties","directProperties","asNumber","asString","numberList","asComponents","value","components","asNumber","part","readSeriesValues","firstSeriesValueShape","readTupleSeriesValues","readScalarSeriesValues","values","readSeriesErrors","readSeriesError","readSeriesErrorRange","low","high","readSeriesColors","readSeriesColor","asString","readSeriesSymbol","symbolDefs","points","readSeriesSymbolPoint","name","definition","x","y","readSeries","block","symbolDefs","mergedProps","properties","asString","readSeriesColors","asNumber","readSeriesValues","readSeriesErrors","readSeriesSymbol","numberList","readChartZones","value","zones","item","label","asString","asNumber","STACKED_MODES","asChartType","value","isChartType","asStackedMode","mode","readChart","block","properties","symbolDefs","mergedProps","children","contentChildren","axes","child","stacked","asString","stringList","contentProperty","asNumber","numberList","readChartZones","readBoolean","readAxis","axis","readSeries","readChartRules","resolveChartObject","base","block","properties","symbolDefinitions","mergedProperties","readChart","readIsometric","properties","depth","asString","resolveIsometricObject","base","block","properties","layoutProperty","size","tupleValues","readIsometric","readPath","p","origin","pointsValue","value","x","asNumber","y","asString","resolvePathObject","base","properties","origin","readPath","readSwimlane","p","orientation","asString","lanesValue","lanes","value","index","label","size","asNumber","color","resolveSwimlaneObject","base","properties","readSwimlane","declaredCanvasObjectKind","block","properties","asString","canvasObjectTypeForKind","kind","classifyCanvasObject","symbolDefinitions","shapeReference","symbol","readCanvasObjectGeometry","block","origin","layoutProperty","positionOverride","position","tupleValues","size","asNumber","STRUCTURAL_PROPERTIES","readCanvasObjectPresentation","properties","presentation","key","value","text","asString","resolveCanvasObject","block","origin","context","frameId","positionOverride","mergedProps","layoutProp","symbolDefs","properties","classification","classifyCanvasObject","geometry","readCanvasObjectGeometry","base","asString","readCanvasObjectPresentation","resolveChartObject","resolveIsometricObject","resolvePathObject","resolveSwimlaneObject","asNumber","directGroupMemberIds","block","childBlocks","child","isCanvasObjectBlockKind","asString","directProperties","CanvasTreeResolver","#context","#canvasObjects","#linkBlocks","#connectionBlocks","#linkSourceIndexes","#connectionSourceIndexes","#sequence","resolution","model","groups","#resolveChildren","block","location","nextFlowPosition","createFlowPositioner","child","childBlocks","#resolveChild","sourceIndex","#resolveContainer","isCanvasObjectBlockKind","#resolveCanvasObject","#resolveGroup","expanded","expandNetLinks","canvasObject","#resolvePositionedCanvasObject","size","tupleValues","resolveCanvasObject","properties","asString","directGroupMemberIds","resolveCanvasTree","readShaderDefinition","block","properties","directProperties","program","asString","parameters","key","value","number","asNumber","text","readSymbolPoints","block","value","directProperties","item","x","asNumber","y","readSymbolPorts","ports","childBlocks","child","port","position","tupleValues","readSymbolDefinition","points","projectModel","block","childBlocks","child","collectCanvasDefinitions","sflDocument","collectStyleDefinitions","collectLayoutDefinitions","collectSymbolDefinitions","collectShaderDefinitions","findCanvasModel","shaders","shader","readShaderDefinition","styles","layouts","symbols","symbol","readSymbolDefinition","model","classifyCompositionReferences","composition","styleBlocks","layoutBlocks","styleRef","layoutRef","reference","collectBlockDiagnostics","block","diagnostics","child","childBlocks","collectUnresolvedCompositionReferences","sflDocument","resolveDefinitionInheritance","definitions","parentName","DefinitionInheritanceResolver","#definitions","#parentName","#resolved","name","#resolveDefinition","ancestry","cached","block","values","#inheritedProperties","key","value","directProperties","parent","createCanvasObjectPropertyReaders","definitions","styles","layouts","symbols","shaders","references","block","classifyCompositionReferences","resolvedStyles","resolveDefinitionInheritance","resolvedLayouts","merged","key","value","directProperties","styleProperties","localProperties","layoutProperties","reference","NATIVE_CIRCULAR_CHART_TYPES","OPTIONAL_CIRCULAR_GRID_CHART_TYPES","collectUnsupportedChartTypes","doc","diagnostics","visit","block","declared","asString","directProperties","isChartType","CHART_TYPES","child","childBlocks","collectEmptySeries","series","contentChildren","collectUnsupportedGridShapes","chartType","styleProperties","collectUnsupportedWidgetTypes","sflDocument","diagnostics","visit","block","type","asString","directProperties","child","childBlocks","createCanvasResolution","doc","definitions","collectCanvasDefinitions","collectUnresolvedCompositionReferences","collectUnsupportedChartTypes","collectUnsupportedGridShapes","collectEmptySeries","collectUnsupportedWidgetTypes","createCanvasObjectPropertyReaders","resolveCanvasState","document","resolution","createCanvasResolution","canvasObjects","groups","linkBlocks","connectionBlocks","linkSourceIndexes","connectionSourceIndexes","resolveCanvasTree","links","readLinks","connections","readConnections","isIsometricObject","canvasObject","sflToCanvasState","source","resolveCanvasState","parseSource","COLOR_TOKEN_PATTERN","decodeGradient","source","match","stops","stopPattern","COLOR_TOKEN_PATTERN","stop","decodeMesh","points","pointPattern","index","point","decodeColor","decodeRamp","source","match","stops","stopPattern","COLOR_TOKEN_PATTERN","stop","applyShadowProperty","shadow","key","value","decodeShadow","source","match","part","keyValue","numOf","value","safeJson","dashArray","parsed","numbers","entry","solidColor","decoded","decodeColor","oneOf","allowed","fallback","FONT_WEIGHTS","SHAPE_FONT_WEIGHTS","LABEL_POSITIONS","PATH_MARKERS","strokePaint","value","decoded","decodeColor","TEXT_ALIGNS","VERTICAL_ALIGNS","STROKE_STYLES","PATH_TYPES","optionalOneOf","allowed","SHAPE_STROKE_STYLES","MARKER_TYPES","decodeImageFill","source","match","legendPositionOf","value","lineStyleOf","dataOf","s","decodeColor","c","r","frameOf","p","image","solidColor","numOf","decodeShadow","gridOf","axesOf","textOf","legendOf","chartBase","barConfig","source","p","decodeColor","numOf","lineConfig","scatterConfig","boxplotConfig","fieldConfig","decodeRamp","heatmapConfig","hexbinConfig","mekkoConfig","pieConfig","polarAreaConfig","radarConfig","radialConfig","radialBarConfig","sankeyConfig","treemapConfig","customConfig","chartObject","base","chartBase","source","p","chartType","typedChart","barConfig","lineConfig","scatterConfig","boxplotConfig","fieldConfig","heatmapConfig","hexbinConfig","mekkoConfig","pieConfig","polarAreaConfig","radarConfig","radialConfig","radialBarConfig","sankeyConfig","treemapConfig","customConfig","config","connectionObject","c","p","optionalOneOf","PATH_TYPES","strokePaint","numOf","STROKE_STYLES","frameObject","p","numOf","oneOf","FONT_WEIGHTS","dashArray","LABEL_POSITIONS","isometricObject","canvasObject","presentation","shadowStyle","decodeShadow","solidColor","numOf","linkObject","l","p","numOf","optionalOneOf","PATH_TYPES","strokePaint","STROKE_STYLES","decodeShadow","MARKER_TYPES","pathObject","p","oneOf","PATH_MARKERS","solidColor","numOf","dashArray","shapeTypeOf","value","shapeObject","shaders","p","isText","decodeColor","strokePaint","numOf","oneOf","SHAPE_FONT_WEIGHTS","optionalOneOf","TEXT_ALIGNS","VERTICAL_ALIGNS","decodeShadow","dashArray","SHAPE_STROKE_STYLES","swimlaneObject","p","numOf","dashArray","decodeShadow","oneOf","FONT_WEIGHTS","CSS_COLOR","CSS_FONT_FAMILY","color","value","fontFamily","FONT_WEIGHT","variant","motion","fontWeight","TICK_SCALE_NUMBERS","TICK_SCALE_COLORS","tickScaleObject","canvasObject","properties","parameters","key","RULER_NUMBERS","RULER_COLORS","RULER_DEFAULTS","RULER_OPTIONAL_COLORS","rulerObject","widgetObject","byOrder","items","a","b","collectCanvasObjects","state","canvasObjects","shaders","shader","canvasObject","shape","shapeObject","frameObject","swimlaneObject","isIsometricObject","isometricObject","pathObject","chartObject","widgetObject","linkObject","connectionObject","VISIBLE_ISOMETRIC_FACES","AXIS_ANGLE","AXIS_COS","AXIS_SIN","isometricBounds","object","width","height","depth","isometricTopFaceCenter","faceCenter","corners","isometricFaceCenter","face","isometricFaces","x","y","apex","toRight","toLeft","down","right","left","center","apexDown","bottom","bottomLeft","bottomRight","clamp255","value","hexToRgb","hex","match","n","rgbToHex","r","g","b","channel","multiply","factor","rgb","deriveFaceFills","fill","DEGREES_TO_RADIANS","rotatePoint","point","degrees","radians","cosine","sine","rectangleCenter","rectangle","rectanglePointToWorld","rectangle","rectanglePoint","center","rectangleCenter","rotatedPoint","rotatePoint","pointAtNormalizedPort","rectangle","normalizedPosition","rectanglePointToWorld","elementCenter","rect","edgePointToward","other","center","otherCenter","angle","sidePoint","canvasObject","endpoint","offset","namedPortPoint","port","candidate","pointAtNormalizedPort","elementCenter","resolveLinkEndpoint","link","end","canvasObjects","selected","selectLinkEndpoint","absolutePoint","explicitAbsolutePoint","findPositionedCanvasObject","anchoredPoint","explicitAnchorPoint","automaticEndpointPoint","opposite","edgePointToward","id","ISOMETRIC_SEQUENCE_BASE","positionedCanvasObjects","canvasObjects","connectionEndpointPoint","object","face","isometricFaceCenter","isometricStackPosition","isometricObjects","id","index","connectionStack","connection","behind","VISIBLE_ISOMETRIC_FACES","position","lowest","best","createRenderInputConnections","isometricById","createRenderInputLinks","positionedObjects","link","resolveLinkEndpoint","sflToRenderInput","sfl","state","sflToCanvasState","canvasObjects","collectCanvasObjects","createRenderInputLinks","tag","nodes","role","id","kind","label","parentFrameId","node","index","EMPTY_BOUNDS","boxBounds","frame","extra","rotatedBounds","degrees","boundsAroundPoints","rotateFrameCorners","centerX","centerY","angle","cos","sin","frameCorners","point","points","freeformPathData","geometry","linearPathData","smoothPathData","first","remaining","segments","point","segmentCount","commands","index","curveSegmentCommand","previous","freeformPointAt","start","end","next","factor","firstControl","secondControl","finite","value","fallback","stackRank","object","key","rank","index","stackSequence","fallback","paint","value","diagnostics","ownerId","stop","point","DEFAULT_FONT","topRoundedRectPath","x","y","width","height","radius","clampedRadius","bottomRoundedRectPath","leftRoundedRectPath","rightRoundedRectPath","cornersRoundedRectPath","radii","max","tl","tr","br","bl","arcTo","r","toX","toY","simpleContainerStyle","fill","stroke","strokeWidth","dash","TAB_RADIUS","tabBox","input","thickness","length","inset","x","y","bottomRoundedRectPath","leftRoundedRectPath","rightRoundedRectPath","topRoundedRectPath","renderTitleTab","padding","box","bounds","boxBounds","vertical","verticalTitleText","horizontalTitleText","DEFAULT_FONT","centerX","centerY","textThickness","textLength","SQUARED_CORNER_BY_LABEL_POSITION","frameBoundaryNode","frame","order","hasTab","shadow","bounds","boxBounds","style","simpleContainerStyle","squared","radii","cornersRoundedRectPath","buildFrame","index","nodes","renderTitleTab","getShadowOffset","angle","distance","rad","resolveShadow","shadow","offset","dividerPath","context","offset","swimlane","renderLaneDividers","lane","index","labelBase","context","lane","index","DEFAULT_FONT","horizontalLabel","thickness","centerX","centerY","width","x","y","rotatedBounds","verticalLabel","renderLaneLabels","render","normalizeLanes","swimlane","targetSize","total","sum","lane","positionLanes","offset","positioned","createSwimlaneRenderContext","index","boxBounds","buildSwimlane","swimlane","index","context","createSwimlaneRenderContext","simpleContainerStyle","resolveShadow","renderLaneDividers","renderLaneLabels","buildContainers","input","frame","index","tag","buildFrame","swimlane","buildSwimlane","distance","a","b","toward","from","to","distanceFromStart","length","ratio","roundedCorner","previous","vertex","next","requestedRadius","radius","roundedPolygonPath","points","radiusAt","index","_","first","rest","point","corners","commands","corner","isometricContext","object","index","strokeWidth","finite","rotation","box","isometricBounds","rotationCenter","rotatedBounds","groundShadowNode","context","faces","height","heightFactor","shadowDrop","contactFootprint","point","footprintCenter","sum","shadowSpread","footprint","footprintXs","footprintYs","roundedPolygonPath","faceNodes","hullClip","order","common","noStroke","faceFills","deriveFaceFills","colorProp","face","name","offset","points","color","seamsNode","hullNode","hullPath","cornerRadius","LABEL_HEIGHT","LABEL_GAP","LABEL_PADDING_X","LABEL_PADDING_Y","LABEL_CHAR_WIDTH","labelPlacement","anchor","isometricTopFaceCenter","bottomY","labelTextNode","placement","text","centerX","topY","DEFAULT_FONT","labelGuideNode","labelBackgroundNode","background","width","labelNodes","label","guide","buildIsometricObject","isometricFaces","silhouette","groundShadow","seams","hull","facesNodes","objectNodes","buildIsometricObjects","objects","tag","endpointLabelPosition","points","end","index","neighbor","x","y","dx","dy","length","ux","uy","renderEndpointLabel","context","labelIndex","label","fontSize","finite","position","width","DEFAULT_FONT","renderEndpointLabels","renderMainLabel","context","DEFAULT_FONT","hexToRgb","hex","result","rgbToHex","r","g","b","a","channel","x","alphaChannel","mixHexColors","start","end","ratio","startRgb","hexToRgb","endRgb","startAlpha","endAlpha","rgbToHex","interpolateHexColorStops","stops","position","sortedStops","first","second","last","index","range","getLinkStrokeColor","colorValue","getDashArray","strokeWidth","strokeStyle","wrapText","text","width","fontSize","metrics","maxChars","fits","line","word","result","rawLine","words","estimateTextWidth","bold","heuristicRichMeasure","lerpPoint","a","b","t","cubicBezierPoint","p0","p1","p2","p3","mt","splitCubicBezier","c","d","e","f","pointAtArcLength","points","targetLength","lastIndex","accumulated","index","start","end","length","ratio","polylineLength","total","bezierArcLength","samples","previous","point","SAMPLES","sampledArcLengths","points","lengths","previous","index","point","cubicBezierPoint","parameterAtLength","target","total","fraction","projectedGapHalfLength","clearance","maximum","p0","p1","p2","p3","dx","dy","length","ux","uy","splitCurvedPath","flatPoints","curvedControlPoints","half","maximumGap","gapHalfLength","beforeParameter","afterParameter","curvedPathBeforeGap","curvedPathAfterGap","parameter","splitCubicBezier","splitPolylinePath","points","clearance","total","polylineLength","placement","polylineGapPlacement","polylineBeforeGap","polylineAfterGap","totalLength","half","midpoint","pointAtArcLength","start","end","gapHalfLength","projectedPolylineGap","halfLength","segmentLength","horizontalShare","verticalShare","projectedClearance","splitLength","split","LABEL_GAP_PADDING","MIN_VISIBLE_STUB","bezierPoints","points","pathLength","bezier","bezierArcLength","polylineLength","splitPathAroundLabel","pathType","gapWidth","gapHeight","clearance","splitCurvedPath","splitPolylinePath","labelGapDash","split","totalLength","dashBefore","afterLength","gapLength","curvedMidpoint","points","x0","y0","x1","y1","x2","y2","x3","y3","t","mt","orthogonalMidpoint","fallback","totalLength","segments","index","start","end","length","halfLength","accumulatedLength","segment","ratio","getLineMidpoint","pathType","effectiveFrom","effectiveTo","sideNormal","side","controlDistances","from","to","fromNormal","toNormal","options","minimum","maximum","perpendicularScale","deltaX","deltaY","alongFrom","alongTo","perpendicularFrom","perpendicularTo","parallel","fromDistance","toDistance","routeCubic","fromSide","toSide","sideNormal","calculateCurvedLinkRoute","from","to","fromSide","toSide","p0","p1","p2","p3","routeCubic","snapAlignedEndpoints","from","to","fromSide","toSide","verticalPair","horizontalPair","chooseInitialOrientation","endpointEdges","stepOutDistances","fromNormal","toNormal","horizontalFirst","fromDistance","toDistance","axis","delta","gap","chooseBend","route","fromConnection","toConnection","fromStub","toStub","x","y","fromHorizontal","isHorizontalSide","toHorizontal","side","segmentMidpoints","points","midpoints","index","baseOrthogonalPoints","route","bend","from","to","fromConnection","toConnection","horizontalFirst","fromStub","toStub","movableInnerSegments","fromSide","toSide","fixedSides","offsetOrthogonalPoints","segmentOffsets","movable","first","middle","last","fromY","bendX","toY","fromX","bendY","toX","describeSegments","points","originalMidpoints","canMoveFirstInner","canMoveLastInner","totalSegments","originalMidpoint","segmentIndex","offset","start","end","midpoint","isInner","isMovableEdge","hasLength","roundOrthogonalPoints","coordinates","maximumRadius","points","coordinatePoints","roundedPoints","index","corner","createRoundedCorner","sampleRoundedCorner","point","previous","next","incoming","outgoing","incomingIsAxisAligned","outgoingIsAxisAligned","isStraight","radius","axisLength","incomingDirection","axisDirection","outgoingDirection","entry","offsetPoint","exit","center","startAngle","endAngle","normalizedAngleSweep","direction","distance","vector","angle","sampleIndex","progress","routeOrthogonal","request","routeDraft","createOrthogonalRouteDraft","bend","chooseBend","originalPoints","baseOrthogonalPoints","originalSegmentMidpoints","segmentMidpoints","movableSegments","movableInnerSegments","points","offsetOrthogonalPoints","segments","describeSegments","roundOrthogonalPoints","alignedFrom","alignedTo","snapAlignedEndpoints","fromNormal","sideNormal","toNormal","horizontalFirst","chooseInitialOrientation","fromDistance","toDistance","stepOutDistances","createRouteConnection","point","side","normal","distance","ORTHOGONAL_EPSILON","pathFromWaypoints","from","waypoints","to","corners","points","point","segments","index","start","end","midpoint","roundOrthogonalPoints","isAxisAligned","segment","dx","dy","calculateOrthogonalLinkRoute","link","from","to","fromSide","toSide","waypointResult","pathFromWaypoints","isAxisAligned","endpointEdges","request","route","routeOrthogonal","facingSide","from","to","angle","connectionSides","link","fromSide","toSide","calculateStraightLinkRoute","from","to","calculateLinkRoute","link","effectiveFrom","effectiveTo","pathType","fromSide","toSide","connectionSides","calculateCurvedLinkRoute","calculateOrthogonalLinkRoute","calculateStraightLinkRoute","linkBounds","points","padding","xs","_","index","ys","labelLayout","link","measureText","visible","fontSize","finite","width","metrics","DEFAULT_FONT","lines","wrapText","linkStyle","item","strokeWidth","color","dash","stroke","stop","resolveShadow","createLinkRenderContext","from","to","pathType","segments","calculateLinkRoute","getLinkStrokeColor","label","contentDash","getDashArray","gap","labelGapDash","getLineMidpoint","markerForEnd","link","end","explicit","direction","roundedOrthogonalPathData","segments","radius","raw","segment","points","point","index","corners","previous","next","pathData","corner","incoming","outgoing","cornerRadius","before","after","last","polylinePathData","points","path","index","pathData","pathType","segments","strokeWidth","roundedOrthogonalPathData","round","value","movableSegments","segment","renderLinkPath","context","link","markerForEnd","renderWeightBadge","context","link","text","width","height","y","buildLink","item","index","measureText","context","createLinkRenderContext","renderLinkPath","renderMainLabel","renderWeightBadge","renderEndpointLabels","buildLinks","links","tag","buildFreeformPath","path","index","strokeWidth","finite","extra","bounds","point","tension","closed","freeformPathData","buildFreeformPaths","paths","tag","shapeNodeBase","context","CLOUD_LOBES","QUARTER_TURN","FULL_TURN","BOTTOM_ANGLE","EPSILON","pointOnLobe","centerX","centerY","radius","angle","angleOnLobe","point","outerCusp","first","second","centroid","dx","dy","distance","along","across","footX","footY","candidates","fromCentroid","lobeArcs","lobes","sum","lobe","index","from","to","quarterStops","stops","turn","arcCurves","start","curves","stop","reach","begin","end","normalizedCloudOutline","arcs","arc","anchors","curve","minX","maxX","minY","maxY","unit","CLOUD_OUTLINE","cloudPath","x","y","width","height","at","u","v","cylinderPath","x","y","width","height","cap","rx","cx","left","right","lidY","floorY","lid","wall","personFigure","scale","head","body","figureHeight","top","personLabelArea","centerX","bottom","personPath","headCenterY","skull","dome","polygonPath","points","s","n","i","DOCUMENT_WAVE_AMPLITUDE","QUARTER_SINE_SLOPE","NOTE_FOLD_RATIO","PREDEFINED_PROCESS_BAR_RATIO","pillCornerRadius","width","height","localShapePath","type","x","y","p","coords","cut","amplitude","mid","quarter","slope","fold","cloudPath","cylinderPath","personPath","bar","renderPath","context","path","localShapePath","shapeNodeBase","renderBoundedPath","node","renderRectangle","rx","pillCornerRadius","finite","renderEllipse","renderSymbol","tension","points","x","y","freeformPathData","GEOMETRY_RENDERERS","renderPath","renderEllipse","renderBoundedPath","renderRectangle","renderSymbol","renderShapeGeometry","context","REMOVED_SHAPE_HINTS","COMMON_SHAPE_DEFAULTS","SHAPE_RENDER_DEFAULTS","shapeDefaults","shape","diagnostics","defaults","shapeDash","strokeWidth","shapeStyle","finite","shadow","angle","paint","BOLD_PATTERN","hasBoldMarkup","text","parseRichLine","line","runs","lastIndex","match","parseRichText","runsToWords","words","run","word","wrapRichLine","maxWidth","measure","spaceWidth","lines","current","currentWidth","wordWidth","addedWidth","wrapRichText","renderShapeText","context","strokeWidth","measureText","shape","bounds","order","rotation","rotationCenter","x","y","width","height","fontSize","finite","shapeDefaults","padding","area","personLabelArea","textWidth","fontFamily","DEFAULT_FONT","metrics","textNode","wrapText","hasBoldMarkup","measure","spaceWidth","heuristicRichMeasure","wrapRichText","renderDoubleStroke","context","strokeWidth","insetWidth","insetHeight","ring","nodes","renderShapeGeometry","inset","createRenderContext","shape","index","diagnostics","x","finite","y","width","height","rotation","rotatedBounds","shapeStyle","renderShaderSurface","buildShape","measureText","shader","node","text","renderShapeText","buildShapes","shapes","tag","formatRollingNumber","value","digits","text","DEFAULT_ROLLING_NUMBER_STYLE","resolveRollingNumberStyle","style","buildRollingNumber","widget","index","x","finite","y","width","height","rotation","rotatedBounds","formatRollingNumber","resolveRollingNumberStyle","buildTickScale","max","progress","nodes","buildTickLabels","box","labels","ticks","major","start","sweep","radius","fontSize","centerX","centerY","count","step","fraction","angle","labelX","labelY","labelBox","DEFAULT_FONT","buildRuler","min","buildRulerLabels","horizontal","inset","line","across","tickLength","edge","along","buildWidgets","widgets","tag","CHART_COLORS","DEFAULT_ZONE_FILL","DEFAULT_HEATMAP_ZONES","DEFAULT_HEX_RADIUS","mapChartValue","value","axis","extent","chartTicks","ascending","step","ticks","axisBands","thresholds","threshold","a","b","zoneColorAtValue","bands","zones","bandCount","stops","zone","index","DEFAULT_ZONE_FILL","interpolateHexColorStops","barCategoryCount","chart","series","BAR_LABEL","formatBarLabel","value","template","barLabelSize","text","fontSize","pill","padX","padY","lineHeight","pillPath","x","y","width","height","r","barShapePath","x","y","width","height","radius","r","roundedBarPath","barPath","roundedBottom","quantile","sorted","probability","position","lowerIndex","upperIndex","computeBoxplotStats","values","a","b","hexToRgb","hex","channels","channel","index","red","green","blue","colorWithAlpha","alpha","rgb","clamped","rgbToHex","value","rgbToHsl","r","g","b","max","min","lightness","delta","saturation","hue","hslToRgb","chroma","x","m","relativeLuminance","linear","normalized","contrastRatio","luminanceA","luminanceB","lighter","darker","SAME_HUE_LIGHTNESS_GAP","SAME_HUE_MIN_LIGHTNESS","SAME_HUE_MAX_LIGHTNESS","SAME_HUE_LIGHT_MIN_LIGHTNESS","SAME_HUE_LIGHT_MAX_LIGHTNESS","SAME_HUE_MIN_CONTRAST","contrastTextColor","fallback","targetLightness","variant","sameHueContrastColor","isLightColor","sameHueTint","representativeColor","value","fallback","errorBarRange","value","error","createVerticalErrorWhiskerNode","whisker","verticalErrorWhiskerPath","geometry","centerX","startY","endY","capStartX","capEndX","formatFieldValue","value","CATEGORY_LABEL_ROW","settings","chart","isHorizontalBar","horizontalRows","plot","count","barCategoryCount","slotHeight","groupGap","finite","labelRow","available","thickness","barsHeight","rowTop","rows","index","linePathData","points","tension","freeformPathData","point","index","resolvePieRadii","plotWidth","plotHeight","configInnerRadius","configCornerRadius","rawOuterRadius","rawInnerRadius","cornerRadius","outerRadius","innerRadius","pieArcPoint","geometry","angle","radius","clipSegmentToRect","from","to","halfWidth","halfHeight","dx","dy","tMin","tMax","tx1","tx2","ty1","ty2","t","largeArcFlag","a","b","gapInsetAngle","halfGap","insetAngles","angles","inset","pieApexRadius","sweep","halfSweep","denominator","apexSlicePath","outerAngles","apex","start","end","donutSlicePath","innerAngles","outerStart","outerEnd","innerEnd","innerStart","CORNER_ANGLE_HEADROOM","pieFillet","circleRadius","filletCenterRadius","edgeAngle","sign","ratio","d","maxPieCornerRadius","angleFactor","outerLimit","innerLimit","ringLimit","maxApexCornerRadius","apexRadius","depthLimit","roundedApexSlicePath","outerFilletCenterRadius","roundedDonutSlicePath","innerFilletCenterRadius","pieUsesInnerArc","gapPx","createPieSlicePath","segmentedBarPath","frame","orientation","count","gap","radius","fraction","snap","horizontal","length","segment","filled","units","parts","index","visible","offset","roundedBarPath","resolveChartShadow","shadow","angle","finite","distance","stackedSegment","chart","mode","categoryIndex","seriesIndex","plotHeight","value","waterfallSegment","percentSegment","cumulativeSegment","running","index","mappedSegment","total","sum","series","cumulative","magnitude","start","end","mapChartValue","chartText","options","chart","frame","DEFAULT_FONT","finite","IDENT","block","kind","id","property","CHART_TITLE_PROP","axisLabelProp","axis","categoryProp","index","seriesLabelProp","seriesColorProp","seriesValueProp","id","index","block","seriesValueColorProp","ruleTextProp","ruleAtProp","buildXAxisLabel","chart","layout","order","chartText","axisLabelProp","buildYAxisLabel","buildAxisLabels","labels","xLabel","yLabel","buildBoxplotSeriesYAxisTicks","chart","layout","order","count","slotWidth","series","index","centerY","chartText","seriesLabelProp","CHARTS_WITH_OWN_LEGEND","buildLegend","render","usesStandardLegend","createLegendItems","item","renderLegendItem","chart","isConnectedCustom","legendSeries","LEGEND_ROW_HEIGHT","LEGEND_COLUMN_GAP","isStackedLegendPosition","position","legendItemWidths","finite","stackedLegendColumnWidth","widths","legendStartX","plot","totalWidth","legendY","createStackedLegendItems","order","series","maxWidth","x","lastY","seriesIndex","createRowLegendItems","sum","width","y","itemX","createLegendSwatch","createLegendLabel","bounds","diagnostics","fallback","CHART_COLORS","solidOnly","color","representativeColor","seriesColorProp","paint","chartText","seriesLabelProp","CARTESIAN_VALUE_TYPES","CHARTS_WITHOUT_CARTESIAN_DECORATIONS","hasCartesianDecorations","chart","tickOffset","finite","isHorizontalBoxplot","boxplotCategoryLabelWidth","fontSize","series","TREEMAP_SIDE_LEGEND_WIDTH","treemapSideLegendSide","showLegend","barCategoryLabelWidth","categories","category","leftLabelWidth","isHorizontalBar","decorations","showLabels","legendPosition","legendAtTop","hasLegendItems","legendStacked","isStackedLegendPosition","sideColumnWidth","stackedLegendColumnWidth","LEGEND_COLUMN_GAP","treemapSide","tick","padLeft","padRight","valueRow","horizontalValueAxis","basePadBottom","hasColorBar","legendAtBottomRow","padBottom","LEGEND_ROW_HEIGHT","padTop","boxBounds","categoryLabels","chart","count","_value","index","buildCategoricalXAxisTicks","layout","order","barCategoryCount","slotWidth","labels","editable","left","groupGap","finite","centerX","chartText","tickOffset","categoryProp","buildSeriesXAxisTicks","series","seriesLabelProp","buildNumericXAxisTicks","chart","layout","order","chartTicks","tick","index","x","mapChartValue","chartText","tickOffset","buildNumericYAxisTicks","chart","layout","order","chartTicks","tick","index","y","mapChartValue","chartText","tickOffset","isHorizontalBoxplot","chart","buildXAxisTicks","layout","order","buildCategoricalXAxisTicks","buildSeriesXAxisTicks","buildNumericXAxisTicks","buildYAxisTicks","buildBoxplotSeriesYAxisTicks","buildNumericYAxisTicks","xTickPositions","plot","count","barCategoryCount","_value","index","chartTicks","tick","mapChartValue","axisLineDash","width","buildAxisLines","lineWidth","finite","tickLength","bounds","bottom","style","nodes","add","id","d","isHorizontalBar","x","rows","horizontalRows","y","rowTop","categoryNames","names","buildHorizontalBarAxes","above","inside","editable","name","top","chartText","categoryProp","buildChartAxes","hasCartesianDecorations","lines","xTicks","yTicks","labels","buildAxisLabels","idwInterpolate","samples","pointX","pointY","power","weightedSum","weightSum","sample","deltaX","deltaY","distanceSquared","weight","FIELD_GRID_MAX_CELLS","fieldSurfaceClip","chart","plot","computeFieldGrid","samples","width","height","power","aspect","cols","rows","grid","row","pointY","column","pointX","idwInterpolate","CIRCULAR_GRID_CHART_TYPES","START_ANGLE","CURVED_TENSION","LABEL_FREE_MARGIN","radarLabelSpace","fontSize","radarRadius","plotWidth","plotHeight","hasLabels","margin","radarCategoryCount","configuredCount","dataCount","radarAngleAt","count","index","angleForAxisValue","min","max","value","ratio","radarPointAt","frame","pointRadius","angle","radarRadiusForValue","range","radarSeriesPath","points","curved","freeformPathData","CURVED_TENSION","point","index","createGridDot","chart","id","order","bounds","x","y","width","clip","radius","style","size","gridLineDashStyle","chart","width","rounded","buildCircularChartGrid","chart","plot","bounds","order","centerX","centerY","radius","width","finite","buildDottedCircularGrid","style","gridLineDashStyle","nodes","chartTicks","tick","ringRadius","ringRatio","angle","angleForAxisValue","edgeX","edgeY","yTicks","xTicks","yTick","xTick","x","y","id","createGridDot","range","buildChartGrid","chart","plot","bounds","order","hasCartesianDecorations","CIRCULAR_GRID_CHART_TYPES","buildCircularChartGrid","width","finite","isHorizontalBar","buildHorizontalBarGrid","clip","fieldSurfaceClip","buildDottedRectGrid","style","gridLineDashStyle","nodes","chartTicks","tick","x","mapChartValue","y","index","xTicks","yTicks","xTick","yTick","id","createGridDot","buildChartRules","render","createChartRuleMarks","mark","renderChartRule","nextOrder","rule","lineOrder","labelOrder","mapChartValue","nodes","createChartRuleLine","createChartRuleLabel","ruleAtProp","fontSize","finite","chartText","ruleTextProp","chartImageRect","chart","inset","finite","buildChartBackdrop","bounds","order","rect","nodes","createGlassBackdropNodes","context","id","d","chart","bounds","nextOrder","blur","finite","rect","chartImageRect","nodes","buildChartGrid","node","createBarGlowNode","context","id","d","color","glow","bounds","chart","diagnostics","nextOrder","paint","representativeColor","barLabelsEnabled","context","resolvePlacement","target","size","fits","BAR_LABEL","labelTop","placement","frame","height","createPillNode","id","box","color","chart","bounds","diagnostics","nextOrder","config","pillPath","paint","finite","createTextNode","text","fontSize","chartText","createAxisValueNode","plot","top","CATEGORY_LABEL_ROW","horizontalPlacement","requested","horizontalBox","left","createBarLabelNodes","formatBarLabel","pill","barLabelSize","nodes","DEFAULT_HATCH","MIN_HATCH_SPACING","hatchPath","x","y","width","height","angle","spacing","radians","direction","normal","center","reach","segments","offset","cx","cy","barTrackClip","context","frame","barTrackEnabled","roundedBarPath","createBarTrackNodes","id","orientation","chart","bounds","diagnostics","nextOrder","config","radius","finite","d","segmentedBarPath","nodes","paint","renderGroupedBars","context","layout","createGroupedBarLayout","marks","series","seriesIndex","createSeriesBarMarks","tracks","barTrackEnabled","mark","createBarTrackNodes","bars","renderGroupedBarMark","labels","barLabelsEnabled","createGroupedLabel","createGroupedGlow","isSeriesMax","values","entry","chart","createBarLabelNodes","groupedShape","frame","plot","config","radius","segments","finite","segmentedBarPath","barPath","glow","d","createBarGlowNode","valueCount","barCategoryCount","slotWidth","groupGap","barGap","seriesColor","CHART_COLORS","value","valueIndex","numericValue","height","mapChartValue","nodes","createGroupedBarNodes","errorNode","createGroupedBarError","plotClipPath","x","y","width","bounds","diagnostics","nextOrder","path","fill","paint","stroke","strokeWidth","shadow","resolveChartShadow","shadowCaster","barTrackClip","bar","seriesValueColorProp","seriesValueProp","glass","createGlassBackdropNodes","lower","upper","errorBarRange","createVerticalErrorWhiskerNode","barFrame","context","rows","seriesIndex","valueIndex","value","chart","plot","top","rowTop","segment","stackedSegment","start","barGap","finite","seriesHeight","width","mapChartValue","barPath","frame","config","segments","segmentedBarPath","roundedBarPath","markOf","series","CHART_COLORS","barNodes","mark","diagnostics","nextOrder","stroke","paint","strokeWidth","shadow","resolveChartShadow","fill","nodes","createGlassBackdropNodes","barTrackClip","seriesValueColorProp","labelNodes","highest","showLabel","barLabelsEnabled","lastSeries","createBarLabelNodes","pushBar","layers","barTrackEnabled","createBarTrackNodes","glow","createBarGlowNode","renderHorizontalBars","horizontalRows","numeric","slotOf","context","mode","chart","plot","slotWidth","barCategoryCount","groupGap","finite","pathOf","x","y","height","slot","radius","segments","segmentedBarPath","barPath","pushLabel","layers","series","seriesIndex","valueIndex","frame","config","barLabelsEnabled","isSeriesMax","requested","value","createBarLabelNodes","markOf","segment","stackedSegment","CHART_COLORS","segmentNodes","mark","bounds","diagnostics","nextOrder","path","fill","paint","stroke","strokeWidth","shadow","resolveChartShadow","nodes","plotClip","barTrackClip","createGlassBackdropNodes","seriesValueColorProp","seriesValueProp","pushSegment","barTrackEnabled","createBarTrackNodes","glow","createBarGlowNode","renderStackedBars","valueCount","values","index","numeric","renderBar","context","isHorizontalBar","renderHorizontalBars","renderStackedBars","renderGroupedBars","createBoxplotLayout","context","chart","plot","orientation","boxCount","slotWidth","widthFraction","representativeColor","finite","boxplotPoint","orientation","center","value","createBoxplotGeometry","context","layout","seriesIndex","stats","chart","plot","valueAt","mapChartValue","renderSamplePoints","context","layout","mark","chart","plot","bounds","diagnostics","nextOrder","valueAt","value","mapChartValue","pointIndex","center","jitter","x","y","boxplotPoint","paint","seed","hash","renderBoxAndWhiskers","context","layout","mark","createBoxBorderLine","lowerWhisker","upperWhisker","lowerWhiskerCap","upperWhiskerCap","createBoxNode","medianLine","center","min","q1","boxplotPoint","q3","max","whiskerCap","id","value","capHalf","half","line","chart","bounds","diagnostics","nextOrder","geometry","a","b","x","y","width","height","paint","renderBoxplotSeries","context","layout","series","seriesIndex","stats","computeBoxplotStats","geometry","createBoxplotGeometry","color","CHART_COLORS","mark","nodes","renderBoxAndWhiskers","renderSamplePoints","renderBoxplot","context","layout","createBoxplotLayout","nodes","series","seriesIndex","renderBoxplotSeries","HOLLOW_POINT_STROKE","CONNECTOR_LABEL_GAP","CONNECTOR_LABEL_WIDTH","renderCustom","context","renderConnectedPairs","series","seriesIndex","renderCustomSeries","style","customSeriesStyle","customSeriesValues","value","valueIndex","point","customPointPosition","mark","createCustomSymbolMark","createCustomPointMark","isHorizontal","chart","index","metricComponent","mapChartValue","color","CHART_COLORS","paint","finite","symbol","size","scale","offset","points","x","y","customMarkId","freeformPathData","radius","beforeSeries","afterSeries","beforeValues","afterValues","zones","betterColor","worseColor","tieColor","DEFAULT_ZONE_FILL","reverse","count","categories","nodes","beforeValue","afterValue","beforePoint","afterPoint","beforeMetric","afterMetric","better","worse","comparisonColor","createConnectorLine","createConnectorLabel","from","to","text","bounds","nextOrder","horizontal","frame","chartText","classifyFieldData","context","chart","plot","scalarSeries","series","tupleSize","vectorSeries","x","y","value","mapChartValue","renderFieldLegend","context","stops","sortedStops","b","minimum","maximum","geometry","legendGeometry","createColorBar","createLegendLabels","plot","width","chart","bounds","nextOrder","span","stop","y","chartText","formatFieldValue","RAMP_FALLBACK_COLOR","colorAtRamp","ramp","value","interpolateHexColorStops","stitchIsolineSegments","segments","pointKey","point","adjacency","addEdge","from","to","segment","key","list","entry","index","a","b","usedSegments","extend","chain","current","next","candidate","chains","forward","backward","computeIsolineSegments","field","threshold","row","column","cell","createIsolineCell","caseIndex","isolineCaseIndex","segmentsForIsolineCase","fieldSample","isAboveThreshold","sample","edges","cellEdgeIntersections","isolineSegment","interpolateEdge","start","end","progress","ISOLINE_TENSION","renderScalarField","context","samples","grid","createScalarGrid","renderFieldCells","renderIsolines","plot","chart","result","computeFieldGrid","nodes","row","column","createFieldCell","bounds","nextOrder","centerX","centerY","color","colorAtRamp","fieldSurfaceClip","threshold","thresholdIndex","node","createIsoline","segments","computeIsolineSegments","path","stitchIsolineSegments","chain","linePathData","x","y","renderVectorField","context","seriesList","nodes","series","seriesIndex","color","CHART_COLORS","vector","vectorIndex","createVectorNode","seriesId","chart","plot","bounds","diagnostics","nextOrder","x","y","angle","magnitude","startX","mapChartValue","startY","endX","endY","paint","renderField","context","data","classifyFieldData","nodes","renderScalarField","renderVectorField","renderFieldLegend","renderHeatmapCells","context","layout","nodes","series","rowIndex","renderRowCells","_","columnIndex","cell","createHeatmapCell","renderHeatmapCell","value","cellGap","colorForValue","zoneColorAtValue","background","createCellBackground","createCellValueLabel","chart","bounds","nextOrder","finite","chartText","contrastTextColor","renderHeatmapHeaders","context","layout","renderRowHeaders","renderColumnHeaders","series","rowIndex","createRowHeader","chart","plot","bounds","nextOrder","chartText","label","columnIndex","createColumnHeader","createHeatmapLayout","context","chart","columns","heatmapColumns","reservedSpace","heatmapReservedSpace","axisBands","DEFAULT_HEATMAP_ZONES","finite","createHeatmapGrid","_","index","fontSize","longestLabel","max","series","estimateTextWidth","columnCount","width","height","rowCount","cellGap","cellWidth","cellHeight","gridWidth","gridHeight","cellSize","BAR_HEIGHT","TICK_HEIGHT","ROW_GAP","renderHeatmapLegend","context","layout","barX","barWidth","labelHeight","barY","barBounds","boxBounds","createGradientBar","createBoundaryTicks","bandRatio","value","first","last","chart","nextOrder","bandCount","stops","zone","index","DEFAULT_ZONE_FILL","bounds","labelY","labelWidth","x","tick","isFirst","isLast","align","frameX","label","chartText","formatFieldValue","renderHeatmap","context","layout","createHeatmapLayout","nodes","renderHeatmapCells","renderHeatmapHeaders","renderHeatmapLegend","computeHexBins","points","radius","dx","dy","bins","x","y","col","rowOffset","row","key","existing","assignSankeyColumns","graph","columns","id","pass","changed","link","candidate","groupSankeyColumns","ids","groups","column","group","createSankeyGraph","nodes","links","ids","node","link","incoming","outgoing","id","validLinks","nodeValues","graph","values","id","inflow","sum","link","outflow","calculateValueScale","groups","height","scale","ids","total","gaps","usable","sankeyNodeX","column","columnCount","width","calculateNodeGeometry","columns","groupSankeyColumns","valueScale","y","heights","cursor","nodeHeight","layoutSankeyLinks","graph","geometry","width","offsets","outgoingOffsets","incomingOffsets","id","link","sliceHeight","sourceOffset","targetOffset","sourceTop","targetTop","sourceSlice","targetSlice","sankeyNodeX","layoutSankeyNodes","inputs","graph","geometry","width","offsets","id","input","node","column","offset","sankeyNodeX","collectOffsets","inputs","offsets","input","layoutSankey","nodeInputs","linkInputs","width","height","graph","createSankeyGraph","columns","assignSankeyColumns","geometry","calculateNodeGeometry","layoutSankeyNodes","layoutSankeyLinks","squarifyTreemap","items","bounds","remainingItems","sizeTreemapItems","rectangles","remaining","remainingBounds","row","selectTreemapRow","placement","placeTreemapRow","positiveItems","item","total","sum","areaScale","left","right","availableLength","rowItems","index","candidateItems","worstAspectRatio","area","areas","largestArea","smallestArea","squaredLength","placeVerticalTreemapRow","placeHorizontalTreemapRow","columnWidth","y","height","rectangle","rowHeight","x","width","hexPath","cx","cy","radius","points","corner","angle","renderHexbin","context","chart","plot","bounds","diagnostics","nextOrder","nodes","hexRadius","DEFAULT_HEX_RADIUS","shadow","resolveChartShadow","clipPath","series","seriesIndex","pixelPoints","y","i","vx","vy","mapChartValue","bins","computeHexBins","maxCount","bin","color","CHART_COLORS","paint","seriesValuePairs","chart","series","value","index","pixelPoints","context","pairs","plot","x","y","mapChartValue","createLineAreaFill","context","series","points","color","tension","areaOpacity","chart","plot","nextOrder","baselineY","first","last","d","linePathData","top","point","centerX","halfHeight","fillBounds","colorWithAlpha","formatHighlight","template","category","value","guideNode","context","mark","chart","plot","bounds","diagnostics","nextOrder","paint","dotNode","glow","labelNode","config","fontSize","text","width","chartText","renderLineHighlights","series","color","wanted","pairs","seriesValuePairs","points","pixelPoints","nodes","wantedIndex","index","point","createLinePointMarks","series","pairs","points","color","position","valueIndex","renderLineMarks","context","marks","mark","renderLinePointMark","nodes","errorNode","createLineError","createLinePoint","chart","plot","bounds","nextOrder","lower","upper","errorBarRange","createVerticalErrorWhiskerNode","mapChartValue","diagnostics","config","radius","strokeWidth","visible","fill","paint","createLinePath","context","series","points","color","tension","chart","plot","bounds","diagnostics","nextOrder","config","source","gradient","glow","linePathData","paint","resolveChartShadow","seriesColor","series","seriesIndex","representativeColor","CHART_COLORS","renderLineSeriesArea","context","areaOpacity","color","tension","points","pixelPoints","seriesValuePairs","createLineAreaFill","renderLineSeries","pairs","nodes","createLinePath","marks","createLinePointMarks","renderLineMarks","renderLineHighlights","renderLine","context","nodes","series","seriesIndex","renderLineSeriesArea","renderLineSeries","PERCENT_TICKS","renderMekkoGrid","context","layout","nodes","renderGridLines","renderPercentageLabels","chart","bounds","nextOrder","percent","y","percentageY","finite","plot","chartText","renderMekkoColumnLabels","context","layout","columnIndex","column","createTotalLabel","createColumnLabel","chart","plot","bounds","nextOrder","chartText","label","width","wrapText","COLUMN_GAP","createMekkoLayout","context","labels","mekkoColumnLabels","labelGutterWidth","grid","createMekkoGrid","fontSize","finite","createMekkoColumns","chart","_","index","topGutter","bottomGutter","totals","columnIndex","sum","series","grandTotal","total","maximumTotal","availableWidth","nextX","label","width","height","column","BACKDROP_OPACITY","renderMekkoColumnSegments","context","layout","columnIndex","backdrop","createColumnBackdrop","gradientFlow","columnSegments","calculateColumnSegments","segments","segment","index","renderSegment","chart","bounds","diagnostics","nextOrder","column","cornerRadius","mekkoCornerRadius","barShapePath","paint","finite","seriesList","cumulativeHeight","series","seriesIndex","value","height","y","color","CHART_COLORS","nextColor","createSegmentNode","createSegmentLabel","plot","shadow","resolveChartShadow","clipPath","radius","x","width","fallback","gradientBounds","fill","representativeColor","innerWidth","innerHeight","lineHeight","labelLines","wrapText","textColor","contrastTextColor","label","chartText","valueNode","renderMekko","context","layout","createMekkoLayout","nodes","renderMekkoGrid","column","columnIndex","renderMekkoColumnSegments","renderMekkoColumnLabels","fill","template","chart","values","series","finite","total","sum","value","first","renderPieCenter","context","geometry","bounds","nextOrder","lines","fontSize","lineHeight","width","DEFAULT_FONT","createPieGeometry","context","chart","plot","resolved","resolvePieRadii","room","outerRadius","innerRadius","cornerRadius","sum","series","finite","MIN_LABEL_SWEEP","LABEL_WIDTH","LABEL_RADIUS_FRACTION","OUTSIDE_GAP","LEADER_INSET","OUTSIDE_TINT_LIGHTNESS","OUTSIDE_FALLBACK_COLOR","renderPieLabels","context","geometry","marks","mark","createPieLabel","labelTextPair","point","color","fontSize","percent","outside","midAngle","chart","bounds","nextOrder","lineHeight","content","width","base","DEFAULT_FONT","detail","extra","nameText","seriesLabelProp","valueText","seriesValueProp","createTick","tickStart","tickEnd","config","mid","finite","pieArcPoint","ringThickness","tooThin","hasManualOffset","position","addOffset","clipSegmentToRect","sameHueTint","representativeColor","labelRadius","sliceColor","sameHueContrastColor","contrastTextColor","dx","dy","TOP","FULL","MAXIMUM_SWEEP","radians","degrees","renderPieSlices","context","geometry","config","marks","createPieSliceMarks","finite","gapPx","mark","createSliceNodes","shiftGeometry","renderPieLabels","shiftOf","mid","dx","dy","seriesList","total","layout","angle","series","seriesIndex","value","sweep","CHART_COLORS","fullCirclePath","cx","cy","pieOuterShadow","shadow","halfGap","blur","maxDistance","distance","scale","sliceCornerRadius","rawSweep","usesInnerArc","pieUsesInnerArc","gapSweep","gapInsetAngle","availableSweep","maxPieCornerRadius","maxApexCornerRadius","pieApexRadius","sliceStroke","strokeColor","chart","bounds","diagnostics","nextOrder","fill","paint","slicePath","createPieSlicePath","resolveChartShadow","strokeStyle","glow","shadowCaster","slice","seriesValueProp","representativeColor","renderPie","context","geometry","createPieGeometry","renderPieSlices","renderPieCenter","START_ANGLE","TRACK_COLOR_FALLBACK","MIN_LABEL_SWEEP","LABEL_WIDTH","LABEL_RADIUS_FRACTION","OUTSIDE_GAP","LEADER_INSET","OUTSIDE_TINT_LIGHTNESS","OUTSIDE_FALLBACK_COLOR","layoutOf","context","chart","plot","maxRadius","axisMin","finite","clampedCorner","layout","outerRadius","angles","centerX","centerY","innerRadius","cornerRadius","gapPx","geometry","halfGap","rawSweep","availableSweep","gapInsetAngle","pieUsesInnerArc","maxPieCornerRadius","apexRadius","pieApexRadius","maxApexCornerRadius","wedgeNodes","series","value","rawColor","bounds","diagnostics","nextOrder","color","paint","shadow","resolveChartShadow","trackPath","createPieSlicePath","track","wedgePath","shadowCaster","wedge","seriesValueProp","renderPolarArea","range","sweep","showLabels","index","fraction","CHART_COLORS","nodes","createWedgeLabel","labelPlacement","fillColor","mid","lineHeight","ringThickness","labelOffsetX","labelOffsetY","hasManualOffset","tooThin","chordWidth","fitsInline","outside","tickStart","pieArcPoint","point","addOffset","sameHueTint","representativeColor","sameHueContrastColor","contrastTextColor","placement","fontSize","tickEnd","clipSegmentToRect","tick","detail","base","DEFAULT_FONT","nameText","seriesLabelProp","valueText","formatFieldValue","dx","dy","DEFAULT_CATEGORIES","radarFrameFor","context","chart","plot","configuredCount","dataCount","series","radarRadius","finite","radarCategoryCount","createRadarGeometry","configuredCategories","frame","categories","createCategories","pointAt","pointRadius","pointIndex","radarPointAt","value","radarRadiusForValue","radarSeriesPath","_","index","configured","categoryCount","renderRadarGrid","context","geometry","renderRings","renderSpokes","chartTicks","tick","createRingNode","chart","bounds","nextOrder","ringRadius","style","finite","_","categoryIndex","edge","renderRadarLabels","context","geometry","category","categoryIndex","createCategoryLabel","chart","plot","bounds","nextOrder","labelPoint","horizontalOffset","width","chartText","labelX","labelAlignment","pointX","renderRadarSeries","context","geometry","nodes","series","seriesIndex","renderSeries","color","CHART_COLORS","points","seriesPoints","path","radarSeriesPath","createSeriesFill","createSeriesStroke","createSeriesPoints","values","_","categoryIndex","chart","bounds","diagnostics","nextOrder","paint","resolveChartShadow","point","pointIndex","seriesValueProp","renderRadar","context","geometry","createRadarGeometry","nodes","renderRadarGrid","renderRadarLabels","renderRadarSeries","START_ANGLE","DEFAULT_RING_THICKNESS","DEFAULT_RING_GAP","TRACK_OPACITY","FULL_SWEEP_EPSILON","arcPoint","cx","cy","angle","fullCirclePath","annulusPath","outerRadius","innerRadius","arcSegmentPath","from","to","start","end","ringShadow","shadow","ringThickness","blur","maxDistance","distance","scale","ringProgressPath","sweep","mid","largeArc","layoutOf","context","chart","plot","axisMin","finite","ringEndShadows","layout","series","radius","color","bounds","nextOrder","centerX","centerY","resolveChartShadow","isFullCircle","clampedShadow","stubSweep","endIndex","ringNodes","index","diagnostics","ringGap","range","paint","CHART_COLORS","value","fraction","track","casters","progress","seriesValueProp","renderRadialBar","renderSankeyLinks","context","data","shadow","resolveChartShadow","gradient","plot","clipPath","link","linkIndex","ribbon","createSankeyLinkRibbon","createSankeyRibbonNode","source","target","fromColor","DEFAULT_ZONE_FILL","toColor","fill","chart","bounds","nextOrder","gradientBounds","sankeyRibbonPath","controlX","OUTSIDE_LABEL_LIGHTNESS_ON_LIGHT_BG","OUTSIDE_LABEL_LIGHTNESS_ON_DARK_BG","renderSankeyNodes","context","data","cornerRadius","finite","nodes","node","createNodeRect","label","createNodeLabel","chart","bounds","nextOrder","x","y","style","DEFAULT_ZONE_FILL","resolveChartShadow","isFirstColumn","isLastColumn","detail","leftRoundedRectPath","rightRoundedRectPath","position","createInsideLabel","createOutsideLabel","fallback","defaultColor","contrastTextColor","sameHueTint","isLightColor","color","labelX","chartText","orientation","centerX","centerY","fontSize","id","thickness","width","estimateTextWidth","createSankeyRenderData","context","chart","plot","showLabels","labelGutter","availableWidth","layout","layoutSankey","createNodeInputs","createLinkInputs","finite","node","DEFAULT_ZONE_FILL","zone","inputs","series","representativeColor","renderSankey","context","data","createSankeyRenderData","nodes","renderSankeyLinks","renderSankeyNodes","renderScatter","context","radius","nodes","shadow","resolveChartShadow","series","seriesIndex","color","CHART_COLORS","pixelPoints","seriesValuePairs","point","pointIndex","createScatterPoint","chart","bounds","diagnostics","nextOrder","paint","createTreemapLayout","context","chart","plot","showLegend","fontSize","finite","legendPosition","legendHeight","cellGap","axisBands","DEFAULT_HEATMAP_ZONES","treemapLeafValue","leaf","treemapLeafColor","layout","zoneColorAtValue","BAR_THICKNESS","TICK_LENGTH","ROW_GAP","CHART_GAP","LABEL_SIZE","renderTreemapLegend","context","layout","renderBottomLegend","renderSideLegend","bandRatio","value","first","last","bandStops","bandCount","zone","index","DEFAULT_ZONE_FILL","chart","plot","bounds","nextOrder","barX","barWidth","labelHeight","barY","barBounds","boxBounds","stops","bar","ticks","x","tick","isFirst","isLast","align","frameX","label","chartText","formatFieldValue","side","barTop","barHeight","tickX","tickEndX","labelX","y","HEADER_HEIGHT","renderTreemapTiles","context","layout","tiles","headers","layoutTreemapTiles","nodes","gradientFlow","tile","index","next","sameGroup","nextTile","renderTile","header","renderTreemapHeader","leaf","items","treemapLeafValue","squarifyTreemap","groupOrder","key","groupItems","sum","groupRects","groupGap","groupRect","headerHeight","leafItems","chart","plot","bounds","nextOrder","fill","background","smallFontSize","label","chartText","contrastTextColor","color","treemapLeafColor","nextColor","createTileNode","createTileLabel","diagnostics","gap","shadow","resolveChartShadow","clipPath","tileX","tileY","tileWidth","tileHeight","fallback","gradientBounds","representativeColor","paint","finite","value","width","height","x","y","textColor","labelLines","wrapText","lineHeight","valueNode","renderTreemap","context","layout","createTreemapLayout","nodes","renderTreemapTiles","renderTreemapLegend","RENDERERS","renderBar","renderBoxplot","renderCustom","renderField","renderHeatmap","context","renderHexbin","renderLine","renderMekko","renderPie","renderPolarArea","renderRadar","renderRadialBar","renderSankey","renderScatter","renderTreemap","POLAR_TYPES","isPolarChart","chartType","renderChartMarks","buildCartesianChart","foundation","chart","context","layout","nodes","renderOrder","gridNodes","buildChartGrid","renderChartMarks","ruleNodes","buildChartRules","buildChartAxes","scaleDetail","chart","plot","horizontal","isHorizontalBar","pieDetail","outerRadius","innerRadius","cornerRadius","resolvePieRadii","polarAreaDetail","maxRadius","finite","radarDetail","configuredCount","dataCount","series","count","radarCategoryCount","radius","radarRadius","centerX","centerY","curved","frameDetail","CARTESIAN_VALUE_TYPES","buildChartFrame","bounds","order","frame","paint","detail","buildOrderedChartLegend","chart","layout","renderOrder","diagnostics","nodes","buildLegend","createChartRenderContext","chart","layout","renderOrder","diagnostics","ChartRenderOrder","#baseOrder","#offset","baseOrder","nodeCount","buildChartTitle","chart","bounds","plot","renderOrder","chartText","finite","CHART_TITLE_PROP","createChartFoundation","chart","index","diagnostics","baseOrder","layout","decorations","renderOrder","ChartRenderOrder","nodes","buildChartFrame","buildChartBackdrop","buildChartTitle","buildOrderedChartLegend","createChartRenderContext","buildPolarChart","foundation","renderChartMarks","buildUndecoratedChart","foundation","renderChartMarks","buildChart","chart","index","diagnostics","foundation","createChartFoundation","isPolarChart","buildPolarChart","hasCartesianDecorations","buildCartesianChart","buildUndecoratedChart","buildCharts","charts","diagnostics","chart","index","tag","buildChart","sceneBounds","nodes","n","EMPTY_BOUNDS","stackingOf","input","stacking","add","role","objects","legacyBase","object","index","stackRank","stackSequence","item","stampStacking","node","stack","buildRenderScene","options","measureText","diagnostics","buildContainers","buildFreeformPaths","buildCharts","buildLinks","buildShapes","buildWidgets","buildIsometricObjects","a","b","xml","value","num","safeId","SvgClipDefinitions","addDefinition","prefix","style","key","id","safeId","clip","shape","xml","num","SvgFilterDefinitions","addDefinition","prefix","style","nodeId","size","innerShadowPrimitives","reach","outerShadowPrimitives","blurPrimitives","value","primitives","margin","key","id","safeId","num","shadow","xml","effect","blur","saturate","markerBody","type","size","color","strokeWidth","num","markerExtent","type","size","strokeWidth","markerAttributes","id","extent","num","SvgMarkerDefinitions","addDefinition","prefix","color","key","safeId","attributes","markerBody","xml","meshGradientDefinition","id","paint","radialIds","_point","index","safeId","radialDefinitions","point","centerX","centerY","num","xml","layers","linearGradientDefinition","bounds","angle","radius","deltaX","deltaY","stops","stop","SvgPaintDefinitions","addDefinition","prefix","value","nodeId","key","definition","SvgDefinitionRegistry","prefix","addDefinition","definition","SvgPaintDefinitions","SvgFilterDefinitions","SvgMarkerDefinitions","SvgClipDefinitions","id","safeId","value","nodeId","bounds","style","size","type","color","strokeWidth","hitAreaFor","path","linkId","withLinkHitAreas","nodes","node","strokeColorAt","style","edge","paint","a","b","styleAttrs","node","defs","stroke","fill","attrs","xml","addStrokeAttrs","addVisualEffectAttrs","addPathMarkerAttrs","num","elementSize","shape","filter","clip","start","end","transform","rotation","center","imageAttrs","SYMBOL_POINTS_ATTR","SYMBOL_TENSION_ATTR","SYMBOL_BOUNDS_ATTR","CORNER_RADIUS_ATTR","SQUARE_CORNER_ATTR","PATH_POINTS_ATTR","PATH_TENSION_ATTR","PATH_CLOSED_ATTR","PATH_POINT_INDEX_ATTR","ISOMETRIC_SIZE_ATTR","ISOMETRIC_LABEL_OFFSET_ATTR","domRole","identity","identityAttrs","xml","detailAttrs","detail","chartValueAttrs","chartScaleAttrs","chartSeriesAttrs","pieGeometryAttrs","radarGeometryAttrs","linkDetailAttrs","frameBoundaryAttrs","symbolGeometryAttrs","declaredBoundsAttr","pathGeometryAttrs","isometricGeometryAttrs","num","CORNER_RADIUS_ATTR","SQUARE_CORNER_ATTR","bounds","SYMBOL_BOUNDS_ATTR","SYMBOL_POINTS_ATTR","SYMBOL_TENSION_ATTR","PATH_POINTS_ATTR","PATH_TENSION_ATTR","PATH_CLOSED_ATTR","ISOMETRIC_SIZE_ATTR","ISOMETRIC_LABEL_OFFSET_ATTR","contractAttrs","node","label","attributes","attribute","richLineTspans","words","x","dy","fontSize","num","groups","word","prev","group","i","xml","textSvg","node","defs","position","textPosition","content","textContent","preserve","contractAttrs","transform","linePx","contentHeight","anchor","firstTextBaseline","index","lineOffset","line","lineTspan","shaderSurfaceSvg","node","defs","rotation","transform","parameters","xml","fillColor","contractAttrs","num","rollingDigitSvg","character","style","rollingNumberSvg","fontSize","label","digits","widgetStyle","nodeSvg","textSvg","imageAttrs","attrs","styleAttrs","renderSvgDocument","scene","options","padding","width","height","viewBox","num","defs","SvgDefinitionRegistry","body","withLinkHitAreas","node","nodeSvg","renderSceneToSvg","scene","options","renderSvgDocument","renderCanvas","input","options","scene","buildRenderScene","svg","width","height","diagnostics","renderSceneToSvg","SCENE_CACHE_LIMIT","sceneCache","cachedRenderScene","source","cached","sflToRenderInput","oldest","render","CAMERA_OWNED_ATTRIBUTES","patchRootAttributes","svg","next","attribute","classifySceneDiff","oldOwnerIds","newOwnerIds","touchedOwnerIds","added","removed","changed","id","wasPresent","isPresent","patchDefinitions","svg","next","currentDefinitions","nextDefinitions","patchAttributes","current","next","changed","attribute","childrenEqual","a","b","aChildren","bChildren","i","x","y","xElement","yElement","replaceTextContent","patchSceneElement","widgetRestyled","attributesChanged","contentChanged","ownerIdOf","element","currentElementsById","svg","elements","reusableElement","current","next","markTouched","patchSceneElement","placeAfter","previousSibling","wantedNext","patchSceneNodes","definitions","patchDefinitions","currentById","retainedIds","oldOwnerIds","newOwnerIds","touchedOwnerIds","ownerId","nextElement","liveElement","id","classifySceneDiff","patchDisplayContent","svg","next","patchRootAttributes","patchSceneNodes","parseSvg","svgString","root","readViewBox","svg","values","ViewportController","#svg","#natural","#view","svg","natural","factor","clientX","clientY","rect","centerX","centerY","worldX","worldY","dxPixels","dyPixels","pixelsPerUnit","mountDisplay","container","svgString","svg","parseSvg","viewport","ViewportController","readViewBox","factor","clientX","clientY","dxPixels","dyPixels","nextSvgString","next","diff","patchDisplayContent","Emitter","name","handler","eventHandlers","storedHandler","event","registered","error","Emitter","positive","value","fallback","loadImage","document","source","resolve","reject","ImageConstructor","image","canvasBlob","canvas","mimeType","quality","blob","rasterizeSvgSnapshot","svg","snapshot","options","viewBox","readViewBox","scale","width","height","context","url","background","SVG_NAMESPACE","copyAttributes","source","target","attribute","removeRuntimeOverlays","svg","overlay","svgElement","document","name","attributes","element","key","value","readWidgetStyle","surface","DEFAULT_ROLLING_NUMBER_STYLE","cellsOf","box","plain","size","groupOf","style","group","attributeValue","labelText","label","top","cells","text","digitCell","character","cellX","cellWidth","cellHeight","nodes","digit","flattenRollingNumbers","labelBlock","rowWidth","left","index","node","freezeShaderSurfaces","captures","clone","capture","image","viewBox","serializeSvgSnapshot","SVG_NAMESPACE","DERIVED_HEIGHT_ROLES","svgElement","document","tag","SVG_NAMESPACE","selectionOverlayGroup","id","primary","group","transform","OVERLAY_ATTR","CHANGE_COLOR","FLASH_DURATION_MS","REDUCED_MOTION_DURATION_MS","changeOverlayGroup","document","id","primary","group","svgElement","transform","startChangeFade","target","reducedMotion","shapeChangeOverlay","color","bounds","ring","linkChangeOverlay","halo","baseWidth","isCameraGesture","parseContractVersion","svg","match","isContractCompatible","version","ROLES","sceneRole","domRole","symbolDeclaredBounds","el","raw","SYMBOL_BOUNDS_ATTR","x","y","width","height","pathGeometryOf","PATH_POINTS_ATTR","points","point","PATH_TENSION_ATTR","PATH_CLOSED_ATTR","isometricGeometryOf","ISOMETRIC_SIZE_ATTR","depth","cornerRadius","CORNER_RADIUS_ATTR","labelOffsetX","labelOffsetY","ISOMETRIC_LABEL_OFFSET_ATTR","resolveOwner","target","id","role","findOwnerNode","svg","id","predicate","nodes","el","isPrimary","el","pxPerUnit","svg","rect","viewBoxWidth","viewBoxHeight","horizontal","screenPx","svg","px","pxPerUnit","BUBBLE_RADIUS_PX","BUBBLE_MARGIN_PX","PLUS_HALF_SIZE_PX","BUBBLE_STROKE_WIDTH_PX","quickDuplicatePositions","bounds","offset","centerX","centerY","plusPath","x","y","halfSize","BUBBLE_FILL","BUBBLE_STROKE","BUBBLE_HOVER_FILL","BUBBLE_HOVER_STROKE","BUBBLE_HOVER_SCALE","duplicateBubble","document","radius","strokeWidth","direction","bubble","svgElement","duplicatePlus","plus","quickDuplicateBubbles","primary","id","svg","group","selectionOverlayGroup","screenPx","symbolDeclaredBounds","RING_COLOR","HALO_EXTRA_WIDTH_PX","SHAFT_WIDTH_PX","HIT_WIDTH_PX","ARROW_LENGTH_PX","ARROWHEAD_LENGTH_PX","ARROWHEAD_WIDTH_PX","normalizeVec","v","length","axisCursorUrl","direction","svg","centroid","points","sum","acc","p","ISO_HALO_ATTR","createAxisArrow","document","axis","group","svgElement","hit","screenPx","shaft","head","positionAxisArrow","elements","origin","headLength","headWidth","tip","shaftEnd","normal","headLeft","headRight","axisArrow","axisArrowPlacements","object","faces","isometricFaces","apex","right","left","bottom","centroid","normalizeVec","DUPLICATE_MARGIN_PX","ARROW_LENGTH_PX","BUBBLE_RADIUS_PX","reflect","point","through","quickDuplicatePlacements","placements","visualCenter","ISO_DUPLICATE_BUBBLES_ATTR","VISIBLE_FACE_DIRECTIONS","isometricQuickDuplicateBubbles","document","svg","group","svgElement","radius","screenPx","margin","halfSize","PLUS_HALF_SIZE_PX","strokeWidth","BUBBLE_STROKE_WIDTH_PX","direction","origin","dir","x","y","duplicateBubble","duplicatePlus","isometricSelectionOverlay","primary","id","bounds","symbolDeclaredBounds","geometry","isometricGeometryOf","selectionOverlayGroup","halo","ISO_HALO_ATTR","RING_COLOR","baseWidth","HALO_EXTRA_WIDTH_PX","axisArrow","RING_COLOR","HALO_EXTRA_WIDTH_PX","ENDPOINT_RADIUS_PX","ENDPOINT_STROKE_WIDTH_PX","linkHalo","document","primary","svg","halo","svgElement","baseWidth","screenPx","endpointHandle","atLength","endpoint","point","handle","SEGMENT_LENGTH_PX","SEGMENT_THICKNESS_PX","readSegments","segmentHandles","handles","segment","index","horizontal","length","thickness","width","height","linkSelectionOverlay","id","group","selectionOverlayGroup","RING_COLOR","HALO_EXTRA_WIDTH_PX","POINT_RADIUS_PX","POINT_STROKE_WIDTH_PX","PATH_HALO_ATTR","pathHalo","document","primary","svg","halo","svgElement","baseWidth","screenPx","pointHandle","x","y","index","handle","PATH_POINT_INDEX_ATTR","pathSelectionOverlay","id","group","selectionOverlayGroup","geometry","pathGeometryOf","HANDLE_SIZE_PX","HANDLE_STROKE_WIDTH_PX","HANDLE_STROKE","HANDLE_CURSORS","resizeHandlePositions","bounds","centerX","centerY","LOCKED_HEIGHT_HANDLES","renderResizeHandles","document","svg","lockHeight","size","screenPx","strokeWidth","name","handle","svgElement","RING_COLOR","RING_STROKE_WIDTH_PX","RING_OFFSET_PX","shapeSelectionOverlay","document","primary","id","svg","lockHeight","bounds","symbolDeclaredBounds","group","selectionOverlayGroup","offset","screenPx","ring","svgElement","renderResizeHandles","createChangeFlash","svg","timers","ownerIds","color","CHANGE_COLOR","ids","doc","reducedMotion","id","primary","findOwnerNode","isPrimary","pending","stale","overlay","linkChangeOverlay","shapeChangeOverlay","startChangeFade","duration","REDUCED_MOTION_DURATION_MS","FLASH_DURATION_MS","timer","bindKeyboardSelection","svg","selection","selectable","onKeyDown","event","modifiersOf","event","selectionReducer","current","action","next","clickAction","id","modifiers","SELECTION_OVERLAY_CONTROL_SELECTOR","isSelectionOverlayControl","target","OwnerPointerController","#svg","#emitter","#diagramId","#selection","svg","emitter","diagramId","selection","event","owner","resolveOwner","modifiersOf","#clearWhenOutsideOverlay","#selectOwner","modifiers","clickAction","node","findOwnerNode","isPrimary","DRAG_THRESHOLD","PointerInteractionSession","#display","#ownerPointer","#selectable","#down","display","ownerPointer","selectable","#onPointerDown","#onPointerMove","#onPointerUp","#destroy","event","target","overContent","resolveOwner","isSelectionOverlayControl","isCameraGesture","#continueDrag","wasDrag","bindPointerInteraction","binding","emitter","diagramId","selection","OwnerPointerController","paintSelectionOverlays","svg","selectedIds","owners","overlay","document","id","primary","findOwnerNode","isPrimary","owner","linkSelectionOverlay","pathSelectionOverlay","isometricSelectionOverlay","shapeSelectionOverlay","DERIVED_HEIGHT_ROLES","quickDuplicateBubbles","SelectionController","#svg","#emitter","#diagramId","#owners","#ids","svg","emitter","diagramId","id","owner","action","selectionReducer","paintSelectionOverlays","ids","element","resolveOwner","bindWheelZoom","display","selection","onWheel","event","isCameraGesture","bindInteraction","display","emitter","diagramId","options","selectable","selection","SelectionController","unbindPointer","bindPointerInteraction","unbindWheel","bindWheelZoom","unbindKeyboard","bindKeyboardSelection","changeFlash","createChangeFlash","ids","ownerIds","color","SHADER_DEFAULTS","fragmentSource","buttonProgram","fragmentSource","chromaticGlassPlateProgram","fragmentSource","chromaticHaloProgram","fragmentSource","eclipseOrbProgram","fragmentSource","emberMatrixProgram","fragmentSource","emberSlitsProgram","fragmentSource","glassRefractionProgram","fragmentSource","halftoneHaloProgram","fragmentSource","haloProgram","fragmentSource","lumenPortalProgram","fragmentSource","lumenPortalLightProgram","fragmentSource","orbProgram","fragmentSource","pixelConstellationProgram","fragmentSource","plasmaGaugeProgram","fragmentSource","prismSlatsProgram","fragmentSource","rulerProgram","fragmentSource","smearOrbProgram","fragmentSource","tickScaleProgram","fragmentSource","violetGlassProgram","fragmentSource","violetGlassLightProgram","builtins","orbProgram","haloProgram","halftoneHaloProgram","chromaticHaloProgram","chromaticGlassPlateProgram","glassRefractionProgram","emberSlitsProgram","smearOrbProgram","pixelConstellationProgram","plasmaGaugeProgram","tickScaleProgram","rulerProgram","buttonProgram","prismSlatsProgram","eclipseOrbProgram","emberMatrixProgram","violetGlassProgram","violetGlassLightProgram","lumenPortalProgram","lumenPortalLightProgram","programs","program","shaderProgram","name","programs","TRANSPARENT","hostBackground","svg","view","element","color","backdropClone","owner","width","height","clone","ownerIndex","surface","background","x","y","viewWidth","viewHeight","fill","captureShaderBackdrop","density","scale","markup","image","source","resolve","color","value","fallback","match","integer","number","uniform1f","surface","name","location","uniform3f","uniform2f","uniformName","parameter","enumParameter","applyParameters","elapsed","key","lag","current","next","enumValue","VERTEX_SOURCE","compile","gl","type","source","shader","linkProgram","fragmentSource","vertex","fragment","program","transparentTexture","texture","FULL_SCREEN_QUAD","parametersOf","owner","bindFullScreenQuad","gl","program","buffer","position","findBaseGeometry","definition","ownerId","element","createSurface","canvas","name","shaderProgram","linkProgram","usesBackdrop","baseGeometry","baseFill","transparentTexture","color","releaseSurface","surface","syncBackdropBounds","surface","svg","svgBounds","surfaceBounds","applyBackdrop","backdrop","gl","MAX_SURFACE_PIXELS","renderSurface","seconds","canvas","parameters","shown","density","fit","width","height","resolution","uniform1f","sampler","uniform2f","key","fallback","SHADER_DEFAULTS","uniformName","number","uniform3f","color","elapsed","applyParameters","createSurfaceClock","view","pausedSince","spentPaused","real","paused","RECAPTURE_DELAY_MS","capturePngs","svg","surfaces","seconds","surfaceByCanvas","surface","canvas","renderSurface","updateParameters","ownerId","parameters","changed","watchSvgChanges","view","onChange","mutations","sizes","mountShaderSurfaces","frame","backdropGeneration","recapture","clock","createSurfaceClock","draw","milliseconds","stop","releaseSurface","captureBackdrops","generation","captureShaderBackdrop","backdrop","applyBackdrop","startFrames","refresh","createSurface","unwatch","destroy","renderViewerSource","next","defaultRenderOptions","svg","render","assertCreateViewerContract","version","parseContractVersion","isContractCompatible","assertViewerUpdateContract","HTML_NAMESPACE","setStyles","element","styles","createDigit","document","character","theme","digit","createDigitCell","cell","divider","animateDigit","keyframes","duration","fadeDigit","previous","next","hidden","shown","incoming","outgoing","finish","replaceDigit","updateRollingDigits","digits","previousValue","nextValue","cells","index","findRollingNumber","svg","widgetId","surface","FADE_INTERVAL","widgetDigits","widgetStyle","encoded","DEFAULT_ROLLING_NUMBER_STYLE","positiveInteger","value","number","durationFor","duration","setRollingNumber","animate","digits","previousValue","nextValue","formatRollingNumber","updateRollingDigits","mountDocumentWidgets","valueOverrides","lastApplied","pending","now","wait","current","latest","timer","bases","written","fills","clamp01","value","parameters","surface","positive","fallback","rulerProgress","params","min","max","move","node","dx","dy","current","base","next","hexToRgb","match","number","shade","bump","rgb","mixed","channel","fill","child","placeRulerKnobs","svg","progressOf","radii","id","x","y","width","height","horizontal","progress","inset","line","extent","across","along","dent","depth","knobId","nodes","primary","box","half","gap","side","target","spread","start","span","knobAt","label","labelAt","shift","ViewerSession","options","initialSvg","diagramId","mountDisplay","mountShaderSurfaces","mountDocumentWidgets","bindInteraction","Emitter","radii","placeRulerKnobs","id","knobRadius","name","handler","ids","serializeSvgSnapshot","rasterizeSvgSnapshot","ownerId","parameters","merged","widgetId","value","ruler","element","progress","rulerProgress","applied","scale","max","paused","next","svg","renderViewerSource","assertViewerUpdateContract","diff","selectedIds","owner","color","createViewer","options","diagramId","svg","renderViewerSource","assertCreateViewerContract","viewer","ViewerSession","SHADOW_STYLE","createShadowContainer","root","style","container","showRenderError","error","box","mountInteractiveDiagram","source","config","createViewer","mountStaticDiagram","render","mountShadowDiagram","viewer","ElementBase","StickyflowDiagram","OBSERVED_ATTRS","value","config","readConfig","name","mount","mountShadowDiagram","defineStickyflowDiagram","tagName","StickyflowDiagram","defineStickyflowDiagram"]}
|