@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.
Files changed (312) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +80 -87
  3. package/dist/contrast/contrast.d.ts +16 -0
  4. package/dist/contrast/contrast.js +102 -0
  5. package/dist/core/intent-registry.d.ts +11 -0
  6. package/dist/core/intent-registry.js +70 -0
  7. package/dist/core/oklch.d.ts +16 -0
  8. package/dist/core/oklch.js +56 -0
  9. package/dist/create-palette-kit.d.ts +9 -0
  10. package/dist/create-palette-kit.js +67 -0
  11. package/dist/engine/context/context.d.ts +13 -0
  12. package/dist/engine/context/context.js +37 -0
  13. package/dist/engine/level/curves.d.ts +17 -0
  14. package/dist/engine/level/curves.js +49 -0
  15. package/dist/engine/level/level.d.ts +4 -0
  16. package/dist/engine/level/level.js +13 -0
  17. package/dist/engine/relation/relation.d.ts +105 -0
  18. package/dist/engine/relation/relation.js +137 -0
  19. package/dist/engine/resolve/resolve.d.ts +36 -0
  20. package/dist/engine/resolve/resolve.js +116 -0
  21. package/dist/engine/state/state.d.ts +46 -0
  22. package/dist/engine/state/state.js +68 -0
  23. package/dist/engine/usage/fill.d.ts +9 -0
  24. package/dist/engine/usage/fill.js +9 -0
  25. package/dist/engine/usage/lines.d.ts +9 -0
  26. package/dist/engine/usage/lines.js +9 -0
  27. package/dist/engine/usage/overlays.d.ts +9 -0
  28. package/dist/engine/usage/overlays.js +9 -0
  29. package/dist/engine/usage/strategy.d.ts +56 -0
  30. package/dist/engine/usage/strategy.js +30 -0
  31. package/dist/engine/usage/visualVocabulary.d.ts +9 -0
  32. package/dist/engine/usage/visualVocabulary.js +9 -0
  33. package/dist/export/serialize.d.ts +14 -0
  34. package/dist/export/serialize.js +89 -0
  35. package/dist/export/types.d.ts +37 -0
  36. package/dist/export/types.js +31 -0
  37. package/dist/index.d.ts +3 -3
  38. package/dist/index.js +2 -2
  39. package/dist/operators/convert.d.ts +32 -0
  40. package/dist/operators/convert.js +80 -0
  41. package/dist/presets/presets.d.ts +95 -0
  42. package/dist/presets/presets.js +308 -0
  43. package/dist/types/index.d.ts +111 -187
  44. package/dist/utils/errors/errors.d.ts +17 -0
  45. package/dist/utils/errors/errors.js +22 -0
  46. package/docs/API.md +167 -0
  47. package/docs/Alpha.md +14 -0
  48. package/docs/Architecture.md +56 -0
  49. package/docs/CLI.md +22 -0
  50. package/docs/Concepts.md +73 -0
  51. package/docs/Config.md +144 -0
  52. package/docs/Diagnostics.md +22 -0
  53. package/docs/Exporters.md +33 -0
  54. package/docs/FAQ.md +59 -0
  55. package/docs/Migration.md +61 -0
  56. package/docs/Overlays.md +33 -0
  57. package/docs/README.md +60 -0
  58. package/docs/Text.md +41 -0
  59. package/docs/Tokens.md +42 -0
  60. package/docs/Usage-JSON.md +39 -0
  61. package/docs/Usage-ReactNative.md +63 -0
  62. package/docs/Usage-Web.md +66 -0
  63. package/docs/Validation.md +97 -0
  64. package/docs/Why.md +37 -0
  65. package/docs/_api-surface.md +53 -0
  66. package/docs/snippets/serialize-oklch.md +9 -0
  67. package/docs/spec.md +98 -0
  68. package/package.json +74 -59
  69. package/.codex/skills/color-pipeline-implementer/SKILL.md +0 -23
  70. package/.codex/skills/commit-message-crafter/SKILL.md +0 -63
  71. package/.codex/skills/commit-message-crafter/references/benchmarks.md +0 -20
  72. package/.codex/skills/contrast-solver-helper/SKILL.md +0 -20
  73. package/.codex/skills/exporters-builder/SKILL.md +0 -20
  74. package/.codex/skills/markdownlint-writer/SKILL.md +0 -32
  75. package/.codex/skills/phase-implementation-runbook/SKILL.md +0 -92
  76. package/.codex/skills/type-contract-auditor/SKILL.md +0 -21
  77. package/.github/skills/review-guide/SKILL.md +0 -23
  78. package/.github/skills/review-guide/references/review-guide-v0.3.md +0 -629
  79. package/.markdownlint.json +0 -4
  80. package/AGENTS.md +0 -16
  81. package/biome.json +0 -43
  82. package/dist/cli/args.d.ts +0 -12
  83. package/dist/cli/args.js +0 -56
  84. package/dist/cli/args.test.d.ts +0 -1
  85. package/dist/cli/args.test.js +0 -22
  86. package/dist/cli/codegen/__snapshots__/tokens.test.js.snap +0 -87
  87. package/dist/cli/codegen/tokens.d.ts +0 -12
  88. package/dist/cli/codegen/tokens.js +0 -139
  89. package/dist/cli/codegen/tokens.test.d.ts +0 -1
  90. package/dist/cli/codegen/tokens.test.js +0 -51
  91. package/dist/cli/config.d.ts +0 -40
  92. package/dist/cli/config.js +0 -34
  93. package/dist/cli/validate.d.ts +0 -2
  94. package/dist/cli/validate.js +0 -33
  95. package/dist/cli/validate.test.d.ts +0 -1
  96. package/dist/cli/validate.test.js +0 -40
  97. package/dist/cli.d.ts +0 -2
  98. package/dist/cli.js +0 -148
  99. package/dist/contrast/apca.d.ts +0 -2
  100. package/dist/contrast/apca.js +0 -15
  101. package/dist/contrast/apca.test.d.ts +0 -1
  102. package/dist/contrast/apca.test.js +0 -16
  103. package/dist/contrast/index.d.ts +0 -4
  104. package/dist/contrast/index.js +0 -4
  105. package/dist/contrast/scoring.d.ts +0 -4
  106. package/dist/contrast/scoring.js +0 -31
  107. package/dist/contrast/scoring.test.d.ts +0 -1
  108. package/dist/contrast/scoring.test.js +0 -148
  109. package/dist/contrast/solver.d.ts +0 -13
  110. package/dist/contrast/solver.js +0 -170
  111. package/dist/contrast/solver.test.d.ts +0 -1
  112. package/dist/contrast/solver.test.js +0 -75
  113. package/dist/contrast/types.d.ts +0 -17
  114. package/dist/contrast/types.js +0 -1
  115. package/dist/contrast/utils.d.ts +0 -4
  116. package/dist/contrast/utils.js +0 -18
  117. package/dist/contrast/wcag2.d.ts +0 -3
  118. package/dist/contrast/wcag2.js +0 -19
  119. package/dist/contrast/wcag2.test.d.ts +0 -1
  120. package/dist/contrast/wcag2.test.js +0 -17
  121. package/dist/core/createTheme.d.ts +0 -35
  122. package/dist/core/createTheme.js +0 -24
  123. package/dist/core/dx-helpers.test.d.ts +0 -1
  124. package/dist/core/dx-helpers.test.js +0 -61
  125. package/dist/core/index.d.ts +0 -2
  126. package/dist/core/index.js +0 -2
  127. package/dist/core/onSolid.test.d.ts +0 -1
  128. package/dist/core/onSolid.test.js +0 -118
  129. package/dist/core/qa.v1.test.d.ts +0 -1
  130. package/dist/core/qa.v1.test.js +0 -112
  131. package/dist/core/resolve.d.ts +0 -3
  132. package/dist/core/resolve.js +0 -8
  133. package/dist/core/resolve.test.d.ts +0 -1
  134. package/dist/core/resolve.test.js +0 -89
  135. package/dist/core/resolveMany.d.ts +0 -8
  136. package/dist/core/resolveMany.js +0 -17
  137. package/dist/core/tokenRegistry.d.ts +0 -23
  138. package/dist/core/tokenRegistry.js +0 -83
  139. package/dist/core/tokenRegistry.test.d.ts +0 -1
  140. package/dist/core/tokenRegistry.test.js +0 -133
  141. package/dist/engine/applyOperators.d.ts +0 -3
  142. package/dist/engine/applyOperators.js +0 -23
  143. package/dist/engine/context.d.ts +0 -4
  144. package/dist/engine/context.js +0 -1
  145. package/dist/engine/gamut.d.ts +0 -13
  146. package/dist/engine/gamut.js +0 -101
  147. package/dist/engine/gamut.test.d.ts +0 -1
  148. package/dist/engine/gamut.test.js +0 -23
  149. package/dist/engine/generateScale.d.ts +0 -15
  150. package/dist/engine/generateScale.js +0 -29
  151. package/dist/engine/generateScale.test.d.ts +0 -1
  152. package/dist/engine/generateScale.test.js +0 -32
  153. package/dist/engine/index.d.ts +0 -8
  154. package/dist/engine/index.js +0 -4
  155. package/dist/engine/normalize.d.ts +0 -43
  156. package/dist/engine/normalize.js +0 -403
  157. package/dist/engine/normalize.test.d.ts +0 -1
  158. package/dist/engine/normalize.test.js +0 -136
  159. package/dist/engine/onSolid.d.ts +0 -3
  160. package/dist/engine/onSolid.js +0 -110
  161. package/dist/engine/resolveBaseColor.d.ts +0 -25
  162. package/dist/engine/resolveBaseColor.js +0 -127
  163. package/dist/engine/resolveBaseColor.test.d.ts +0 -1
  164. package/dist/engine/resolveBaseColor.test.js +0 -97
  165. package/dist/export/__snapshots__/exportTheme.test.js.snap +0 -74
  166. package/dist/export/exportTheme.d.ts +0 -47
  167. package/dist/export/exportTheme.js +0 -170
  168. package/dist/export/exportTheme.test.d.ts +0 -1
  169. package/dist/export/exportTheme.test.js +0 -118
  170. package/dist/export/index.d.ts +0 -1
  171. package/dist/export/index.js +0 -1
  172. package/dist/export/serializeColor.d.ts +0 -1
  173. package/dist/export/serializeColor.js +0 -1
  174. package/dist/export/serializeColor.test.d.ts +0 -1
  175. package/dist/export/serializeColor.test.js +0 -54
  176. package/dist/export.d.ts +0 -1
  177. package/dist/export.js +0 -1
  178. package/dist/operators/emphasis.d.ts +0 -3
  179. package/dist/operators/emphasis.js +0 -113
  180. package/dist/operators/emphasis.test.d.ts +0 -1
  181. package/dist/operators/emphasis.test.js +0 -69
  182. package/dist/operators/index.d.ts +0 -3
  183. package/dist/operators/index.js +0 -2
  184. package/dist/operators/state.d.ts +0 -3
  185. package/dist/operators/state.js +0 -102
  186. package/dist/operators/state.test.d.ts +0 -1
  187. package/dist/operators/state.test.js +0 -48
  188. package/dist/operators/types.d.ts +0 -13
  189. package/dist/operators/types.js +0 -1
  190. package/dist/operators/utils.d.ts +0 -16
  191. package/dist/operators/utils.js +0 -23
  192. package/dist/presets/curves.d.ts +0 -28
  193. package/dist/presets/curves.js +0 -145
  194. package/dist/presets/index.d.ts +0 -2
  195. package/dist/presets/index.js +0 -1
  196. package/dist/presets/tokens/index.d.ts +0 -3
  197. package/dist/presets/tokens/index.js +0 -3
  198. package/dist/presets/tokens/minimal-ui.d.ts +0 -6
  199. package/dist/presets/tokens/minimal-ui.js +0 -53
  200. package/dist/presets/tokens/modern-ui.d.ts +0 -5
  201. package/dist/presets/tokens/modern-ui.js +0 -83
  202. package/dist/presets/tokens/presets.test.d.ts +0 -1
  203. package/dist/presets/tokens/presets.test.js +0 -31
  204. package/dist/presets/tokens/radixLike-ui.d.ts +0 -6
  205. package/dist/presets/tokens/radixLike-ui.js +0 -77
  206. package/dist/serialize/index.d.ts +0 -1
  207. package/dist/serialize/index.js +0 -1
  208. package/dist/serialize/normalizeOutput.d.ts +0 -6
  209. package/dist/serialize/normalizeOutput.js +0 -45
  210. package/dist/serialize/serializeColor.d.ts +0 -21
  211. package/dist/serialize/serializeColor.js +0 -178
  212. package/dist/serialize/serializeResolved.test.d.ts +0 -1
  213. package/dist/serialize/serializeResolved.test.js +0 -45
  214. package/dist/serialize.d.ts +0 -1
  215. package/dist/serialize.js +0 -1
  216. package/dist/utils/clamp.d.ts +0 -1
  217. package/dist/utils/clamp.js +0 -1
  218. package/dist/utils/index.d.ts +0 -1
  219. package/dist/utils/index.js +0 -1
  220. package/dist/utils/lerp.d.ts +0 -1
  221. package/dist/utils/lerp.js +0 -1
  222. package/dist/utils/parseColor.d.ts +0 -6
  223. package/dist/utils/parseColor.js +0 -67
  224. package/dist/utils/parseColor.test.d.ts +0 -1
  225. package/dist/utils/parseColor.test.js +0 -51
  226. package/dist/utils/smoothstep.d.ts +0 -1
  227. package/dist/utils/smoothstep.js +0 -5
  228. package/planning/phase-10-review.md +0 -550
  229. package/planning/phase-7-review.md +0 -411
  230. package/planning/phase-8-review.md +0 -669
  231. package/planning/phase-9-review.md +0 -564
  232. package/planning/roadmap-v0.3.md +0 -284
  233. package/planning/spec-serializer-v0.3.md +0 -324
  234. package/planning/spec-v0.3.md +0 -305
  235. package/src/cli/args.test.ts +0 -28
  236. package/src/cli/args.ts +0 -66
  237. package/src/cli/codegen/__snapshots__/tokens.test.ts.snap +0 -87
  238. package/src/cli/codegen/tokens.test.ts +0 -61
  239. package/src/cli/codegen/tokens.ts +0 -191
  240. package/src/cli/config.ts +0 -71
  241. package/src/cli/validate.test.ts +0 -49
  242. package/src/cli/validate.ts +0 -38
  243. package/src/cli.ts +0 -183
  244. package/src/contrast/apca.test.ts +0 -20
  245. package/src/contrast/apca.ts +0 -26
  246. package/src/contrast/index.ts +0 -4
  247. package/src/contrast/scoring.test.ts +0 -188
  248. package/src/contrast/scoring.ts +0 -48
  249. package/src/contrast/solver.test.ts +0 -147
  250. package/src/contrast/solver.ts +0 -235
  251. package/src/contrast/types.ts +0 -20
  252. package/src/contrast/utils.ts +0 -28
  253. package/src/contrast/wcag2.test.ts +0 -21
  254. package/src/contrast/wcag2.ts +0 -24
  255. package/src/core/createTheme.ts +0 -78
  256. package/src/core/dx-helpers.test.ts +0 -82
  257. package/src/core/index.ts +0 -7
  258. package/src/core/onSolid.test.ts +0 -146
  259. package/src/core/qa.v1.test.ts +0 -149
  260. package/src/core/resolve.test.ts +0 -99
  261. package/src/core/resolve.ts +0 -11
  262. package/src/core/resolveMany.ts +0 -22
  263. package/src/core/tokenRegistry.test.ts +0 -153
  264. package/src/core/tokenRegistry.ts +0 -114
  265. package/src/engine/applyOperators.ts +0 -32
  266. package/src/engine/context.ts +0 -8
  267. package/src/engine/gamut.test.ts +0 -30
  268. package/src/engine/gamut.ts +0 -144
  269. package/src/engine/generateScale.test.ts +0 -46
  270. package/src/engine/generateScale.ts +0 -48
  271. package/src/engine/index.ts +0 -8
  272. package/src/engine/normalize.test.ts +0 -222
  273. package/src/engine/normalize.ts +0 -550
  274. package/src/engine/onSolid.ts +0 -178
  275. package/src/engine/resolveBaseColor.test.ts +0 -117
  276. package/src/engine/resolveBaseColor.ts +0 -203
  277. package/src/export/__snapshots__/exportTheme.test.ts.snap +0 -74
  278. package/src/export/exportTheme.test.ts +0 -144
  279. package/src/export/exportTheme.ts +0 -251
  280. package/src/export/index.ts +0 -1
  281. package/src/export/serializeColor.test.ts +0 -73
  282. package/src/export/serializeColor.ts +0 -1
  283. package/src/export.ts +0 -1
  284. package/src/index.ts +0 -3
  285. package/src/operators/emphasis.test.ts +0 -85
  286. package/src/operators/emphasis.ts +0 -132
  287. package/src/operators/index.ts +0 -3
  288. package/src/operators/state.test.ts +0 -66
  289. package/src/operators/state.ts +0 -122
  290. package/src/operators/types.ts +0 -14
  291. package/src/operators/utils.ts +0 -44
  292. package/src/presets/curves.ts +0 -168
  293. package/src/presets/index.ts +0 -2
  294. package/src/presets/tokens/index.ts +0 -3
  295. package/src/presets/tokens/minimal-ui.ts +0 -55
  296. package/src/presets/tokens/modern-ui.ts +0 -85
  297. package/src/presets/tokens/presets.test.ts +0 -46
  298. package/src/presets/tokens/radixLike-ui.ts +0 -79
  299. package/src/serialize/index.ts +0 -1
  300. package/src/serialize/normalizeOutput.ts +0 -63
  301. package/src/serialize/serializeColor.ts +0 -260
  302. package/src/serialize/serializeResolved.test.ts +0 -57
  303. package/src/serialize.ts +0 -1
  304. package/src/types/index.ts +0 -207
  305. package/src/utils/clamp.ts +0 -2
  306. package/src/utils/index.ts +0 -1
  307. package/src/utils/lerp.ts +0 -1
  308. package/src/utils/parseColor.test.ts +0 -66
  309. package/src/utils/parseColor.ts +0 -87
  310. package/src/utils/smoothstep.ts +0 -6
  311. package/tsconfig.build.json +0 -11
  312. package/tsconfig.json +0 -15
package/docs/API.md ADDED
@@ -0,0 +1,167 @@
1
+ # API
2
+
3
+ This document describes the public API exposed by the package root in the v0.4
4
+ branch.
5
+
6
+ ## Public Entry Point
7
+
8
+ ```ts
9
+ import { createPaletteKit } from "@clhaas/palette-kit";
10
+ ```
11
+
12
+ The package root exports `createPaletteKit` and the official resolver preset
13
+ configs. Public TypeScript types are also reexported from the package root.
14
+
15
+ ## createPaletteKit
16
+
17
+ ```ts
18
+ function createPaletteKit(config: PaletteKitConfig): PaletteKit;
19
+ ```
20
+
21
+ `createPaletteKit` creates an immutable palette resolver. It normalizes the
22
+ intent registry once and keeps context and output defaults explicit.
23
+
24
+ ```ts
25
+ const palette = createPaletteKit({
26
+ context: "light",
27
+ output: "oklch",
28
+ preset: "neutral",
29
+ intents: {
30
+ brand: { hue: 260, chroma: 0.14 },
31
+ neutral: { hue: 0, chroma: 0 },
32
+ },
33
+ });
34
+ ```
35
+
36
+ ## palette.resolve
37
+
38
+ ```ts
39
+ palette.resolve({
40
+ usage,
41
+ intent,
42
+ level,
43
+ on,
44
+ over,
45
+ under,
46
+ state,
47
+ stateDirection,
48
+ context,
49
+ output,
50
+ });
51
+ ```
52
+
53
+ Resolution always happens in OKLCH first. The selected `output` is applied only
54
+ after resolution.
55
+
56
+ ```ts
57
+ const surface = palette.resolve({
58
+ usage: "fill",
59
+ intent: "neutral",
60
+ level: 2,
61
+ });
62
+
63
+ const text = palette.resolve({
64
+ usage: "visualVocabulary",
65
+ intent: "brand",
66
+ on: surface,
67
+ });
68
+ ```
69
+
70
+ ## Usage Rules
71
+
72
+ | Usage | Level | Relations |
73
+ | --- | --- | --- |
74
+ | `fill` | Required | `on` optional |
75
+ | `visualVocabulary` | Forbidden | `on` required |
76
+ | `lines` | Required | `on` optional |
77
+ | `overlays` | Required | `over` or `under` optional |
78
+
79
+ `on` enforces APCA contrast. The default target is Lc 60. If the resolver cannot
80
+ meet the target after the configured luminance shift and chroma reduction, it
81
+ throws.
82
+
83
+ ## State Rules
84
+
85
+ `state` defaults to `"default"`.
86
+
87
+ When `state` is not `"default"`, `stateDirection` is required. Palette Kit never
88
+ infers whether a state should increase or decrease lightness.
89
+
90
+ ```ts
91
+ palette.resolve({
92
+ usage: "fill",
93
+ intent: "brand",
94
+ level: 4,
95
+ state: "hover",
96
+ stateDirection: "increase",
97
+ });
98
+ ```
99
+
100
+ ## Context Rules
101
+
102
+ Context is never inferred from the system or DOM.
103
+
104
+ Precedence:
105
+
106
+ 1. Resolver-level `context`
107
+ 2. Palette-level `context`
108
+ 3. `systemDefaultContext`
109
+
110
+ If none is available, resolution throws.
111
+
112
+ Context affects default level curves. In dark context, the default fill and
113
+ lines curves use the inverted structural lightness scale while preserving
114
+ intent hue and chroma.
115
+
116
+ ## Output Rules
117
+
118
+ | Output | Runtime status |
119
+ | --- | --- |
120
+ | `oklch` | Returns normalized OKLCH object |
121
+ | `oklab` | Returns OKLab object |
122
+ | `srgb` | Returns `{ r, g, b, alpha }` |
123
+ | `p3` | Returns Display-P3 `{ r, g, b, alpha }` |
124
+ | `hex` | Serialized to `#rrggbb` |
125
+ | `rgba` | Serialized to `{ r, g, b, a }` |
126
+
127
+ RGB-like outputs use clipped 8-bit channels.
128
+
129
+ Output precedence:
130
+
131
+ 1. Resolver-level `output`
132
+ 2. Palette-level `output`
133
+ 3. `systemDefaultOutput`
134
+ 4. Explicit `oklch` default
135
+
136
+ ## Public Types
137
+
138
+ The package root reexports:
139
+
140
+ - `PaletteKitConfig`
141
+ - `PaletteKit`
142
+ - `PaletteResolveOptions`
143
+ - `PaletteResolveOutput`
144
+ - `Usage`
145
+ - `Level`
146
+ - `State`
147
+ - `StateDeltaDirection`
148
+ - `Context`
149
+ - `ColorOutput`
150
+ - `OklchColor`
151
+ - `RgbColor`
152
+ - `RgbaColor`
153
+ - `IntentDefinition`
154
+ - `ResolverPresetName`
155
+ - `ResolverConfig`
156
+ - `ResolverConfigOverrides`
157
+ - `RelationParamsConfig`
158
+ - `ChromaConfig`
159
+
160
+ ## Not Public in v0.4
161
+
162
+ - Intent registry helpers
163
+ - Validators
164
+ - Internal resolver helpers
165
+ - Serializer functions
166
+ - CLI
167
+ - Subpath exporters
package/docs/Alpha.md ADDED
@@ -0,0 +1,14 @@
1
+ # Alpha
2
+
3
+ Alpha is present in the normalized OKLCH model as `alpha`.
4
+
5
+ In the current v0.4 implementation:
6
+
7
+ - base resolved OKLCH colors use `alpha: 1`;
8
+ - `rgba` output maps alpha to `a`;
9
+ - `over` and `under` relations apply configured alpha by level;
10
+ - state alpha deltas from `resolverConfig` apply only to `overlays`;
11
+ - non-overlay usages preserve resolved alpha and never use alpha to satisfy
12
+ contrast.
13
+
14
+ Alpha behavior is explicit and deterministic.
@@ -0,0 +1,56 @@
1
+ # Architecture
2
+
3
+ This document reflects the current v0.4 branch implementation.
4
+
5
+ ## Public Flow
6
+
7
+ ```text
8
+ createPaletteKit(config) -> palette.resolve(options) -> output
9
+ ```
10
+
11
+ Resolution is deterministic and side-effect free.
12
+
13
+ ## Main Layers
14
+
15
+ - `core`: OKLCH model and intent registry.
16
+ - `engine`: usage, level, state, relation, context, and resolver pipeline.
17
+ - `export`: output typing and serializers.
18
+ - `presets`: official resolver presets and config merge helpers.
19
+ - `types`: public type contracts reexported by the package root.
20
+ - `utils`: structured internal errors.
21
+
22
+ ## Resolver Pipeline
23
+
24
+ The internal resolver:
25
+
26
+ 1. validates usage, state, context, level, and relations;
27
+ 2. looks up the registered intent;
28
+ 3. selects the usage strategy;
29
+ 4. applies context-aware level curves for level-driven usages;
30
+ 5. applies relation validation and behavior;
31
+ 6. applies explicit luminance state deltas and overlay alpha deltas;
32
+ 7. applies structural context hooks;
33
+ 8. returns normalized OKLCH.
34
+
35
+ Output serialization happens after resolution.
36
+
37
+ ## Public Outputs
38
+
39
+ - `oklch`: normalized OKLCH object.
40
+ - `oklab`: OKLab object.
41
+ - `srgb`: clipped 8-bit sRGB object.
42
+ - `p3`: clipped 8-bit Display-P3 object.
43
+ - `hex`: serialized sRGB hex string.
44
+ - `rgba`: serialized sRGB object.
45
+
46
+ ## Not Public in v0.4
47
+
48
+ - CLI
49
+ - subpath exporters
50
+ - serializer functions
51
+ - registry helpers
52
+
53
+ See also:
54
+
55
+ - [Resolver Pipeline Diagram](../planning/v0.4/diagrams/resolver-pipeline.md)
56
+ - [Axes Diagram](../planning/v0.4/diagrams/axes.md)
package/docs/CLI.md ADDED
@@ -0,0 +1,22 @@
1
+ # CLI
2
+
3
+ Palette Kit v0.4 does not expose a public CLI.
4
+
5
+ There is no `bin` entry in the current package surface and no documented command
6
+ for generating tokens.
7
+
8
+ Use the runtime API directly:
9
+
10
+ ```ts
11
+ import { createPaletteKit } from "@clhaas/palette-kit";
12
+
13
+ const palette = createPaletteKit({
14
+ context: "light",
15
+ intents: {
16
+ brand: { hue: 260, chroma: 0.14 },
17
+ },
18
+ });
19
+ ```
20
+
21
+ CLI support may be added in a future phase, but it is not part of v0.4 current
22
+ implementation.
@@ -0,0 +1,73 @@
1
+ # Concepts
2
+
3
+ Palette Kit v0.4 resolves colors from orthogonal axes instead of precomposed
4
+ tokens.
5
+
6
+ ## Intent
7
+
8
+ An intent is a semantic hue and chroma anchor.
9
+
10
+ ```ts
11
+ intents: {
12
+ brand: { hue: 260, chroma: 0.14 },
13
+ neutral: { hue: 0, chroma: 0 },
14
+ }
15
+ ```
16
+
17
+ Intent does not encode usage, level, state, relation, or context.
18
+
19
+ ## Usage
20
+
21
+ `usage` describes how the color is used:
22
+
23
+ - `fill`
24
+ - `visualVocabulary`
25
+ - `lines`
26
+ - `overlays`
27
+
28
+ ## Level
29
+
30
+ `level` is an explicit integer from `1` to `9`.
31
+
32
+ It is required for:
33
+
34
+ - `fill`
35
+ - `lines`
36
+ - `overlays`
37
+
38
+ It is forbidden for `visualVocabulary`.
39
+
40
+ ## Relation
41
+
42
+ Relations connect one resolved color to another:
43
+
44
+ - `on`
45
+ - `over`
46
+ - `under`
47
+
48
+ `visualVocabulary` requires `on`.
49
+
50
+ ## State
51
+
52
+ `state` defaults to `default`.
53
+
54
+ When state is not `default`, the caller must provide `stateDirection` as
55
+ `increase` or `decrease`.
56
+
57
+ ## Context
58
+
59
+ Context is `light` or `dark`. It is never inferred automatically.
60
+
61
+ Precedence:
62
+
63
+ 1. resolver-level context
64
+ 2. palette-level context
65
+ 3. system default context
66
+
67
+ ## Output
68
+
69
+ Output is a delivery concern, not semantic input.
70
+
71
+ Changing output must not change internal OKLCH resolution.
72
+
73
+ See [What Never Happens](../planning/v0.4/diagrams/what-never-happens.md).
package/docs/Config.md ADDED
@@ -0,0 +1,144 @@
1
+ # Configuration
2
+
3
+ `createPaletteKit` accepts a small explicit configuration object.
4
+
5
+ ```ts
6
+ import { createPaletteKit } from "@clhaas/palette-kit";
7
+
8
+ const palette = createPaletteKit({
9
+ context: "light",
10
+ output: "oklch",
11
+ intents: {
12
+ brand: { hue: 260, chroma: 0.14 },
13
+ neutral: { hue: 0, chroma: 0 },
14
+ },
15
+ });
16
+ ```
17
+
18
+ ## intents
19
+
20
+ ```ts
21
+ Record<string, { hue: number; chroma: number }>
22
+ ```
23
+
24
+ `intents` is required. Intent names must be flat strings:
25
+
26
+ - not empty
27
+ - no whitespace
28
+ - no `.`
29
+
30
+ `hue` must be finite and is normalized to `[0, 360)`. `chroma` must be finite
31
+ and greater than or equal to `0`.
32
+
33
+ Intent names must describe semantic meaning only. Names that encode usage,
34
+ state, relation, level, or visual implementation details are rejected. Keep
35
+ dimensions such as `fill`, `hover`, `on`, `strong`, `red`, and `dark` in
36
+ resolver options or configuration instead of intent names.
37
+
38
+ ## context
39
+
40
+ ```ts
41
+ "light" | "dark"
42
+ ```
43
+
44
+ `context` is optional at palette creation. It becomes the default environment
45
+ for resolver calls.
46
+
47
+ Palette Kit never reads `prefers-color-scheme`, the DOM, or platform state.
48
+
49
+ Context affects default level curves. Dark context inverts the structural
50
+ lightness scale for `fill` and `lines` while preserving semantic hue and chroma.
51
+
52
+ ## systemDefaultContext
53
+
54
+ ```ts
55
+ "light" | "dark"
56
+ ```
57
+
58
+ `systemDefaultContext` is an optional host-provided fallback.
59
+
60
+ Context precedence:
61
+
62
+ 1. Resolver-level `context`
63
+ 2. Palette-level `context`
64
+ 3. `systemDefaultContext`
65
+
66
+ If no context can be resolved, `palette.resolve` throws.
67
+
68
+ ## output
69
+
70
+ ```ts
71
+ "oklch" | "oklab" | "srgb" | "p3" | "hex" | "rgba"
72
+ ```
73
+
74
+ `output` is optional and defaults to `oklch`.
75
+
76
+ Runtime support in the current v0.4 implementation:
77
+
78
+ - `oklch`: supported
79
+ - `oklab`: supported
80
+ - `srgb`: supported
81
+ - `p3`: supported
82
+ - `hex`: supported
83
+ - `rgba`: supported
84
+
85
+ ## systemDefaultOutput
86
+
87
+ ```ts
88
+ "oklch" | "oklab" | "srgb" | "p3" | "hex" | "rgba"
89
+ ```
90
+
91
+ `systemDefaultOutput` is an optional host-provided output fallback.
92
+
93
+ Output precedence:
94
+
95
+ 1. Resolver-level `output`
96
+ 2. Palette-level `output`
97
+ 3. `systemDefaultOutput`
98
+ 4. Explicit `oklch` default
99
+
100
+ ## Presets and Resolver Config
101
+
102
+ `preset` is optional and defaults to `"neutral"`.
103
+
104
+ ```ts
105
+ createPaletteKit({
106
+ context: "light",
107
+ preset: "soft",
108
+ intents,
109
+ });
110
+ ```
111
+
112
+ Public presets:
113
+
114
+ - `soft`
115
+ - `neutral`
116
+ - `strong`
117
+
118
+ `resolverConfig` explicitly overrides the selected preset.
119
+
120
+ ```ts
121
+ createPaletteKit({
122
+ context: "light",
123
+ preset: "neutral",
124
+ intents,
125
+ resolverConfig: {
126
+ relationParams: {
127
+ on: { contrastTarget: 75 },
128
+ },
129
+ stateDeltas: {
130
+ luminance: { hover: 4 },
131
+ },
132
+ },
133
+ });
134
+ ```
135
+
136
+ Supported resolver config sections:
137
+
138
+ - `levelCurves`
139
+ - `stateDeltas`
140
+ - `relationParams`
141
+ - `chromaLimits`
142
+
143
+ The default `on` contrast target is APCA Lc 60. `over` and `under` alpha values
144
+ are configured per level.
@@ -0,0 +1,22 @@
1
+ # Diagnostics
2
+
3
+ Palette Kit v0.4 does not expose a public diagnostics API.
4
+
5
+ Runtime misuse is reported through thrown errors. Core resolver/configuration
6
+ misuse uses structured internal `PaletteKitError` instances, but that class is
7
+ not part of the public API surface yet.
8
+
9
+ ## Observable Error Areas
10
+
11
+ - unknown intent
12
+ - missing required level
13
+ - forbidden level on `visualVocabulary`
14
+ - missing `on` relation
15
+ - multiple relations
16
+ - unresolved context
17
+ - invalid or unsupported serialized output
18
+
19
+ ## Current Recommendation
20
+
21
+ Catch errors at application boundaries and report the message. Do not depend on
22
+ internal error classes until they are explicitly exported.
@@ -0,0 +1,33 @@
1
+ # Exporters
2
+
3
+ Palette Kit v0.4 does not expose public CSS or JSON exporters.
4
+
5
+ There is no public exporter subpath.
6
+
7
+ ## Current Public Path
8
+
9
+ Build exported artifacts manually from `palette.resolve`.
10
+
11
+ ```ts
12
+ const tokens = {
13
+ "brand.surface": palette.resolve({
14
+ usage: "fill",
15
+ intent: "brand",
16
+ level: 4,
17
+ output: "hex",
18
+ }),
19
+ };
20
+ ```
21
+
22
+ ## Supported Runtime Outputs
23
+
24
+ - `oklch`
25
+ - `oklab`
26
+ - `srgb`
27
+ - `p3`
28
+ - `hex`
29
+ - `rgba`
30
+
31
+ ## Future Work
32
+
33
+ Public exporters may be added after the minimal v0.4 resolver surface is stable.
package/docs/FAQ.md ADDED
@@ -0,0 +1,59 @@
1
+ # FAQ
2
+
3
+ ## What is the public API in v0.4?
4
+
5
+ The public runtime API is `createPaletteKit` from the package root.
6
+
7
+ ```ts
8
+ import { createPaletteKit } from "@clhaas/palette-kit";
9
+ ```
10
+
11
+ The palette instance exposes `palette.resolve`.
12
+
13
+ ## Does Palette Kit return CSS strings?
14
+
15
+ It depends on `output`.
16
+
17
+ - `output: "oklch"` returns a normalized OKLCH object.
18
+ - `output: "oklab"` returns an OKLab object.
19
+ - `output: "srgb"` returns `{ r, g, b, alpha }`.
20
+ - `output: "p3"` returns Display-P3 `{ r, g, b, alpha }`.
21
+ - `output: "hex"` returns a `#rrggbb` string.
22
+ - `output: "rgba"` returns `{ r, g, b, a }`.
23
+
24
+ ## Are `oklab`, `srgb`, and `p3` supported?
25
+
26
+ Yes. `oklab` returns an OKLab object. `srgb` and `p3` return RGB-like objects
27
+ with `{ r, g, b, alpha }`.
28
+
29
+ ## Is there a CLI?
30
+
31
+ No. There is no public CLI in the v0.4 branch.
32
+
33
+ ## Can I export CSS variables or JSON tokens?
34
+
35
+ There is no public exporter subpath in v0.4. Build CSS, JSON, or token files
36
+ manually from `palette.resolve`.
37
+
38
+ ## Are presets public?
39
+
40
+ Yes. `soft`, `neutral`, and `strong` are public resolver presets. The package
41
+ root also exports the preset config objects.
42
+
43
+ `createPaletteKit` accepts `preset` and explicit `resolverConfig` overrides.
44
+
45
+ ## Does `on` enforce contrast?
46
+
47
+ Yes. `on` enforces APCA contrast with a default Lc 60 target and fails
48
+ explicitly if the target cannot be satisfied.
49
+
50
+ ## Does Palette Kit detect dark mode?
51
+
52
+ No. Context is explicit. Provide `context`, resolver-level `context`, or
53
+ `systemDefaultContext`.
54
+
55
+ ## Can output have a host default?
56
+
57
+ Yes. Use `systemDefaultOutput` when the host wants to inject a fallback. Resolver
58
+ output overrides palette output, palette output overrides `systemDefaultOutput`,
59
+ and `oklch` is used when none of those are provided.
@@ -0,0 +1,61 @@
1
+ # Migration Notes for the v0.4 Branch
2
+
3
+ The v0.4 branch is a rebuild around `createPaletteKit` and orthogonal resolver
4
+ axes. It is not a continuation of the older theme factory API.
5
+
6
+ ## Removed From the Public Surface
7
+
8
+ - legacy theme factory
9
+ - public exporter subpaths
10
+ - public serializer subpaths
11
+ - CLI commands
12
+ - seed-based theme config
13
+ - older public presets
14
+
15
+ ## Current Public Surface
16
+
17
+ ```ts
18
+ import { createPaletteKit } from "@clhaas/palette-kit";
19
+
20
+ const palette = createPaletteKit({
21
+ context: "light",
22
+ intents: {
23
+ brand: { hue: 260, chroma: 0.14 },
24
+ neutral: { hue: 0, chroma: 0 },
25
+ },
26
+ });
27
+ ```
28
+
29
+ ## Conceptual Migration
30
+
31
+ Older versions organized resolution around seeds, roles, surfaces, and theme
32
+ helpers. The v0.4 branch organizes resolution around explicit axes:
33
+
34
+ - `intent`
35
+ - `usage`
36
+ - `level`
37
+ - `relation`
38
+ - `state`
39
+ - `context`
40
+ - `output`
41
+
42
+ ## Output Migration
43
+
44
+ Use resolver output directly:
45
+
46
+ ```ts
47
+ const color = palette.resolve({
48
+ usage: "fill",
49
+ intent: "brand",
50
+ level: 4,
51
+ output: "hex",
52
+ });
53
+ ```
54
+
55
+ There is no public token exporter or CLI in the current v0.4 branch.
56
+
57
+ ## References
58
+
59
+ - [API](./API.md)
60
+ - [Configuration](./Config.md)
61
+ - [v0.4 SPEC](../planning/v0.4/v0.4-palette-kit-spec.md)
@@ -0,0 +1,33 @@
1
+ # Overlays
2
+
3
+ `overlays` is a public usage value in v0.4.
4
+
5
+ ```ts
6
+ const scrim = palette.resolve({
7
+ usage: "overlays",
8
+ intent: "neutral",
9
+ level: 1,
10
+ under: surface,
11
+ });
12
+ ```
13
+
14
+ ## Rules
15
+
16
+ - `level` is required.
17
+ - `on` is forbidden.
18
+ - `over` and `under` are optional relation targets.
19
+
20
+ ## Current Behavior
21
+
22
+ The current v0.4 resolver applies configured relation behavior:
23
+
24
+ - base lightness is `50`;
25
+ - the overlay level curve can add a configured luminance delta;
26
+ - `over` applies alpha from `relationParams.over.baseAlphaByLevel`;
27
+ - `under` applies alpha from `relationParams.under.baseAlphaByLevel`;
28
+ - `under` also reduces lightness by
29
+ `relationParams.under.luminanceReduction`;
30
+ - non-default state can apply configured overlay alpha deltas when
31
+ `stateDirection` is provided;
32
+
33
+ `over` and `under` do not enforce contrast.