stickyflow 0.0.0-stage → 0.3.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/LICENSE +202 -0
  3. package/README.md +167 -2
  4. package/dist/chunk-65IVT4GK.js +8835 -0
  5. package/dist/chunk-65IVT4GK.js.map +1 -0
  6. package/dist/chunk-BYMIYXP5.js +4695 -0
  7. package/dist/chunk-BYMIYXP5.js.map +1 -0
  8. package/dist/chunk-CSXQD3ON.js +3678 -0
  9. package/dist/chunk-CSXQD3ON.js.map +1 -0
  10. package/dist/chunk-CXL254BT.cjs +4825 -0
  11. package/dist/chunk-CXL254BT.cjs.map +1 -0
  12. package/dist/chunk-DDCTNLLD.cjs +8844 -0
  13. package/dist/chunk-DDCTNLLD.cjs.map +1 -0
  14. package/dist/chunk-HFOGKSNU.cjs +842 -0
  15. package/dist/chunk-HFOGKSNU.cjs.map +1 -0
  16. package/dist/chunk-UXDWH2JC.cjs +3684 -0
  17. package/dist/chunk-UXDWH2JC.cjs.map +1 -0
  18. package/dist/chunk-XEN5QIIJ.js +801 -0
  19. package/dist/chunk-XEN5QIIJ.js.map +1 -0
  20. package/dist/index.cjs +1167 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +335 -0
  23. package/dist/index.d.ts +335 -0
  24. package/dist/index.js +1097 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/interaction/index.cjs +7587 -0
  27. package/dist/interaction/index.cjs.map +1 -0
  28. package/dist/interaction/index.d.cts +274 -0
  29. package/dist/interaction/index.d.ts +274 -0
  30. package/dist/interaction/index.js +7562 -0
  31. package/dist/interaction/index.js.map +1 -0
  32. package/dist/render-C5X74hds.d.cts +1041 -0
  33. package/dist/render-C5X74hds.d.ts +1041 -0
  34. package/dist/runtimeTypes-D8hPZ62T.d.ts +239 -0
  35. package/dist/runtimeTypes-yTSAvtCn.d.cts +239 -0
  36. package/dist/stickyflow-diagram.global.js +1444 -0
  37. package/dist/stickyflow-diagram.global.js.map +1 -0
  38. package/dist/types-BDKDf4zr.d.cts +116 -0
  39. package/dist/types-CdgGdtoD.d.ts +116 -0
  40. package/dist/viewer/index.cjs +31 -0
  41. package/dist/viewer/index.cjs.map +1 -0
  42. package/dist/viewer/index.d.cts +44 -0
  43. package/dist/viewer/index.d.ts +44 -0
  44. package/dist/viewer/index.js +6 -0
  45. package/dist/viewer/index.js.map +1 -0
  46. package/dist/web-component/index.cjs +144 -0
  47. package/dist/web-component/index.cjs.map +1 -0
  48. package/dist/web-component/index.d.cts +31 -0
  49. package/dist/web-component/index.d.ts +31 -0
  50. package/dist/web-component/index.js +141 -0
  51. package/dist/web-component/index.js.map +1 -0
  52. 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, p: ChartProps): ScatterChartConfig {\n return {\n categories: source?.categories,\n pointSize: numOf(p.pointSize),\n pointOpacity: numOf(p.pointOpacity),\n pointStrokeWidth: numOf(p.pointStrokeWidth),\n pointStrokeColor: p.pointStrokeColor,\n };\n}\n\nexport function boxplotConfig(source: ChartSource, p: ChartProps): 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 boxWhiskerWidth: numOf(p.boxWhiskerWidth),\n boxMedianWidth: numOf(p.boxMedianWidth),\n boxMedianColor: p.boxMedianColor,\n boxWhiskerColor: p.boxWhiskerColor,\n boxCapSize: numOf(p.boxCapSize),\n boxPointSize: numOf(p.boxPointSize),\n boxPointOpacity: numOf(p.boxPointOpacity),\n boxJitter: numOf(p.boxJitter),\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, p: ChartProps): 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 cellShape: p.cellShape === 'circle' ? 'circle' : p.cellShape === 'square' ? 'square' : undefined,\n cellStrokeColor: p.cellStrokeColor,\n cellStrokeWidth: numOf(p.cellStrokeWidth),\n cellValueSize: numOf(p.cellValueSize),\n cellValueColor: p.cellValueColor,\n };\n}\n\nexport function hexbinConfig(source: ChartSource, p: ChartProps): HexbinChartConfig {\n return {\n hexRadius: source?.hexRadius,\n scale: decodeRamp(source?.scale),\n hexGap: numOf(p.hexGap),\n hexStrokeWidth: numOf(p.hexStrokeWidth),\n hexStrokeColor: p.hexStrokeColor,\n hexMinOpacity: numOf(p.hexMinOpacity),\n };\n}\n\nexport function mekkoConfig(source: ChartSource, p: ChartProps): MekkoChartConfig {\n return {\n categories: source?.categories,\n barCornerRadius: source?.barCornerRadius,\n mekkoVaryHeight: source?.mekkoVaryHeight,\n tileGradient: source?.tileGradient,\n showColumnBackdrop: source?.showColumnBackdrop,\n mekkoColumnGap: numOf(p.mekkoColumnGap),\n mekkoSegmentGap: numOf(p.mekkoSegmentGap),\n mekkoRoundAll: p.mekkoRoundAll === undefined ? undefined : String(p.mekkoRoundAll) !== 'false',\n mekkoSegmentStrokeColor: p.mekkoSegmentStrokeColor,\n mekkoSegmentStrokeWidth: numOf(p.mekkoSegmentStrokeWidth),\n mekkoLabelSize: numOf(p.mekkoLabelSize),\n mekkoValueSize: numOf(p.mekkoValueSize),\n mekkoTextColor: p.mekkoTextColor,\n showMekkoTotals: p.showMekkoTotals === undefined ? undefined : String(p.showMekkoTotals) !== 'false',\n mekkoValueFormat:\n p.mekkoValueFormat === 'percent' ? 'percent' : p.mekkoValueFormat === 'value' ? 'value' : undefined,\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, p: ChartProps): PolarAreaChartConfig {\n return {\n innerRadius: source?.innerRadius,\n pieCornerRadius: source?.pieCornerRadius,\n pieSliceGap: source?.pieSliceGap,\n pieStartAngle: numOf(p.pieStartAngle),\n pieStroke: p.pieStroke,\n pieStrokeWidth: numOf(p.pieStrokeWidth),\n polarTrackOpacity: numOf(p.polarTrackOpacity),\n polarRings: p.polarRings === undefined ? undefined : String(p.polarRings) !== 'false',\n polarTrackStroke: p.polarTrackStroke,\n polarTrackStrokeWidth: numOf(p.polarTrackStrokeWidth),\n polarTrackDash: p.polarTrackDash,\n polarValueSize: numOf(p.polarValueSize),\n polarNameSize: numOf(p.polarNameSize),\n polarValueFirst: p.polarValueFirst === undefined ? undefined : String(p.polarValueFirst) !== 'false',\n polarOutsideLabels: p.polarOutsideLabels === undefined ? undefined : String(p.polarOutsideLabels) !== 'false',\n };\n}\n\nfunction radarStyle(\n p: ChartProps,\n): Pick<RadarChartConfig, 'radarStrokeWidth' | 'radarPointSize' | 'radarSpokes' | 'radarTension'> {\n return {\n radarStrokeWidth: numOf(p.radarStrokeWidth),\n radarPointSize: numOf(p.radarPointSize),\n radarTension: numOf(p.radarTension),\n radarSpokes: p.radarSpokes === undefined ? undefined : String(p.radarSpokes) !== 'false',\n };\n}\n\nexport function radarConfig(source: ChartSource, p: ChartProps): RadarChartConfig {\n return {\n categories: source?.categories,\n areaOpacity: source?.areaOpacity,\n ...radarStyle(p),\n };\n}\n\nexport function radialConfig(source: ChartSource, p: ChartProps): RadialChartConfig {\n return {\n categories: source?.categories,\n areaOpacity: source?.areaOpacity,\n ...radarStyle(p),\n };\n}\n\nexport function radialBarConfig(source: ChartSource, p: ChartProps): RadialBarChartConfig {\n return {\n ringThickness: source?.ringThickness,\n ringGap: source?.ringGap,\n ringTrackOpacity: numOf(p.ringTrackOpacity),\n ringCap: p.ringCap === 'butt' ? 'butt' : p.ringCap === 'round' ? 'round' : undefined,\n ringStartAngle: numOf(p.ringStartAngle),\n ringSweep: numOf(p.ringSweep),\n };\n}\n\nexport function sankeyConfig(source: ChartSource, p: ChartProps): 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 sankeyNodeWidth: numOf(p.sankeyNodeWidth),\n sankeyNodeGap: numOf(p.sankeyNodeGap),\n sankeyLinkOpacity: numOf(p.sankeyLinkOpacity),\n sankeyLinkCurve: numOf(p.sankeyLinkCurve),\n sankeyLabelSize: numOf(p.sankeyLabelSize),\n };\n}\n\nexport function treemapConfig(source: ChartSource, p: ChartProps): TreemapChartConfig {\n return {\n zones: source?.zones,\n cellGap: source?.cellGap,\n barCornerRadius: source?.barCornerRadius,\n headerColor: source?.headerColor,\n tileGradient: source?.tileGradient,\n tileStrokeColor: p.tileStrokeColor,\n tileStrokeWidth: numOf(p.tileStrokeWidth),\n tileLabelSize: numOf(p.tileLabelSize),\n tileValueSize: numOf(p.tileValueSize),\n tileTextColor: p.tileTextColor,\n tileLabelPadding: numOf(p.tileLabelPadding),\n showTileValues: p.showTileValues === undefined ? undefined : String(p.showTileValues) !== 'false',\n headerHeight: numOf(p.headerHeight),\n };\n}\n\nexport function customConfig(source: ChartSource, p: ChartProps): CustomChartConfig {\n return {\n categories: source?.categories,\n zones: source?.zones,\n orientation: source?.orientation,\n connectPoints: source?.connectPoints,\n reverseComparison: source?.reverseComparison,\n customConnectorWidth: numOf(p.customConnectorWidth),\n customConnectorOpacity: numOf(p.customConnectorOpacity),\n customConnectorDash: p.customConnectorDash,\n customBeforeFill: p.customBeforeFill,\n customBeforeStroke: p.customBeforeStroke,\n customBeforeStrokeWidth: numOf(p.customBeforeStrokeWidth),\n customLabelSize: numOf(p.customLabelSize),\n customLabelColor: p.customLabelColor,\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, p));\n case 'boxplot':\n return typedChart(base, chartType, boxplotConfig(source, p));\n case 'field':\n return typedChart(base, chartType, fieldConfig(source));\n case 'heatmap':\n return typedChart(base, chartType, heatmapConfig(source, p));\n case 'hexbin':\n return typedChart(base, chartType, hexbinConfig(source, p));\n case 'mekko':\n return typedChart(base, chartType, mekkoConfig(source, p));\n case 'pie':\n return typedChart(base, chartType, pieConfig(source, p));\n case 'polarArea':\n return typedChart(base, chartType, polarAreaConfig(source, p));\n case 'radar':\n return typedChart(base, chartType, radarConfig(source, p));\n case 'radial':\n return typedChart(base, chartType, radialConfig(source, p));\n case 'radialBar':\n return typedChart(base, chartType, radialBarConfig(source, p));\n case 'sankey':\n return typedChart(base, chartType, sankeyConfig(source, p));\n case 'treemap':\n return typedChart(base, chartType, treemapConfig(source, p));\n case 'custom':\n return typedChart(base, chartType, customConfig(source, p));\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 positiveNumber(value: string | undefined): number | undefined {\n const number = Number(value);\n return value !== undefined && Number.isFinite(number) && number > 0 ? number : 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', 'peak'] 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 fontSize: positiveNumber(properties.fontSize),\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 ellipsizeToWidth(text: string, width: number, fontSize: number, bold: boolean): string {\n if (estimateTextWidth(text, fontSize, bold) <= width) {\n return text;\n }\n let end = text.length;\n while (end > 1 && estimateTextWidth(`${text.slice(0, end)}…`, fontSize, bold) > width) {\n end -= 1;\n }\n return `${text.slice(0, end)}…`;\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 fontSize: 0,\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 fontSize: style.fontSize ?? DEFAULT_ROLLING_NUMBER_STYLE.fontSize,\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) / (1 + 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) / (1 + 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 tension?: number;\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, tension = CURVED_TENSION): string {\n if (points.length === 0) {\n return '';\n }\n if (curved) {\n return freeformPathData({ points, 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 borderColor = representativeColor(chart.config?.barBorderColor, '#000000');\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,\n borderWidth: finite(chart.config?.barBorderWidth, 1),\n whiskerWidth: Math.max(0, finite(chart.config?.boxWhiskerWidth, 1)),\n medianWidth: Math.max(0, finite(chart.config?.boxMedianWidth, 2)),\n medianColor: chart.config?.boxMedianColor ?? borderColor,\n whiskerColor: chart.config?.boxWhiskerColor,\n capSize: Math.max(0, finite(chart.config?.boxCapSize, 0.4)),\n pointSize: Math.max(0, finite(chart.config?.boxPointSize, 3)),\n pointOpacity: Math.min(1, Math.max(0, finite(chart.config?.boxPointOpacity, 0.7))),\n jitter: Math.max(0, finite(chart.config?.boxJitter, 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 if (layout.pointSize <= 0) {\n return [];\n }\n return (mark.series.values as number[]).map((value, pointIndex) => {\n const center =\n mark.geometry.center + jitter(mark.seriesIndex * 10_000 + pointIndex) * layout.jitter * 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: layout.pointSize,\n ry: layout.pointSize,\n style: { fill: paint(mark.color, diagnostics, chart.id), opacity: layout.pointOpacity },\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 { representativeColor } from '../../primitives';\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 color?: string;\n}\n\nexport function renderBoxAndWhiskers(\n context: ChartRenderContext,\n layout: BoxplotLayout,\n mark: BoxplotSeriesMark,\n): RenderNode[] {\n const whiskers = layout.whiskerWidth > 0 ? [lowerWhisker(layout, mark), upperWhisker(layout, mark)] : [];\n const caps =\n layout.whiskerWidth > 0 && layout.capSize > 0 ? [lowerWhiskerCap(layout, mark), upperWhiskerCap(layout, mark)] : [];\n const median = layout.medianWidth > 0 ? [medianLine(layout, mark)] : [];\n return [\n ...[...whiskers, ...caps].map(line =>\n createBoxBorderLine(context, layout, { ...line, color: whiskerColor(layout, mark) }),\n ),\n createBoxNode(context, layout, mark),\n ...median.map(line => createBoxBorderLine(context, layout, line)),\n ];\n}\n\nfunction whiskerColor(layout: BoxplotLayout, mark: BoxplotSeriesMark): string | undefined {\n if (layout.whiskerColor === 'series') {\n return representativeColor(mark.color, layout.borderColor);\n }\n return layout.whiskerColor;\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: layout.whiskerWidth,\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: layout.whiskerWidth,\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 * layout.capSize) / 2;\n return {\n id,\n from: boxplotPoint(layout.orientation, center - capHalf, value),\n to: boxplotPoint(layout.orientation, center + capHalf, value),\n strokeWidth: layout.whiskerWidth,\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: layout.medianWidth,\n color: layout.medianColor,\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: line.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.config?.customBeforeFill ?? chart.gridColor ?? '#e2e8f0', context.diagnostics, chart.id),\n stroke: { kind: 'solid', color: chart.config?.customBeforeStroke ?? HOLLOW_POINT_STROKE },\n strokeWidth: finite(chart.config?.customBeforeStrokeWidth, 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 connectorDash(text: string | undefined): number[] | undefined {\n const parts = (text ?? '')\n .split(/[ ,]+/)\n .map(Number)\n .filter(part => Number.isFinite(part) && part > 0);\n return parts.length > 0 ? parts : undefined;\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: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color },\n strokeWidth: finite(chart.config?.customConnectorWidth, 2),\n opacity: chart.config?.customConnectorOpacity,\n dash: connectorDash(chart.config?.customConnectorDash),\n },\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(6, finite(chart.config?.customLabelSize, Math.max(9, finite(chart.fontSize, 12)) - 2)),\n ...(chart.config?.customLabelColor ? { color: chart.config.customLabelColor } : {}),\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 const id = `chart-heatmap-cell-${chart.id}-${cell.seriesId}-${cell.columnIndex}`;\n const style = {\n fill: { kind: 'solid' as const, color: cell.color },\n stroke: { kind: 'solid' as const, color: chart.config?.cellStrokeColor ?? chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.config?.cellStrokeWidth, finite(chart.gridWidth, 1)),\n };\n if (chart.config?.cellShape === 'circle') {\n return {\n type: 'ellipse',\n id,\n order: nextOrder(),\n bounds,\n cx: cell.frame.x + cell.frame.width / 2,\n cy: cell.frame.y + cell.frame.height / 2,\n rx: cell.frame.width / 2,\n ry: cell.frame.height / 2,\n style,\n };\n }\n return {\n type: 'rect',\n id,\n order: nextOrder(),\n bounds,\n ...cell.frame,\n rx: layout.grid.cellRadius,\n style,\n };\n}\n\nfunction createCellValueLabel(context: ChartRenderContext, layout: HeatmapLayout, cell: HeatmapCell): RenderNode {\n const { chart, bounds, nextOrder } = context;\n const size = Math.max(6, finite(chart.config?.cellValueSize, layout.fontSize));\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 - size / 2,\n width: cell.frame.width,\n height: size + 2,\n },\n text: String(cell.value),\n chart,\n align: 'center',\n }),\n ...(chart.config?.cellValueSize === undefined ? {} : { fontSize: size }),\n color: chart.config?.cellValueColor ?? 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(\n groups: Map<number, string[]>,\n values: Map<string, number>,\n height: number,\n nodeGap: number,\n): 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) * nodeGap;\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(\n column: number,\n columnCount: number,\n width: number,\n nodeWidth: number = SANKEY_NODE_WIDTH,\n): number {\n if (columnCount <= 1) {\n return 0;\n }\n return (column * (width - nodeWidth)) / (columnCount - 1);\n}\n\nexport function calculateNodeGeometry(\n graph: SankeyGraph,\n columns: Map<string, number>,\n height: number,\n nodeGap: number = SANKEY_NODE_GAP,\n): SankeyNodeGeometry {\n const groups = groupSankeyColumns(graph.ids, columns);\n const values = nodeValues(graph);\n const valueScale = calculateValueScale(groups, values, height, nodeGap);\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 + nodeGap;\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 nodeWidth: number = SANKEY_NODE_WIDTH,\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, nodeWidth) +\n nodeWidth +\n (sourceOffset?.x ?? 0),\n x1:\n sankeyNodeX(geometry.columns.get(link.target) ?? 0, geometry.columnCount, width, nodeWidth) +\n (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 nodeWidth: number = SANKEY_NODE_WIDTH,\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, nodeWidth) + (offset?.x ?? 0),\n y: (geometry.y.get(id) ?? 0) + (offset?.y ?? 0),\n width: nodeWidth,\n height: geometry.heights.get(id) ?? 2,\n column,\n };\n });\n}\n","import { assignSankeyColumns } from './columns';\nimport { SANKEY_NODE_GAP, SANKEY_NODE_WIDTH } from './constants';\nimport { createSankeyGraph } from './graph';\nimport { layoutSankeyLinks } from './links';\nimport { calculateNodeGeometry } from './nodeGeometry';\nimport { layoutSankeyNodes } from './nodes';\nimport type { SankeyLayout, SankeyLayoutOptions, 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 options: SankeyLayoutOptions = { nodeWidth: SANKEY_NODE_WIDTH, nodeGap: SANKEY_NODE_GAP },\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, options.nodeGap);\n const offsets = collectOffsets(nodeInputs);\n return {\n nodes: layoutSankeyNodes(nodeInputs, graph, geometry, width, offsets, options.nodeWidth),\n links: layoutSankeyLinks(graph, geometry, width, offsets, options.nodeWidth),\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 { colorAtRamp } from '../field/colorRamp';\nimport { computeHexBins } from '../geometry';\nimport { CHART_COLORS, DEFAULT_HEX_RADIUS, mapChartValue, resolveChartShadow } from '../primitives';\nimport type { ChartRenderContext } from './types';\n\nconst DEFAULT_MIN_OPACITY = 0.15;\n// Shrinking the radius by this much per pixel of gap opens that gap between the flat sides of two neighbours.\nconst GAP_TO_RADIUS = 1 / Math.sqrt(3);\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 config = chart.config;\n const hexRadius = Math.max(1, config?.hexRadius ?? DEFAULT_HEX_RADIUS);\n const drawRadius = Math.max(0.5, hexRadius - Math.max(0, config?.hexGap ?? 0) * GAP_TO_RADIUS);\n const strokeWidth = config?.hexStrokeWidth ?? 0;\n const minOpacity = Math.min(1, Math.max(0, config?.hexMinOpacity ?? DEFAULT_MIN_OPACITY));\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 const ramp = config?.scale;\n bins.forEach((bin, i) => {\n const share = bin.count / maxCount;\n const fill = ramp ? colorAtRamp(ramp, share) : color;\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, drawRadius),\n style: {\n fill: paint(fill, diagnostics, chart.id),\n stroke: strokeWidth > 0 ? paint(config?.hexStrokeColor ?? fill, diagnostics, chart.id) : undefined,\n strokeWidth: strokeWidth > 0 ? strokeWidth : undefined,\n opacity: ramp ? undefined : Math.max(minOpacity, share),\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 const columnLabel = createColumnLabel(context, layout, columnIndex, column);\n return context.chart.config?.showMekkoTotals === false\n ? [columnLabel]\n : [createTotalLabel(context, layout, columnIndex, column), columnLabel];\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\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 const columnGap = Math.max(0, finite(context.chart.config?.mekkoColumnGap, 4));\n const smallFontSize = Math.max(8, fontSize - 1);\n\n return {\n columns: createMekkoColumns(context, grid, labels, columnGap),\n fontSize,\n smallFontSize,\n labelGutterWidth,\n columnGap,\n labelSize: Math.max(6, finite(context.chart.config?.mekkoLabelSize, smallFontSize)),\n valueSize: Math.max(6, finite(context.chart.config?.mekkoValueSize, smallFontSize)),\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(\n context: ChartRenderContext,\n grid: MekkoGrid,\n labels: string[],\n columnGap: number,\n): 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 - columnGap * 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 + columnGap;\n return column;\n });\n}\n","import type { ChartSeries } from '../../../../model/chart';\nimport type { Bounds, RenderNode } from '../../../scene';\nimport { finite, paint } from '../../../scene';\nimport { ellipsizeToWidth, wrapText } from '../../../scene/textLayout';\nimport {\n barPath,\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 config = chart.config;\n const radius = segment.isTop || config?.mekkoRoundAll ? mekkoCornerRadius(context) : 0;\n const { x, y, width, height } = segment.frame;\n const segmentGap = Math.max(0, finite(config?.mekkoSegmentGap, 0));\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: barPath(x, y + segmentGap / 2, width, Math.max(0, height - segmentGap), radius, Boolean(config?.mekkoRoundAll)),\n style: {\n fill,\n stroke: { kind: 'solid', color: config?.mekkoSegmentStrokeColor ?? chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(config?.mekkoSegmentStrokeWidth, 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.labelSize * 1.2;\n const valueHeight = layout.valueSize * 1.2;\n const labelLines = wrapText(segment.seriesLabel, innerWidth, layout.labelSize).map(line =>\n ellipsizeToWidth(line, innerWidth, layout.labelSize, true),\n );\n if (labelLines.length * lineHeight + valueHeight > innerHeight) {\n return [];\n }\n const textColor = chart.config?.mekkoTextColor ?? contrastTextColor(representativeColor(segment.color, '#ffffff'));\n const columnTotal = layout.columns[segment.columnIndex]?.total ?? 0;\n const valueText =\n chart.config?.mekkoValueFormat === 'percent'\n ? `${columnTotal > 0 ? Math.round((segment.value / columnTotal) * 100) : 0}%`\n : String(segment.value);\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.labelSize,\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: valueText,\n chart,\n }),\n lines: [valueText],\n fontSize: layout.valueSize,\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 chartTicks,\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 TOP = -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 start: 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 start: TOP + (finite(chart.config?.pieStartAngle, 0) * Math.PI) / 180,\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: {\n fill: paint(chart.gridColor ?? TRACK_COLOR_FALLBACK, diagnostics, chart.id),\n opacity: chart.config?.polarTrackOpacity,\n ...trackStroke(context),\n },\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, ...wedgeStroke(context) },\n };\n return shadowCaster ? [track, shadowCaster, wedge] : [track, wedge];\n}\n\nfunction trackStroke(context: ChartRenderContext<PolarAreaChart>) {\n const config = context.chart.config;\n if (!config?.polarTrackStroke) {\n return {};\n }\n const dash = (config.polarTrackDash ?? '')\n .split(/[ ,]+/)\n .map(Number)\n .filter(part => Number.isFinite(part) && part > 0);\n return {\n stroke: { kind: 'solid' as const, color: config.polarTrackStroke },\n strokeWidth: finite(config.polarTrackStrokeWidth, 1),\n dash: dash.length > 0 ? dash : undefined,\n };\n}\n\nfunction wedgeStroke(context: ChartRenderContext<PolarAreaChart>) {\n const config = context.chart.config;\n if (!config?.pieStroke) {\n return {};\n }\n return {\n stroke: { kind: 'solid' as const, color: config.pieStroke },\n strokeWidth: finite(config.pieStrokeWidth, 1),\n };\n}\n\nfunction ringNodes(context: ChartRenderContext<PolarAreaChart>, layout: WedgeLayout): RenderNode[] {\n const { chart, bounds, nextOrder } = context;\n if (!chart.config?.polarRings || layout.range <= 0) {\n return [];\n }\n return chartTicks(chart.axisY)\n .filter(tick => tick > layout.axisMin && tick < layout.axisMin + layout.range)\n .map((tick): RenderNode => {\n const radius =\n layout.innerRadius + ((layout.maxRadius - layout.innerRadius) * (tick - layout.axisMin)) / layout.range;\n return {\n type: 'ellipse',\n id: `chart-polar-area-ring-${chart.id}-${tick}`,\n order: nextOrder(),\n bounds,\n cx: layout.centerX,\n cy: layout.centerY,\n rx: radius,\n ry: radius,\n style: {\n fill: { kind: 'none' },\n stroke: { kind: 'solid', color: chart.textColor ?? '#334155' },\n strokeWidth: finite(chart.gridWidth, 1),\n opacity: 0.25,\n },\n };\n });\n}\n\nexport function renderPolarArea(context: ChartRenderContext<PolarAreaChart>): RenderNode[] {\n const layout = layoutOf(context);\n const { centerX, centerY, innerRadius, maxRadius, axisMin, range, sweep, start } = layout;\n const showLabels = context.showLabels && sweep >= MIN_LABEL_SWEEP;\n\n const wedges = context.chart.series.flatMap((series, index): RenderNode[] => {\n const angles = { start: start + index * sweep, end: start + (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 return [...wedges, ...ringNodes(context, layout)];\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 labelSizes(chart: PolarAreaChart): { nameSize: number; valueSize: number } {\n const base = Math.max(9, finite(chart.fontSize, 12));\n return {\n nameSize: Math.max(6, finite(chart.config?.polarNameSize, base)),\n valueSize: Math.max(6, finite(chart.config?.polarValueSize, base)),\n };\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 { nameSize, valueSize } = labelSizes(context.chart);\n const lineHeight = ((nameSize + valueSize) * 1.2) / 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 const outsideLabels = context.chart.config?.polarOutsideLabels ?? false;\n if (!fitsInline && !hasManualOffset && !outsideLabels) {\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 ? outsideLabels && context.chart.textColor\n ? context.chart.textColor\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 { nameSize, valueSize } = labelSizes(chart);\n const lineHeight = Math.max(nameSize, valueSize) * 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 fontFamily: chart.fontFamily ?? DEFAULT_FONT,\n align: 'center' as const,\n verticalAlign: 'middle' as const,\n lineHeight: 1.2,\n color,\n };\n const valueFirst = chart.config?.polarValueFirst ?? false;\n const nameHeight = nameSize * 1.2;\n const valueHeight = valueSize * 1.2;\n const top = point.y - (nameHeight + valueHeight) / 2;\n const nameY = valueFirst ? top + valueHeight : top;\n const valueY = valueFirst ? top : top + nameHeight;\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: nameY,\n height: nameSize * 1.2,\n fontSize: nameSize,\n lines: [series.label],\n fontWeight: valueFirst ? 'normal' : '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: valueY,\n height: valueSize * 1.2,\n fontSize: valueSize,\n lines: [formatFieldValue(value)],\n fontWeight: valueFirst ? 'bold' : '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 tension: chart.config?.radarTension,\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 strokeWidth: Math.max(0, chart.config?.radarStrokeWidth ?? 2),\n tension: frame.tension,\n pointSize: Math.max(0, chart.config?.radarPointSize ?? 3),\n showSpokes: chart.config?.radarSpokes ?? true,\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), ...(geometry.showSpokes ? 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, geometry.tension);\n return [\n createSeriesFill(context, geometry, series, path, color),\n ...(geometry.strokeWidth > 0 ? [createSeriesStroke(context, geometry, series, path, color)] : []),\n ...(geometry.pointSize > 0 ? createSeriesPoints(context, geometry, 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 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-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: geometry.strokeWidth,\n lineJoin: 'round',\n shadow: resolveChartShadow(chart.shadowStyle),\n },\n };\n}\n\nfunction createSeriesPoints(\n context: ChartRenderContext,\n geometry: RadarGeometry,\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: geometry.pointSize,\n ry: geometry.pointSize,\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 TOP = -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, from: number): string {\n if (sweep >= Math.PI * 2 - FULL_SWEEP_EPSILON) {\n const start = arcPoint(cx, cy, r, from);\n const mid = arcPoint(cx, cy, r, from + 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, from);\n const end = arcPoint(cx, cy, r, from + 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 start: number;\n total: number;\n trackOpacity: number;\n cap: 'round' | 'butt';\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 start: TOP + (finite(chart.config?.ringStartAngle, 0) * Math.PI) / 180,\n total: (Math.min(360, Math.max(1, finite(chart.config?.ringSweep, 360))) * Math.PI) / 180,\n trackOpacity: Math.min(1, Math.max(0, finite(chart.config?.ringTrackOpacity, TRACK_OPACITY))),\n cap: chart.config?.ringCap ?? 'round',\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, start } = 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, start + stubSweep],\n [start + sweep - stubSweep, start + 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: layout.cap,\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, start, total, trackOpacity, cap } =\n 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 trackStyle = {\n fill: { kind: 'none' } as const,\n stroke: color,\n strokeWidth: ringThickness,\n opacity: trackOpacity,\n };\n const track: RenderNode =\n total >= Math.PI * 2 - FULL_SWEEP_EPSILON\n ? {\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: trackStyle,\n }\n : {\n type: 'path',\n id: `chart-radial-bar-track-${chart.id}-${series.id}`,\n order: nextOrder(),\n bounds,\n d: arcSegmentPath(centerX, centerY, radius, start, start + total),\n style: { ...trackStyle, lineCap: cap },\n };\n if (fraction <= 0) {\n return [track];\n }\n\n const sweep = fraction * total;\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, start),\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: cap },\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 { finite } 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(context, data, link, linkIndex, gradient);\n return createSankeyRibbonNode(context, ribbon, shadow, clipPath, gradient);\n });\n}\n\nfunction createSankeyLinkRibbon(\n context: ChartRenderContext,\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 config = context.chart.config;\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 - source.x) * Math.min(1, Math.max(0, finite(config?.sankeyLinkCurve, 0.5))),\n fill,\n opacity: Math.min(1, Math.max(0, finite(config?.sankeyLinkOpacity, 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.labelSize,\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.labelSize;\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 nodeWidth: Math.max(1, finite(chart.config?.sankeyNodeWidth, 18)),\n nodeGap: Math.max(0, finite(chart.config?.sankeyNodeGap, 8)),\n });\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 labelSize: Math.max(6, finite(chart.config?.sankeyLabelSize, Math.max(9, finite(chart.fontSize, 12)) - 2)),\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\nconst DEFAULT_POINT_SIZE = 4;\n\nexport function renderScatter(context: ChartRenderContext): 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, 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 shadow: ReturnType<typeof resolveChartShadow>,\n): RenderNode {\n const { chart, bounds, diagnostics, nextOrder } = context;\n const config = chart.config;\n const radius = config?.pointSize ?? DEFAULT_POINT_SIZE;\n const strokeWidth = config?.pointStrokeWidth ?? 0;\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: {\n fill: paint(color, diagnostics, chart.id),\n stroke: strokeWidth > 0 ? paint(config?.pointStrokeColor ?? color, diagnostics, chart.id) : undefined,\n strokeWidth: strokeWidth > 0 ? strokeWidth : undefined,\n opacity: config?.pointOpacity,\n shadow,\n },\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 headerHeight: Math.max(0, finite(chart.config?.headerHeight, 20)),\n labelSize: Math.max(6, finite(chart.config?.tileLabelSize, Math.max(8, fontSize - 1))),\n valueSize: Math.max(6, finite(chart.config?.tileValueSize, Math.max(8, fontSize - 1))),\n labelPadding: Math.max(0, finite(chart.config?.tileLabelPadding, 4)),\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 { ellipsizeToWidth, estimateTextWidth, 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\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(layout.headerHeight, 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: layout.headerHeight,\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 + (layout.headerHeight - 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.config?.tileStrokeColor ?? chart.gridColor ?? '#e2e8f0' },\n strokeWidth: finite(chart.config?.tileStrokeWidth, 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 pad = layout.labelPadding;\n const width = Math.max(1, tile.width - gap - pad * 2);\n const height = Math.max(1, tile.height - gap - pad * 1.5);\n const x = plot.x + tile.x + gap / 2 + pad;\n const y = plot.y + tile.y + gap / 2 + pad * 0.75;\n const textColor = chart.config?.tileTextColor ?? contrastTextColor(representativeColor(color, '#ffffff'));\n const lineHeight = layout.labelSize * 1.2;\n const maxLines = Math.max(1, Math.floor(height / lineHeight));\n const labelLines = wrapText(leaf.label, width, layout.labelSize)\n .slice(0, maxLines)\n .map(line => ellipsizeToWidth(line, width, layout.labelSize, true));\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.labelSize,\n fontWeight: 'bold',\n color: textColor,\n };\n\n const valueText = String(value);\n const valueFits =\n labelLines.length * lineHeight + layout.valueSize * 1.2 <= height + 2 &&\n estimateTextWidth(valueText, layout.valueSize, false) <= width;\n if (chart.config?.showTileValues === false || !valueFits) {\n return [label];\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.valueSize,\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 const tension = chart.config?.radarTension;\n return {\n of: 'radarGeometry',\n radarGeometry: `${centerX},${centerY},${radius},${chart.axisY.min},${chart.axisY.max},${count},${curved}${tension === undefined ? '' : `,${tension}`}`,\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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\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' || node.identity?.role === 'widget' ? '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 =\n node.widgetStyle.fontSize > 0 ? node.widgetStyle.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 #userPoint(clientX: number, clientY: number): { x: number; y: number } | null {\n const matrix = this.#svg.getScreenCTM();\n if (!matrix) {\n return null;\n }\n const point = new DOMPoint(clientX, clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\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 anchor = this.#userPoint(centerX, centerY);\n this.#view = { ...this.#view, w: this.#view.w / factor, h: this.#view.h / factor };\n this.apply();\n const moved = anchor ? this.#userPoint(centerX, centerY) : null;\n if (anchor && moved) {\n this.#view.x += anchor.x - moved.x;\n this.#view.y += anchor.y - moved.y;\n }\n this.apply();\n }\n\n panBy(dxPixels: number, dyPixels: number): void {\n const scale = this.#svg.getScreenCTM()?.a;\n const pixelsPerUnit = scale && scale > 0 ? scale : 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, fontSize = 0): Cells {\n const size = fontSize > 0 ? fontSize : 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', style.fontSize);\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 = 6;\nconst BUBBLE_MARGIN_PX = 14;\nexport const PLUS_HALF_SIZE_PX = 3;\nexport const BUBBLE_STROKE_WIDTH_PX = 1.5;\n\nfunction quickDuplicatePositions(\n bounds: OverlayBounds,\n offset: number,\n): Array<[number, number, QuickDuplicateDirection]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [centerX, bounds.y - offset, 'top'],\n [bounds.x + bounds.width + offset, centerY, 'right'],\n [centerX, bounds.y + bounds.height + offset, 'bottom'],\n [bounds.x - offset, centerY, 'left'],\n ];\n}\n\nexport function plusPath(x: number, y: number, halfSize: number): string {\n return `M ${x - halfSize} ${y} L ${x + halfSize} ${y} M ${x} ${y - halfSize} L ${x} ${y + halfSize}`;\n}\n\nconst BUBBLE_FILL = '#e8e8e8';\nconst BUBBLE_STROKE = '#ccc';\nconst BUBBLE_HOVER_FILL = '#9b42df';\nconst BUBBLE_HOVER_STROKE = '#7c2fb5';\nconst BUBBLE_HOVER_SCALE = 1.2;\n\nexport function duplicateBubble(\n document: Document,\n x: number,\n y: number,\n radius: number,\n strokeWidth: number,\n direction: string,\n): SVGCircleElement {\n const bubble = svgElement(document, 'circle');\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n bubble.setAttribute('stroke-width', String(strokeWidth));\n bubble.setAttribute('data-sf-quick-duplicate', direction);\n bubble.style.pointerEvents = 'auto';\n bubble.style.cursor = 'pointer';\n bubble.style.transition = 'r 120ms ease, fill 120ms ease, stroke 120ms ease';\n bubble.addEventListener('pointerenter', () => {\n bubble.setAttribute('r', String(radius * BUBBLE_HOVER_SCALE));\n bubble.setAttribute('fill', BUBBLE_HOVER_FILL);\n bubble.setAttribute('stroke', BUBBLE_HOVER_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#ffffff');\n });\n bubble.addEventListener('pointerleave', () => {\n bubble.setAttribute('r', String(radius));\n bubble.setAttribute('fill', BUBBLE_FILL);\n bubble.setAttribute('stroke', BUBBLE_STROKE);\n const plus = bubble.nextElementSibling;\n plus?.setAttribute('stroke', '#999');\n });\n return bubble;\n}\n\nexport function duplicatePlus(\n document: Document,\n x: number,\n y: number,\n halfSize: number,\n strokeWidth: number,\n): SVGPathElement {\n const plus = svgElement(document, 'path');\n plus.setAttribute('d', plusPath(x, y, halfSize));\n plus.setAttribute('stroke', '#999');\n plus.setAttribute('stroke-width', String(strokeWidth));\n plus.setAttribute('stroke-linecap', 'round');\n return plus;\n}\n\nexport function quickDuplicateBubbles(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const offset = radius + screenPx(svg, BUBBLE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n for (const [x, y, direction] of quickDuplicatePositions(bounds, offset)) {\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function updateQuickDuplicateBubbles(group: SVGGElement, bounds: OverlayBounds): void {\n const bubbles = group.querySelectorAll('circle[data-sf-quick-duplicate]');\n const firstRadius = Number(bubbles[0]?.getAttribute('r')) || BUBBLE_RADIUS_PX;\n const offset = firstRadius * ((BUBBLE_RADIUS_PX + BUBBLE_MARGIN_PX) / BUBBLE_RADIUS_PX);\n const halfSize = firstRadius * (PLUS_HALF_SIZE_PX / BUBBLE_RADIUS_PX);\n for (const [index, [x, y]] of quickDuplicatePositions(bounds, offset).entries()) {\n const bubble = bubbles[index];\n if (!bubble) {\n continue;\n }\n bubble.setAttribute('cx', String(x));\n bubble.setAttribute('cy', String(y));\n const plus = bubble.nextElementSibling;\n if (plus) {\n plus.setAttribute('d', plusPath(x, y, halfSize));\n }\n }\n}\n","import { isometricFaces } from '../../../model/isometricObject';\nimport { isometricGeometryOf, symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport {\n BUBBLE_RADIUS_PX,\n BUBBLE_STROKE_WIDTH_PX,\n duplicateBubble,\n duplicatePlus,\n PLUS_HALF_SIZE_PX,\n} from './quickDuplicate';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 2;\nconst SHAFT_WIDTH_PX = 3.25;\nconst HIT_WIDTH_PX = 14;\nconst ARROW_LENGTH_PX = 34;\nconst ARROWHEAD_LENGTH_PX = 10.5;\nconst ARROWHEAD_WIDTH_PX = 8.5;\n\nexport type IsometricAxis = 'width' | 'height' | 'depth';\n\nexport interface Vec {\n x: number;\n y: number;\n}\n\nexport function normalizeVec(v: Vec): Vec {\n const length = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / length, y: v.y / length };\n}\n\nfunction axisCursorUrl(direction: Vec): string {\n const angleDeg = (Math.atan2(direction.y, direction.x) * 180) / Math.PI;\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\">` +\n `<g transform=\"rotate(${angleDeg} 13 13)\" stroke-linejoin=\"round\" stroke-linecap=\"round\">` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"white\" stroke-width=\"4.5\"/>` +\n `<line x1=\"4\" y1=\"13\" x2=\"22\" y2=\"13\" stroke=\"black\" stroke-width=\"1.6\"/>` +\n `<path d=\"M4 13 L9.5 8.5 L9.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `<path d=\"M22 13 L16.5 8.5 L16.5 17.5 Z\" fill=\"black\" stroke=\"white\" stroke-width=\"1.5\"/>` +\n `</g></svg>`;\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\") 13 13, pointer`;\n}\n\nfunction centroid(points: readonly Vec[]): Vec {\n const sum = points.reduce((acc, p) => ({ x: acc.x + p.x, y: acc.y + p.y }), { x: 0, y: 0 });\n return { x: sum.x / points.length, y: sum.y / points.length };\n}\n\nexport const ISO_HALO_ATTR = 'data-sf-iso-halo';\n\ninterface ArrowElements {\n group: SVGGElement;\n hit: SVGLineElement;\n shaft: SVGLineElement;\n head: SVGPolygonElement;\n}\n\nfunction createAxisArrow(document: Document, axis: IsometricAxis, direction: Vec, svg: SVGSVGElement): ArrowElements {\n const group = svgElement(document, 'g');\n group.setAttribute('data-sf-resize-handle', `iso-${axis}`);\n group.style.cursor = axisCursorUrl(direction);\n\n const hit = svgElement(document, 'line');\n hit.setAttribute('stroke', 'transparent');\n hit.setAttribute('stroke-width', String(screenPx(svg, HIT_WIDTH_PX)));\n hit.setAttribute('stroke-linecap', 'round');\n hit.style.pointerEvents = 'stroke';\n group.appendChild(hit);\n\n const shaft = svgElement(document, 'line');\n shaft.setAttribute('stroke', RING_COLOR);\n shaft.setAttribute('stroke-width', String(screenPx(svg, SHAFT_WIDTH_PX)));\n shaft.setAttribute('stroke-linecap', 'round');\n shaft.style.pointerEvents = 'none';\n group.appendChild(shaft);\n\n const head = svgElement(document, 'polygon');\n head.setAttribute('fill', RING_COLOR);\n head.style.pointerEvents = 'none';\n group.appendChild(head);\n\n return { group, hit, shaft, head };\n}\n\nfunction positionAxisArrow(elements: ArrowElements, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const length = screenPx(svg, ARROW_LENGTH_PX);\n const headLength = screenPx(svg, ARROWHEAD_LENGTH_PX);\n const headWidth = screenPx(svg, ARROWHEAD_WIDTH_PX);\n const tip: Vec = { x: origin.x + direction.x * length, y: origin.y + direction.y * length };\n const shaftEnd: Vec = {\n x: origin.x + direction.x * (length - headLength),\n y: origin.y + direction.y * (length - headLength),\n };\n const normal: Vec = { x: -direction.y, y: direction.x };\n const headLeft: Vec = { x: shaftEnd.x + (normal.x * headWidth) / 2, y: shaftEnd.y + (normal.y * headWidth) / 2 };\n const headRight: Vec = { x: shaftEnd.x - (normal.x * headWidth) / 2, y: shaftEnd.y - (normal.y * headWidth) / 2 };\n\n elements.hit.setAttribute('x1', String(origin.x));\n elements.hit.setAttribute('y1', String(origin.y));\n elements.hit.setAttribute('x2', String(tip.x));\n elements.hit.setAttribute('y2', String(tip.y));\n\n elements.shaft.setAttribute('x1', String(origin.x));\n elements.shaft.setAttribute('y1', String(origin.y));\n elements.shaft.setAttribute('x2', String(shaftEnd.x));\n elements.shaft.setAttribute('y2', String(shaftEnd.y));\n\n elements.head.setAttribute('points', `${tip.x},${tip.y} ${headLeft.x},${headLeft.y} ${headRight.x},${headRight.y}`);\n}\n\nfunction axisArrow(\n document: Document,\n origin: Vec,\n direction: Vec,\n axis: IsometricAxis,\n svg: SVGSVGElement,\n): SVGGElement {\n const elements = createAxisArrow(document, axis, direction, svg);\n positionAxisArrow(elements, origin, direction, svg);\n return elements.group;\n}\n\nexport function updateAxisArrowGroup(group: SVGGElement, origin: Vec, direction: Vec, svg: SVGSVGElement): void {\n const hit = group.querySelector('line:nth-child(1)') as SVGLineElement | null;\n const shaft = group.querySelector('line:nth-child(2)') as SVGLineElement | null;\n const head = group.querySelector('polygon') as SVGPolygonElement | null;\n if (!hit || !shaft || !head) {\n return;\n }\n positionAxisArrow({ group, hit, shaft, head }, origin, direction, svg);\n}\n\nexport function updateHalo(halo: SVGPathElement, d: string): void {\n halo.setAttribute('d', d);\n}\n\nexport interface IsometricSize {\n x: number;\n y: number;\n width: number;\n height: number;\n depth: number;\n}\n\nexport function axisArrowPlacements(object: IsometricSize): Record<IsometricAxis, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const apex = faces.top[0];\n const right = faces.top[1];\n const left = faces.top[3];\n const bottom = faces.front[2];\n return {\n width: { origin: centroid(faces.right), direction: normalizeVec({ x: right.x - apex.x, y: right.y - apex.y }) },\n height: { origin: bottom, direction: { x: 0, y: 1 } },\n depth: { origin: centroid(faces.front), direction: normalizeVec({ x: left.x - apex.x, y: left.y - apex.y }) },\n };\n}\n\nconst DUPLICATE_MARGIN_PX = ARROW_LENGTH_PX + BUBBLE_RADIUS_PX + 10;\n\nexport type IsometricQuickDuplicateDirection =\n | 'iso-width-pos'\n | 'iso-width-neg'\n | 'iso-depth-pos'\n | 'iso-depth-neg'\n | 'iso-height-pos'\n | 'iso-height-neg';\n\nfunction reflect(point: Vec, through: Vec): Vec {\n return { x: through.x * 2 - point.x, y: through.y * 2 - point.y };\n}\n\nexport function quickDuplicatePlacements(\n object: IsometricSize,\n): Record<IsometricQuickDuplicateDirection, { origin: Vec; direction: Vec }> {\n const faces = isometricFaces(object);\n const placements = axisArrowPlacements(object);\n const visualCenter = centroid([\n faces.top[0],\n faces.top[1],\n faces.top[2],\n faces.top[3],\n faces.front[2],\n faces.front[3],\n faces.right[2],\n ]);\n return {\n 'iso-width-pos': placements.width,\n 'iso-width-neg': {\n origin: reflect(placements.width.origin, visualCenter),\n direction: { x: -placements.width.direction.x, y: -placements.width.direction.y },\n },\n 'iso-depth-pos': placements.depth,\n 'iso-depth-neg': {\n origin: reflect(placements.depth.origin, visualCenter),\n direction: { x: -placements.depth.direction.x, y: -placements.depth.direction.y },\n },\n 'iso-height-pos': placements.height,\n 'iso-height-neg': {\n origin: reflect(placements.height.origin, visualCenter),\n direction: { x: -placements.height.direction.x, y: -placements.height.direction.y },\n },\n };\n}\n\nexport const ISO_DUPLICATE_BUBBLES_ATTR = 'data-sf-iso-duplicate-bubbles';\n\nconst VISIBLE_FACE_DIRECTIONS: readonly IsometricQuickDuplicateDirection[] = [\n 'iso-height-neg',\n 'iso-depth-pos',\n 'iso-width-pos',\n];\n\nexport function isometricQuickDuplicateBubbles(\n document: Document,\n object: IsometricSize,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = svgElement(document, 'g');\n group.setAttribute(ISO_DUPLICATE_BUBBLES_ATTR, '');\n const radius = screenPx(svg, BUBBLE_RADIUS_PX);\n const margin = screenPx(svg, DUPLICATE_MARGIN_PX);\n const halfSize = screenPx(svg, PLUS_HALF_SIZE_PX);\n const strokeWidth = screenPx(svg, BUBBLE_STROKE_WIDTH_PX);\n const placements = quickDuplicatePlacements(object);\n for (const direction of VISIBLE_FACE_DIRECTIONS) {\n const { origin, direction: dir } = placements[direction];\n const x = origin.x + dir.x * margin;\n const y = origin.y + dir.y * margin;\n group.append(\n duplicateBubble(document, x, y, radius, strokeWidth, direction),\n duplicatePlus(document, x, y, halfSize, strokeWidth),\n );\n }\n return group;\n}\n\nexport function isometricSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const geometry = isometricGeometryOf(primary);\n const group = selectionOverlayGroup(document, id, primary);\n\n const halo = svgElement(document, 'path');\n halo.setAttribute(ISO_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('opacity', '0.6');\n halo.style.pointerEvents = 'none';\n group.appendChild(halo);\n\n const placements = axisArrowPlacements({\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n });\n group.appendChild(axisArrow(document, placements.width.origin, placements.width.direction, 'width', svg));\n group.appendChild(axisArrow(document, placements.height.origin, placements.height.direction, 'height', svg));\n group.appendChild(axisArrow(document, placements.depth.origin, placements.depth.direction, 'depth', svg));\n group.appendChild(\n isometricQuickDuplicateBubbles(\n document,\n {\n x: bounds.x,\n y: bounds.y,\n width: geometry?.width ?? bounds.width,\n height: geometry?.height ?? bounds.height,\n depth: geometry?.depth ?? 0,\n },\n svg,\n ),\n );\n return group;\n}\n","import { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { LinkEndpoint } from './types';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst ENDPOINT_RADIUS_PX = 5;\nconst ENDPOINT_STROKE_WIDTH_PX = 1.5;\n\nfunction linkHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction endpointHandle(\n document: Document,\n primary: SVGPathElement,\n atLength: number,\n endpoint: LinkEndpoint,\n svg: SVGSVGElement,\n): SVGCircleElement {\n const point = primary.getPointAtLength(atLength);\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(point.x));\n handle.setAttribute('cy', String(point.y));\n handle.setAttribute('r', String(screenPx(svg, ENDPOINT_RADIUS_PX)));\n handle.setAttribute('fill', RING_COLOR);\n handle.setAttribute('stroke', 'white');\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-endpoint', endpoint);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'crosshair';\n return handle;\n}\n\nconst SEGMENT_LENGTH_PX = 22;\nconst SEGMENT_THICKNESS_PX = 8;\n\ninterface LinkSegmentData {\n ax: number;\n ay: number;\n bx: number;\n by: number;\n movable: boolean;\n}\n\nfunction readSegments(primary: SVGPathElement): LinkSegmentData[] {\n try {\n return JSON.parse(primary.getAttribute('data-sf-link-segments') ?? '[]') as LinkSegmentData[];\n } catch {\n return [];\n }\n}\n\nfunction segmentHandles(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGRectElement[] {\n const handles: SVGRectElement[] = [];\n readSegments(primary).forEach((segment, index) => {\n if (!segment.movable) {\n return;\n }\n const horizontal = Math.abs(segment.bx - segment.ax) > Math.abs(segment.by - segment.ay);\n const length = screenPx(svg, SEGMENT_LENGTH_PX);\n const thickness = screenPx(svg, SEGMENT_THICKNESS_PX);\n const width = horizontal ? length : thickness;\n const height = horizontal ? thickness : length;\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String((segment.ax + segment.bx) / 2 - width / 2));\n handle.setAttribute('y', String((segment.ay + segment.by) / 2 - height / 2));\n handle.setAttribute('width', String(width));\n handle.setAttribute('height', String(height));\n handle.setAttribute('rx', String(thickness / 2));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, ENDPOINT_STROKE_WIDTH_PX)));\n handle.setAttribute('data-sf-link-segment', String(index));\n handle.setAttribute('data-sf-link-segment-axis', horizontal ? 'y' : 'x');\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = horizontal ? 'ns-resize' : 'ew-resize';\n handles.push(handle);\n });\n return handles;\n}\n\nexport function linkSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n const length = primary.getTotalLength();\n group.append(\n linkHalo(document, primary, svg),\n ...segmentHandles(document, primary, svg),\n endpointHandle(document, primary, 0, 'from', svg),\n endpointHandle(document, primary, length, 'to', svg),\n );\n return group;\n}\n","import { PATH_POINT_INDEX_ATTR } from '../../../svg/domContract/attributes';\nimport { pathGeometryOf } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst HALO_EXTRA_WIDTH_PX = 4;\nconst POINT_RADIUS_PX = 5;\nconst POINT_STROKE_WIDTH_PX = 1.5;\n\nexport const PATH_HALO_ATTR = 'data-sf-path-halo';\n\nfunction pathHalo(document: Document, primary: SVGPathElement, svg: SVGSVGElement): SVGPathElement {\n const halo = svgElement(document, 'path');\n halo.setAttribute(PATH_HALO_ATTR, '');\n halo.setAttribute('d', primary.getAttribute('d') ?? '');\n halo.setAttribute('fill', 'none');\n halo.setAttribute('stroke', RING_COLOR);\n const baseWidth = Number(primary.getAttribute('stroke-width')) || 2;\n halo.setAttribute('stroke-width', String(baseWidth + screenPx(svg, HALO_EXTRA_WIDTH_PX)));\n halo.setAttribute('stroke-linecap', 'round');\n halo.setAttribute('opacity', '0.5');\n return halo;\n}\n\nfunction pointHandle(document: Document, x: number, y: number, index: number, svg: SVGSVGElement): SVGCircleElement {\n const handle = svgElement(document, 'circle');\n handle.setAttribute('cx', String(x));\n handle.setAttribute('cy', String(y));\n handle.setAttribute('r', String(screenPx(svg, POINT_RADIUS_PX)));\n handle.setAttribute('fill', '#ffffff');\n handle.setAttribute('stroke', RING_COLOR);\n handle.setAttribute('stroke-width', String(screenPx(svg, POINT_STROKE_WIDTH_PX)));\n handle.setAttribute(PATH_POINT_INDEX_ATTR, String(index));\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = 'move';\n return handle;\n}\n\nexport function pathSelectionOverlay(\n document: Document,\n primary: SVGPathElement,\n id: string,\n svg: SVGSVGElement,\n): SVGGElement {\n const group = selectionOverlayGroup(document, id, primary);\n group.appendChild(pathHalo(document, primary, svg));\n const geometry = pathGeometryOf(primary);\n for (const [index, [x, y]] of (geometry?.points ?? []).entries()) {\n group.appendChild(pointHandle(document, x, y, index, svg));\n }\n return group;\n}\n","import { svgElement } from './dom';\nimport { screenPx } from './scale';\nimport type { OverlayBounds, ResizeHandle } from './types';\n\nconst HANDLE_SIZE_PX = 6;\nconst HANDLE_STROKE_WIDTH_PX = 1;\nconst HANDLE_STROKE = '#992dff';\nconst HANDLE_CURSORS: Record<ResizeHandle, string> = {\n 'top-left': 'nwse-resize',\n top: 'ns-resize',\n 'top-right': 'nesw-resize',\n right: 'ew-resize',\n 'bottom-right': 'nwse-resize',\n bottom: 'ns-resize',\n 'bottom-left': 'nesw-resize',\n left: 'ew-resize',\n};\n\nexport function resizeHandlePositions(bounds: OverlayBounds): Array<[number, number, ResizeHandle]> {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n return [\n [bounds.x, bounds.y, 'top-left'],\n [centerX, bounds.y, 'top'],\n [bounds.x + bounds.width, bounds.y, 'top-right'],\n [bounds.x + bounds.width, centerY, 'right'],\n [bounds.x + bounds.width, bounds.y + bounds.height, 'bottom-right'],\n [centerX, bounds.y + bounds.height, 'bottom'],\n [bounds.x, bounds.y + bounds.height, 'bottom-left'],\n [bounds.x, centerY, 'left'],\n ];\n}\n\nconst LOCKED_HEIGHT_HANDLES: ReadonlySet<ResizeHandle> = new Set(['top', 'bottom']);\n\nexport function renderResizeHandles(\n document: Document,\n bounds: OverlayBounds,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGRectElement[] {\n const size = screenPx(svg, HANDLE_SIZE_PX);\n const strokeWidth = screenPx(svg, HANDLE_STROKE_WIDTH_PX);\n const positions = lockHeight\n ? resizeHandlePositions(bounds).filter(([, , name]) => !LOCKED_HEIGHT_HANDLES.has(name))\n : resizeHandlePositions(bounds);\n return positions.map(([centerX, centerY, name]) => {\n const handle = svgElement(document, 'rect');\n handle.setAttribute('x', String(centerX - size / 2));\n handle.setAttribute('y', String(centerY - size / 2));\n handle.setAttribute('width', String(size));\n handle.setAttribute('height', String(size));\n handle.setAttribute('fill', 'white');\n handle.setAttribute('stroke', HANDLE_STROKE);\n handle.setAttribute('stroke-width', String(strokeWidth));\n handle.setAttribute('data-sf-resize-handle', name);\n handle.style.pointerEvents = 'auto';\n handle.style.cursor = lockHeight ? 'ew-resize' : HANDLE_CURSORS[name];\n return handle;\n });\n}\n","import { symbolDeclaredBounds } from '../contract';\nimport { selectionOverlayGroup, svgElement } from './dom';\nimport { renderResizeHandles } from './resizeHandles';\nimport { screenPx } from './scale';\n\nconst RING_COLOR = '#9b42df';\nconst RING_STROKE_WIDTH_PX = 3;\nconst RING_OFFSET_PX = 1;\n\nexport function shapeSelectionOverlay(\n document: Document,\n primary: SVGGraphicsElement,\n id: string,\n svg: SVGSVGElement,\n lockHeight = false,\n): SVGGElement {\n const bounds = symbolDeclaredBounds(primary) ?? primary.getBBox();\n const group = selectionOverlayGroup(document, id, primary);\n const offset = screenPx(svg, RING_OFFSET_PX);\n const ring = svgElement(document, 'rect');\n ring.setAttribute('x', String(bounds.x - offset));\n ring.setAttribute('y', String(bounds.y - offset));\n ring.setAttribute('width', String(bounds.width + offset * 2));\n ring.setAttribute('height', String(bounds.height + offset * 2));\n ring.setAttribute('fill', 'none');\n ring.setAttribute('stroke', RING_COLOR);\n ring.setAttribute('stroke-width', String(screenPx(svg, RING_STROKE_WIDTH_PX)));\n group.appendChild(ring);\n group.append(...renderResizeHandles(document, bounds, svg, lockHeight));\n return group;\n}\n","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;\nuniform vec3 uPeak;\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 peakColor = dot(uPeak, uPeak) > 0.0 ? uPeak : vec3(1.0);\n vec3 tickColor = mix(uColor, peakColor, 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","radarStyle","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","positiveNumber","number","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","ellipsizeToWidth","bold","estimateTextWidth","end","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","tension","CURVED_TENSION","freeformPathData","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","borderColor","representativeColor","widthFraction","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","whiskers","lowerWhisker","upperWhisker","caps","lowerWhiskerCap","upperWhiskerCap","median","medianLine","line","createBoxBorderLine","whiskerColor","createBoxNode","representativeColor","center","min","q1","boxplotPoint","q3","max","whiskerCap","id","value","capHalf","half","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","connectorDash","text","parts","part","from","to","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","id","style","finite","size","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","nodeGap","scale","ids","total","gaps","usable","sankeyNodeX","column","columnCount","width","nodeWidth","calculateNodeGeometry","columns","groupSankeyColumns","valueScale","y","heights","cursor","nodeHeight","layoutSankeyLinks","graph","geometry","width","offsets","nodeWidth","outgoingOffsets","incomingOffsets","id","link","sliceHeight","sourceOffset","targetOffset","sourceTop","targetTop","sourceSlice","targetSlice","sankeyNodeX","layoutSankeyNodes","inputs","graph","geometry","width","offsets","nodeWidth","id","input","node","column","offset","sankeyNodeX","collectOffsets","inputs","offsets","input","layoutSankey","nodeInputs","linkInputs","width","height","options","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","DEFAULT_MIN_OPACITY","GAP_TO_RADIUS","hexPath","cx","cy","radius","points","corner","angle","renderHexbin","context","chart","plot","bounds","diagnostics","nextOrder","nodes","config","hexRadius","DEFAULT_HEX_RADIUS","drawRadius","strokeWidth","minOpacity","shadow","resolveChartShadow","clipPath","series","seriesIndex","pixelPoints","y","i","vx","vy","mapChartValue","bins","computeHexBins","maxCount","bin","color","CHART_COLORS","ramp","share","fill","colorAtRamp","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","columnLabel","createColumnLabel","createTotalLabel","chart","plot","bounds","nextOrder","chartText","label","width","wrapText","createMekkoLayout","context","labels","mekkoColumnLabels","labelGutterWidth","grid","createMekkoGrid","fontSize","finite","columnGap","smallFontSize","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","config","radius","x","width","segmentGap","fallback","gradientBounds","fill","representativeColor","barPath","innerWidth","innerHeight","lineHeight","valueHeight","labelLines","wrapText","line","ellipsizeToWidth","textColor","contrastTextColor","columnTotal","valueText","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","TOP","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","trackStroke","wedgePath","shadowCaster","wedge","seriesValueProp","wedgeStroke","config","dash","part","ringNodes","chartTicks","tick","radius","renderPolarArea","range","sweep","start","showLabels","index","fraction","CHART_COLORS","nodes","createWedgeLabel","labelSizes","base","labelPlacement","fillColor","mid","nameSize","valueSize","lineHeight","ringThickness","labelOffsetX","labelOffsetY","hasManualOffset","tooThin","chordWidth","fitsInline","outsideLabels","outside","tickStart","pieArcPoint","point","addOffset","sameHueTint","representativeColor","sameHueContrastColor","contrastTextColor","placement","tickEnd","clipSegmentToRect","detail","DEFAULT_FONT","valueFirst","nameHeight","valueHeight","top","nameY","valueY","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","TOP","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","total","trackOpacity","cap","paint","CHART_COLORS","value","fraction","trackStyle","track","casters","progress","seriesValueProp","renderRadialBar","renderSankeyLinks","context","data","shadow","resolveChartShadow","gradient","plot","clipPath","link","linkIndex","ribbon","createSankeyLinkRibbon","createSankeyRibbonNode","source","target","config","fromColor","DEFAULT_ZONE_FILL","toColor","fill","finite","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","DEFAULT_POINT_SIZE","renderScatter","context","nodes","shadow","resolveChartShadow","series","seriesIndex","color","CHART_COLORS","pixelPoints","seriesValuePairs","point","pointIndex","createScatterPoint","chart","bounds","diagnostics","nextOrder","config","radius","strokeWidth","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","tick","isFirst","isLast","align","frameX","label","chartText","formatFieldValue","side","barTop","barHeight","tickX","tickEndX","labelX","y","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","pad","width","height","x","y","textColor","lineHeight","maxLines","labelLines","wrapText","line","ellipsizeToWidth","valueText","valueFits","estimateTextWidth","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","tension","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","#userPoint","clientX","clientY","matrix","point","factor","rect","centerX","centerY","anchor","moved","dxPixels","dyPixels","scale","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","fontSize","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"]}