@invinite-org/chartlang-adapter-kit 1.3.0 → 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.
Files changed (143) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +7 -0
  3. package/dist/canvas/index.d.ts +5 -0
  4. package/dist/canvas/index.d.ts.map +1 -0
  5. package/dist/canvas/index.js +5 -0
  6. package/dist/canvas/index.js.map +1 -0
  7. package/dist/canvas/mockContext.d.ts +168 -0
  8. package/dist/canvas/mockContext.d.ts.map +1 -0
  9. package/dist/canvas/mockContext.js +198 -0
  10. package/dist/canvas/mockContext.js.map +1 -0
  11. package/dist/canvas/paintPrimitive.d.ts +35 -0
  12. package/dist/canvas/paintPrimitive.d.ts.map +1 -0
  13. package/dist/canvas/paintPrimitive.js +171 -0
  14. package/dist/canvas/paintPrimitive.js.map +1 -0
  15. package/dist/canvas/renderCtx.d.ts +40 -0
  16. package/dist/canvas/renderCtx.d.ts.map +1 -0
  17. package/dist/canvas/renderCtx.js +4 -0
  18. package/dist/canvas/renderCtx.js.map +1 -0
  19. package/dist/geometry/_lib/arrowhead.d.ts +18 -0
  20. package/dist/geometry/_lib/arrowhead.d.ts.map +1 -0
  21. package/dist/geometry/_lib/arrowhead.js +38 -0
  22. package/dist/geometry/_lib/arrowhead.js.map +1 -0
  23. package/dist/geometry/_lib/bezier.d.ts +57 -0
  24. package/dist/geometry/_lib/bezier.d.ts.map +1 -0
  25. package/dist/geometry/_lib/bezier.js +84 -0
  26. package/dist/geometry/_lib/bezier.js.map +1 -0
  27. package/dist/geometry/_lib/chevron.d.ts +29 -0
  28. package/dist/geometry/_lib/chevron.d.ts.map +1 -0
  29. package/dist/geometry/_lib/chevron.js +37 -0
  30. package/dist/geometry/_lib/chevron.js.map +1 -0
  31. package/dist/geometry/_lib/dash.d.ts +30 -0
  32. package/dist/geometry/_lib/dash.d.ts.map +1 -0
  33. package/dist/geometry/_lib/dash.js +40 -0
  34. package/dist/geometry/_lib/dash.js.map +1 -0
  35. package/dist/geometry/_lib/fibLevels.d.ts +36 -0
  36. package/dist/geometry/_lib/fibLevels.d.ts.map +1 -0
  37. package/dist/geometry/_lib/fibLevels.js +44 -0
  38. package/dist/geometry/_lib/fibLevels.js.map +1 -0
  39. package/dist/geometry/_lib/gannLevels.d.ts +54 -0
  40. package/dist/geometry/_lib/gannLevels.d.ts.map +1 -0
  41. package/dist/geometry/_lib/gannLevels.js +88 -0
  42. package/dist/geometry/_lib/gannLevels.js.map +1 -0
  43. package/dist/geometry/_lib/lineExtend.d.ts +31 -0
  44. package/dist/geometry/_lib/lineExtend.d.ts.map +1 -0
  45. package/dist/geometry/_lib/lineExtend.js +48 -0
  46. package/dist/geometry/_lib/lineExtend.js.map +1 -0
  47. package/dist/geometry/_lib/namedPolyline.d.ts +25 -0
  48. package/dist/geometry/_lib/namedPolyline.d.ts.map +1 -0
  49. package/dist/geometry/_lib/namedPolyline.js +64 -0
  50. package/dist/geometry/_lib/namedPolyline.js.map +1 -0
  51. package/dist/geometry/_lib/pitchforkGeom.d.ts +46 -0
  52. package/dist/geometry/_lib/pitchforkGeom.d.ts.map +1 -0
  53. package/dist/geometry/_lib/pitchforkGeom.js +70 -0
  54. package/dist/geometry/_lib/pitchforkGeom.js.map +1 -0
  55. package/dist/geometry/_lib/shapeStyle.d.ts +21 -0
  56. package/dist/geometry/_lib/shapeStyle.d.ts.map +1 -0
  57. package/dist/geometry/_lib/shapeStyle.js +41 -0
  58. package/dist/geometry/_lib/shapeStyle.js.map +1 -0
  59. package/dist/geometry/_lib/strokeStyle.d.ts +34 -0
  60. package/dist/geometry/_lib/strokeStyle.d.ts.map +1 -0
  61. package/dist/geometry/_lib/strokeStyle.js +26 -0
  62. package/dist/geometry/_lib/strokeStyle.js.map +1 -0
  63. package/dist/geometry/_lib/textStyle.d.ts +70 -0
  64. package/dist/geometry/_lib/textStyle.d.ts.map +1 -0
  65. package/dist/geometry/_lib/textStyle.js +78 -0
  66. package/dist/geometry/_lib/textStyle.js.map +1 -0
  67. package/dist/geometry/decompose.d.ts +28 -0
  68. package/dist/geometry/decompose.d.ts.map +1 -0
  69. package/dist/geometry/decompose.js +176 -0
  70. package/dist/geometry/decompose.js.map +1 -0
  71. package/dist/geometry/index.d.ts +4 -0
  72. package/dist/geometry/index.d.ts.map +1 -0
  73. package/dist/geometry/index.js +5 -0
  74. package/dist/geometry/index.js.map +1 -0
  75. package/dist/geometry/kinds/annotations.d.ts +77 -0
  76. package/dist/geometry/kinds/annotations.d.ts.map +1 -0
  77. package/dist/geometry/kinds/annotations.js +219 -0
  78. package/dist/geometry/kinds/annotations.js.map +1 -0
  79. package/dist/geometry/kinds/boxes.d.ts +116 -0
  80. package/dist/geometry/kinds/boxes.d.ts.map +1 -0
  81. package/dist/geometry/kinds/boxes.js +285 -0
  82. package/dist/geometry/kinds/boxes.js.map +1 -0
  83. package/dist/geometry/kinds/channels.d.ts +72 -0
  84. package/dist/geometry/kinds/channels.d.ts.map +1 -0
  85. package/dist/geometry/kinds/channels.js +148 -0
  86. package/dist/geometry/kinds/channels.js.map +1 -0
  87. package/dist/geometry/kinds/containers.d.ts +54 -0
  88. package/dist/geometry/kinds/containers.d.ts.map +1 -0
  89. package/dist/geometry/kinds/containers.js +268 -0
  90. package/dist/geometry/kinds/containers.js.map +1 -0
  91. package/dist/geometry/kinds/curves.d.ts +53 -0
  92. package/dist/geometry/kinds/curves.d.ts.map +1 -0
  93. package/dist/geometry/kinds/curves.js +110 -0
  94. package/dist/geometry/kinds/curves.js.map +1 -0
  95. package/dist/geometry/kinds/cycles.d.ts +52 -0
  96. package/dist/geometry/kinds/cycles.d.ts.map +1 -0
  97. package/dist/geometry/kinds/cycles.js +158 -0
  98. package/dist/geometry/kinds/cycles.js.map +1 -0
  99. package/dist/geometry/kinds/elliott.d.ts +73 -0
  100. package/dist/geometry/kinds/elliott.d.ts.map +1 -0
  101. package/dist/geometry/kinds/elliott.js +116 -0
  102. package/dist/geometry/kinds/elliott.js.map +1 -0
  103. package/dist/geometry/kinds/fibonacci.d.ts +166 -0
  104. package/dist/geometry/kinds/fibonacci.d.ts.map +1 -0
  105. package/dist/geometry/kinds/fibonacci.js +458 -0
  106. package/dist/geometry/kinds/fibonacci.js.map +1 -0
  107. package/dist/geometry/kinds/freehand.d.ts +53 -0
  108. package/dist/geometry/kinds/freehand.d.ts.map +1 -0
  109. package/dist/geometry/kinds/freehand.js +115 -0
  110. package/dist/geometry/kinds/freehand.js.map +1 -0
  111. package/dist/geometry/kinds/gann.d.ts +63 -0
  112. package/dist/geometry/kinds/gann.d.ts.map +1 -0
  113. package/dist/geometry/kinds/gann.js +153 -0
  114. package/dist/geometry/kinds/gann.js.map +1 -0
  115. package/dist/geometry/kinds/lines.d.ts +90 -0
  116. package/dist/geometry/kinds/lines.d.ts.map +1 -0
  117. package/dist/geometry/kinds/lines.js +201 -0
  118. package/dist/geometry/kinds/lines.js.map +1 -0
  119. package/dist/geometry/kinds/marker.d.ts +21 -0
  120. package/dist/geometry/kinds/marker.d.ts.map +1 -0
  121. package/dist/geometry/kinds/marker.js +47 -0
  122. package/dist/geometry/kinds/marker.js.map +1 -0
  123. package/dist/geometry/kinds/patterns.d.ts +85 -0
  124. package/dist/geometry/kinds/patterns.d.ts.map +1 -0
  125. package/dist/geometry/kinds/patterns.js +133 -0
  126. package/dist/geometry/kinds/patterns.js.map +1 -0
  127. package/dist/geometry/kinds/pitchforks.d.ts +36 -0
  128. package/dist/geometry/kinds/pitchforks.d.ts.map +1 -0
  129. package/dist/geometry/kinds/pitchforks.js +109 -0
  130. package/dist/geometry/kinds/pitchforks.js.map +1 -0
  131. package/dist/geometry/project.d.ts +50 -0
  132. package/dist/geometry/project.d.ts.map +1 -0
  133. package/dist/geometry/project.js +62 -0
  134. package/dist/geometry/project.js.map +1 -0
  135. package/dist/geometry/types.d.ts +146 -0
  136. package/dist/geometry/types.d.ts.map +1 -0
  137. package/dist/geometry/types.js +4 -0
  138. package/dist/geometry/types.js.map +1 -0
  139. package/dist/index.d.ts +2 -0
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +1 -0
  142. package/dist/index.js.map +1 -1
  143. package/package.json +8 -1
@@ -0,0 +1,41 @@
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
+ // Stroke + fill semantics ported from the per-tool style application
5
+ // in invinite/src/components/trading-chart/tools/rectangle-tool.ts,
6
+ // triangle-tool.ts, rotated-rectangle-tool.ts (commit
7
+ // 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite). Re-licensed
8
+ // MIT for chartlang.
9
+ import { dashPattern } from "./dash.js";
10
+ const DEFAULT_STROKE = "#000000";
11
+ const DEFAULT_LINE_WIDTH = 1;
12
+ const DEFAULT_FILL_ALPHA = 1;
13
+ /**
14
+ * Resolved {@link ShapeStyle} → IR styles. `stroke` is always present
15
+ * (defaults `"#000000"` / `1` / solid); `fill` is present only when the
16
+ * source `style.fill` is set, with `alpha` defaulting to `1`. The
17
+ * box / shape decomposers map this straight onto a `polyline` / `arc`
18
+ * primitive's `stroke` / `fill`. Pure — no `ctx`.
19
+ *
20
+ * @since 1.3
21
+ * @stable
22
+ * @example
23
+ * const r = resolveShapeStyle({ stroke: "#3b82f6", fill: "#dbeafe", fillAlpha: 0.4 });
24
+ * // r.stroke.color === "#3b82f6"; r.fill?.alpha === 0.4
25
+ * void r;
26
+ */
27
+ export function resolveShapeStyle(style) {
28
+ const stroke = {
29
+ color: style.stroke ?? DEFAULT_STROKE,
30
+ width: style.lineWidth ?? DEFAULT_LINE_WIDTH,
31
+ dash: dashPattern(style.lineStyle ?? "solid"),
32
+ };
33
+ if (style.fill === undefined) {
34
+ return { stroke };
35
+ }
36
+ return {
37
+ stroke,
38
+ fill: { color: style.fill, alpha: style.fillAlpha ?? DEFAULT_FILL_ALPHA },
39
+ };
40
+ }
41
+ //# sourceMappingURL=shapeStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeStyle.js","sourceRoot":"","sources":["../../../src/geometry/_lib/shapeStyle.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,qEAAqE;AACrE,oEAAoE;AACpE,sDAAsD;AACtD,qEAAqE;AACrE,qBAAqB;AAKrB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IAI/C,MAAM,MAAM,GAAgB;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc;QACrC,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB;QAC5C,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;KAChD,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IACtB,CAAC;IACD,OAAO;QACH,MAAM;QACN,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,EAAE;KAC5E,CAAC;AACN,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//\n// Stroke + fill semantics ported from the per-tool style application\n// in invinite/src/components/trading-chart/tools/rectangle-tool.ts,\n// triangle-tool.ts, rotated-rectangle-tool.ts (commit\n// 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite). Re-licensed\n// MIT for chartlang.\n\nimport type { ShapeStyle } from \"@invinite-org/chartlang-core\";\n\nimport type { FillStyle, StrokeStyle } from \"../types.js\";\nimport { dashPattern } from \"./dash.js\";\n\nconst DEFAULT_STROKE = \"#000000\";\nconst DEFAULT_LINE_WIDTH = 1;\nconst DEFAULT_FILL_ALPHA = 1;\n\n/**\n * Resolved {@link ShapeStyle} → IR styles. `stroke` is always present\n * (defaults `\"#000000\"` / `1` / solid); `fill` is present only when the\n * source `style.fill` is set, with `alpha` defaulting to `1`. The\n * box / shape decomposers map this straight onto a `polyline` / `arc`\n * primitive's `stroke` / `fill`. Pure — no `ctx`.\n *\n * @since 1.3\n * @stable\n * @example\n * const r = resolveShapeStyle({ stroke: \"#3b82f6\", fill: \"#dbeafe\", fillAlpha: 0.4 });\n * // r.stroke.color === \"#3b82f6\"; r.fill?.alpha === 0.4\n * void r;\n */\nexport function resolveShapeStyle(style: ShapeStyle): {\n readonly stroke: StrokeStyle;\n readonly fill?: FillStyle;\n} {\n const stroke: StrokeStyle = {\n color: style.stroke ?? DEFAULT_STROKE,\n width: style.lineWidth ?? DEFAULT_LINE_WIDTH,\n dash: dashPattern(style.lineStyle ?? \"solid\"),\n };\n if (style.fill === undefined) {\n return { stroke };\n }\n return {\n stroke,\n fill: { color: style.fill, alpha: style.fillAlpha ?? DEFAULT_FILL_ALPHA },\n };\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import type { StrokeStyle } from "../types.js";
2
+ /**
3
+ * The line-style inputs every line-family decomposer reads off its
4
+ * drawing state — the structural shape shared by `lines`, `curves`,
5
+ * `channels`, and `cycles`.
6
+ *
7
+ * @since 1.3
8
+ * @stable
9
+ * @example
10
+ * const style: LineStyleInput = { color: "#000000", lineStyle: "dashed" };
11
+ * void style;
12
+ */
13
+ export type LineStyleInput = {
14
+ readonly color?: string | undefined;
15
+ readonly lineWidth?: number | undefined;
16
+ readonly lineStyle?: "solid" | "dashed" | "dotted" | undefined;
17
+ };
18
+ /**
19
+ * Resolve a {@link LineStyleInput} into a {@link StrokeStyle}, applying
20
+ * the family defaults: colour falls back to `defaultColor` (black for
21
+ * most kinds; the `cycles` decomposers pass their own accent), width to
22
+ * `1`, and the dash array is derived from `lineStyle` via
23
+ * {@link dashPattern}. Extracted so the four line-family `kinds/` files
24
+ * share one resolver instead of byte-identical copies.
25
+ *
26
+ * @since 1.3
27
+ * @stable
28
+ * @example
29
+ * const s = strokeOf({ lineStyle: "dashed" });
30
+ * // { color: "#000000", width: 1, dash: [6, 4] }
31
+ * void s;
32
+ */
33
+ export declare function strokeOf(style: LineStyleInput, defaultColor?: string): StrokeStyle;
34
+ //# sourceMappingURL=strokeStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strokeStyle.d.ts","sourceRoot":"","sources":["../../../src/geometry/_lib/strokeStyle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CAClE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,YAAY,SAAY,GAAG,WAAW,CAMrF"}
@@ -0,0 +1,26 @@
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 { dashPattern } from "./dash.js";
4
+ /**
5
+ * Resolve a {@link LineStyleInput} into a {@link StrokeStyle}, applying
6
+ * the family defaults: colour falls back to `defaultColor` (black for
7
+ * most kinds; the `cycles` decomposers pass their own accent), width to
8
+ * `1`, and the dash array is derived from `lineStyle` via
9
+ * {@link dashPattern}. Extracted so the four line-family `kinds/` files
10
+ * share one resolver instead of byte-identical copies.
11
+ *
12
+ * @since 1.3
13
+ * @stable
14
+ * @example
15
+ * const s = strokeOf({ lineStyle: "dashed" });
16
+ * // { color: "#000000", width: 1, dash: [6, 4] }
17
+ * void s;
18
+ */
19
+ export function strokeOf(style, defaultColor = "#000000") {
20
+ return {
21
+ color: style.color ?? defaultColor,
22
+ width: style.lineWidth ?? 1,
23
+ dash: dashPattern(style.lineStyle ?? "solid"),
24
+ };
25
+ }
26
+ //# sourceMappingURL=strokeStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strokeStyle.js","sourceRoot":"","sources":["../../../src/geometry/_lib/strokeStyle.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAmBxC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAqB,EAAE,YAAY,GAAG,SAAS;IACpE,OAAO;QACH,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,YAAY;QAClC,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;QAC3B,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;KAChD,CAAC;AACN,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\nimport type { StrokeStyle } from \"../types.js\";\nimport { dashPattern } from \"./dash.js\";\n\n/**\n * The line-style inputs every line-family decomposer reads off its\n * drawing state — the structural shape shared by `lines`, `curves`,\n * `channels`, and `cycles`.\n *\n * @since 1.3\n * @stable\n * @example\n * const style: LineStyleInput = { color: \"#000000\", lineStyle: \"dashed\" };\n * void style;\n */\nexport type LineStyleInput = {\n readonly color?: string | undefined;\n readonly lineWidth?: number | undefined;\n readonly lineStyle?: \"solid\" | \"dashed\" | \"dotted\" | undefined;\n};\n\n/**\n * Resolve a {@link LineStyleInput} into a {@link StrokeStyle}, applying\n * the family defaults: colour falls back to `defaultColor` (black for\n * most kinds; the `cycles` decomposers pass their own accent), width to\n * `1`, and the dash array is derived from `lineStyle` via\n * {@link dashPattern}. Extracted so the four line-family `kinds/` files\n * share one resolver instead of byte-identical copies.\n *\n * @since 1.3\n * @stable\n * @example\n * const s = strokeOf({ lineStyle: \"dashed\" });\n * // { color: \"#000000\", width: 1, dash: [6, 4] }\n * void s;\n */\nexport function strokeOf(style: LineStyleInput, defaultColor = \"#000000\"): StrokeStyle {\n return {\n color: style.color ?? defaultColor,\n width: style.lineWidth ?? 1,\n dash: dashPattern(style.lineStyle ?? \"solid\"),\n };\n}\n"]}
@@ -0,0 +1,70 @@
1
+ import type { TextOpts } from "@invinite-org/chartlang-core";
2
+ /**
3
+ * Pixel size each named {@link TextOpts.size} keyword maps to.
4
+ * `"normal"` (12 px) is the default when `size` is omitted.
5
+ *
6
+ * @since 1.3
7
+ * @stable
8
+ * @example
9
+ * const px = SIZE_TO_PX.normal; // 12
10
+ * void px;
11
+ */
12
+ export declare const SIZE_TO_PX: Readonly<Record<NonNullable<TextOpts["size"]>, number>>;
13
+ /**
14
+ * Map each {@link TextOpts.halign} keyword to the IR `text` primitive's
15
+ * `align` value.
16
+ *
17
+ * @since 1.3
18
+ * @stable
19
+ * @example
20
+ * const a = HALIGN_TO_TEXTALIGN.center; // "center"
21
+ * void a;
22
+ */
23
+ export declare const HALIGN_TO_TEXTALIGN: Readonly<Record<NonNullable<TextOpts["halign"]>, "left" | "center" | "right">>;
24
+ /**
25
+ * Map each {@link TextOpts.valign} keyword to the IR `text` primitive's
26
+ * `baseline` value.
27
+ *
28
+ * @since 1.3
29
+ * @stable
30
+ * @example
31
+ * const b = VALIGN_TO_TEXTBASELINE.middle; // "middle"
32
+ * void b;
33
+ */
34
+ export declare const VALIGN_TO_TEXTBASELINE: Readonly<Record<NonNullable<TextOpts["valign"]>, "top" | "middle" | "bottom">>;
35
+ /**
36
+ * Concrete text-state derived from {@link TextOpts}, mapped directly
37
+ * onto the IR `text` primitive's `font` / `align` / `baseline` /
38
+ * `color` fields.
39
+ *
40
+ * @since 1.3
41
+ * @stable
42
+ * @example
43
+ * const s: ResolvedTextOpts = {
44
+ * font: "12px sans-serif",
45
+ * align: "center",
46
+ * baseline: "middle",
47
+ * color: "#000000",
48
+ * };
49
+ * void s;
50
+ */
51
+ export type ResolvedTextOpts = {
52
+ readonly font: string;
53
+ readonly align: "left" | "center" | "right";
54
+ readonly baseline: "top" | "middle" | "bottom";
55
+ readonly color: string;
56
+ };
57
+ /**
58
+ * Resolve a {@link TextOpts} bag into the four IR text-state values.
59
+ * Missing fields fall back to `"normal"` size (12 px), `"center"`
60
+ * halign, `"middle"` valign, and `"#000000"` color. Pure — no `ctx`.
61
+ *
62
+ * @since 1.3
63
+ * @stable
64
+ * @example
65
+ * const r = resolveTextOpts({ size: "large", color: "#10b981" });
66
+ * // r.font === "16px sans-serif"
67
+ * void r;
68
+ */
69
+ export declare function resolveTextOpts(opts: TextOpts): ResolvedTextOpts;
70
+ //# sourceMappingURL=textStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../src/geometry/_lib/textStyle.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAI7D;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAM9E,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CACtC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,CAKvE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CACzC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAKvE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAQhE"}
@@ -0,0 +1,78 @@
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
+ // `TextOpts` → text-state derivation ported from
5
+ // invinite/src/components/trading-chart/tools/text-tool.ts,
6
+ // invinite/src/components/trading-chart/tools/marker-tool.ts,
7
+ // commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite.
8
+ // Re-licensed MIT for chartlang.
9
+ const DEFAULT_COLOR = "#000000";
10
+ /**
11
+ * Pixel size each named {@link TextOpts.size} keyword maps to.
12
+ * `"normal"` (12 px) is the default when `size` is omitted.
13
+ *
14
+ * @since 1.3
15
+ * @stable
16
+ * @example
17
+ * const px = SIZE_TO_PX.normal; // 12
18
+ * void px;
19
+ */
20
+ export const SIZE_TO_PX = {
21
+ tiny: 8,
22
+ small: 10,
23
+ normal: 12,
24
+ large: 16,
25
+ huge: 20,
26
+ };
27
+ /**
28
+ * Map each {@link TextOpts.halign} keyword to the IR `text` primitive's
29
+ * `align` value.
30
+ *
31
+ * @since 1.3
32
+ * @stable
33
+ * @example
34
+ * const a = HALIGN_TO_TEXTALIGN.center; // "center"
35
+ * void a;
36
+ */
37
+ export const HALIGN_TO_TEXTALIGN = {
38
+ left: "left",
39
+ center: "center",
40
+ right: "right",
41
+ };
42
+ /**
43
+ * Map each {@link TextOpts.valign} keyword to the IR `text` primitive's
44
+ * `baseline` value.
45
+ *
46
+ * @since 1.3
47
+ * @stable
48
+ * @example
49
+ * const b = VALIGN_TO_TEXTBASELINE.middle; // "middle"
50
+ * void b;
51
+ */
52
+ export const VALIGN_TO_TEXTBASELINE = {
53
+ top: "top",
54
+ middle: "middle",
55
+ bottom: "bottom",
56
+ };
57
+ /**
58
+ * Resolve a {@link TextOpts} bag into the four IR text-state values.
59
+ * Missing fields fall back to `"normal"` size (12 px), `"center"`
60
+ * halign, `"middle"` valign, and `"#000000"` color. Pure — no `ctx`.
61
+ *
62
+ * @since 1.3
63
+ * @stable
64
+ * @example
65
+ * const r = resolveTextOpts({ size: "large", color: "#10b981" });
66
+ * // r.font === "16px sans-serif"
67
+ * void r;
68
+ */
69
+ export function resolveTextOpts(opts) {
70
+ const sizePx = SIZE_TO_PX[opts.size ?? "normal"];
71
+ return {
72
+ font: `${sizePx}px sans-serif`,
73
+ align: HALIGN_TO_TEXTALIGN[opts.halign ?? "center"],
74
+ baseline: VALIGN_TO_TEXTBASELINE[opts.valign ?? "middle"],
75
+ color: opts.color ?? DEFAULT_COLOR,
76
+ };
77
+ }
78
+ //# sourceMappingURL=textStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textStyle.js","sourceRoot":"","sources":["../../../src/geometry/_lib/textStyle.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,iDAAiD;AACjD,8DAA8D;AAC9D,gEAAgE;AAChE,iEAAiE;AACjE,iCAAiC;AAIjC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4D;IAC/E,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAE5B;IACA,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAE/B;IACA,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACnB,CAAC;AAyBF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC;IACjD,OAAO;QACH,IAAI,EAAE,GAAG,MAAM,eAAe;QAC9B,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;QACnD,QAAQ,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;QACzD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,aAAa;KACrC,CAAC;AACN,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//\n// `TextOpts` → text-state derivation ported from\n// invinite/src/components/trading-chart/tools/text-tool.ts,\n// invinite/src/components/trading-chart/tools/marker-tool.ts,\n// commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite.\n// Re-licensed MIT for chartlang.\n\nimport type { TextOpts } from \"@invinite-org/chartlang-core\";\n\nconst DEFAULT_COLOR = \"#000000\";\n\n/**\n * Pixel size each named {@link TextOpts.size} keyword maps to.\n * `\"normal\"` (12 px) is the default when `size` is omitted.\n *\n * @since 1.3\n * @stable\n * @example\n * const px = SIZE_TO_PX.normal; // 12\n * void px;\n */\nexport const SIZE_TO_PX: Readonly<Record<NonNullable<TextOpts[\"size\"]>, number>> = {\n tiny: 8,\n small: 10,\n normal: 12,\n large: 16,\n huge: 20,\n};\n\n/**\n * Map each {@link TextOpts.halign} keyword to the IR `text` primitive's\n * `align` value.\n *\n * @since 1.3\n * @stable\n * @example\n * const a = HALIGN_TO_TEXTALIGN.center; // \"center\"\n * void a;\n */\nexport const HALIGN_TO_TEXTALIGN: Readonly<\n Record<NonNullable<TextOpts[\"halign\"]>, \"left\" | \"center\" | \"right\">\n> = {\n left: \"left\",\n center: \"center\",\n right: \"right\",\n};\n\n/**\n * Map each {@link TextOpts.valign} keyword to the IR `text` primitive's\n * `baseline` value.\n *\n * @since 1.3\n * @stable\n * @example\n * const b = VALIGN_TO_TEXTBASELINE.middle; // \"middle\"\n * void b;\n */\nexport const VALIGN_TO_TEXTBASELINE: Readonly<\n Record<NonNullable<TextOpts[\"valign\"]>, \"top\" | \"middle\" | \"bottom\">\n> = {\n top: \"top\",\n middle: \"middle\",\n bottom: \"bottom\",\n};\n\n/**\n * Concrete text-state derived from {@link TextOpts}, mapped directly\n * onto the IR `text` primitive's `font` / `align` / `baseline` /\n * `color` fields.\n *\n * @since 1.3\n * @stable\n * @example\n * const s: ResolvedTextOpts = {\n * font: \"12px sans-serif\",\n * align: \"center\",\n * baseline: \"middle\",\n * color: \"#000000\",\n * };\n * void s;\n */\nexport type ResolvedTextOpts = {\n readonly font: string;\n readonly align: \"left\" | \"center\" | \"right\";\n readonly baseline: \"top\" | \"middle\" | \"bottom\";\n readonly color: string;\n};\n\n/**\n * Resolve a {@link TextOpts} bag into the four IR text-state values.\n * Missing fields fall back to `\"normal\"` size (12 px), `\"center\"`\n * halign, `\"middle\"` valign, and `\"#000000\"` color. Pure — no `ctx`.\n *\n * @since 1.3\n * @stable\n * @example\n * const r = resolveTextOpts({ size: \"large\", color: \"#10b981\" });\n * // r.font === \"16px sans-serif\"\n * void r;\n */\nexport function resolveTextOpts(opts: TextOpts): ResolvedTextOpts {\n const sizePx = SIZE_TO_PX[opts.size ?? \"normal\"];\n return {\n font: `${sizePx}px sans-serif`,\n align: HALIGN_TO_TEXTALIGN[opts.halign ?? \"center\"],\n baseline: VALIGN_TO_TEXTBASELINE[opts.valign ?? \"middle\"],\n color: opts.color ?? DEFAULT_COLOR,\n };\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import type { DrawingEmission } from "../types.js";
2
+ import type { DrawPrimitive, Viewport } from "./types.js";
3
+ /**
4
+ * Reduce a {@link DrawingEmission} to a flat, renderer-agnostic
5
+ * {@link DrawPrimitive} list against `view`. Pure — no `ctx`, no library
6
+ * types — so every adapter shares one geometry derivation and paints
7
+ * the result with its own sink.
8
+ *
9
+ * The switch is **exhaustive over all 63 `DrawingKind`s**: the 20 basic
10
+ * kinds (Task 1), the 20 curve / freehand / channel / fibonacci kinds
11
+ * (Task 2), and the 23 gann / pitchfork / pattern / elliott / cycle /
12
+ * container / table kinds (Task 3). The `default` arm is a `const
13
+ * _exhaustive: never` guard — it compiles only because every literal has
14
+ * a `case`, so adding a future `DrawingKind` to core fails `pnpm
15
+ * typecheck` here until a decomposer is added. `op: "remove"` is handled
16
+ * by each adapter's drawing-state map (this function operates on whatever
17
+ * `state` it is handed).
18
+ *
19
+ * @since 1.3
20
+ * @stable
21
+ * @example
22
+ * declare const e: DrawingEmission;
23
+ * declare const v: Viewport;
24
+ * const prims = decomposeDrawing(e, v);
25
+ * void prims;
26
+ */
27
+ export declare function decomposeDrawing(e: DrawingEmission, view: Viewport): ReadonlyArray<DrawPrimitive>;
28
+ //# sourceMappingURL=decompose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decompose.d.ts","sourceRoot":"","sources":["../../src/geometry/decompose.ts"],"names":[],"mappings":"AAqEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuEnD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC,aAAa,CAAC,CAsIjG"}
@@ -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,4 @@
1
+ export { decomposeDrawing } from "./decompose.js";
2
+ export { priceToY, timeToX, worldPointToPixel } from "./project.js";
3
+ export type { DrawPrimitive, FillStyle, Point2, StrokeStyle, Viewport } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}