@invinite-org/chartlang-adapter-kit 1.2.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/README.md +7 -0
- package/dist/canvas/index.d.ts +5 -0
- package/dist/canvas/index.d.ts.map +1 -0
- package/dist/canvas/index.js +5 -0
- package/dist/canvas/index.js.map +1 -0
- package/dist/canvas/mockContext.d.ts +168 -0
- package/dist/canvas/mockContext.d.ts.map +1 -0
- package/dist/canvas/mockContext.js +198 -0
- package/dist/canvas/mockContext.js.map +1 -0
- package/dist/canvas/paintPrimitive.d.ts +35 -0
- package/dist/canvas/paintPrimitive.d.ts.map +1 -0
- package/dist/canvas/paintPrimitive.js +171 -0
- package/dist/canvas/paintPrimitive.js.map +1 -0
- package/dist/canvas/renderCtx.d.ts +40 -0
- package/dist/canvas/renderCtx.d.ts.map +1 -0
- package/dist/canvas/renderCtx.js +4 -0
- package/dist/canvas/renderCtx.js.map +1 -0
- package/dist/capabilities/capabilities.d.ts +9 -7
- package/dist/capabilities/capabilities.d.ts.map +1 -1
- package/dist/capabilities/capabilities.js +14 -8
- package/dist/capabilities/capabilities.js.map +1 -1
- package/dist/geometry/_lib/arrowhead.d.ts +18 -0
- package/dist/geometry/_lib/arrowhead.d.ts.map +1 -0
- package/dist/geometry/_lib/arrowhead.js +38 -0
- package/dist/geometry/_lib/arrowhead.js.map +1 -0
- package/dist/geometry/_lib/bezier.d.ts +57 -0
- package/dist/geometry/_lib/bezier.d.ts.map +1 -0
- package/dist/geometry/_lib/bezier.js +84 -0
- package/dist/geometry/_lib/bezier.js.map +1 -0
- package/dist/geometry/_lib/chevron.d.ts +29 -0
- package/dist/geometry/_lib/chevron.d.ts.map +1 -0
- package/dist/geometry/_lib/chevron.js +37 -0
- package/dist/geometry/_lib/chevron.js.map +1 -0
- package/dist/geometry/_lib/dash.d.ts +30 -0
- package/dist/geometry/_lib/dash.d.ts.map +1 -0
- package/dist/geometry/_lib/dash.js +40 -0
- package/dist/geometry/_lib/dash.js.map +1 -0
- package/dist/geometry/_lib/fibLevels.d.ts +36 -0
- package/dist/geometry/_lib/fibLevels.d.ts.map +1 -0
- package/dist/geometry/_lib/fibLevels.js +44 -0
- package/dist/geometry/_lib/fibLevels.js.map +1 -0
- package/dist/geometry/_lib/gannLevels.d.ts +54 -0
- package/dist/geometry/_lib/gannLevels.d.ts.map +1 -0
- package/dist/geometry/_lib/gannLevels.js +88 -0
- package/dist/geometry/_lib/gannLevels.js.map +1 -0
- package/dist/geometry/_lib/lineExtend.d.ts +31 -0
- package/dist/geometry/_lib/lineExtend.d.ts.map +1 -0
- package/dist/geometry/_lib/lineExtend.js +48 -0
- package/dist/geometry/_lib/lineExtend.js.map +1 -0
- package/dist/geometry/_lib/namedPolyline.d.ts +25 -0
- package/dist/geometry/_lib/namedPolyline.d.ts.map +1 -0
- package/dist/geometry/_lib/namedPolyline.js +64 -0
- package/dist/geometry/_lib/namedPolyline.js.map +1 -0
- package/dist/geometry/_lib/pitchforkGeom.d.ts +46 -0
- package/dist/geometry/_lib/pitchforkGeom.d.ts.map +1 -0
- package/dist/geometry/_lib/pitchforkGeom.js +70 -0
- package/dist/geometry/_lib/pitchforkGeom.js.map +1 -0
- package/dist/geometry/_lib/shapeStyle.d.ts +21 -0
- package/dist/geometry/_lib/shapeStyle.d.ts.map +1 -0
- package/dist/geometry/_lib/shapeStyle.js +41 -0
- package/dist/geometry/_lib/shapeStyle.js.map +1 -0
- package/dist/geometry/_lib/strokeStyle.d.ts +34 -0
- package/dist/geometry/_lib/strokeStyle.d.ts.map +1 -0
- package/dist/geometry/_lib/strokeStyle.js +26 -0
- package/dist/geometry/_lib/strokeStyle.js.map +1 -0
- package/dist/geometry/_lib/textStyle.d.ts +70 -0
- package/dist/geometry/_lib/textStyle.d.ts.map +1 -0
- package/dist/geometry/_lib/textStyle.js +78 -0
- package/dist/geometry/_lib/textStyle.js.map +1 -0
- package/dist/geometry/decompose.d.ts +28 -0
- package/dist/geometry/decompose.d.ts.map +1 -0
- package/dist/geometry/decompose.js +176 -0
- package/dist/geometry/decompose.js.map +1 -0
- package/dist/geometry/index.d.ts +4 -0
- package/dist/geometry/index.d.ts.map +1 -0
- package/dist/geometry/index.js +5 -0
- package/dist/geometry/index.js.map +1 -0
- package/dist/geometry/kinds/annotations.d.ts +77 -0
- package/dist/geometry/kinds/annotations.d.ts.map +1 -0
- package/dist/geometry/kinds/annotations.js +219 -0
- package/dist/geometry/kinds/annotations.js.map +1 -0
- package/dist/geometry/kinds/boxes.d.ts +116 -0
- package/dist/geometry/kinds/boxes.d.ts.map +1 -0
- package/dist/geometry/kinds/boxes.js +285 -0
- package/dist/geometry/kinds/boxes.js.map +1 -0
- package/dist/geometry/kinds/channels.d.ts +72 -0
- package/dist/geometry/kinds/channels.d.ts.map +1 -0
- package/dist/geometry/kinds/channels.js +148 -0
- package/dist/geometry/kinds/channels.js.map +1 -0
- package/dist/geometry/kinds/containers.d.ts +54 -0
- package/dist/geometry/kinds/containers.d.ts.map +1 -0
- package/dist/geometry/kinds/containers.js +268 -0
- package/dist/geometry/kinds/containers.js.map +1 -0
- package/dist/geometry/kinds/curves.d.ts +53 -0
- package/dist/geometry/kinds/curves.d.ts.map +1 -0
- package/dist/geometry/kinds/curves.js +110 -0
- package/dist/geometry/kinds/curves.js.map +1 -0
- package/dist/geometry/kinds/cycles.d.ts +52 -0
- package/dist/geometry/kinds/cycles.d.ts.map +1 -0
- package/dist/geometry/kinds/cycles.js +158 -0
- package/dist/geometry/kinds/cycles.js.map +1 -0
- package/dist/geometry/kinds/elliott.d.ts +73 -0
- package/dist/geometry/kinds/elliott.d.ts.map +1 -0
- package/dist/geometry/kinds/elliott.js +116 -0
- package/dist/geometry/kinds/elliott.js.map +1 -0
- package/dist/geometry/kinds/fibonacci.d.ts +166 -0
- package/dist/geometry/kinds/fibonacci.d.ts.map +1 -0
- package/dist/geometry/kinds/fibonacci.js +458 -0
- package/dist/geometry/kinds/fibonacci.js.map +1 -0
- package/dist/geometry/kinds/freehand.d.ts +53 -0
- package/dist/geometry/kinds/freehand.d.ts.map +1 -0
- package/dist/geometry/kinds/freehand.js +115 -0
- package/dist/geometry/kinds/freehand.js.map +1 -0
- package/dist/geometry/kinds/gann.d.ts +63 -0
- package/dist/geometry/kinds/gann.d.ts.map +1 -0
- package/dist/geometry/kinds/gann.js +153 -0
- package/dist/geometry/kinds/gann.js.map +1 -0
- package/dist/geometry/kinds/lines.d.ts +90 -0
- package/dist/geometry/kinds/lines.d.ts.map +1 -0
- package/dist/geometry/kinds/lines.js +201 -0
- package/dist/geometry/kinds/lines.js.map +1 -0
- package/dist/geometry/kinds/marker.d.ts +21 -0
- package/dist/geometry/kinds/marker.d.ts.map +1 -0
- package/dist/geometry/kinds/marker.js +47 -0
- package/dist/geometry/kinds/marker.js.map +1 -0
- package/dist/geometry/kinds/patterns.d.ts +85 -0
- package/dist/geometry/kinds/patterns.d.ts.map +1 -0
- package/dist/geometry/kinds/patterns.js +133 -0
- package/dist/geometry/kinds/patterns.js.map +1 -0
- package/dist/geometry/kinds/pitchforks.d.ts +36 -0
- package/dist/geometry/kinds/pitchforks.d.ts.map +1 -0
- package/dist/geometry/kinds/pitchforks.js +109 -0
- package/dist/geometry/kinds/pitchforks.js.map +1 -0
- package/dist/geometry/project.d.ts +50 -0
- package/dist/geometry/project.d.ts.map +1 -0
- package/dist/geometry/project.js +62 -0
- package/dist/geometry/project.js.map +1 -0
- package/dist/geometry/types.d.ts +146 -0
- package/dist/geometry/types.d.ts.map +1 -0
- package/dist/geometry/types.js +4 -0
- package/dist/geometry/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validation/validateEmission.d.ts.map +1 -1
- package/dist/validation/validateEmission.js +47 -0
- package/dist/validation/validateEmission.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
import { decomposeArrow, decomposeArrowMarkDown, decomposeArrowMarkUp, decomposeArrowMarker, decomposeText, } from "./kinds/annotations.js";
|
|
4
|
+
import { decomposeCircle, decomposeEllipse, decomposeFillBetween, decomposePath, decomposePolyline, decomposeRectangle, decomposeRotatedRectangle, decomposeTriangle, } from "./kinds/boxes.js";
|
|
5
|
+
import { decomposeDisjointChannel, decomposeFlatTopBottom, decomposeRegressionTrend, decomposeTrendChannel, } from "./kinds/channels.js";
|
|
6
|
+
import { decomposeFrame, decomposeGroup, decomposeTable } from "./kinds/containers.js";
|
|
7
|
+
import { decomposeArc, decomposeCurve, decomposeDoubleCurve } from "./kinds/curves.js";
|
|
8
|
+
import { decomposeCyclicLines, decomposeSineLine, decomposeTimeCycles } from "./kinds/cycles.js";
|
|
9
|
+
import { decomposeElliottCorrectionWave, decomposeElliottDoubleCombo, decomposeElliottImpulseWave, decomposeElliottTriangleWave, decomposeElliottTripleCombo, } from "./kinds/elliott.js";
|
|
10
|
+
import { decomposeFibChannel, decomposeFibCircles, decomposeFibRetracement, decomposeFibSpeedArcs, decomposeFibSpeedFan, decomposeFibSpiral, decomposeFibTimeZone, decomposeFibTrendExtension, decomposeFibTrendTime, decomposeFibWedge, } from "./kinds/fibonacci.js";
|
|
11
|
+
import { decomposeBrush, decomposeHighlighter, decomposePen } from "./kinds/freehand.js";
|
|
12
|
+
import { decomposeGannBox, decomposeGannFan, decomposeGannSquare, decomposeGannSquareFixed, } from "./kinds/gann.js";
|
|
13
|
+
import { decomposeCrossLine, decomposeHorizontalLine, decomposeHorizontalRay, decomposeLine, decomposeTrendAngle, decomposeVerticalLine, } from "./kinds/lines.js";
|
|
14
|
+
import { decomposeMarker } from "./kinds/marker.js";
|
|
15
|
+
import { decomposeAbcdPattern, decomposeCypherPattern, decomposeHeadAndShoulders, decomposeThreeDrivesPattern, decomposeTrianglePattern, decomposeXabcdPattern, } from "./kinds/patterns.js";
|
|
16
|
+
import { decomposePitchfan, decomposePitchfork } from "./kinds/pitchforks.js";
|
|
17
|
+
/**
|
|
18
|
+
* Reduce a {@link DrawingEmission} to a flat, renderer-agnostic
|
|
19
|
+
* {@link DrawPrimitive} list against `view`. Pure — no `ctx`, no library
|
|
20
|
+
* types — so every adapter shares one geometry derivation and paints
|
|
21
|
+
* the result with its own sink.
|
|
22
|
+
*
|
|
23
|
+
* The switch is **exhaustive over all 63 `DrawingKind`s**: the 20 basic
|
|
24
|
+
* kinds (Task 1), the 20 curve / freehand / channel / fibonacci kinds
|
|
25
|
+
* (Task 2), and the 23 gann / pitchfork / pattern / elliott / cycle /
|
|
26
|
+
* container / table kinds (Task 3). The `default` arm is a `const
|
|
27
|
+
* _exhaustive: never` guard — it compiles only because every literal has
|
|
28
|
+
* a `case`, so adding a future `DrawingKind` to core fails `pnpm
|
|
29
|
+
* typecheck` here until a decomposer is added. `op: "remove"` is handled
|
|
30
|
+
* by each adapter's drawing-state map (this function operates on whatever
|
|
31
|
+
* `state` it is handed).
|
|
32
|
+
*
|
|
33
|
+
* @since 1.3
|
|
34
|
+
* @stable
|
|
35
|
+
* @example
|
|
36
|
+
* declare const e: DrawingEmission;
|
|
37
|
+
* declare const v: Viewport;
|
|
38
|
+
* const prims = decomposeDrawing(e, v);
|
|
39
|
+
* void prims;
|
|
40
|
+
*/
|
|
41
|
+
export function decomposeDrawing(e, view) {
|
|
42
|
+
switch (e.drawingKind) {
|
|
43
|
+
case "line":
|
|
44
|
+
return decomposeLine(e.state, view);
|
|
45
|
+
case "horizontal-line":
|
|
46
|
+
return decomposeHorizontalLine(e.state, view);
|
|
47
|
+
case "horizontal-ray":
|
|
48
|
+
return decomposeHorizontalRay(e.state, view);
|
|
49
|
+
case "vertical-line":
|
|
50
|
+
return decomposeVerticalLine(e.state, view);
|
|
51
|
+
case "cross-line":
|
|
52
|
+
return decomposeCrossLine(e.state, view);
|
|
53
|
+
case "trend-angle":
|
|
54
|
+
return decomposeTrendAngle(e.state, view);
|
|
55
|
+
case "rectangle":
|
|
56
|
+
return decomposeRectangle(e.state, view);
|
|
57
|
+
case "rotated-rectangle":
|
|
58
|
+
return decomposeRotatedRectangle(e.state, view);
|
|
59
|
+
case "triangle":
|
|
60
|
+
return decomposeTriangle(e.state, view);
|
|
61
|
+
case "polyline":
|
|
62
|
+
return decomposePolyline(e.state, view);
|
|
63
|
+
case "circle":
|
|
64
|
+
return decomposeCircle(e.state, view);
|
|
65
|
+
case "ellipse":
|
|
66
|
+
return decomposeEllipse(e.state, view);
|
|
67
|
+
case "path":
|
|
68
|
+
return decomposePath(e.state, view);
|
|
69
|
+
case "fill-between":
|
|
70
|
+
return decomposeFillBetween(e.state, view);
|
|
71
|
+
case "marker":
|
|
72
|
+
return decomposeMarker(e.state, view);
|
|
73
|
+
case "text":
|
|
74
|
+
return decomposeText(e.state, view);
|
|
75
|
+
case "arrow":
|
|
76
|
+
return decomposeArrow(e.state, view);
|
|
77
|
+
case "arrow-marker":
|
|
78
|
+
return decomposeArrowMarker(e.state, view);
|
|
79
|
+
case "arrow-mark-up":
|
|
80
|
+
return decomposeArrowMarkUp(e.state, view);
|
|
81
|
+
case "arrow-mark-down":
|
|
82
|
+
return decomposeArrowMarkDown(e.state, view);
|
|
83
|
+
case "arc":
|
|
84
|
+
return decomposeArc(e.state, view);
|
|
85
|
+
case "curve":
|
|
86
|
+
return decomposeCurve(e.state, view);
|
|
87
|
+
case "double-curve":
|
|
88
|
+
return decomposeDoubleCurve(e.state, view);
|
|
89
|
+
case "pen":
|
|
90
|
+
return decomposePen(e.state, view);
|
|
91
|
+
case "highlighter":
|
|
92
|
+
return decomposeHighlighter(e.state, view);
|
|
93
|
+
case "brush":
|
|
94
|
+
return decomposeBrush(e.state, view);
|
|
95
|
+
case "trend-channel":
|
|
96
|
+
return decomposeTrendChannel(e.state, view);
|
|
97
|
+
case "flat-top-bottom":
|
|
98
|
+
return decomposeFlatTopBottom(e.state, view);
|
|
99
|
+
case "disjoint-channel":
|
|
100
|
+
return decomposeDisjointChannel(e.state, view);
|
|
101
|
+
case "regression-trend":
|
|
102
|
+
return decomposeRegressionTrend(e.state, view);
|
|
103
|
+
case "fib-retracement":
|
|
104
|
+
return decomposeFibRetracement(e.state, view);
|
|
105
|
+
case "fib-trend-extension":
|
|
106
|
+
return decomposeFibTrendExtension(e.state, view);
|
|
107
|
+
case "fib-channel":
|
|
108
|
+
return decomposeFibChannel(e.state, view);
|
|
109
|
+
case "fib-time-zone":
|
|
110
|
+
return decomposeFibTimeZone(e.state, view);
|
|
111
|
+
case "fib-wedge":
|
|
112
|
+
return decomposeFibWedge(e.state, view);
|
|
113
|
+
case "fib-speed-fan":
|
|
114
|
+
return decomposeFibSpeedFan(e.state, view);
|
|
115
|
+
case "fib-speed-arcs":
|
|
116
|
+
return decomposeFibSpeedArcs(e.state, view);
|
|
117
|
+
case "fib-spiral":
|
|
118
|
+
return decomposeFibSpiral(e.state, view);
|
|
119
|
+
case "fib-circles":
|
|
120
|
+
return decomposeFibCircles(e.state, view);
|
|
121
|
+
case "fib-trend-time":
|
|
122
|
+
return decomposeFibTrendTime(e.state, view);
|
|
123
|
+
case "gann-box":
|
|
124
|
+
return decomposeGannBox(e.state, view);
|
|
125
|
+
case "gann-square-fixed":
|
|
126
|
+
return decomposeGannSquareFixed(e.state, view);
|
|
127
|
+
case "gann-square":
|
|
128
|
+
return decomposeGannSquare(e.state, view);
|
|
129
|
+
case "gann-fan":
|
|
130
|
+
return decomposeGannFan(e.state, view);
|
|
131
|
+
case "pitchfork":
|
|
132
|
+
return decomposePitchfork(e.state, view);
|
|
133
|
+
case "pitchfan":
|
|
134
|
+
return decomposePitchfan(e.state, view);
|
|
135
|
+
case "xabcd-pattern":
|
|
136
|
+
return decomposeXabcdPattern(e.state, view);
|
|
137
|
+
case "cypher-pattern":
|
|
138
|
+
return decomposeCypherPattern(e.state, view);
|
|
139
|
+
case "head-and-shoulders":
|
|
140
|
+
return decomposeHeadAndShoulders(e.state, view);
|
|
141
|
+
case "abcd-pattern":
|
|
142
|
+
return decomposeAbcdPattern(e.state, view);
|
|
143
|
+
case "triangle-pattern":
|
|
144
|
+
return decomposeTrianglePattern(e.state, view);
|
|
145
|
+
case "three-drives-pattern":
|
|
146
|
+
return decomposeThreeDrivesPattern(e.state, view);
|
|
147
|
+
case "elliott-impulse-wave":
|
|
148
|
+
return decomposeElliottImpulseWave(e.state, view);
|
|
149
|
+
case "elliott-correction-wave":
|
|
150
|
+
return decomposeElliottCorrectionWave(e.state, view);
|
|
151
|
+
case "elliott-triangle-wave":
|
|
152
|
+
return decomposeElliottTriangleWave(e.state, view);
|
|
153
|
+
case "elliott-double-combo":
|
|
154
|
+
return decomposeElliottDoubleCombo(e.state, view);
|
|
155
|
+
case "elliott-triple-combo":
|
|
156
|
+
return decomposeElliottTripleCombo(e.state, view);
|
|
157
|
+
case "cyclic-lines":
|
|
158
|
+
return decomposeCyclicLines(e.state, view);
|
|
159
|
+
case "time-cycles":
|
|
160
|
+
return decomposeTimeCycles(e.state, view);
|
|
161
|
+
case "sine-line":
|
|
162
|
+
return decomposeSineLine(e.state, view);
|
|
163
|
+
case "group":
|
|
164
|
+
return decomposeGroup(e.state, view);
|
|
165
|
+
case "frame":
|
|
166
|
+
return decomposeFrame(e.state, view);
|
|
167
|
+
case "table":
|
|
168
|
+
return decomposeTable(e.state, view);
|
|
169
|
+
default: {
|
|
170
|
+
const _exhaustive = e.drawingKind;
|
|
171
|
+
void _exhaustive;
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=decompose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompose.js","sourceRoot":"","sources":["../../src/geometry/decompose.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n AbcdPatternState,\n ArcState,\n ArrowMarkDownState,\n ArrowMarkUpState,\n ArrowMarkerState,\n ArrowState,\n BrushState,\n CircleState,\n CrossLineState,\n CurveState,\n CyclicLinesState,\n CypherPatternState,\n DisjointChannelState,\n DoubleCurveState,\n ElliottCorrectionWaveState,\n ElliottDoubleComboState,\n ElliottImpulseWaveState,\n ElliottTriangleWaveState,\n ElliottTripleComboState,\n EllipseState,\n FibChannelState,\n FibCirclesState,\n FibRetracementState,\n FibSpeedArcsState,\n FibSpeedFanState,\n FibSpiralState,\n FibTimeZoneState,\n FibTrendExtensionState,\n FibTrendTimeState,\n FibWedgeState,\n FillBetweenState,\n FlatTopBottomState,\n FrameState,\n GannBoxState,\n GannFanState,\n GannSquareFixedState,\n GannSquareState,\n GroupState,\n HeadAndShouldersState,\n HighlighterState,\n HorizontalLineState,\n HorizontalRayState,\n LineState,\n MarkerState,\n PathState,\n PenState,\n PitchfanState,\n PitchforkState,\n PolylineState,\n RectangleState,\n RegressionTrendState,\n RotatedRectangleState,\n SineLineState,\n TableState,\n TextState,\n ThreeDrivesPatternState,\n TimeCyclesState,\n TrendAngleState,\n TrendChannelState,\n TrianglePatternState,\n TriangleState,\n VerticalLineState,\n XabcdPatternState,\n} from \"@invinite-org/chartlang-core\";\n\nimport type { DrawingEmission } from \"../types.js\";\nimport {\n decomposeArrow,\n decomposeArrowMarkDown,\n decomposeArrowMarkUp,\n decomposeArrowMarker,\n decomposeText,\n} from \"./kinds/annotations.js\";\nimport {\n decomposeCircle,\n decomposeEllipse,\n decomposeFillBetween,\n decomposePath,\n decomposePolyline,\n decomposeRectangle,\n decomposeRotatedRectangle,\n decomposeTriangle,\n} from \"./kinds/boxes.js\";\nimport {\n decomposeDisjointChannel,\n decomposeFlatTopBottom,\n decomposeRegressionTrend,\n decomposeTrendChannel,\n} from \"./kinds/channels.js\";\nimport { decomposeFrame, decomposeGroup, decomposeTable } from \"./kinds/containers.js\";\nimport { decomposeArc, decomposeCurve, decomposeDoubleCurve } from \"./kinds/curves.js\";\nimport { decomposeCyclicLines, decomposeSineLine, decomposeTimeCycles } from \"./kinds/cycles.js\";\nimport {\n decomposeElliottCorrectionWave,\n decomposeElliottDoubleCombo,\n decomposeElliottImpulseWave,\n decomposeElliottTriangleWave,\n decomposeElliottTripleCombo,\n} from \"./kinds/elliott.js\";\nimport {\n decomposeFibChannel,\n decomposeFibCircles,\n decomposeFibRetracement,\n decomposeFibSpeedArcs,\n decomposeFibSpeedFan,\n decomposeFibSpiral,\n decomposeFibTimeZone,\n decomposeFibTrendExtension,\n decomposeFibTrendTime,\n decomposeFibWedge,\n} from \"./kinds/fibonacci.js\";\nimport { decomposeBrush, decomposeHighlighter, decomposePen } from \"./kinds/freehand.js\";\nimport {\n decomposeGannBox,\n decomposeGannFan,\n decomposeGannSquare,\n decomposeGannSquareFixed,\n} from \"./kinds/gann.js\";\nimport {\n decomposeCrossLine,\n decomposeHorizontalLine,\n decomposeHorizontalRay,\n decomposeLine,\n decomposeTrendAngle,\n decomposeVerticalLine,\n} from \"./kinds/lines.js\";\nimport { decomposeMarker } from \"./kinds/marker.js\";\nimport {\n decomposeAbcdPattern,\n decomposeCypherPattern,\n decomposeHeadAndShoulders,\n decomposeThreeDrivesPattern,\n decomposeTrianglePattern,\n decomposeXabcdPattern,\n} from \"./kinds/patterns.js\";\nimport { decomposePitchfan, decomposePitchfork } from \"./kinds/pitchforks.js\";\nimport type { DrawPrimitive, Viewport } from \"./types.js\";\n\n/**\n * Reduce a {@link DrawingEmission} to a flat, renderer-agnostic\n * {@link DrawPrimitive} list against `view`. Pure — no `ctx`, no library\n * types — so every adapter shares one geometry derivation and paints\n * the result with its own sink.\n *\n * The switch is **exhaustive over all 63 `DrawingKind`s**: the 20 basic\n * kinds (Task 1), the 20 curve / freehand / channel / fibonacci kinds\n * (Task 2), and the 23 gann / pitchfork / pattern / elliott / cycle /\n * container / table kinds (Task 3). The `default` arm is a `const\n * _exhaustive: never` guard — it compiles only because every literal has\n * a `case`, so adding a future `DrawingKind` to core fails `pnpm\n * typecheck` here until a decomposer is added. `op: \"remove\"` is handled\n * by each adapter's drawing-state map (this function operates on whatever\n * `state` it is handed).\n *\n * @since 1.3\n * @stable\n * @example\n * declare const e: DrawingEmission;\n * declare const v: Viewport;\n * const prims = decomposeDrawing(e, v);\n * void prims;\n */\nexport function decomposeDrawing(e: DrawingEmission, view: Viewport): ReadonlyArray<DrawPrimitive> {\n switch (e.drawingKind) {\n case \"line\":\n return decomposeLine(e.state as LineState, view);\n case \"horizontal-line\":\n return decomposeHorizontalLine(e.state as HorizontalLineState, view);\n case \"horizontal-ray\":\n return decomposeHorizontalRay(e.state as HorizontalRayState, view);\n case \"vertical-line\":\n return decomposeVerticalLine(e.state as VerticalLineState, view);\n case \"cross-line\":\n return decomposeCrossLine(e.state as CrossLineState, view);\n case \"trend-angle\":\n return decomposeTrendAngle(e.state as TrendAngleState, view);\n case \"rectangle\":\n return decomposeRectangle(e.state as RectangleState, view);\n case \"rotated-rectangle\":\n return decomposeRotatedRectangle(e.state as RotatedRectangleState, view);\n case \"triangle\":\n return decomposeTriangle(e.state as TriangleState, view);\n case \"polyline\":\n return decomposePolyline(e.state as PolylineState, view);\n case \"circle\":\n return decomposeCircle(e.state as CircleState, view);\n case \"ellipse\":\n return decomposeEllipse(e.state as EllipseState, view);\n case \"path\":\n return decomposePath(e.state as PathState, view);\n case \"fill-between\":\n return decomposeFillBetween(e.state as FillBetweenState, view);\n case \"marker\":\n return decomposeMarker(e.state as MarkerState, view);\n case \"text\":\n return decomposeText(e.state as TextState, view);\n case \"arrow\":\n return decomposeArrow(e.state as ArrowState, view);\n case \"arrow-marker\":\n return decomposeArrowMarker(e.state as ArrowMarkerState, view);\n case \"arrow-mark-up\":\n return decomposeArrowMarkUp(e.state as ArrowMarkUpState, view);\n case \"arrow-mark-down\":\n return decomposeArrowMarkDown(e.state as ArrowMarkDownState, view);\n case \"arc\":\n return decomposeArc(e.state as ArcState, view);\n case \"curve\":\n return decomposeCurve(e.state as CurveState, view);\n case \"double-curve\":\n return decomposeDoubleCurve(e.state as DoubleCurveState, view);\n case \"pen\":\n return decomposePen(e.state as PenState, view);\n case \"highlighter\":\n return decomposeHighlighter(e.state as HighlighterState, view);\n case \"brush\":\n return decomposeBrush(e.state as BrushState, view);\n case \"trend-channel\":\n return decomposeTrendChannel(e.state as TrendChannelState, view);\n case \"flat-top-bottom\":\n return decomposeFlatTopBottom(e.state as FlatTopBottomState, view);\n case \"disjoint-channel\":\n return decomposeDisjointChannel(e.state as DisjointChannelState, view);\n case \"regression-trend\":\n return decomposeRegressionTrend(e.state as RegressionTrendState, view);\n case \"fib-retracement\":\n return decomposeFibRetracement(e.state as FibRetracementState, view);\n case \"fib-trend-extension\":\n return decomposeFibTrendExtension(e.state as FibTrendExtensionState, view);\n case \"fib-channel\":\n return decomposeFibChannel(e.state as FibChannelState, view);\n case \"fib-time-zone\":\n return decomposeFibTimeZone(e.state as FibTimeZoneState, view);\n case \"fib-wedge\":\n return decomposeFibWedge(e.state as FibWedgeState, view);\n case \"fib-speed-fan\":\n return decomposeFibSpeedFan(e.state as FibSpeedFanState, view);\n case \"fib-speed-arcs\":\n return decomposeFibSpeedArcs(e.state as FibSpeedArcsState, view);\n case \"fib-spiral\":\n return decomposeFibSpiral(e.state as FibSpiralState, view);\n case \"fib-circles\":\n return decomposeFibCircles(e.state as FibCirclesState, view);\n case \"fib-trend-time\":\n return decomposeFibTrendTime(e.state as FibTrendTimeState, view);\n case \"gann-box\":\n return decomposeGannBox(e.state as GannBoxState, view);\n case \"gann-square-fixed\":\n return decomposeGannSquareFixed(e.state as GannSquareFixedState, view);\n case \"gann-square\":\n return decomposeGannSquare(e.state as GannSquareState, view);\n case \"gann-fan\":\n return decomposeGannFan(e.state as GannFanState, view);\n case \"pitchfork\":\n return decomposePitchfork(e.state as PitchforkState, view);\n case \"pitchfan\":\n return decomposePitchfan(e.state as PitchfanState, view);\n case \"xabcd-pattern\":\n return decomposeXabcdPattern(e.state as XabcdPatternState, view);\n case \"cypher-pattern\":\n return decomposeCypherPattern(e.state as CypherPatternState, view);\n case \"head-and-shoulders\":\n return decomposeHeadAndShoulders(e.state as HeadAndShouldersState, view);\n case \"abcd-pattern\":\n return decomposeAbcdPattern(e.state as AbcdPatternState, view);\n case \"triangle-pattern\":\n return decomposeTrianglePattern(e.state as TrianglePatternState, view);\n case \"three-drives-pattern\":\n return decomposeThreeDrivesPattern(e.state as ThreeDrivesPatternState, view);\n case \"elliott-impulse-wave\":\n return decomposeElliottImpulseWave(e.state as ElliottImpulseWaveState, view);\n case \"elliott-correction-wave\":\n return decomposeElliottCorrectionWave(e.state as ElliottCorrectionWaveState, view);\n case \"elliott-triangle-wave\":\n return decomposeElliottTriangleWave(e.state as ElliottTriangleWaveState, view);\n case \"elliott-double-combo\":\n return decomposeElliottDoubleCombo(e.state as ElliottDoubleComboState, view);\n case \"elliott-triple-combo\":\n return decomposeElliottTripleCombo(e.state as ElliottTripleComboState, view);\n case \"cyclic-lines\":\n return decomposeCyclicLines(e.state as CyclicLinesState, view);\n case \"time-cycles\":\n return decomposeTimeCycles(e.state as TimeCyclesState, view);\n case \"sine-line\":\n return decomposeSineLine(e.state as SineLineState, view);\n case \"group\":\n return decomposeGroup(e.state as GroupState, view);\n case \"frame\":\n return decomposeFrame(e.state as FrameState, view);\n case \"table\":\n return decomposeTable(e.state as TableState, view);\n default: {\n const _exhaustive: never = e.drawingKind;\n void _exhaustive;\n return [];\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/geometry/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
export { decomposeDrawing } from "./decompose.js";
|
|
4
|
+
export { priceToY, timeToX, worldPointToPixel } from "./project.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geometry/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nexport { decomposeDrawing } from \"./decompose.js\";\nexport { priceToY, timeToX, worldPointToPixel } from \"./project.js\";\nexport type { DrawPrimitive, FillStyle, Point2, StrokeStyle, Viewport } from \"./types.js\";\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ArrowMarkDownState, ArrowMarkUpState, ArrowMarkerState, ArrowState, TextState } from "@invinite-org/chartlang-core";
|
|
2
|
+
import type { DrawPrimitive, Viewport } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Decompose a `text` drawing — a single label at the projected anchor,
|
|
5
|
+
* its font / alignment / colour resolved from `TextOpts`. `bgColor` is
|
|
6
|
+
* carried through onto the IR `text` primitive (adapters that can paint
|
|
7
|
+
* a background rect may use it; the canvas sink ignores it).
|
|
8
|
+
*
|
|
9
|
+
* @since 1.3
|
|
10
|
+
* @stable
|
|
11
|
+
* @example
|
|
12
|
+
* declare const s: TextState;
|
|
13
|
+
* declare const v: Viewport;
|
|
14
|
+
* const prims = decomposeText(s, v);
|
|
15
|
+
* // prims[0].kind === "text"
|
|
16
|
+
* void prims;
|
|
17
|
+
*/
|
|
18
|
+
export declare function decomposeText(state: TextState, view: Viewport): ReadonlyArray<DrawPrimitive>;
|
|
19
|
+
/**
|
|
20
|
+
* Decompose an `arrow` drawing — a stroked shaft, a filled arrowhead
|
|
21
|
+
* triangle at the head anchor, and an optional label at the shaft
|
|
22
|
+
* midpoint. Stroke and arrowhead fill share `style.color`.
|
|
23
|
+
*
|
|
24
|
+
* @since 1.3
|
|
25
|
+
* @stable
|
|
26
|
+
* @example
|
|
27
|
+
* declare const s: ArrowState;
|
|
28
|
+
* declare const v: Viewport;
|
|
29
|
+
* const prims = decomposeArrow(s, v);
|
|
30
|
+
* // prims[0].kind === "polyline"; prims[1].kind === "polyline"
|
|
31
|
+
* void prims;
|
|
32
|
+
*/
|
|
33
|
+
export declare function decomposeArrow(state: ArrowState, view: Viewport): ReadonlyArray<DrawPrimitive>;
|
|
34
|
+
/**
|
|
35
|
+
* Decompose an `arrow-marker` drawing — a self-contained compact glyph
|
|
36
|
+
* at the anchor: a filled dot, a short stub up + right, a filled
|
|
37
|
+
* arrowhead at the stub end, and optional text to the right. Default
|
|
38
|
+
* colour is `"#3b82f6"` (invinite toolbar blue).
|
|
39
|
+
*
|
|
40
|
+
* @since 1.3
|
|
41
|
+
* @stable
|
|
42
|
+
* @example
|
|
43
|
+
* declare const s: ArrowMarkerState;
|
|
44
|
+
* declare const v: Viewport;
|
|
45
|
+
* const prims = decomposeArrowMarker(s, v);
|
|
46
|
+
* void prims;
|
|
47
|
+
*/
|
|
48
|
+
export declare function decomposeArrowMarker(state: ArrowMarkerState, view: Viewport): ReadonlyArray<DrawPrimitive>;
|
|
49
|
+
/**
|
|
50
|
+
* Decompose an `arrow-mark-up` drawing — a filled up-chevron glyph at
|
|
51
|
+
* the anchor. Default fill colour is `"#22c55e"` (green); an explicit
|
|
52
|
+
* `style.color` overrides.
|
|
53
|
+
*
|
|
54
|
+
* @since 1.3
|
|
55
|
+
* @stable
|
|
56
|
+
* @example
|
|
57
|
+
* declare const s: ArrowMarkUpState;
|
|
58
|
+
* declare const v: Viewport;
|
|
59
|
+
* const prims = decomposeArrowMarkUp(s, v);
|
|
60
|
+
* void prims;
|
|
61
|
+
*/
|
|
62
|
+
export declare function decomposeArrowMarkUp(state: ArrowMarkUpState, view: Viewport): ReadonlyArray<DrawPrimitive>;
|
|
63
|
+
/**
|
|
64
|
+
* Decompose an `arrow-mark-down` drawing — a filled down-chevron glyph
|
|
65
|
+
* at the anchor. Default fill colour is `"#ef4444"` (red); an explicit
|
|
66
|
+
* `style.color` overrides.
|
|
67
|
+
*
|
|
68
|
+
* @since 1.3
|
|
69
|
+
* @stable
|
|
70
|
+
* @example
|
|
71
|
+
* declare const s: ArrowMarkDownState;
|
|
72
|
+
* declare const v: Viewport;
|
|
73
|
+
* const prims = decomposeArrowMarkDown(s, v);
|
|
74
|
+
* void prims;
|
|
75
|
+
*/
|
|
76
|
+
export declare function decomposeArrowMarkDown(state: ArrowMarkDownState, view: Viewport): ReadonlyArray<DrawPrimitive>;
|
|
77
|
+
//# sourceMappingURL=annotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../../src/geometry/kinds/annotations.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACR,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACZ,MAAM,8BAA8B,CAAC;AAOtC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiB3D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,CAgB5F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,CAmC9F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,QAAQ,GACf,aAAa,CAAC,aAAa,CAAC,CAyC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,QAAQ,GACf,aAAa,CAAC,aAAa,CAAC,CAW9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,QAAQ,GACf,aAAa,CAAC,aAAa,CAAC,CAW9B"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
//
|
|
4
|
+
// Annotation geometry moved from the canvas2d adapter's per-kind
|
|
5
|
+
// renderers
|
|
6
|
+
// examples/canvas2d-adapter/src/render/draw/{text,arrow,arrowMarker,
|
|
7
|
+
// arrowMarkUp,arrowMarkDown}.ts.
|
|
8
|
+
// The originating math is invinite's text / arrow / arrow-marker /
|
|
9
|
+
// arrow-mark-up / arrow-mark-down tools (commit
|
|
10
|
+
// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite); re-licensed
|
|
11
|
+
// MIT for chartlang.
|
|
12
|
+
import { arrowheadPolygon } from "../_lib/arrowhead.js";
|
|
13
|
+
import { chevronPolygon } from "../_lib/chevron.js";
|
|
14
|
+
import { dashPattern } from "../_lib/dash.js";
|
|
15
|
+
import { resolveTextOpts } from "../_lib/textStyle.js";
|
|
16
|
+
import { worldPointToPixel } from "../project.js";
|
|
17
|
+
const DEFAULT_LINE_COLOR = "#000000";
|
|
18
|
+
const DEFAULT_LINE_WIDTH = 1;
|
|
19
|
+
const DEFAULT_ARROW_MARKER_COLOR = "#3b82f6"; // invinite toolbar blue
|
|
20
|
+
const DEFAULT_MARK_UP_COLOR = "#22c55e";
|
|
21
|
+
const DEFAULT_MARK_DOWN_COLOR = "#ef4444";
|
|
22
|
+
const SOLID_FILL_ALPHA = 1;
|
|
23
|
+
const ARROW_LABEL_FONT = "12px sans-serif";
|
|
24
|
+
const ARROW_LABEL_VERTICAL_OFFSET = 4;
|
|
25
|
+
const MARKER_DOT_RADIUS = 3;
|
|
26
|
+
const MARKER_STUB_DX = 16;
|
|
27
|
+
const MARKER_STUB_DY = -8;
|
|
28
|
+
const MARKER_TEXT_OFFSET_X = 6;
|
|
29
|
+
const MARKER_TEXT_FONT = "12px sans-serif";
|
|
30
|
+
const TWO_PI = Math.PI * 2;
|
|
31
|
+
/**
|
|
32
|
+
* Decompose a `text` drawing — a single label at the projected anchor,
|
|
33
|
+
* its font / alignment / colour resolved from `TextOpts`. `bgColor` is
|
|
34
|
+
* carried through onto the IR `text` primitive (adapters that can paint
|
|
35
|
+
* a background rect may use it; the canvas sink ignores it).
|
|
36
|
+
*
|
|
37
|
+
* @since 1.3
|
|
38
|
+
* @stable
|
|
39
|
+
* @example
|
|
40
|
+
* declare const s: TextState;
|
|
41
|
+
* declare const v: Viewport;
|
|
42
|
+
* const prims = decomposeText(s, v);
|
|
43
|
+
* // prims[0].kind === "text"
|
|
44
|
+
* void prims;
|
|
45
|
+
*/
|
|
46
|
+
export function decomposeText(state, view) {
|
|
47
|
+
const anchor = worldPointToPixel(state.anchor, view);
|
|
48
|
+
const resolved = resolveTextOpts(state.style);
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
kind: "text",
|
|
52
|
+
x: anchor.x,
|
|
53
|
+
y: anchor.y,
|
|
54
|
+
text: state.body,
|
|
55
|
+
color: resolved.color,
|
|
56
|
+
font: resolved.font,
|
|
57
|
+
align: resolved.align,
|
|
58
|
+
baseline: resolved.baseline,
|
|
59
|
+
...(state.style.bgColor === undefined ? {} : { bgColor: state.style.bgColor }),
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Decompose an `arrow` drawing — a stroked shaft, a filled arrowhead
|
|
65
|
+
* triangle at the head anchor, and an optional label at the shaft
|
|
66
|
+
* midpoint. Stroke and arrowhead fill share `style.color`.
|
|
67
|
+
*
|
|
68
|
+
* @since 1.3
|
|
69
|
+
* @stable
|
|
70
|
+
* @example
|
|
71
|
+
* declare const s: ArrowState;
|
|
72
|
+
* declare const v: Viewport;
|
|
73
|
+
* const prims = decomposeArrow(s, v);
|
|
74
|
+
* // prims[0].kind === "polyline"; prims[1].kind === "polyline"
|
|
75
|
+
* void prims;
|
|
76
|
+
*/
|
|
77
|
+
export function decomposeArrow(state, view) {
|
|
78
|
+
const from = worldPointToPixel(state.anchors[0], view);
|
|
79
|
+
const to = worldPointToPixel(state.anchors[1], view);
|
|
80
|
+
const color = state.style.color ?? DEFAULT_LINE_COLOR;
|
|
81
|
+
const out = [
|
|
82
|
+
{
|
|
83
|
+
kind: "polyline",
|
|
84
|
+
points: [from, to],
|
|
85
|
+
closed: false,
|
|
86
|
+
stroke: {
|
|
87
|
+
color,
|
|
88
|
+
width: state.style.lineWidth ?? DEFAULT_LINE_WIDTH,
|
|
89
|
+
dash: dashPattern(state.style.lineStyle ?? "solid"),
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
kind: "polyline",
|
|
94
|
+
points: arrowheadPolygon(from, to),
|
|
95
|
+
closed: true,
|
|
96
|
+
fill: { color, alpha: SOLID_FILL_ALPHA },
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
if (state.style.label !== undefined) {
|
|
100
|
+
out.push({
|
|
101
|
+
kind: "text",
|
|
102
|
+
x: (from.x + to.x) / 2,
|
|
103
|
+
y: (from.y + to.y) / 2 - ARROW_LABEL_VERTICAL_OFFSET,
|
|
104
|
+
text: state.style.label,
|
|
105
|
+
color,
|
|
106
|
+
font: ARROW_LABEL_FONT,
|
|
107
|
+
align: "center",
|
|
108
|
+
baseline: "bottom",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Decompose an `arrow-marker` drawing — a self-contained compact glyph
|
|
115
|
+
* at the anchor: a filled dot, a short stub up + right, a filled
|
|
116
|
+
* arrowhead at the stub end, and optional text to the right. Default
|
|
117
|
+
* colour is `"#3b82f6"` (invinite toolbar blue).
|
|
118
|
+
*
|
|
119
|
+
* @since 1.3
|
|
120
|
+
* @stable
|
|
121
|
+
* @example
|
|
122
|
+
* declare const s: ArrowMarkerState;
|
|
123
|
+
* declare const v: Viewport;
|
|
124
|
+
* const prims = decomposeArrowMarker(s, v);
|
|
125
|
+
* void prims;
|
|
126
|
+
*/
|
|
127
|
+
export function decomposeArrowMarker(state, view) {
|
|
128
|
+
const anchor = worldPointToPixel(state.anchor, view);
|
|
129
|
+
const color = state.style.color ?? DEFAULT_ARROW_MARKER_COLOR;
|
|
130
|
+
const stubEnd = { x: anchor.x + MARKER_STUB_DX, y: anchor.y + MARKER_STUB_DY };
|
|
131
|
+
const out = [
|
|
132
|
+
{
|
|
133
|
+
kind: "arc",
|
|
134
|
+
cx: anchor.x,
|
|
135
|
+
cy: anchor.y,
|
|
136
|
+
r: MARKER_DOT_RADIUS,
|
|
137
|
+
start: 0,
|
|
138
|
+
end: TWO_PI,
|
|
139
|
+
closed: false,
|
|
140
|
+
fill: { color, alpha: SOLID_FILL_ALPHA },
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
kind: "polyline",
|
|
144
|
+
points: [anchor, stubEnd],
|
|
145
|
+
closed: false,
|
|
146
|
+
stroke: { color, width: DEFAULT_LINE_WIDTH, dash: dashPattern("solid") },
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
kind: "polyline",
|
|
150
|
+
points: arrowheadPolygon(anchor, stubEnd),
|
|
151
|
+
closed: true,
|
|
152
|
+
fill: { color, alpha: SOLID_FILL_ALPHA },
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
if (state.style.text !== undefined) {
|
|
156
|
+
out.push({
|
|
157
|
+
kind: "text",
|
|
158
|
+
x: anchor.x + MARKER_TEXT_OFFSET_X,
|
|
159
|
+
y: anchor.y,
|
|
160
|
+
text: state.style.text,
|
|
161
|
+
color,
|
|
162
|
+
font: MARKER_TEXT_FONT,
|
|
163
|
+
align: "left",
|
|
164
|
+
baseline: "middle",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Decompose an `arrow-mark-up` drawing — a filled up-chevron glyph at
|
|
171
|
+
* the anchor. Default fill colour is `"#22c55e"` (green); an explicit
|
|
172
|
+
* `style.color` overrides.
|
|
173
|
+
*
|
|
174
|
+
* @since 1.3
|
|
175
|
+
* @stable
|
|
176
|
+
* @example
|
|
177
|
+
* declare const s: ArrowMarkUpState;
|
|
178
|
+
* declare const v: Viewport;
|
|
179
|
+
* const prims = decomposeArrowMarkUp(s, v);
|
|
180
|
+
* void prims;
|
|
181
|
+
*/
|
|
182
|
+
export function decomposeArrowMarkUp(state, view) {
|
|
183
|
+
const anchor = worldPointToPixel(state.anchor, view);
|
|
184
|
+
const color = state.style.color ?? DEFAULT_MARK_UP_COLOR;
|
|
185
|
+
return [
|
|
186
|
+
{
|
|
187
|
+
kind: "polyline",
|
|
188
|
+
points: chevronPolygon(anchor, "up"),
|
|
189
|
+
closed: true,
|
|
190
|
+
fill: { color, alpha: SOLID_FILL_ALPHA },
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Decompose an `arrow-mark-down` drawing — a filled down-chevron glyph
|
|
196
|
+
* at the anchor. Default fill colour is `"#ef4444"` (red); an explicit
|
|
197
|
+
* `style.color` overrides.
|
|
198
|
+
*
|
|
199
|
+
* @since 1.3
|
|
200
|
+
* @stable
|
|
201
|
+
* @example
|
|
202
|
+
* declare const s: ArrowMarkDownState;
|
|
203
|
+
* declare const v: Viewport;
|
|
204
|
+
* const prims = decomposeArrowMarkDown(s, v);
|
|
205
|
+
* void prims;
|
|
206
|
+
*/
|
|
207
|
+
export function decomposeArrowMarkDown(state, view) {
|
|
208
|
+
const anchor = worldPointToPixel(state.anchor, view);
|
|
209
|
+
const color = state.style.color ?? DEFAULT_MARK_DOWN_COLOR;
|
|
210
|
+
return [
|
|
211
|
+
{
|
|
212
|
+
kind: "polyline",
|
|
213
|
+
points: chevronPolygon(anchor, "down"),
|
|
214
|
+
closed: true,
|
|
215
|
+
fill: { color, alpha: SOLID_FILL_ALPHA },
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../../src/geometry/kinds/annotations.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Annotation geometry moved from the canvas2d adapter's per-kind\n// renderers\n// examples/canvas2d-adapter/src/render/draw/{text,arrow,arrowMarker,\n// arrowMarkUp,arrowMarkDown}.ts.\n// The originating math is invinite's text / arrow / arrow-marker /\n// arrow-mark-up / arrow-mark-down tools (commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite); re-licensed\n// MIT for chartlang.\n\nimport type {\n ArrowMarkDownState,\n ArrowMarkUpState,\n ArrowMarkerState,\n ArrowState,\n TextState,\n} from \"@invinite-org/chartlang-core\";\n\nimport { arrowheadPolygon } from \"../_lib/arrowhead.js\";\nimport { chevronPolygon } from \"../_lib/chevron.js\";\nimport { dashPattern } from \"../_lib/dash.js\";\nimport { resolveTextOpts } from \"../_lib/textStyle.js\";\nimport { worldPointToPixel } from \"../project.js\";\nimport type { DrawPrimitive, Viewport } from \"../types.js\";\n\nconst DEFAULT_LINE_COLOR = \"#000000\";\nconst DEFAULT_LINE_WIDTH = 1;\nconst DEFAULT_ARROW_MARKER_COLOR = \"#3b82f6\"; // invinite toolbar blue\nconst DEFAULT_MARK_UP_COLOR = \"#22c55e\";\nconst DEFAULT_MARK_DOWN_COLOR = \"#ef4444\";\nconst SOLID_FILL_ALPHA = 1;\nconst ARROW_LABEL_FONT = \"12px sans-serif\";\nconst ARROW_LABEL_VERTICAL_OFFSET = 4;\nconst MARKER_DOT_RADIUS = 3;\nconst MARKER_STUB_DX = 16;\nconst MARKER_STUB_DY = -8;\nconst MARKER_TEXT_OFFSET_X = 6;\nconst MARKER_TEXT_FONT = \"12px sans-serif\";\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Decompose a `text` drawing — a single label at the projected anchor,\n * its font / alignment / colour resolved from `TextOpts`. `bgColor` is\n * carried through onto the IR `text` primitive (adapters that can paint\n * a background rect may use it; the canvas sink ignores it).\n *\n * @since 1.3\n * @stable\n * @example\n * declare const s: TextState;\n * declare const v: Viewport;\n * const prims = decomposeText(s, v);\n * // prims[0].kind === \"text\"\n * void prims;\n */\nexport function decomposeText(state: TextState, view: Viewport): ReadonlyArray<DrawPrimitive> {\n const anchor = worldPointToPixel(state.anchor, view);\n const resolved = resolveTextOpts(state.style);\n return [\n {\n kind: \"text\",\n x: anchor.x,\n y: anchor.y,\n text: state.body,\n color: resolved.color,\n font: resolved.font,\n align: resolved.align,\n baseline: resolved.baseline,\n ...(state.style.bgColor === undefined ? {} : { bgColor: state.style.bgColor }),\n },\n ];\n}\n\n/**\n * Decompose an `arrow` drawing — a stroked shaft, a filled arrowhead\n * triangle at the head anchor, and an optional label at the shaft\n * midpoint. Stroke and arrowhead fill share `style.color`.\n *\n * @since 1.3\n * @stable\n * @example\n * declare const s: ArrowState;\n * declare const v: Viewport;\n * const prims = decomposeArrow(s, v);\n * // prims[0].kind === \"polyline\"; prims[1].kind === \"polyline\"\n * void prims;\n */\nexport function decomposeArrow(state: ArrowState, view: Viewport): ReadonlyArray<DrawPrimitive> {\n const from = worldPointToPixel(state.anchors[0], view);\n const to = worldPointToPixel(state.anchors[1], view);\n const color = state.style.color ?? DEFAULT_LINE_COLOR;\n const out: DrawPrimitive[] = [\n {\n kind: \"polyline\",\n points: [from, to],\n closed: false,\n stroke: {\n color,\n width: state.style.lineWidth ?? DEFAULT_LINE_WIDTH,\n dash: dashPattern(state.style.lineStyle ?? \"solid\"),\n },\n },\n {\n kind: \"polyline\",\n points: arrowheadPolygon(from, to),\n closed: true,\n fill: { color, alpha: SOLID_FILL_ALPHA },\n },\n ];\n if (state.style.label !== undefined) {\n out.push({\n kind: \"text\",\n x: (from.x + to.x) / 2,\n y: (from.y + to.y) / 2 - ARROW_LABEL_VERTICAL_OFFSET,\n text: state.style.label,\n color,\n font: ARROW_LABEL_FONT,\n align: \"center\",\n baseline: \"bottom\",\n });\n }\n return out;\n}\n\n/**\n * Decompose an `arrow-marker` drawing — a self-contained compact glyph\n * at the anchor: a filled dot, a short stub up + right, a filled\n * arrowhead at the stub end, and optional text to the right. Default\n * colour is `\"#3b82f6\"` (invinite toolbar blue).\n *\n * @since 1.3\n * @stable\n * @example\n * declare const s: ArrowMarkerState;\n * declare const v: Viewport;\n * const prims = decomposeArrowMarker(s, v);\n * void prims;\n */\nexport function decomposeArrowMarker(\n state: ArrowMarkerState,\n view: Viewport,\n): ReadonlyArray<DrawPrimitive> {\n const anchor = worldPointToPixel(state.anchor, view);\n const color = state.style.color ?? DEFAULT_ARROW_MARKER_COLOR;\n const stubEnd = { x: anchor.x + MARKER_STUB_DX, y: anchor.y + MARKER_STUB_DY };\n const out: DrawPrimitive[] = [\n {\n kind: \"arc\",\n cx: anchor.x,\n cy: anchor.y,\n r: MARKER_DOT_RADIUS,\n start: 0,\n end: TWO_PI,\n closed: false,\n fill: { color, alpha: SOLID_FILL_ALPHA },\n },\n {\n kind: \"polyline\",\n points: [anchor, stubEnd],\n closed: false,\n stroke: { color, width: DEFAULT_LINE_WIDTH, dash: dashPattern(\"solid\") },\n },\n {\n kind: \"polyline\",\n points: arrowheadPolygon(anchor, stubEnd),\n closed: true,\n fill: { color, alpha: SOLID_FILL_ALPHA },\n },\n ];\n if (state.style.text !== undefined) {\n out.push({\n kind: \"text\",\n x: anchor.x + MARKER_TEXT_OFFSET_X,\n y: anchor.y,\n text: state.style.text,\n color,\n font: MARKER_TEXT_FONT,\n align: \"left\",\n baseline: \"middle\",\n });\n }\n return out;\n}\n\n/**\n * Decompose an `arrow-mark-up` drawing — a filled up-chevron glyph at\n * the anchor. Default fill colour is `\"#22c55e\"` (green); an explicit\n * `style.color` overrides.\n *\n * @since 1.3\n * @stable\n * @example\n * declare const s: ArrowMarkUpState;\n * declare const v: Viewport;\n * const prims = decomposeArrowMarkUp(s, v);\n * void prims;\n */\nexport function decomposeArrowMarkUp(\n state: ArrowMarkUpState,\n view: Viewport,\n): ReadonlyArray<DrawPrimitive> {\n const anchor = worldPointToPixel(state.anchor, view);\n const color = state.style.color ?? DEFAULT_MARK_UP_COLOR;\n return [\n {\n kind: \"polyline\",\n points: chevronPolygon(anchor, \"up\"),\n closed: true,\n fill: { color, alpha: SOLID_FILL_ALPHA },\n },\n ];\n}\n\n/**\n * Decompose an `arrow-mark-down` drawing — a filled down-chevron glyph\n * at the anchor. Default fill colour is `\"#ef4444\"` (red); an explicit\n * `style.color` overrides.\n *\n * @since 1.3\n * @stable\n * @example\n * declare const s: ArrowMarkDownState;\n * declare const v: Viewport;\n * const prims = decomposeArrowMarkDown(s, v);\n * void prims;\n */\nexport function decomposeArrowMarkDown(\n state: ArrowMarkDownState,\n view: Viewport,\n): ReadonlyArray<DrawPrimitive> {\n const anchor = worldPointToPixel(state.anchor, view);\n const color = state.style.color ?? DEFAULT_MARK_DOWN_COLOR;\n return [\n {\n kind: \"polyline\",\n points: chevronPolygon(anchor, \"down\"),\n closed: true,\n fill: { color, alpha: SOLID_FILL_ALPHA },\n },\n ];\n}\n"]}
|