@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.
- package/CHANGELOG.md +1694 -0
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/dist/alert/alert.d.ts +32 -0
- package/dist/alert/alert.d.ts.map +1 -0
- package/dist/alert/alert.js +19 -0
- package/dist/alert/alert.js.map +1 -0
- package/dist/alert/index.d.ts +2 -0
- package/dist/alert/index.d.ts.map +1 -0
- package/dist/alert/index.js +4 -0
- package/dist/alert/index.js.map +1 -0
- package/dist/color/colorHelpers.d.ts +65 -0
- package/dist/color/colorHelpers.d.ts.map +1 -0
- package/dist/color/colorHelpers.js +137 -0
- package/dist/color/colorHelpers.js.map +1 -0
- package/dist/color/index.d.ts +37 -0
- package/dist/color/index.d.ts.map +1 -0
- package/dist/color/index.js +23 -0
- package/dist/color/index.js.map +1 -0
- package/dist/color/parseColor.d.ts +48 -0
- package/dist/color/parseColor.d.ts.map +1 -0
- package/dist/color/parseColor.js +141 -0
- package/dist/color/parseColor.js.map +1 -0
- package/dist/define/defineAlert.d.ts +43 -0
- package/dist/define/defineAlert.d.ts.map +1 -0
- package/dist/define/defineAlert.js +49 -0
- package/dist/define/defineAlert.js.map +1 -0
- package/dist/define/defineAlertCondition.d.ts +65 -0
- package/dist/define/defineAlertCondition.d.ts.map +1 -0
- package/dist/define/defineAlertCondition.js +64 -0
- package/dist/define/defineAlertCondition.js.map +1 -0
- package/dist/define/defineDrawing.d.ts +62 -0
- package/dist/define/defineDrawing.d.ts.map +1 -0
- package/dist/define/defineDrawing.js +67 -0
- package/dist/define/defineDrawing.js.map +1 -0
- package/dist/define/defineIndicator.d.ts +48 -0
- package/dist/define/defineIndicator.d.ts.map +1 -0
- package/dist/define/defineIndicator.js +54 -0
- package/dist/define/defineIndicator.js.map +1 -0
- package/dist/define/index.d.ts +6 -0
- package/dist/define/index.d.ts.map +1 -0
- package/dist/define/index.js +7 -0
- package/dist/define/index.js.map +1 -0
- package/dist/define/overrides.d.ts +102 -0
- package/dist/define/overrides.d.ts.map +1 -0
- package/dist/define/overrides.js +4 -0
- package/dist/define/overrides.js.map +1 -0
- package/dist/draw/buckets.d.ts +57 -0
- package/dist/draw/buckets.d.ts.map +1 -0
- package/dist/draw/buckets.js +110 -0
- package/dist/draw/buckets.js.map +1 -0
- package/dist/draw/draw.d.ts +128 -0
- package/dist/draw/draw.d.ts.map +1 -0
- package/dist/draw/draw.js +40 -0
- package/dist/draw/draw.js.map +1 -0
- package/dist/draw/drawingKind.d.ts +80 -0
- package/dist/draw/drawingKind.d.ts.map +1 -0
- package/dist/draw/drawingKind.js +177 -0
- package/dist/draw/drawingKind.js.map +1 -0
- package/dist/draw/drawingState.d.ts +1420 -0
- package/dist/draw/drawingState.d.ts.map +1 -0
- package/dist/draw/drawingState.js +4 -0
- package/dist/draw/drawingState.js.map +1 -0
- package/dist/draw/drawingStyle.d.ts +219 -0
- package/dist/draw/drawingStyle.d.ts.map +1 -0
- package/dist/draw/drawingStyle.js +4 -0
- package/dist/draw/drawingStyle.js.map +1 -0
- package/dist/draw/handle.d.ts +32 -0
- package/dist/draw/handle.d.ts.map +1 -0
- package/dist/draw/handle.js +4 -0
- package/dist/draw/handle.js.map +1 -0
- package/dist/draw/index.d.ts +13 -0
- package/dist/draw/index.d.ts.map +1 -0
- package/dist/draw/index.js +7 -0
- package/dist/draw/index.js.map +1 -0
- package/dist/draw/table.d.ts +84 -0
- package/dist/draw/table.d.ts.map +1 -0
- package/dist/draw/table.js +22 -0
- package/dist/draw/table.js.map +1 -0
- package/dist/draw/worldPoint.d.ts +114 -0
- package/dist/draw/worldPoint.d.ts.map +1 -0
- package/dist/draw/worldPoint.js +4 -0
- package/dist/draw/worldPoint.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/input/index.d.ts +3 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +4 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/input.d.ts +174 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +174 -0
- package/dist/input/input.js.map +1 -0
- package/dist/input/inputDescriptor.d.ts +204 -0
- package/dist/input/inputDescriptor.d.ts.map +1 -0
- package/dist/input/inputDescriptor.js +4 -0
- package/dist/input/inputDescriptor.js.map +1 -0
- package/dist/interval/intervalToSeconds.d.ts +20 -0
- package/dist/interval/intervalToSeconds.d.ts.map +1 -0
- package/dist/interval/intervalToSeconds.js +50 -0
- package/dist/interval/intervalToSeconds.js.map +1 -0
- package/dist/plot/index.d.ts +2 -0
- package/dist/plot/index.d.ts.map +1 -0
- package/dist/plot/index.js +4 -0
- package/dist/plot/index.js.map +1 -0
- package/dist/plot/plot.d.ts +277 -0
- package/dist/plot/plot.d.ts.map +1 -0
- package/dist/plot/plot.js +37 -0
- package/dist/plot/plot.js.map +1 -0
- package/dist/request/index.d.ts +2 -0
- package/dist/request/index.d.ts.map +1 -0
- package/dist/request/index.js +4 -0
- package/dist/request/index.js.map +1 -0
- package/dist/request/request.d.ts +106 -0
- package/dist/request/request.d.ts.map +1 -0
- package/dist/request/request.js +44 -0
- package/dist/request/request.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/runtime.d.ts +84 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +72 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/mutableSlot.d.ts +25 -0
- package/dist/state/mutableSlot.d.ts.map +1 -0
- package/dist/state/mutableSlot.js +4 -0
- package/dist/state/mutableSlot.js.map +1 -0
- package/dist/state/snapshot.d.ts +108 -0
- package/dist/state/snapshot.d.ts.map +1 -0
- package/dist/state/snapshot.js +4 -0
- package/dist/state/snapshot.js.map +1 -0
- package/dist/state/state.d.ts +86 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.js +95 -0
- package/dist/state/state.js.map +1 -0
- package/dist/statefulPrimitives.d.ts +71 -0
- package/dist/statefulPrimitives.d.ts.map +1 -0
- package/dist/statefulPrimitives.js +234 -0
- package/dist/statefulPrimitives.js.map +1 -0
- package/dist/ta/index.d.ts +2 -0
- package/dist/ta/index.d.ts.map +1 -0
- package/dist/ta/index.js +4 -0
- package/dist/ta/index.js.map +1 -0
- package/dist/ta/ta.d.ts +2476 -0
- package/dist/ta/ta.d.ts.map +1 -0
- package/dist/ta/ta.js +312 -0
- package/dist/ta/ta.js.map +1 -0
- package/dist/time/_lib/dateTimeFormatCache.d.ts +11 -0
- package/dist/time/_lib/dateTimeFormatCache.d.ts.map +1 -0
- package/dist/time/_lib/dateTimeFormatCache.js +22 -0
- package/dist/time/_lib/dateTimeFormatCache.js.map +1 -0
- package/dist/time/index.d.ts +7 -0
- package/dist/time/index.d.ts.map +1 -0
- package/dist/time/index.js +8 -0
- package/dist/time/index.js.map +1 -0
- package/dist/time/nyDayKey.d.ts +24 -0
- package/dist/time/nyDayKey.d.ts.map +1 -0
- package/dist/time/nyDayKey.js +49 -0
- package/dist/time/nyDayKey.js.map +1 -0
- package/dist/time/session.d.ts +16 -0
- package/dist/time/session.d.ts.map +1 -0
- package/dist/time/session.js +18 -0
- package/dist/time/session.js.map +1 -0
- package/dist/time/sessionBoundaries.d.ts +40 -0
- package/dist/time/sessionBoundaries.d.ts.map +1 -0
- package/dist/time/sessionBoundaries.js +102 -0
- package/dist/time/sessionBoundaries.js.map +1 -0
- package/dist/time/types.d.ts +34 -0
- package/dist/time/types.d.ts.map +1 -0
- package/dist/time/types.js +4 -0
- package/dist/time/types.js.map +1 -0
- package/dist/time/weekKey.d.ts +11 -0
- package/dist/time/weekKey.d.ts.map +1 -0
- package/dist/time/weekKey.js +25 -0
- package/dist/time/weekKey.js.map +1 -0
- package/dist/time/weekday.d.ts +12 -0
- package/dist/time/weekday.d.ts.map +1 -0
- package/dist/time/weekday.js +22 -0
- package/dist/time/weekday.js.map +1 -0
- package/dist/types.d.ts +464 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/views/barstate.d.ts +40 -0
- package/dist/views/barstate.d.ts.map +1 -0
- package/dist/views/barstate.js +22 -0
- package/dist/views/barstate.js.map +1 -0
- package/dist/views/index.d.ts +4 -0
- package/dist/views/index.d.ts.map +1 -0
- package/dist/views/index.js +4 -0
- package/dist/views/index.js.map +1 -0
- package/dist/views/syminfo.d.ts +46 -0
- package/dist/views/syminfo.d.ts.map +1 -0
- package/dist/views/syminfo.js +25 -0
- package/dist/views/syminfo.js.map +1 -0
- package/dist/views/timeframe.d.ts +40 -0
- package/dist/views/timeframe.d.ts.map +1 -0
- package/dist/views/timeframe.js +21 -0
- package/dist/views/timeframe.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alert/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC"}
|
|
@@ -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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"}
|