@invinite-org/chartlang-core 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/CHANGELOG.md +1694 -0
  2. package/LICENSE +21 -0
  3. package/README.md +53 -0
  4. package/dist/alert/alert.d.ts +32 -0
  5. package/dist/alert/alert.d.ts.map +1 -0
  6. package/dist/alert/alert.js +19 -0
  7. package/dist/alert/alert.js.map +1 -0
  8. package/dist/alert/index.d.ts +2 -0
  9. package/dist/alert/index.d.ts.map +1 -0
  10. package/dist/alert/index.js +4 -0
  11. package/dist/alert/index.js.map +1 -0
  12. package/dist/color/colorHelpers.d.ts +65 -0
  13. package/dist/color/colorHelpers.d.ts.map +1 -0
  14. package/dist/color/colorHelpers.js +137 -0
  15. package/dist/color/colorHelpers.js.map +1 -0
  16. package/dist/color/index.d.ts +37 -0
  17. package/dist/color/index.d.ts.map +1 -0
  18. package/dist/color/index.js +23 -0
  19. package/dist/color/index.js.map +1 -0
  20. package/dist/color/parseColor.d.ts +48 -0
  21. package/dist/color/parseColor.d.ts.map +1 -0
  22. package/dist/color/parseColor.js +141 -0
  23. package/dist/color/parseColor.js.map +1 -0
  24. package/dist/define/defineAlert.d.ts +43 -0
  25. package/dist/define/defineAlert.d.ts.map +1 -0
  26. package/dist/define/defineAlert.js +49 -0
  27. package/dist/define/defineAlert.js.map +1 -0
  28. package/dist/define/defineAlertCondition.d.ts +65 -0
  29. package/dist/define/defineAlertCondition.d.ts.map +1 -0
  30. package/dist/define/defineAlertCondition.js +64 -0
  31. package/dist/define/defineAlertCondition.js.map +1 -0
  32. package/dist/define/defineDrawing.d.ts +62 -0
  33. package/dist/define/defineDrawing.d.ts.map +1 -0
  34. package/dist/define/defineDrawing.js +67 -0
  35. package/dist/define/defineDrawing.js.map +1 -0
  36. package/dist/define/defineIndicator.d.ts +48 -0
  37. package/dist/define/defineIndicator.d.ts.map +1 -0
  38. package/dist/define/defineIndicator.js +54 -0
  39. package/dist/define/defineIndicator.js.map +1 -0
  40. package/dist/define/index.d.ts +6 -0
  41. package/dist/define/index.d.ts.map +1 -0
  42. package/dist/define/index.js +7 -0
  43. package/dist/define/index.js.map +1 -0
  44. package/dist/define/overrides.d.ts +102 -0
  45. package/dist/define/overrides.d.ts.map +1 -0
  46. package/dist/define/overrides.js +4 -0
  47. package/dist/define/overrides.js.map +1 -0
  48. package/dist/draw/buckets.d.ts +57 -0
  49. package/dist/draw/buckets.d.ts.map +1 -0
  50. package/dist/draw/buckets.js +110 -0
  51. package/dist/draw/buckets.js.map +1 -0
  52. package/dist/draw/draw.d.ts +128 -0
  53. package/dist/draw/draw.d.ts.map +1 -0
  54. package/dist/draw/draw.js +40 -0
  55. package/dist/draw/draw.js.map +1 -0
  56. package/dist/draw/drawingKind.d.ts +80 -0
  57. package/dist/draw/drawingKind.d.ts.map +1 -0
  58. package/dist/draw/drawingKind.js +177 -0
  59. package/dist/draw/drawingKind.js.map +1 -0
  60. package/dist/draw/drawingState.d.ts +1420 -0
  61. package/dist/draw/drawingState.d.ts.map +1 -0
  62. package/dist/draw/drawingState.js +4 -0
  63. package/dist/draw/drawingState.js.map +1 -0
  64. package/dist/draw/drawingStyle.d.ts +219 -0
  65. package/dist/draw/drawingStyle.d.ts.map +1 -0
  66. package/dist/draw/drawingStyle.js +4 -0
  67. package/dist/draw/drawingStyle.js.map +1 -0
  68. package/dist/draw/handle.d.ts +32 -0
  69. package/dist/draw/handle.d.ts.map +1 -0
  70. package/dist/draw/handle.js +4 -0
  71. package/dist/draw/handle.js.map +1 -0
  72. package/dist/draw/index.d.ts +13 -0
  73. package/dist/draw/index.d.ts.map +1 -0
  74. package/dist/draw/index.js +7 -0
  75. package/dist/draw/index.js.map +1 -0
  76. package/dist/draw/table.d.ts +84 -0
  77. package/dist/draw/table.d.ts.map +1 -0
  78. package/dist/draw/table.js +22 -0
  79. package/dist/draw/table.js.map +1 -0
  80. package/dist/draw/worldPoint.d.ts +114 -0
  81. package/dist/draw/worldPoint.d.ts.map +1 -0
  82. package/dist/draw/worldPoint.js +4 -0
  83. package/dist/draw/worldPoint.js.map +1 -0
  84. package/dist/index.d.ts +28 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +16 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/input/index.d.ts +3 -0
  89. package/dist/input/index.d.ts.map +1 -0
  90. package/dist/input/index.js +4 -0
  91. package/dist/input/index.js.map +1 -0
  92. package/dist/input/input.d.ts +174 -0
  93. package/dist/input/input.d.ts.map +1 -0
  94. package/dist/input/input.js +174 -0
  95. package/dist/input/input.js.map +1 -0
  96. package/dist/input/inputDescriptor.d.ts +204 -0
  97. package/dist/input/inputDescriptor.d.ts.map +1 -0
  98. package/dist/input/inputDescriptor.js +4 -0
  99. package/dist/input/inputDescriptor.js.map +1 -0
  100. package/dist/interval/intervalToSeconds.d.ts +20 -0
  101. package/dist/interval/intervalToSeconds.d.ts.map +1 -0
  102. package/dist/interval/intervalToSeconds.js +50 -0
  103. package/dist/interval/intervalToSeconds.js.map +1 -0
  104. package/dist/plot/index.d.ts +2 -0
  105. package/dist/plot/index.d.ts.map +1 -0
  106. package/dist/plot/index.js +4 -0
  107. package/dist/plot/index.js.map +1 -0
  108. package/dist/plot/plot.d.ts +277 -0
  109. package/dist/plot/plot.d.ts.map +1 -0
  110. package/dist/plot/plot.js +37 -0
  111. package/dist/plot/plot.js.map +1 -0
  112. package/dist/request/index.d.ts +2 -0
  113. package/dist/request/index.d.ts.map +1 -0
  114. package/dist/request/index.js +4 -0
  115. package/dist/request/index.js.map +1 -0
  116. package/dist/request/request.d.ts +106 -0
  117. package/dist/request/request.d.ts.map +1 -0
  118. package/dist/request/request.js +44 -0
  119. package/dist/request/request.js.map +1 -0
  120. package/dist/runtime/index.d.ts +3 -0
  121. package/dist/runtime/index.d.ts.map +1 -0
  122. package/dist/runtime/index.js +4 -0
  123. package/dist/runtime/index.js.map +1 -0
  124. package/dist/runtime/runtime.d.ts +84 -0
  125. package/dist/runtime/runtime.d.ts.map +1 -0
  126. package/dist/runtime/runtime.js +72 -0
  127. package/dist/runtime/runtime.js.map +1 -0
  128. package/dist/state/index.d.ts +5 -0
  129. package/dist/state/index.d.ts.map +1 -0
  130. package/dist/state/index.js +4 -0
  131. package/dist/state/index.js.map +1 -0
  132. package/dist/state/mutableSlot.d.ts +25 -0
  133. package/dist/state/mutableSlot.d.ts.map +1 -0
  134. package/dist/state/mutableSlot.js +4 -0
  135. package/dist/state/mutableSlot.js.map +1 -0
  136. package/dist/state/snapshot.d.ts +108 -0
  137. package/dist/state/snapshot.d.ts.map +1 -0
  138. package/dist/state/snapshot.js +4 -0
  139. package/dist/state/snapshot.js.map +1 -0
  140. package/dist/state/state.d.ts +86 -0
  141. package/dist/state/state.d.ts.map +1 -0
  142. package/dist/state/state.js +95 -0
  143. package/dist/state/state.js.map +1 -0
  144. package/dist/statefulPrimitives.d.ts +71 -0
  145. package/dist/statefulPrimitives.d.ts.map +1 -0
  146. package/dist/statefulPrimitives.js +234 -0
  147. package/dist/statefulPrimitives.js.map +1 -0
  148. package/dist/ta/index.d.ts +2 -0
  149. package/dist/ta/index.d.ts.map +1 -0
  150. package/dist/ta/index.js +4 -0
  151. package/dist/ta/index.js.map +1 -0
  152. package/dist/ta/ta.d.ts +2476 -0
  153. package/dist/ta/ta.d.ts.map +1 -0
  154. package/dist/ta/ta.js +312 -0
  155. package/dist/ta/ta.js.map +1 -0
  156. package/dist/time/_lib/dateTimeFormatCache.d.ts +11 -0
  157. package/dist/time/_lib/dateTimeFormatCache.d.ts.map +1 -0
  158. package/dist/time/_lib/dateTimeFormatCache.js +22 -0
  159. package/dist/time/_lib/dateTimeFormatCache.js.map +1 -0
  160. package/dist/time/index.d.ts +7 -0
  161. package/dist/time/index.d.ts.map +1 -0
  162. package/dist/time/index.js +8 -0
  163. package/dist/time/index.js.map +1 -0
  164. package/dist/time/nyDayKey.d.ts +24 -0
  165. package/dist/time/nyDayKey.d.ts.map +1 -0
  166. package/dist/time/nyDayKey.js +49 -0
  167. package/dist/time/nyDayKey.js.map +1 -0
  168. package/dist/time/session.d.ts +16 -0
  169. package/dist/time/session.d.ts.map +1 -0
  170. package/dist/time/session.js +18 -0
  171. package/dist/time/session.js.map +1 -0
  172. package/dist/time/sessionBoundaries.d.ts +40 -0
  173. package/dist/time/sessionBoundaries.d.ts.map +1 -0
  174. package/dist/time/sessionBoundaries.js +102 -0
  175. package/dist/time/sessionBoundaries.js.map +1 -0
  176. package/dist/time/types.d.ts +34 -0
  177. package/dist/time/types.d.ts.map +1 -0
  178. package/dist/time/types.js +4 -0
  179. package/dist/time/types.js.map +1 -0
  180. package/dist/time/weekKey.d.ts +11 -0
  181. package/dist/time/weekKey.d.ts.map +1 -0
  182. package/dist/time/weekKey.js +25 -0
  183. package/dist/time/weekKey.js.map +1 -0
  184. package/dist/time/weekday.d.ts +12 -0
  185. package/dist/time/weekday.d.ts.map +1 -0
  186. package/dist/time/weekday.js +22 -0
  187. package/dist/time/weekday.js.map +1 -0
  188. package/dist/types.d.ts +464 -0
  189. package/dist/types.d.ts.map +1 -0
  190. package/dist/types.js +4 -0
  191. package/dist/types.js.map +1 -0
  192. package/dist/views/barstate.d.ts +40 -0
  193. package/dist/views/barstate.d.ts.map +1 -0
  194. package/dist/views/barstate.js +22 -0
  195. package/dist/views/barstate.js.map +1 -0
  196. package/dist/views/index.d.ts +4 -0
  197. package/dist/views/index.d.ts.map +1 -0
  198. package/dist/views/index.js +4 -0
  199. package/dist/views/index.js.map +1 -0
  200. package/dist/views/syminfo.d.ts +46 -0
  201. package/dist/views/syminfo.d.ts.map +1 -0
  202. package/dist/views/syminfo.js +25 -0
  203. package/dist/views/syminfo.js.map +1 -0
  204. package/dist/views/timeframe.d.ts +40 -0
  205. package/dist/views/timeframe.d.ts.map +1 -0
  206. package/dist/views/timeframe.js +21 -0
  207. package/dist/views/timeframe.js.map +1 -0
  208. package/package.json +45 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Invinite
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # @invinite-org/chartlang-core
2
+
3
+ `experimental`
4
+
5
+ Types and script-facing primitives for chartlang indicators, alerts, drawings,
6
+ inputs, state slots, views, and secondary-timeframe requests.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ pnpm add @invinite-org/chartlang-core
12
+ ```
13
+
14
+ ## Public surface
15
+
16
+ - Constructors: `defineIndicator`, `defineAlert`, `defineDrawing`.
17
+ - Inputs: `input.int`, `float`, `bool`, `string`, `enum`, `color`, `source`,
18
+ `time`, `price`, `symbol`, `interval`, `externalSeries`.
19
+ - Stateful slots: `state.float`, `int`, `bool`, `string`, plus
20
+ `state.tick.*` for tick-persistent `varip` semantics.
21
+ - Views: `barstate`, `syminfo`, `timeframe`.
22
+ - Secondary stream: `request.security({ interval })` typed surface.
23
+ - Emissions: `plot`, `hline`, `alert`, and the 61-kind `draw.*` namespace.
24
+ - Registry: `STATEFUL_PRIMITIVES` for compiler slot-id injection.
25
+ - Types: `Series<T>`, `Bar`, `InputDescriptor`, `MutableSlot<T>`,
26
+ `ScriptManifest`, `ComputeContext`, `DrawingState`, `DrawingHandle`,
27
+ `DrawingCounts`, `SecurityBar`, view types, and option/result types.
28
+
29
+ ## Minimum-viable API call
30
+
31
+ ```ts
32
+ import { defineIndicator, input, state } from "@invinite-org/chartlang-core";
33
+
34
+ export default defineIndicator({
35
+ name: "Session High",
36
+ apiVersion: 1,
37
+ inputs: { length: input.int(20, { min: 1 }) },
38
+ compute: ({ bar, plot }) => {
39
+ const high = state.float(bar.high);
40
+ high.value = Math.max(high.value, bar.high);
41
+ plot(high.value);
42
+ },
43
+ });
44
+ ```
45
+
46
+ ## Docs
47
+
48
+ See [`docs/language/overview.md`](../../docs/language/overview.md) and
49
+ generated primitive pages under [`docs/primitives/`](../../docs/primitives/).
50
+
51
+ ## License
52
+
53
+ MIT
@@ -0,0 +1,32 @@
1
+ import type { AlertSeverity, JsonValue } from "../types.js";
2
+ /**
3
+ * Styling and metadata options accepted by `alert(...)`. `severity` defaults
4
+ * to `"info"`; `meta` is round-tripped to the host as a JSON-serialisable
5
+ * payload.
6
+ *
7
+ * @since 0.1
8
+ * @example
9
+ * const opts: AlertOpts = {
10
+ * severity: "warning",
11
+ * meta: { reason: "crossover", strength: 0.42 },
12
+ * };
13
+ */
14
+ export type AlertOpts = Readonly<{
15
+ severity?: AlertSeverity;
16
+ meta?: Readonly<Record<string, JsonValue>>;
17
+ }>;
18
+ /**
19
+ * Compile-time callable hole for `alert(message, opts?)`. The compiler
20
+ * rewrites every callsite (Task 2) to dispatch to the runtime; calling this
21
+ * outside the runtime throws the sentinel.
22
+ *
23
+ * @since 0.1
24
+ * @stable
25
+ * @example
26
+ * // Inside a compiled `compute`:
27
+ * // alert("EMA crossed", { severity: "info" });
28
+ * import { alert } from "@invinite-org/chartlang-core";
29
+ * try { alert("noop"); } catch {}
30
+ */
31
+ export declare function alert(_message: string, _opts?: AlertOpts): void;
32
+ //# sourceMappingURL=alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../src/alert/alert.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAC9C,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAE/D"}
@@ -0,0 +1,19 @@
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
+ * Compile-time callable hole for `alert(message, opts?)`. The compiler
5
+ * rewrites every callsite (Task 2) to dispatch to the runtime; calling this
6
+ * outside the runtime throws the sentinel.
7
+ *
8
+ * @since 0.1
9
+ * @stable
10
+ * @example
11
+ * // Inside a compiled `compute`:
12
+ * // alert("EMA crossed", { severity: "info" });
13
+ * import { alert } from "@invinite-org/chartlang-core";
14
+ * try { alert("noop"); } catch {}
15
+ */
16
+ export function alert(_message, _opts) {
17
+ throw new Error("alert called outside compiled runtime");
18
+ }
19
+ //# sourceMappingURL=alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../src/alert/alert.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAqB/D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,KAAK,CAAC,QAAgB,EAAE,KAAiB;IACrD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./alert.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alert/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
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 * from "./alert.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/alert/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,cAAc,YAAY,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type { Color } from "../types.js";
2
+ /**
3
+ * Gradient color stop for `color.fromGradient`.
4
+ *
5
+ * @since 0.5
6
+ * @stable
7
+ * @example
8
+ * const stop: GradientStop = { at: 0, color: "#0000ff" };
9
+ * void stop;
10
+ */
11
+ export type GradientStop = Readonly<{
12
+ at: number;
13
+ color: Color;
14
+ }>;
15
+ /**
16
+ * Dynamic color from a normalised position. `t` is clamped to `[0, 1]`;
17
+ * out-of-range maps to the boundary stop. Stops must be pre-sorted by `at`
18
+ * ascending. Empty stops return transparent black.
19
+ *
20
+ * Pine's `color.from_gradient`.
21
+ *
22
+ * @since 0.5
23
+ * @stable
24
+ * @example
25
+ * // const blue = "#0000ff";
26
+ * // const red = "#ff0000";
27
+ * // color.fromGradient(0.5, [{ at: 0, color: blue }, { at: 1, color: red }]);
28
+ */
29
+ export declare function fromGradient(t: number, stops: ReadonlyArray<GradientStop>): Color;
30
+ /**
31
+ * Override an existing color's alpha channel. `alpha` is clamped to
32
+ * `[0, 1]`. NaN returns the input color unchanged. Pine's `color.new(c,
33
+ * transp)` analogue using direct alpha.
34
+ *
35
+ * @since 0.5
36
+ * @stable
37
+ * @example
38
+ * const c = withAlpha("#ff0000", 0.5);
39
+ * void c;
40
+ */
41
+ export declare function withAlpha(c: Color, alpha: number): Color;
42
+ /**
43
+ * Construct a color from RGB(A) components. Each component is clamped to
44
+ * `[0, 255]`; alpha defaults to `1`. NaN components clamp to `0`.
45
+ *
46
+ * @since 0.5
47
+ * @stable
48
+ * @example
49
+ * const red = rgb(255, 0, 0);
50
+ * void red;
51
+ */
52
+ export declare function rgb(r: number, g: number, b: number, alpha?: number): Color;
53
+ /**
54
+ * Construct a color from HSL(A) components. `h` is clamped to `[0, 360)`;
55
+ * `s` and `l` are clamped to `[0, 100]`. Alpha defaults to `1`. NaN
56
+ * components clamp to `0`.
57
+ *
58
+ * @since 0.5
59
+ * @stable
60
+ * @example
61
+ * const red = hsl(0, 100, 50);
62
+ * void red;
63
+ */
64
+ export declare function hsl(h: number, s: number, l: number, alpha?: number): Color;
65
+ //# sourceMappingURL=colorHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorHelpers.d.ts","sourceRoot":"","sources":["../../src/color/colorHelpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAsClE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,KAAK,CAgCjF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAKxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAM1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAM1E"}
@@ -0,0 +1,137 @@
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 { parseColor } from "./parseColor.js";
4
+ const TRANSPARENT_BLACK = "rgba(0, 0, 0, 0)";
5
+ function clampUnit(value) {
6
+ if (Number.isNaN(value))
7
+ return 0;
8
+ return Math.min(1, Math.max(0, value));
9
+ }
10
+ function clampByte(value) {
11
+ if (Number.isNaN(value))
12
+ return 0;
13
+ return Math.min(255, Math.max(0, Math.floor(value)));
14
+ }
15
+ function clampHue(value) {
16
+ if (Number.isNaN(value))
17
+ return 0;
18
+ return Math.min(359.999, Math.max(0, value));
19
+ }
20
+ function clampPercent(value) {
21
+ if (Number.isNaN(value))
22
+ return 0;
23
+ return Math.min(100, Math.max(0, value));
24
+ }
25
+ function formatNumber(value) {
26
+ const rounded = Math.round(value * 1000) / 1000;
27
+ return String(rounded);
28
+ }
29
+ function emitRgb(r, g, b, alpha) {
30
+ if (alpha >= 1)
31
+ return `rgb(${r}, ${g}, ${b})`;
32
+ return `rgba(${r}, ${g}, ${b}, ${formatNumber(alpha)})`;
33
+ }
34
+ function emitRgba(r, g, b, alpha) {
35
+ return `rgba(${r}, ${g}, ${b}, ${formatNumber(alpha)})`;
36
+ }
37
+ /**
38
+ * Dynamic color from a normalised position. `t` is clamped to `[0, 1]`;
39
+ * out-of-range maps to the boundary stop. Stops must be pre-sorted by `at`
40
+ * ascending. Empty stops return transparent black.
41
+ *
42
+ * Pine's `color.from_gradient`.
43
+ *
44
+ * @since 0.5
45
+ * @stable
46
+ * @example
47
+ * // const blue = "#0000ff";
48
+ * // const red = "#ff0000";
49
+ * // color.fromGradient(0.5, [{ at: 0, color: blue }, { at: 1, color: red }]);
50
+ */
51
+ export function fromGradient(t, stops) {
52
+ const first = stops[0];
53
+ if (first === undefined)
54
+ return TRANSPARENT_BLACK;
55
+ if (stops.length === 1 || Number.isNaN(t))
56
+ return first.color;
57
+ const position = clampUnit(t);
58
+ if (position <= first.at)
59
+ return first.color;
60
+ const last = stops[stops.length - 1];
61
+ if (position >= last.at)
62
+ return last.color;
63
+ let previous = first;
64
+ let next = last;
65
+ for (let i = 1; i < stops.length; i += 1) {
66
+ const candidate = stops[i];
67
+ if (position <= candidate.at) {
68
+ next = candidate;
69
+ break;
70
+ }
71
+ previous = candidate;
72
+ }
73
+ const left = parseColor(previous.color);
74
+ const right = parseColor(next.color);
75
+ if (left === null || right === null)
76
+ return previous.color;
77
+ const ratio = (position - previous.at) / (next.at - previous.at);
78
+ const alpha = left.a + (right.a - left.a) * ratio;
79
+ return emitRgb(clampByte(left.r + (right.r - left.r) * ratio), clampByte(left.g + (right.g - left.g) * ratio), clampByte(left.b + (right.b - left.b) * ratio), clampUnit(alpha));
80
+ }
81
+ /**
82
+ * Override an existing color's alpha channel. `alpha` is clamped to
83
+ * `[0, 1]`. NaN returns the input color unchanged. Pine's `color.new(c,
84
+ * transp)` analogue using direct alpha.
85
+ *
86
+ * @since 0.5
87
+ * @stable
88
+ * @example
89
+ * const c = withAlpha("#ff0000", 0.5);
90
+ * void c;
91
+ */
92
+ export function withAlpha(c, alpha) {
93
+ if (Number.isNaN(alpha))
94
+ return c;
95
+ const parsed = parseColor(c);
96
+ if (parsed === null)
97
+ return c;
98
+ return emitRgba(parsed.r, parsed.g, parsed.b, clampUnit(alpha));
99
+ }
100
+ /**
101
+ * Construct a color from RGB(A) components. Each component is clamped to
102
+ * `[0, 255]`; alpha defaults to `1`. NaN components clamp to `0`.
103
+ *
104
+ * @since 0.5
105
+ * @stable
106
+ * @example
107
+ * const red = rgb(255, 0, 0);
108
+ * void red;
109
+ */
110
+ export function rgb(r, g, b, alpha) {
111
+ const red = clampByte(r);
112
+ const green = clampByte(g);
113
+ const blue = clampByte(b);
114
+ if (alpha === undefined)
115
+ return `rgb(${red}, ${green}, ${blue})`;
116
+ return emitRgba(red, green, blue, clampUnit(alpha));
117
+ }
118
+ /**
119
+ * Construct a color from HSL(A) components. `h` is clamped to `[0, 360)`;
120
+ * `s` and `l` are clamped to `[0, 100]`. Alpha defaults to `1`. NaN
121
+ * components clamp to `0`.
122
+ *
123
+ * @since 0.5
124
+ * @stable
125
+ * @example
126
+ * const red = hsl(0, 100, 50);
127
+ * void red;
128
+ */
129
+ export function hsl(h, s, l, alpha) {
130
+ const hue = formatNumber(clampHue(h));
131
+ const sat = formatNumber(clampPercent(s));
132
+ const light = formatNumber(clampPercent(l));
133
+ if (alpha === undefined)
134
+ return `hsl(${hue}, ${sat}%, ${light}%)`;
135
+ return `hsla(${hue}, ${sat}%, ${light}%, ${formatNumber(clampUnit(alpha))})`;
136
+ }
137
+ //# sourceMappingURL=colorHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorHelpers.js","sourceRoot":"","sources":["../../src/color/colorHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { fromGradient, hsl, rgb, withAlpha } from "./colorHelpers.js";
2
+ export { fromGradient, hsl, rgb, withAlpha } from "./colorHelpers.js";
3
+ export type { GradientStop } from "./colorHelpers.js";
4
+ /**
5
+ * Pine-style color namespace. Includes the named palette plus dynamic
6
+ * helpers for compute-time colors.
7
+ *
8
+ * @since 0.5
9
+ * @stable
10
+ * @example
11
+ * const c = color.withAlpha(color.red, 0.5);
12
+ * void c;
13
+ */
14
+ export declare const color: Readonly<{
15
+ fromGradient: typeof fromGradient;
16
+ withAlpha: typeof withAlpha;
17
+ rgb: typeof rgb;
18
+ hsl: typeof hsl;
19
+ aqua: "#00ffff";
20
+ black: "#000000";
21
+ blue: "#0000ff";
22
+ fuchsia: "#ff00ff";
23
+ gray: "#808080";
24
+ green: "#008000";
25
+ lime: "#00ff00";
26
+ maroon: "#800000";
27
+ navy: "#000080";
28
+ olive: "#808000";
29
+ orange: "#ffa500";
30
+ purple: "#800080";
31
+ red: "#ff0000";
32
+ silver: "#c0c0c0";
33
+ teal: "#008080";
34
+ white: "#ffffff";
35
+ yellow: "#ffff00";
36
+ }>;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/color/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;EAMhB,CAAC"}
@@ -0,0 +1,23 @@
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 { fromGradient, hsl, rgb, withAlpha } from "./colorHelpers.js";
4
+ import { COLOR_PALETTE } from "./parseColor.js";
5
+ export { fromGradient, hsl, rgb, withAlpha } from "./colorHelpers.js";
6
+ /**
7
+ * Pine-style color namespace. Includes the named palette plus dynamic
8
+ * helpers for compute-time colors.
9
+ *
10
+ * @since 0.5
11
+ * @stable
12
+ * @example
13
+ * const c = color.withAlpha(color.red, 0.5);
14
+ * void c;
15
+ */
16
+ export const color = Object.freeze({
17
+ ...COLOR_PALETTE,
18
+ fromGradient,
19
+ withAlpha,
20
+ rgb,
21
+ hsl,
22
+ });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/color/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGtE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/B,GAAG,aAAa;IAChB,YAAY;IACZ,SAAS;IACT,GAAG;IACH,GAAG;CACN,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { Color } from "../types.js";
2
+ /**
3
+ * Pine-style named palette values accepted by the color parser and exposed
4
+ * through the `color` namespace.
5
+ *
6
+ * @internal
7
+ * @since 0.5
8
+ * @example
9
+ * const red = COLOR_PALETTE.red;
10
+ * void red;
11
+ */
12
+ export declare const COLOR_PALETTE: Readonly<{
13
+ aqua: "#00ffff";
14
+ black: "#000000";
15
+ blue: "#0000ff";
16
+ fuchsia: "#ff00ff";
17
+ gray: "#808080";
18
+ green: "#008000";
19
+ lime: "#00ff00";
20
+ maroon: "#800000";
21
+ navy: "#000080";
22
+ olive: "#808000";
23
+ orange: "#ffa500";
24
+ purple: "#800080";
25
+ red: "#ff0000";
26
+ silver: "#c0c0c0";
27
+ teal: "#008080";
28
+ white: "#ffffff";
29
+ yellow: "#ffff00";
30
+ }>;
31
+ /**
32
+ * Parse the CSS color forms chartlang emits: `#rgb`, `#rrggbb`,
33
+ * `rgb(...)`, `rgba(...)`, `hsl(...)`, `hsla(...)`, and the named palette.
34
+ * Returns `null` for unparseable input.
35
+ *
36
+ * @internal
37
+ * @since 0.5
38
+ * @example
39
+ * const parsed = parseColor("#ff0000");
40
+ * void parsed;
41
+ */
42
+ export declare function parseColor(c: Color): Readonly<{
43
+ r: number;
44
+ g: number;
45
+ b: number;
46
+ a: number;
47
+ }> | null;
48
+ //# sourceMappingURL=parseColor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseColor.d.ts","sourceRoot":"","sources":["../../src/color/parseColor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AA4DH;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACtB,CAAC,EAAE,KAAK,GACT,QAAQ,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CA+CjE"}
@@ -0,0 +1,141 @@
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
+ * Pine-style named palette values accepted by the color parser and exposed
5
+ * through the `color` namespace.
6
+ *
7
+ * @internal
8
+ * @since 0.5
9
+ * @example
10
+ * const red = COLOR_PALETTE.red;
11
+ * void red;
12
+ */
13
+ export const COLOR_PALETTE = Object.freeze({
14
+ aqua: "#00ffff",
15
+ black: "#000000",
16
+ blue: "#0000ff",
17
+ fuchsia: "#ff00ff",
18
+ gray: "#808080",
19
+ green: "#008000",
20
+ lime: "#00ff00",
21
+ maroon: "#800000",
22
+ navy: "#000080",
23
+ olive: "#808000",
24
+ orange: "#ffa500",
25
+ purple: "#800080",
26
+ red: "#ff0000",
27
+ silver: "#c0c0c0",
28
+ teal: "#008080",
29
+ white: "#ffffff",
30
+ yellow: "#ffff00",
31
+ });
32
+ const HEX_SHORT = /^#([0-9a-f]{3})$/i;
33
+ const HEX_LONG = /^#([0-9a-f]{6})$/i;
34
+ const RGB = /^rgba?\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)(?:\s*,\s*([^,\s]+))?\s*\)$/i;
35
+ const HSL = /^hsla?\(\s*([^,\s]+)\s*,\s*([^,\s%]+)%\s*,\s*([^,\s%]+)%(?:\s*,\s*([^,\s]+))?\s*\)$/i;
36
+ function isPaletteName(value) {
37
+ return Object.prototype.hasOwnProperty.call(COLOR_PALETTE, value);
38
+ }
39
+ function clampByte(value) {
40
+ return Math.min(255, Math.max(0, Math.floor(value)));
41
+ }
42
+ function clampRoundedByte(value) {
43
+ return Math.min(255, Math.max(0, Math.round(value)));
44
+ }
45
+ function clampUnit(value) {
46
+ return Math.min(1, Math.max(0, value));
47
+ }
48
+ function parseNumber(value) {
49
+ const parsed = Number(value);
50
+ if (Number.isNaN(parsed))
51
+ return null;
52
+ return parsed;
53
+ }
54
+ function hslToRgb(h, s, l) {
55
+ const hue = Math.min(359.999, Math.max(0, h)) / 360;
56
+ const sat = Math.min(100, Math.max(0, s)) / 100;
57
+ const light = Math.min(100, Math.max(0, l)) / 100;
58
+ if (sat === 0) {
59
+ const gray = clampRoundedByte(light * 255);
60
+ return { r: gray, g: gray, b: gray };
61
+ }
62
+ const q = light < 0.5 ? light * (1 + sat) : light + sat - light * sat;
63
+ const p = 2 * light - q;
64
+ const channel = (t) => {
65
+ let adjusted = t;
66
+ if (adjusted < 0)
67
+ adjusted += 1;
68
+ if (adjusted > 1)
69
+ adjusted -= 1;
70
+ if (adjusted < 1 / 6)
71
+ return p + (q - p) * 6 * adjusted;
72
+ if (adjusted < 1 / 2)
73
+ return q;
74
+ if (adjusted < 2 / 3)
75
+ return p + (q - p) * (2 / 3 - adjusted) * 6;
76
+ return p;
77
+ };
78
+ return {
79
+ r: clampRoundedByte(channel(hue + 1 / 3) * 255),
80
+ g: clampRoundedByte(channel(hue) * 255),
81
+ b: clampRoundedByte(channel(hue - 1 / 3) * 255),
82
+ };
83
+ }
84
+ /**
85
+ * Parse the CSS color forms chartlang emits: `#rgb`, `#rrggbb`,
86
+ * `rgb(...)`, `rgba(...)`, `hsl(...)`, `hsla(...)`, and the named palette.
87
+ * Returns `null` for unparseable input.
88
+ *
89
+ * @internal
90
+ * @since 0.5
91
+ * @example
92
+ * const parsed = parseColor("#ff0000");
93
+ * void parsed;
94
+ */
95
+ export function parseColor(c) {
96
+ const value = c.trim().toLowerCase();
97
+ if (isPaletteName(value))
98
+ return parseColor(COLOR_PALETTE[value]);
99
+ const shortHex = HEX_SHORT.exec(value);
100
+ if (shortHex) {
101
+ const hex = shortHex[1];
102
+ return {
103
+ r: Number.parseInt(`${hex[0]}${hex[0]}`, 16),
104
+ g: Number.parseInt(`${hex[1]}${hex[1]}`, 16),
105
+ b: Number.parseInt(`${hex[2]}${hex[2]}`, 16),
106
+ a: 1,
107
+ };
108
+ }
109
+ const longHex = HEX_LONG.exec(value);
110
+ if (longHex) {
111
+ const hex = longHex[1];
112
+ return {
113
+ r: Number.parseInt(hex.slice(0, 2), 16),
114
+ g: Number.parseInt(hex.slice(2, 4), 16),
115
+ b: Number.parseInt(hex.slice(4, 6), 16),
116
+ a: 1,
117
+ };
118
+ }
119
+ const rgbMatch = RGB.exec(value);
120
+ if (rgbMatch) {
121
+ const r = parseNumber(rgbMatch[1]);
122
+ const g = parseNumber(rgbMatch[2]);
123
+ const b = parseNumber(rgbMatch[3]);
124
+ const a = rgbMatch[4] === undefined ? 1 : parseNumber(rgbMatch[4]);
125
+ if (r === null || g === null || b === null || a === null)
126
+ return null;
127
+ return { r: clampByte(r), g: clampByte(g), b: clampByte(b), a: clampUnit(a) };
128
+ }
129
+ const hslMatch = HSL.exec(value);
130
+ if (hslMatch) {
131
+ const h = parseNumber(hslMatch[1]);
132
+ const s = parseNumber(hslMatch[2]);
133
+ const l = parseNumber(hslMatch[3]);
134
+ const a = hslMatch[4] === undefined ? 1 : parseNumber(hslMatch[4]);
135
+ if (h === null || s === null || l === null || a === null)
136
+ return null;
137
+ return { ...hslToRgb(h, s, l), a: clampUnit(a) };
138
+ }
139
+ return null;
140
+ }
141
+ //# sourceMappingURL=parseColor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseColor.js","sourceRoot":"","sources":["../../src/color/parseColor.ts"],"names":[],"mappings":"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"}