@clhaas/palette-kit 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +80 -87
- package/dist/contrast/contrast.d.ts +16 -0
- package/dist/contrast/contrast.js +102 -0
- package/dist/core/intent-registry.d.ts +11 -0
- package/dist/core/intent-registry.js +70 -0
- package/dist/core/oklch.d.ts +16 -0
- package/dist/core/oklch.js +56 -0
- package/dist/create-palette-kit.d.ts +9 -0
- package/dist/create-palette-kit.js +67 -0
- package/dist/engine/context/context.d.ts +13 -0
- package/dist/engine/context/context.js +37 -0
- package/dist/engine/level/curves.d.ts +17 -0
- package/dist/engine/level/curves.js +49 -0
- package/dist/engine/level/level.d.ts +4 -0
- package/dist/engine/level/level.js +13 -0
- package/dist/engine/relation/relation.d.ts +105 -0
- package/dist/engine/relation/relation.js +137 -0
- package/dist/engine/resolve/resolve.d.ts +36 -0
- package/dist/engine/resolve/resolve.js +116 -0
- package/dist/engine/state/state.d.ts +46 -0
- package/dist/engine/state/state.js +68 -0
- package/dist/engine/usage/fill.d.ts +9 -0
- package/dist/engine/usage/fill.js +9 -0
- package/dist/engine/usage/lines.d.ts +9 -0
- package/dist/engine/usage/lines.js +9 -0
- package/dist/engine/usage/overlays.d.ts +9 -0
- package/dist/engine/usage/overlays.js +9 -0
- package/dist/engine/usage/strategy.d.ts +56 -0
- package/dist/engine/usage/strategy.js +30 -0
- package/dist/engine/usage/visualVocabulary.d.ts +9 -0
- package/dist/engine/usage/visualVocabulary.js +9 -0
- package/dist/export/serialize.d.ts +14 -0
- package/dist/export/serialize.js +89 -0
- package/dist/export/types.d.ts +37 -0
- package/dist/export/types.js +31 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/operators/convert.d.ts +32 -0
- package/dist/operators/convert.js +80 -0
- package/dist/presets/presets.d.ts +95 -0
- package/dist/presets/presets.js +308 -0
- package/dist/types/index.d.ts +111 -187
- package/dist/utils/errors/errors.d.ts +17 -0
- package/dist/utils/errors/errors.js +22 -0
- package/docs/API.md +167 -0
- package/docs/Alpha.md +14 -0
- package/docs/Architecture.md +56 -0
- package/docs/CLI.md +22 -0
- package/docs/Concepts.md +73 -0
- package/docs/Config.md +144 -0
- package/docs/Diagnostics.md +22 -0
- package/docs/Exporters.md +33 -0
- package/docs/FAQ.md +59 -0
- package/docs/Migration.md +61 -0
- package/docs/Overlays.md +33 -0
- package/docs/README.md +60 -0
- package/docs/Text.md +41 -0
- package/docs/Tokens.md +42 -0
- package/docs/Usage-JSON.md +39 -0
- package/docs/Usage-ReactNative.md +63 -0
- package/docs/Usage-Web.md +66 -0
- package/docs/Validation.md +97 -0
- package/docs/Why.md +37 -0
- package/docs/_api-surface.md +53 -0
- package/docs/snippets/serialize-oklch.md +9 -0
- package/docs/spec.md +98 -0
- package/package.json +74 -59
- package/.codex/skills/color-pipeline-implementer/SKILL.md +0 -23
- package/.codex/skills/commit-message-crafter/SKILL.md +0 -63
- package/.codex/skills/commit-message-crafter/references/benchmarks.md +0 -20
- package/.codex/skills/contrast-solver-helper/SKILL.md +0 -20
- package/.codex/skills/exporters-builder/SKILL.md +0 -20
- package/.codex/skills/markdownlint-writer/SKILL.md +0 -32
- package/.codex/skills/phase-implementation-runbook/SKILL.md +0 -92
- package/.codex/skills/type-contract-auditor/SKILL.md +0 -21
- package/.github/skills/review-guide/SKILL.md +0 -23
- package/.github/skills/review-guide/references/review-guide-v0.3.md +0 -629
- package/.markdownlint.json +0 -4
- package/AGENTS.md +0 -16
- package/biome.json +0 -43
- package/dist/cli/args.d.ts +0 -12
- package/dist/cli/args.js +0 -56
- package/dist/cli/args.test.d.ts +0 -1
- package/dist/cli/args.test.js +0 -22
- package/dist/cli/codegen/__snapshots__/tokens.test.js.snap +0 -87
- package/dist/cli/codegen/tokens.d.ts +0 -12
- package/dist/cli/codegen/tokens.js +0 -139
- package/dist/cli/codegen/tokens.test.d.ts +0 -1
- package/dist/cli/codegen/tokens.test.js +0 -51
- package/dist/cli/config.d.ts +0 -40
- package/dist/cli/config.js +0 -34
- package/dist/cli/validate.d.ts +0 -2
- package/dist/cli/validate.js +0 -33
- package/dist/cli/validate.test.d.ts +0 -1
- package/dist/cli/validate.test.js +0 -40
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -148
- package/dist/contrast/apca.d.ts +0 -2
- package/dist/contrast/apca.js +0 -15
- package/dist/contrast/apca.test.d.ts +0 -1
- package/dist/contrast/apca.test.js +0 -16
- package/dist/contrast/index.d.ts +0 -4
- package/dist/contrast/index.js +0 -4
- package/dist/contrast/scoring.d.ts +0 -4
- package/dist/contrast/scoring.js +0 -31
- package/dist/contrast/scoring.test.d.ts +0 -1
- package/dist/contrast/scoring.test.js +0 -148
- package/dist/contrast/solver.d.ts +0 -13
- package/dist/contrast/solver.js +0 -170
- package/dist/contrast/solver.test.d.ts +0 -1
- package/dist/contrast/solver.test.js +0 -75
- package/dist/contrast/types.d.ts +0 -17
- package/dist/contrast/types.js +0 -1
- package/dist/contrast/utils.d.ts +0 -4
- package/dist/contrast/utils.js +0 -18
- package/dist/contrast/wcag2.d.ts +0 -3
- package/dist/contrast/wcag2.js +0 -19
- package/dist/contrast/wcag2.test.d.ts +0 -1
- package/dist/contrast/wcag2.test.js +0 -17
- package/dist/core/createTheme.d.ts +0 -35
- package/dist/core/createTheme.js +0 -24
- package/dist/core/dx-helpers.test.d.ts +0 -1
- package/dist/core/dx-helpers.test.js +0 -61
- package/dist/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -2
- package/dist/core/onSolid.test.d.ts +0 -1
- package/dist/core/onSolid.test.js +0 -118
- package/dist/core/qa.v1.test.d.ts +0 -1
- package/dist/core/qa.v1.test.js +0 -112
- package/dist/core/resolve.d.ts +0 -3
- package/dist/core/resolve.js +0 -8
- package/dist/core/resolve.test.d.ts +0 -1
- package/dist/core/resolve.test.js +0 -89
- package/dist/core/resolveMany.d.ts +0 -8
- package/dist/core/resolveMany.js +0 -17
- package/dist/core/tokenRegistry.d.ts +0 -23
- package/dist/core/tokenRegistry.js +0 -83
- package/dist/core/tokenRegistry.test.d.ts +0 -1
- package/dist/core/tokenRegistry.test.js +0 -133
- package/dist/engine/applyOperators.d.ts +0 -3
- package/dist/engine/applyOperators.js +0 -23
- package/dist/engine/context.d.ts +0 -4
- package/dist/engine/context.js +0 -1
- package/dist/engine/gamut.d.ts +0 -13
- package/dist/engine/gamut.js +0 -101
- package/dist/engine/gamut.test.d.ts +0 -1
- package/dist/engine/gamut.test.js +0 -23
- package/dist/engine/generateScale.d.ts +0 -15
- package/dist/engine/generateScale.js +0 -29
- package/dist/engine/generateScale.test.d.ts +0 -1
- package/dist/engine/generateScale.test.js +0 -32
- package/dist/engine/index.d.ts +0 -8
- package/dist/engine/index.js +0 -4
- package/dist/engine/normalize.d.ts +0 -43
- package/dist/engine/normalize.js +0 -403
- package/dist/engine/normalize.test.d.ts +0 -1
- package/dist/engine/normalize.test.js +0 -136
- package/dist/engine/onSolid.d.ts +0 -3
- package/dist/engine/onSolid.js +0 -110
- package/dist/engine/resolveBaseColor.d.ts +0 -25
- package/dist/engine/resolveBaseColor.js +0 -127
- package/dist/engine/resolveBaseColor.test.d.ts +0 -1
- package/dist/engine/resolveBaseColor.test.js +0 -97
- package/dist/export/__snapshots__/exportTheme.test.js.snap +0 -74
- package/dist/export/exportTheme.d.ts +0 -47
- package/dist/export/exportTheme.js +0 -170
- package/dist/export/exportTheme.test.d.ts +0 -1
- package/dist/export/exportTheme.test.js +0 -118
- package/dist/export/index.d.ts +0 -1
- package/dist/export/index.js +0 -1
- package/dist/export/serializeColor.d.ts +0 -1
- package/dist/export/serializeColor.js +0 -1
- package/dist/export/serializeColor.test.d.ts +0 -1
- package/dist/export/serializeColor.test.js +0 -54
- package/dist/export.d.ts +0 -1
- package/dist/export.js +0 -1
- package/dist/operators/emphasis.d.ts +0 -3
- package/dist/operators/emphasis.js +0 -113
- package/dist/operators/emphasis.test.d.ts +0 -1
- package/dist/operators/emphasis.test.js +0 -69
- package/dist/operators/index.d.ts +0 -3
- package/dist/operators/index.js +0 -2
- package/dist/operators/state.d.ts +0 -3
- package/dist/operators/state.js +0 -102
- package/dist/operators/state.test.d.ts +0 -1
- package/dist/operators/state.test.js +0 -48
- package/dist/operators/types.d.ts +0 -13
- package/dist/operators/types.js +0 -1
- package/dist/operators/utils.d.ts +0 -16
- package/dist/operators/utils.js +0 -23
- package/dist/presets/curves.d.ts +0 -28
- package/dist/presets/curves.js +0 -145
- package/dist/presets/index.d.ts +0 -2
- package/dist/presets/index.js +0 -1
- package/dist/presets/tokens/index.d.ts +0 -3
- package/dist/presets/tokens/index.js +0 -3
- package/dist/presets/tokens/minimal-ui.d.ts +0 -6
- package/dist/presets/tokens/minimal-ui.js +0 -53
- package/dist/presets/tokens/modern-ui.d.ts +0 -5
- package/dist/presets/tokens/modern-ui.js +0 -83
- package/dist/presets/tokens/presets.test.d.ts +0 -1
- package/dist/presets/tokens/presets.test.js +0 -31
- package/dist/presets/tokens/radixLike-ui.d.ts +0 -6
- package/dist/presets/tokens/radixLike-ui.js +0 -77
- package/dist/serialize/index.d.ts +0 -1
- package/dist/serialize/index.js +0 -1
- package/dist/serialize/normalizeOutput.d.ts +0 -6
- package/dist/serialize/normalizeOutput.js +0 -45
- package/dist/serialize/serializeColor.d.ts +0 -21
- package/dist/serialize/serializeColor.js +0 -178
- package/dist/serialize/serializeResolved.test.d.ts +0 -1
- package/dist/serialize/serializeResolved.test.js +0 -45
- package/dist/serialize.d.ts +0 -1
- package/dist/serialize.js +0 -1
- package/dist/utils/clamp.d.ts +0 -1
- package/dist/utils/clamp.js +0 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/lerp.d.ts +0 -1
- package/dist/utils/lerp.js +0 -1
- package/dist/utils/parseColor.d.ts +0 -6
- package/dist/utils/parseColor.js +0 -67
- package/dist/utils/parseColor.test.d.ts +0 -1
- package/dist/utils/parseColor.test.js +0 -51
- package/dist/utils/smoothstep.d.ts +0 -1
- package/dist/utils/smoothstep.js +0 -5
- package/planning/phase-10-review.md +0 -550
- package/planning/phase-7-review.md +0 -411
- package/planning/phase-8-review.md +0 -669
- package/planning/phase-9-review.md +0 -564
- package/planning/roadmap-v0.3.md +0 -284
- package/planning/spec-serializer-v0.3.md +0 -324
- package/planning/spec-v0.3.md +0 -305
- package/src/cli/args.test.ts +0 -28
- package/src/cli/args.ts +0 -66
- package/src/cli/codegen/__snapshots__/tokens.test.ts.snap +0 -87
- package/src/cli/codegen/tokens.test.ts +0 -61
- package/src/cli/codegen/tokens.ts +0 -191
- package/src/cli/config.ts +0 -71
- package/src/cli/validate.test.ts +0 -49
- package/src/cli/validate.ts +0 -38
- package/src/cli.ts +0 -183
- package/src/contrast/apca.test.ts +0 -20
- package/src/contrast/apca.ts +0 -26
- package/src/contrast/index.ts +0 -4
- package/src/contrast/scoring.test.ts +0 -188
- package/src/contrast/scoring.ts +0 -48
- package/src/contrast/solver.test.ts +0 -147
- package/src/contrast/solver.ts +0 -235
- package/src/contrast/types.ts +0 -20
- package/src/contrast/utils.ts +0 -28
- package/src/contrast/wcag2.test.ts +0 -21
- package/src/contrast/wcag2.ts +0 -24
- package/src/core/createTheme.ts +0 -78
- package/src/core/dx-helpers.test.ts +0 -82
- package/src/core/index.ts +0 -7
- package/src/core/onSolid.test.ts +0 -146
- package/src/core/qa.v1.test.ts +0 -149
- package/src/core/resolve.test.ts +0 -99
- package/src/core/resolve.ts +0 -11
- package/src/core/resolveMany.ts +0 -22
- package/src/core/tokenRegistry.test.ts +0 -153
- package/src/core/tokenRegistry.ts +0 -114
- package/src/engine/applyOperators.ts +0 -32
- package/src/engine/context.ts +0 -8
- package/src/engine/gamut.test.ts +0 -30
- package/src/engine/gamut.ts +0 -144
- package/src/engine/generateScale.test.ts +0 -46
- package/src/engine/generateScale.ts +0 -48
- package/src/engine/index.ts +0 -8
- package/src/engine/normalize.test.ts +0 -222
- package/src/engine/normalize.ts +0 -550
- package/src/engine/onSolid.ts +0 -178
- package/src/engine/resolveBaseColor.test.ts +0 -117
- package/src/engine/resolveBaseColor.ts +0 -203
- package/src/export/__snapshots__/exportTheme.test.ts.snap +0 -74
- package/src/export/exportTheme.test.ts +0 -144
- package/src/export/exportTheme.ts +0 -251
- package/src/export/index.ts +0 -1
- package/src/export/serializeColor.test.ts +0 -73
- package/src/export/serializeColor.ts +0 -1
- package/src/export.ts +0 -1
- package/src/index.ts +0 -3
- package/src/operators/emphasis.test.ts +0 -85
- package/src/operators/emphasis.ts +0 -132
- package/src/operators/index.ts +0 -3
- package/src/operators/state.test.ts +0 -66
- package/src/operators/state.ts +0 -122
- package/src/operators/types.ts +0 -14
- package/src/operators/utils.ts +0 -44
- package/src/presets/curves.ts +0 -168
- package/src/presets/index.ts +0 -2
- package/src/presets/tokens/index.ts +0 -3
- package/src/presets/tokens/minimal-ui.ts +0 -55
- package/src/presets/tokens/modern-ui.ts +0 -85
- package/src/presets/tokens/presets.test.ts +0 -46
- package/src/presets/tokens/radixLike-ui.ts +0 -79
- package/src/serialize/index.ts +0 -1
- package/src/serialize/normalizeOutput.ts +0 -63
- package/src/serialize/serializeColor.ts +0 -260
- package/src/serialize/serializeResolved.test.ts +0 -57
- package/src/serialize.ts +0 -1
- package/src/types/index.ts +0 -207
- package/src/utils/clamp.ts +0 -2
- package/src/utils/index.ts +0 -1
- package/src/utils/lerp.ts +0 -1
- package/src/utils/parseColor.test.ts +0 -66
- package/src/utils/parseColor.ts +0 -87
- package/src/utils/smoothstep.ts +0 -6
- package/tsconfig.build.json +0 -11
- package/tsconfig.json +0 -15
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { defaultLevelCurves, } from '../engine/level/curves.js';
|
|
2
|
+
import { assertLevel, LEVELS } from '../engine/level/level.js';
|
|
3
|
+
import { defaultStateDeltas, } from '../engine/state/state.js';
|
|
4
|
+
export const RESOLVER_PRESETS = Object.freeze([
|
|
5
|
+
'soft',
|
|
6
|
+
'neutral',
|
|
7
|
+
'strong',
|
|
8
|
+
]);
|
|
9
|
+
const DEFAULT_CONTRAST_TARGET = 60;
|
|
10
|
+
const DEFAULT_MAX_LUMINANCE_SHIFT = 60;
|
|
11
|
+
const DEFAULT_CHROMA_MAX_REDUCTION = 1;
|
|
12
|
+
const DEFAULT_CHROMA_REDUCTION_STEP = 0.01;
|
|
13
|
+
const presetList = RESOLVER_PRESETS.join(', ');
|
|
14
|
+
const formatInvalidResolverPresetError = (value) => `Unknown resolver preset "${String(value)}". Expected one of: ${presetList}.`;
|
|
15
|
+
const assertFiniteConfigNumber = (name, value) => {
|
|
16
|
+
if (!Number.isFinite(value)) {
|
|
17
|
+
throw new Error(`${name} must be a finite number.`);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const assertNonNegativeConfigNumber = (name, value) => {
|
|
21
|
+
assertFiniteConfigNumber(name, value);
|
|
22
|
+
if (value < 0) {
|
|
23
|
+
throw new Error(`${name} must be greater than or equal to 0.`);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const resolveContextualLightness = (lightness, context) => context === 'dark' ? 100 - lightness : lightness;
|
|
27
|
+
const createNumberLevelCurve = (targets) => Object.freeze((level, context) => {
|
|
28
|
+
assertLevel(level);
|
|
29
|
+
return resolveContextualLightness(targets[level], context);
|
|
30
|
+
});
|
|
31
|
+
const createOverlayLevelCurve = (targets) => Object.freeze((level, _context) => {
|
|
32
|
+
assertLevel(level);
|
|
33
|
+
return targets[level];
|
|
34
|
+
});
|
|
35
|
+
const createLevelCurveConfig = (fillTargets, linesTargets, overlayTargets) => Object.freeze({
|
|
36
|
+
fill: createNumberLevelCurve(fillTargets),
|
|
37
|
+
lines: createNumberLevelCurve(linesTargets),
|
|
38
|
+
overlays: createOverlayLevelCurve(overlayTargets),
|
|
39
|
+
});
|
|
40
|
+
const createAlphaTable = (values) => Object.freeze(LEVELS.reduce((table, level) => {
|
|
41
|
+
const value = values[level];
|
|
42
|
+
assertNonNegativeConfigNumber(`relation alpha level ${level}`, value);
|
|
43
|
+
table[level] = value;
|
|
44
|
+
return table;
|
|
45
|
+
}, {}));
|
|
46
|
+
const mergeAlphaTable = (base, override) => createAlphaTable(LEVELS.reduce((table, level) => {
|
|
47
|
+
table[level] = override?.[level] ?? base[level];
|
|
48
|
+
return table;
|
|
49
|
+
}, {}));
|
|
50
|
+
const mergeStateDeltaTable = (base, override) => {
|
|
51
|
+
const table = {
|
|
52
|
+
active: override?.active ?? base.active,
|
|
53
|
+
default: override?.default ?? base.default,
|
|
54
|
+
disabled: override?.disabled ?? base.disabled,
|
|
55
|
+
focus: override?.focus ?? base.focus,
|
|
56
|
+
hover: override?.hover ?? base.hover,
|
|
57
|
+
selected: override?.selected ?? base.selected,
|
|
58
|
+
};
|
|
59
|
+
for (const [state, value] of Object.entries(table)) {
|
|
60
|
+
assertNonNegativeConfigNumber(`stateDeltas.${state}`, value);
|
|
61
|
+
}
|
|
62
|
+
return Object.freeze(table);
|
|
63
|
+
};
|
|
64
|
+
const createRelationParamsConfig = (params) => {
|
|
65
|
+
assertNonNegativeConfigNumber('relationParams.on.contrastTarget', params.on.contrastTarget);
|
|
66
|
+
assertNonNegativeConfigNumber('relationParams.on.maxLuminanceShift', params.on.maxLuminanceShift);
|
|
67
|
+
assertNonNegativeConfigNumber('relationParams.under.luminanceReduction', params.under.luminanceReduction);
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
on: Object.freeze({ ...params.on }),
|
|
70
|
+
over: Object.freeze({
|
|
71
|
+
baseAlphaByLevel: createAlphaTable(params.over.baseAlphaByLevel),
|
|
72
|
+
}),
|
|
73
|
+
under: Object.freeze({
|
|
74
|
+
baseAlphaByLevel: createAlphaTable(params.under.baseAlphaByLevel),
|
|
75
|
+
luminanceReduction: params.under.luminanceReduction,
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const createChromaConfig = (config) => {
|
|
80
|
+
assertNonNegativeConfigNumber('chromaLimits.maxReduction', config.maxReduction);
|
|
81
|
+
assertNonNegativeConfigNumber('chromaLimits.reductionStep', config.reductionStep);
|
|
82
|
+
if (config.reductionStep === 0) {
|
|
83
|
+
throw new Error('chromaLimits.reductionStep must be greater than 0.');
|
|
84
|
+
}
|
|
85
|
+
return Object.freeze({ ...config });
|
|
86
|
+
};
|
|
87
|
+
const baseRelationParams = createRelationParamsConfig({
|
|
88
|
+
on: {
|
|
89
|
+
contrastTarget: DEFAULT_CONTRAST_TARGET,
|
|
90
|
+
maxLuminanceShift: DEFAULT_MAX_LUMINANCE_SHIFT,
|
|
91
|
+
},
|
|
92
|
+
over: {
|
|
93
|
+
baseAlphaByLevel: createAlphaTable({
|
|
94
|
+
1: 0.04,
|
|
95
|
+
2: 0.08,
|
|
96
|
+
3: 0.12,
|
|
97
|
+
4: 0.18,
|
|
98
|
+
5: 0.24,
|
|
99
|
+
6: 0.3,
|
|
100
|
+
7: 0.36,
|
|
101
|
+
8: 0.42,
|
|
102
|
+
9: 0.5,
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
under: {
|
|
106
|
+
baseAlphaByLevel: createAlphaTable({
|
|
107
|
+
1: 0.06,
|
|
108
|
+
2: 0.1,
|
|
109
|
+
3: 0.16,
|
|
110
|
+
4: 0.22,
|
|
111
|
+
5: 0.3,
|
|
112
|
+
6: 0.38,
|
|
113
|
+
7: 0.46,
|
|
114
|
+
8: 0.54,
|
|
115
|
+
9: 0.62,
|
|
116
|
+
}),
|
|
117
|
+
luminanceReduction: 8,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const baseChromaLimits = createChromaConfig({
|
|
121
|
+
maxReduction: DEFAULT_CHROMA_MAX_REDUCTION,
|
|
122
|
+
reductionStep: DEFAULT_CHROMA_REDUCTION_STEP,
|
|
123
|
+
});
|
|
124
|
+
const softFillLevelTargets = Object.freeze({
|
|
125
|
+
1: 98,
|
|
126
|
+
2: 97,
|
|
127
|
+
3: 96,
|
|
128
|
+
4: 94,
|
|
129
|
+
5: 92,
|
|
130
|
+
6: 89,
|
|
131
|
+
7: 86,
|
|
132
|
+
8: 82,
|
|
133
|
+
9: 78,
|
|
134
|
+
});
|
|
135
|
+
const softLinesLevelTargets = Object.freeze({
|
|
136
|
+
1: 96,
|
|
137
|
+
2: 95,
|
|
138
|
+
3: 94,
|
|
139
|
+
4: 93,
|
|
140
|
+
5: 92,
|
|
141
|
+
6: 91,
|
|
142
|
+
7: 90,
|
|
143
|
+
8: 89,
|
|
144
|
+
9: 88,
|
|
145
|
+
});
|
|
146
|
+
const softOverlayLevelTargets = Object.freeze({
|
|
147
|
+
1: Object.freeze({ luminanceDelta: 0.5 }),
|
|
148
|
+
2: Object.freeze({ luminanceDelta: 1 }),
|
|
149
|
+
3: Object.freeze({ luminanceDelta: 1.5 }),
|
|
150
|
+
4: Object.freeze({ luminanceDelta: 2 }),
|
|
151
|
+
5: Object.freeze({ luminanceDelta: 2.5 }),
|
|
152
|
+
6: Object.freeze({ luminanceDelta: 3 }),
|
|
153
|
+
7: Object.freeze({ luminanceDelta: 3.5 }),
|
|
154
|
+
8: Object.freeze({ luminanceDelta: 4 }),
|
|
155
|
+
9: Object.freeze({ luminanceDelta: 4.5 }),
|
|
156
|
+
});
|
|
157
|
+
const strongFillLevelTargets = Object.freeze({
|
|
158
|
+
1: 99,
|
|
159
|
+
2: 96,
|
|
160
|
+
3: 92,
|
|
161
|
+
4: 87,
|
|
162
|
+
5: 81,
|
|
163
|
+
6: 74,
|
|
164
|
+
7: 66,
|
|
165
|
+
8: 57,
|
|
166
|
+
9: 47,
|
|
167
|
+
});
|
|
168
|
+
const strongLinesLevelTargets = Object.freeze({
|
|
169
|
+
1: 97,
|
|
170
|
+
2: 95,
|
|
171
|
+
3: 92,
|
|
172
|
+
4: 89,
|
|
173
|
+
5: 85,
|
|
174
|
+
6: 81,
|
|
175
|
+
7: 76,
|
|
176
|
+
8: 70,
|
|
177
|
+
9: 64,
|
|
178
|
+
});
|
|
179
|
+
const strongOverlayLevelTargets = Object.freeze({
|
|
180
|
+
1: Object.freeze({ luminanceDelta: 2 }),
|
|
181
|
+
2: Object.freeze({ luminanceDelta: 4 }),
|
|
182
|
+
3: Object.freeze({ luminanceDelta: 6 }),
|
|
183
|
+
4: Object.freeze({ luminanceDelta: 8 }),
|
|
184
|
+
5: Object.freeze({ luminanceDelta: 10 }),
|
|
185
|
+
6: Object.freeze({ luminanceDelta: 12 }),
|
|
186
|
+
7: Object.freeze({ luminanceDelta: 14 }),
|
|
187
|
+
8: Object.freeze({ luminanceDelta: 16 }),
|
|
188
|
+
9: Object.freeze({ luminanceDelta: 18 }),
|
|
189
|
+
});
|
|
190
|
+
const softStateDeltas = Object.freeze({
|
|
191
|
+
alpha: Object.freeze({
|
|
192
|
+
active: 0,
|
|
193
|
+
default: 0,
|
|
194
|
+
disabled: 0,
|
|
195
|
+
focus: 0,
|
|
196
|
+
hover: 0,
|
|
197
|
+
selected: 0,
|
|
198
|
+
}),
|
|
199
|
+
luminance: Object.freeze({
|
|
200
|
+
active: 4,
|
|
201
|
+
default: 0,
|
|
202
|
+
disabled: 6,
|
|
203
|
+
focus: 3,
|
|
204
|
+
hover: 2,
|
|
205
|
+
selected: 3,
|
|
206
|
+
}),
|
|
207
|
+
});
|
|
208
|
+
const strongStateDeltas = Object.freeze({
|
|
209
|
+
alpha: Object.freeze({
|
|
210
|
+
active: 0,
|
|
211
|
+
default: 0,
|
|
212
|
+
disabled: 0,
|
|
213
|
+
focus: 0,
|
|
214
|
+
hover: 0,
|
|
215
|
+
selected: 0,
|
|
216
|
+
}),
|
|
217
|
+
luminance: Object.freeze({
|
|
218
|
+
active: 8,
|
|
219
|
+
default: 0,
|
|
220
|
+
disabled: 14,
|
|
221
|
+
focus: 5,
|
|
222
|
+
hover: 4,
|
|
223
|
+
selected: 7,
|
|
224
|
+
}),
|
|
225
|
+
});
|
|
226
|
+
const createResolverConfig = (config) => Object.freeze({
|
|
227
|
+
chromaLimits: createChromaConfig(config.chromaLimits),
|
|
228
|
+
levelCurves: Object.freeze({ ...config.levelCurves }),
|
|
229
|
+
relationParams: createRelationParamsConfig(config.relationParams),
|
|
230
|
+
stateDeltas: Object.freeze({
|
|
231
|
+
alpha: mergeStateDeltaTable(config.stateDeltas.alpha, undefined),
|
|
232
|
+
luminance: mergeStateDeltaTable(config.stateDeltas.luminance, undefined),
|
|
233
|
+
}),
|
|
234
|
+
});
|
|
235
|
+
export const softResolverConfig = createResolverConfig({
|
|
236
|
+
chromaLimits: baseChromaLimits,
|
|
237
|
+
levelCurves: createLevelCurveConfig(softFillLevelTargets, softLinesLevelTargets, softOverlayLevelTargets),
|
|
238
|
+
relationParams: baseRelationParams,
|
|
239
|
+
stateDeltas: softStateDeltas,
|
|
240
|
+
});
|
|
241
|
+
export const neutralResolverConfig = createResolverConfig({
|
|
242
|
+
chromaLimits: baseChromaLimits,
|
|
243
|
+
levelCurves: defaultLevelCurves,
|
|
244
|
+
relationParams: baseRelationParams,
|
|
245
|
+
stateDeltas: defaultStateDeltas,
|
|
246
|
+
});
|
|
247
|
+
export const strongResolverConfig = createResolverConfig({
|
|
248
|
+
chromaLimits: baseChromaLimits,
|
|
249
|
+
levelCurves: createLevelCurveConfig(strongFillLevelTargets, strongLinesLevelTargets, strongOverlayLevelTargets),
|
|
250
|
+
relationParams: baseRelationParams,
|
|
251
|
+
stateDeltas: strongStateDeltas,
|
|
252
|
+
});
|
|
253
|
+
export const defaultResolverConfig = neutralResolverConfig;
|
|
254
|
+
export const resolverPresetConfigs = Object.freeze({
|
|
255
|
+
neutral: neutralResolverConfig,
|
|
256
|
+
soft: softResolverConfig,
|
|
257
|
+
strong: strongResolverConfig,
|
|
258
|
+
});
|
|
259
|
+
export function isResolverPresetName(value) {
|
|
260
|
+
return (typeof value === 'string' &&
|
|
261
|
+
RESOLVER_PRESETS.includes(value));
|
|
262
|
+
}
|
|
263
|
+
export function assertResolverPresetName(value) {
|
|
264
|
+
if (!isResolverPresetName(value)) {
|
|
265
|
+
throw new Error(formatInvalidResolverPresetError(value));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
export function getResolverPresetConfig(preset) {
|
|
269
|
+
assertResolverPresetName(preset);
|
|
270
|
+
return resolverPresetConfigs[preset];
|
|
271
|
+
}
|
|
272
|
+
export function mergeResolverConfig(base, overrides) {
|
|
273
|
+
if (overrides === undefined) {
|
|
274
|
+
return base;
|
|
275
|
+
}
|
|
276
|
+
return createResolverConfig({
|
|
277
|
+
chromaLimits: {
|
|
278
|
+
maxReduction: overrides.chromaLimits?.maxReduction ?? base.chromaLimits.maxReduction,
|
|
279
|
+
reductionStep: overrides.chromaLimits?.reductionStep ??
|
|
280
|
+
base.chromaLimits.reductionStep,
|
|
281
|
+
},
|
|
282
|
+
levelCurves: {
|
|
283
|
+
fill: overrides.levelCurves?.fill ?? base.levelCurves.fill,
|
|
284
|
+
lines: overrides.levelCurves?.lines ?? base.levelCurves.lines,
|
|
285
|
+
overlays: overrides.levelCurves?.overlays ?? base.levelCurves.overlays,
|
|
286
|
+
},
|
|
287
|
+
relationParams: {
|
|
288
|
+
on: {
|
|
289
|
+
contrastTarget: overrides.relationParams?.on?.contrastTarget ??
|
|
290
|
+
base.relationParams.on.contrastTarget,
|
|
291
|
+
maxLuminanceShift: overrides.relationParams?.on?.maxLuminanceShift ??
|
|
292
|
+
base.relationParams.on.maxLuminanceShift,
|
|
293
|
+
},
|
|
294
|
+
over: {
|
|
295
|
+
baseAlphaByLevel: mergeAlphaTable(base.relationParams.over.baseAlphaByLevel, overrides.relationParams?.over?.baseAlphaByLevel),
|
|
296
|
+
},
|
|
297
|
+
under: {
|
|
298
|
+
baseAlphaByLevel: mergeAlphaTable(base.relationParams.under.baseAlphaByLevel, overrides.relationParams?.under?.baseAlphaByLevel),
|
|
299
|
+
luminanceReduction: overrides.relationParams?.under?.luminanceReduction ??
|
|
300
|
+
base.relationParams.under.luminanceReduction,
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
stateDeltas: {
|
|
304
|
+
alpha: mergeStateDeltaTable(base.stateDeltas.alpha, overrides.stateDeltas?.alpha),
|
|
305
|
+
luminance: mergeStateDeltaTable(base.stateDeltas.luminance, overrides.stateDeltas?.luminance),
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,187 +1,111 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
export type
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
*/
|
|
26
|
-
export type
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
* - Tokens never carry actual color values.
|
|
113
|
-
* - `query.output` is forbidden; output formatting is decided by serializers/exporters.
|
|
114
|
-
* - Do not encode interactive state in `query.state`; declare supported states via `states`.
|
|
115
|
-
* - Do not embed literal background colors via `query.on: { kind: "color" }`.
|
|
116
|
-
*/
|
|
117
|
-
export interface TokenDefinition {
|
|
118
|
-
name: string;
|
|
119
|
-
description?: string;
|
|
120
|
-
query: TokenQuery;
|
|
121
|
-
category?: string;
|
|
122
|
-
states?: TokenStates;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Collection of base token definitions keyed by token name.
|
|
126
|
-
*/
|
|
127
|
-
export interface TokenRegistry {
|
|
128
|
-
tokens: Record<string, TokenDefinition>;
|
|
129
|
-
}
|
|
130
|
-
export interface ResolvedColor {
|
|
131
|
-
/**
|
|
132
|
-
* Serialized string corresponding to `preferSpace`.
|
|
133
|
-
* Always present.
|
|
134
|
-
*/
|
|
135
|
-
value: CssColorString;
|
|
136
|
-
/**
|
|
137
|
-
* Auxiliary sRGB representation.
|
|
138
|
-
* Only present if included via `includeSpaces`.
|
|
139
|
-
*/
|
|
140
|
-
srgb?: CssColorString;
|
|
141
|
-
/**
|
|
142
|
-
* Auxiliary Display-P3 representation.
|
|
143
|
-
* Only present if included via `includeSpaces`.
|
|
144
|
-
*/
|
|
145
|
-
p3?: CssColorString;
|
|
146
|
-
/**
|
|
147
|
-
* Auxiliary OKLCH representation.
|
|
148
|
-
* Only present if included via `includeSpaces`.
|
|
149
|
-
*/
|
|
150
|
-
oklch?: CssColorString;
|
|
151
|
-
alpha: number;
|
|
152
|
-
meta?: ColorMeta;
|
|
153
|
-
}
|
|
154
|
-
export interface ColorQuery {
|
|
155
|
-
role: ColorRole;
|
|
156
|
-
variant?: SemanticVariant;
|
|
157
|
-
usage?: ColorUsage;
|
|
158
|
-
context?: ColorContext;
|
|
159
|
-
surface?: SurfaceIntent;
|
|
160
|
-
state?: ColorState;
|
|
161
|
-
emphasis?: ColorEmphasis;
|
|
162
|
-
on?: BackgroundHint;
|
|
163
|
-
contrast?: ContrastRequirement;
|
|
164
|
-
alpha?: AlphaStrategy;
|
|
165
|
-
output?: OutputOptions;
|
|
166
|
-
}
|
|
167
|
-
export interface OnSolidQuery {
|
|
168
|
-
bgRole: ColorRole;
|
|
169
|
-
usage: "text" | "icon";
|
|
170
|
-
context?: ColorContext;
|
|
171
|
-
state?: ColorState;
|
|
172
|
-
emphasis?: ColorEmphasis;
|
|
173
|
-
alpha?: AlphaStrategy;
|
|
174
|
-
contrast?: ContrastRequirement;
|
|
175
|
-
output?: OutputOptions;
|
|
176
|
-
}
|
|
177
|
-
export interface SemanticColorTheme {
|
|
178
|
-
resolve(query: ColorQuery): ResolvedColor;
|
|
179
|
-
resolveMany(queries: ColorQuery[]): ResolvedColor[];
|
|
180
|
-
color(role: ColorRole, options?: Omit<ColorQuery, "role">): ResolvedColor;
|
|
181
|
-
onSolid(query: OnSolidQuery): ResolvedColor;
|
|
182
|
-
withContext(context: ColorContext): SemanticColorTheme;
|
|
183
|
-
export: {
|
|
184
|
-
cssVars(): string;
|
|
185
|
-
json(): unknown;
|
|
186
|
-
};
|
|
187
|
-
}
|
|
1
|
+
import type { IntentDefinition as InternalIntentDefinition } from '../core/intent-registry.js';
|
|
2
|
+
import type { OklchColor as InternalOklchColor } from '../core/oklch.js';
|
|
3
|
+
import type { Context as InternalContext } from '../engine/context/context.js';
|
|
4
|
+
import type { Level as InternalLevel } from '../engine/level/level.js';
|
|
5
|
+
import type { State as InternalState, StateDeltaDirection } from '../engine/state/state.js';
|
|
6
|
+
import type { Usage as InternalUsage } from '../engine/usage/strategy.js';
|
|
7
|
+
import type { ColorOutput as InternalColorOutput, RgbaColor as InternalRgbaColor, RgbColor as InternalRgbColor, ResolveOutput } from '../export/types.js';
|
|
8
|
+
import type { ChromaConfig, RelationParamsConfig, ResolverConfig, ResolverConfigOverrides, ResolverPresetName } from '../presets/presets.js';
|
|
9
|
+
/** Semantic usage axis used by the resolver. */
|
|
10
|
+
export type Usage = InternalUsage;
|
|
11
|
+
/** Explicit level axis. Valid values are integers from 1 to 9. */
|
|
12
|
+
export type Level = InternalLevel;
|
|
13
|
+
/** Interactive state axis. State deltas are applied only when explicitly requested. */
|
|
14
|
+
export type State = InternalState;
|
|
15
|
+
/** Direction used when applying non-default state deltas. Palette Kit never infers it. */
|
|
16
|
+
export type { StateDeltaDirection };
|
|
17
|
+
/** Environmental context axis. Palette Kit never detects this automatically. */
|
|
18
|
+
export type Context = InternalContext;
|
|
19
|
+
/** Output format applied after OKLCH resolution. */
|
|
20
|
+
export type ColorOutput = InternalColorOutput;
|
|
21
|
+
/** Normalized internal OKLCH color returned by the default public output. */
|
|
22
|
+
export type OklchColor = InternalOklchColor;
|
|
23
|
+
/** RGBA object returned by `output: "rgba"`. */
|
|
24
|
+
export type RgbaColor = InternalRgbaColor;
|
|
25
|
+
/** RGB object returned by `output: "srgb"` and `output: "p3"`. */
|
|
26
|
+
export type RgbColor = InternalRgbColor;
|
|
27
|
+
/** Intent registry entry supplied at palette creation. */
|
|
28
|
+
export type IntentDefinition = InternalIntentDefinition;
|
|
29
|
+
export type { ChromaConfig, RelationParamsConfig, ResolverConfig, ResolverConfigOverrides, ResolverPresetName, };
|
|
30
|
+
/** Public return type for a selected resolver output format. */
|
|
31
|
+
export type PaletteResolveOutput<O extends ColorOutput = 'oklch'> = ResolveOutput<O>;
|
|
32
|
+
/** Configuration for `createPaletteKit`. */
|
|
33
|
+
export type PaletteKitConfig<I extends string = string, PaletteOutput extends ColorOutput | undefined = undefined, SystemDefaultOutput extends ColorOutput | undefined = undefined> = Readonly<{
|
|
34
|
+
/** Flat intent registry owned by the application. */
|
|
35
|
+
intents: Record<I, IntentDefinition>;
|
|
36
|
+
/** Palette-level context used when a resolver call does not override it. */
|
|
37
|
+
context?: Context;
|
|
38
|
+
/** Host-provided context fallback. Palette Kit never reads system preferences. */
|
|
39
|
+
systemDefaultContext?: Context;
|
|
40
|
+
/** Palette-level output used when a resolver call does not override it. */
|
|
41
|
+
output?: PaletteOutput;
|
|
42
|
+
/** Host-provided output fallback. Defaults to `oklch` when omitted. */
|
|
43
|
+
systemDefaultOutput?: SystemDefaultOutput;
|
|
44
|
+
/** Public resolver preset. Defaults to `neutral`. */
|
|
45
|
+
preset?: ResolverPresetName;
|
|
46
|
+
/** Explicit resolver configuration overrides merged on top of the preset. */
|
|
47
|
+
resolverConfig?: ResolverConfigOverrides;
|
|
48
|
+
}>;
|
|
49
|
+
export type PaletteDefaultOutput<PaletteOutput extends ColorOutput | undefined, SystemDefaultOutput extends ColorOutput | undefined> = PaletteOutput extends ColorOutput ? PaletteOutput : SystemDefaultOutput extends ColorOutput ? SystemDefaultOutput : 'oklch';
|
|
50
|
+
type RelationTarget = OklchColor;
|
|
51
|
+
type DefaultStateOptions = Readonly<{
|
|
52
|
+
state?: 'default';
|
|
53
|
+
stateDirection?: StateDeltaDirection;
|
|
54
|
+
}>;
|
|
55
|
+
type NonDefaultStateOptions = Readonly<{
|
|
56
|
+
state: Exclude<State, 'default'>;
|
|
57
|
+
stateDirection: StateDeltaDirection;
|
|
58
|
+
}>;
|
|
59
|
+
type StateOptions = DefaultStateOptions | NonDefaultStateOptions;
|
|
60
|
+
type BaseResolveOptions<I extends string, ResolverOutput extends ColorOutput> = Readonly<{
|
|
61
|
+
/** Registered semantic intent name. */
|
|
62
|
+
intent: I;
|
|
63
|
+
/** Resolver-level context override. */
|
|
64
|
+
context?: Context;
|
|
65
|
+
/** Resolver-level output override. */
|
|
66
|
+
output?: ResolverOutput;
|
|
67
|
+
}>;
|
|
68
|
+
type FillResolveOptions = Readonly<{
|
|
69
|
+
usage: 'fill';
|
|
70
|
+
level: Level;
|
|
71
|
+
on?: RelationTarget;
|
|
72
|
+
over?: never;
|
|
73
|
+
under?: never;
|
|
74
|
+
}>;
|
|
75
|
+
type LinesResolveOptions = Readonly<{
|
|
76
|
+
usage: 'lines';
|
|
77
|
+
level: Level;
|
|
78
|
+
on?: RelationTarget;
|
|
79
|
+
over?: never;
|
|
80
|
+
under?: never;
|
|
81
|
+
}>;
|
|
82
|
+
type VisualVocabularyResolveOptions = Readonly<{
|
|
83
|
+
usage: 'visualVocabulary';
|
|
84
|
+
on: RelationTarget;
|
|
85
|
+
level?: never;
|
|
86
|
+
over?: never;
|
|
87
|
+
under?: never;
|
|
88
|
+
}>;
|
|
89
|
+
type OverlayRelationOptions = Readonly<{
|
|
90
|
+
over?: RelationTarget;
|
|
91
|
+
under?: never;
|
|
92
|
+
}> | Readonly<{
|
|
93
|
+
under?: RelationTarget;
|
|
94
|
+
over?: never;
|
|
95
|
+
}> | Readonly<{
|
|
96
|
+
over?: undefined;
|
|
97
|
+
under?: undefined;
|
|
98
|
+
}>;
|
|
99
|
+
type OverlaysResolveOptions = Readonly<{
|
|
100
|
+
usage: 'overlays';
|
|
101
|
+
level: Level;
|
|
102
|
+
on?: never;
|
|
103
|
+
}> & OverlayRelationOptions;
|
|
104
|
+
type UsageResolveOptions = FillResolveOptions | LinesResolveOptions | VisualVocabularyResolveOptions | OverlaysResolveOptions;
|
|
105
|
+
/** Options accepted by `palette.resolve`. */
|
|
106
|
+
export type PaletteResolveOptions<I extends string = string, ResolverOutput extends ColorOutput = ColorOutput> = BaseResolveOptions<I, ResolverOutput> & UsageResolveOptions & StateOptions;
|
|
107
|
+
/** Immutable public Palette Kit instance. */
|
|
108
|
+
export type PaletteKit<I extends string = string, PaletteOutput extends ColorOutput = 'oklch'> = Readonly<{
|
|
109
|
+
/** Resolves a color from semantic axes and formats it after OKLCH resolution. */
|
|
110
|
+
resolve<const ResolverOutput extends ColorOutput = PaletteOutput>(options: PaletteResolveOptions<I, ResolverOutput>): PaletteResolveOutput<ResolverOutput>;
|
|
111
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type PaletteKitErrorCategory = 'configuration' | 'resolver-input' | 'resolution' | 'serialization';
|
|
2
|
+
export type PaletteKitErrorCode = 'CONTRAST_UNSATISFIABLE' | 'UNKNOWN_INTENT' | 'MISSING_REQUIRED_AXIS' | 'FORBIDDEN_AXIS_COMBINATION' | 'INVALID_RELATION_TARGET' | 'MULTIPLE_RELATIONS' | 'UNRESOLVED_CONTEXT' | 'UNSUPPORTED_OUTPUT';
|
|
3
|
+
export type PaletteKitErrorDetails = Readonly<Record<string, unknown>>;
|
|
4
|
+
export declare class PaletteKitError extends Error {
|
|
5
|
+
readonly code: PaletteKitErrorCode;
|
|
6
|
+
readonly category: PaletteKitErrorCategory;
|
|
7
|
+
readonly details?: PaletteKitErrorDetails;
|
|
8
|
+
constructor(code: PaletteKitErrorCode, category: PaletteKitErrorCategory, message: string, details?: PaletteKitErrorDetails);
|
|
9
|
+
}
|
|
10
|
+
export declare const createUnknownIntentError: (intent: string) => PaletteKitError;
|
|
11
|
+
export declare const createMissingRequiredAxisError: (axis: string, usage: string, message?: string) => PaletteKitError;
|
|
12
|
+
export declare const createForbiddenAxisCombinationError: (axis: string, usage: string, message?: string) => PaletteKitError;
|
|
13
|
+
export declare const createInvalidRelationTargetError: (relation: string, message?: string) => PaletteKitError;
|
|
14
|
+
export declare const createMultipleRelationsError: (relations: readonly string[]) => PaletteKitError;
|
|
15
|
+
export declare const createUnresolvedContextError: () => PaletteKitError;
|
|
16
|
+
export declare const createUnsupportedOutputError: (output: string, message?: string) => PaletteKitError;
|
|
17
|
+
export declare const createContrastUnsatisfiableError: (contrast: number, target: number) => PaletteKitError;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class PaletteKitError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
category;
|
|
4
|
+
details;
|
|
5
|
+
constructor(code, category, message, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'PaletteKitError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.category = category;
|
|
10
|
+
this.details =
|
|
11
|
+
details === undefined ? undefined : Object.freeze({ ...details });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export const createUnknownIntentError = (intent) => new PaletteKitError('UNKNOWN_INTENT', 'configuration', `Unknown intent "${intent}". Did you forget to register it in the Intent Registry?`, { intent });
|
|
15
|
+
export const createMissingRequiredAxisError = (axis, usage, message) => new PaletteKitError('MISSING_REQUIRED_AXIS', 'resolver-input', message ?? `${axis} is required for usage "${usage}".`, { axis, usage });
|
|
16
|
+
export const createForbiddenAxisCombinationError = (axis, usage, message) => new PaletteKitError('FORBIDDEN_AXIS_COMBINATION', 'resolver-input', message ?? `${axis} is not allowed for usage "${usage}".`, { axis, usage });
|
|
17
|
+
export const createInvalidRelationTargetError = (relation, message) => new PaletteKitError('INVALID_RELATION_TARGET', 'resolver-input', message ??
|
|
18
|
+
`Relation "${relation}" target must be a normalized OKLCH color.`, { relation });
|
|
19
|
+
export const createMultipleRelationsError = (relations) => new PaletteKitError('MULTIPLE_RELATIONS', 'resolver-input', `Only one relation may be provided. Received: ${relations.join(', ')}.`, { relations: [...relations] });
|
|
20
|
+
export const createUnresolvedContextError = () => new PaletteKitError('UNRESOLVED_CONTEXT', 'resolver-input', 'Context could not be resolved. Provide resolverContext, paletteContext, or systemDefaultContext.');
|
|
21
|
+
export const createUnsupportedOutputError = (output, message) => new PaletteKitError('UNSUPPORTED_OUTPUT', 'serialization', message ?? `Unsupported color output "${output}" in Phase 10 serializer.`, { output });
|
|
22
|
+
export const createContrastUnsatisfiableError = (contrast, target) => new PaletteKitError('CONTRAST_UNSATISFIABLE', 'resolution', `Unable to satisfy APCA contrast target ${target}. Best contrast was ${contrast}.`, { contrast, target });
|