@clhaas/palette-kit 0.1.8 → 0.3.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 (295) hide show
  1. package/.codex/skills/color-pipeline-implementer/SKILL.md +23 -0
  2. package/.codex/skills/commit-message-crafter/SKILL.md +63 -0
  3. package/.codex/skills/commit-message-crafter/references/benchmarks.md +20 -0
  4. package/.codex/skills/contrast-solver-helper/SKILL.md +20 -0
  5. package/.codex/skills/exporters-builder/SKILL.md +20 -0
  6. package/.codex/skills/markdownlint-writer/SKILL.md +32 -0
  7. package/.codex/skills/phase-implementation-runbook/SKILL.md +92 -0
  8. package/.codex/skills/type-contract-auditor/SKILL.md +21 -0
  9. package/.github/skills/review-guide/SKILL.md +23 -0
  10. package/.github/skills/review-guide/references/review-guide-v0.3.md +629 -0
  11. package/.markdownlint.json +4 -0
  12. package/AGENTS.md +16 -0
  13. package/CHANGELOG.md +34 -0
  14. package/README.md +79 -169
  15. package/biome.json +43 -0
  16. package/dist/cli/args.d.ts +12 -0
  17. package/dist/cli/args.js +56 -0
  18. package/dist/cli/args.test.js +22 -0
  19. package/dist/cli/codegen/__snapshots__/tokens.test.js.snap +87 -0
  20. package/dist/cli/codegen/tokens.d.ts +12 -0
  21. package/dist/cli/codegen/tokens.js +139 -0
  22. package/dist/cli/codegen/tokens.test.d.ts +1 -0
  23. package/dist/cli/codegen/tokens.test.js +51 -0
  24. package/dist/cli/config.d.ts +40 -0
  25. package/dist/cli/config.js +34 -0
  26. package/dist/cli/validate.d.ts +2 -0
  27. package/dist/cli/validate.js +33 -0
  28. package/dist/cli/validate.test.d.ts +1 -0
  29. package/dist/cli/validate.test.js +40 -0
  30. package/dist/cli.js +138 -140
  31. package/dist/contrast/apca.d.ts +2 -2
  32. package/dist/contrast/apca.js +14 -4
  33. package/dist/contrast/apca.test.d.ts +1 -0
  34. package/dist/contrast/apca.test.js +16 -0
  35. package/dist/contrast/index.d.ts +4 -0
  36. package/dist/contrast/index.js +4 -0
  37. package/dist/contrast/scoring.d.ts +4 -0
  38. package/dist/contrast/scoring.js +31 -0
  39. package/dist/contrast/scoring.test.d.ts +1 -0
  40. package/dist/contrast/scoring.test.js +148 -0
  41. package/dist/contrast/solver.d.ts +13 -0
  42. package/dist/contrast/solver.js +170 -0
  43. package/dist/contrast/solver.test.d.ts +1 -0
  44. package/dist/contrast/solver.test.js +75 -0
  45. package/dist/contrast/types.d.ts +17 -0
  46. package/dist/contrast/types.js +1 -0
  47. package/dist/contrast/utils.d.ts +4 -0
  48. package/dist/contrast/utils.js +18 -0
  49. package/dist/contrast/wcag2.d.ts +3 -0
  50. package/dist/contrast/wcag2.js +19 -0
  51. package/dist/contrast/wcag2.test.d.ts +1 -0
  52. package/dist/contrast/wcag2.test.js +17 -0
  53. package/dist/core/createTheme.d.ts +35 -0
  54. package/dist/core/createTheme.js +24 -0
  55. package/dist/core/dx-helpers.test.d.ts +1 -0
  56. package/dist/core/dx-helpers.test.js +61 -0
  57. package/dist/core/index.d.ts +2 -0
  58. package/dist/core/index.js +2 -0
  59. package/dist/core/onSolid.test.d.ts +1 -0
  60. package/dist/core/onSolid.test.js +118 -0
  61. package/dist/core/qa.v1.test.d.ts +1 -0
  62. package/dist/core/qa.v1.test.js +112 -0
  63. package/dist/core/resolve.d.ts +3 -0
  64. package/dist/core/resolve.js +8 -0
  65. package/dist/core/resolve.test.d.ts +1 -0
  66. package/dist/core/resolve.test.js +89 -0
  67. package/dist/core/resolveMany.d.ts +8 -0
  68. package/dist/core/resolveMany.js +17 -0
  69. package/dist/core/tokenRegistry.d.ts +23 -0
  70. package/dist/core/tokenRegistry.js +83 -0
  71. package/dist/core/tokenRegistry.test.d.ts +1 -0
  72. package/dist/core/tokenRegistry.test.js +133 -0
  73. package/dist/engine/applyOperators.d.ts +3 -0
  74. package/dist/engine/applyOperators.js +23 -0
  75. package/dist/engine/context.d.ts +4 -0
  76. package/dist/engine/context.js +1 -0
  77. package/dist/engine/gamut.d.ts +13 -0
  78. package/dist/engine/gamut.js +101 -0
  79. package/dist/engine/gamut.test.d.ts +1 -0
  80. package/dist/engine/gamut.test.js +23 -0
  81. package/dist/engine/generateScale.d.ts +15 -0
  82. package/dist/engine/generateScale.js +29 -0
  83. package/dist/engine/generateScale.test.d.ts +1 -0
  84. package/dist/engine/generateScale.test.js +32 -0
  85. package/dist/engine/index.d.ts +8 -0
  86. package/dist/engine/index.js +4 -0
  87. package/dist/engine/normalize.d.ts +43 -0
  88. package/dist/engine/normalize.js +403 -0
  89. package/dist/engine/normalize.test.d.ts +1 -0
  90. package/dist/engine/normalize.test.js +136 -0
  91. package/dist/engine/onSolid.d.ts +3 -0
  92. package/dist/engine/onSolid.js +110 -0
  93. package/dist/engine/resolveBaseColor.d.ts +25 -0
  94. package/dist/engine/resolveBaseColor.js +127 -0
  95. package/dist/engine/resolveBaseColor.test.d.ts +1 -0
  96. package/dist/engine/resolveBaseColor.test.js +97 -0
  97. package/dist/export/__snapshots__/exportTheme.test.js.snap +74 -0
  98. package/dist/export/exportTheme.d.ts +47 -0
  99. package/dist/export/exportTheme.js +170 -0
  100. package/dist/export/exportTheme.test.d.ts +1 -0
  101. package/dist/export/exportTheme.test.js +118 -0
  102. package/dist/export/index.d.ts +1 -0
  103. package/dist/export/index.js +1 -0
  104. package/dist/export/serializeColor.d.ts +1 -0
  105. package/dist/export/serializeColor.js +1 -0
  106. package/dist/export/serializeColor.test.d.ts +1 -0
  107. package/dist/export/serializeColor.test.js +54 -0
  108. package/dist/export.d.ts +1 -0
  109. package/dist/export.js +1 -0
  110. package/dist/index.d.ts +3 -22
  111. package/dist/index.js +2 -18
  112. package/dist/operators/emphasis.d.ts +3 -0
  113. package/dist/operators/emphasis.js +113 -0
  114. package/dist/operators/emphasis.test.d.ts +1 -0
  115. package/dist/operators/emphasis.test.js +69 -0
  116. package/dist/operators/index.d.ts +3 -0
  117. package/dist/operators/index.js +2 -0
  118. package/dist/operators/state.d.ts +3 -0
  119. package/dist/operators/state.js +102 -0
  120. package/dist/operators/state.test.d.ts +1 -0
  121. package/dist/operators/state.test.js +48 -0
  122. package/dist/operators/types.d.ts +13 -0
  123. package/dist/operators/types.js +1 -0
  124. package/dist/operators/utils.d.ts +16 -0
  125. package/dist/operators/utils.js +23 -0
  126. package/dist/presets/curves.d.ts +28 -0
  127. package/dist/presets/curves.js +145 -0
  128. package/dist/presets/index.d.ts +2 -0
  129. package/dist/presets/index.js +1 -0
  130. package/dist/presets/tokens/index.d.ts +3 -0
  131. package/dist/presets/tokens/index.js +3 -0
  132. package/dist/presets/tokens/minimal-ui.d.ts +6 -0
  133. package/dist/presets/tokens/minimal-ui.js +53 -0
  134. package/dist/presets/tokens/modern-ui.d.ts +5 -0
  135. package/dist/presets/tokens/modern-ui.js +83 -0
  136. package/dist/presets/tokens/presets.test.d.ts +1 -0
  137. package/dist/presets/tokens/presets.test.js +31 -0
  138. package/dist/presets/tokens/radixLike-ui.d.ts +6 -0
  139. package/dist/presets/tokens/radixLike-ui.js +77 -0
  140. package/dist/serialize/index.d.ts +1 -0
  141. package/dist/serialize/index.js +1 -0
  142. package/dist/serialize/normalizeOutput.d.ts +6 -0
  143. package/dist/serialize/normalizeOutput.js +45 -0
  144. package/dist/serialize/serializeColor.d.ts +21 -0
  145. package/dist/serialize/serializeColor.js +178 -0
  146. package/dist/serialize/serializeResolved.test.d.ts +1 -0
  147. package/dist/serialize/serializeResolved.test.js +45 -0
  148. package/dist/serialize.d.ts +1 -0
  149. package/dist/serialize.js +1 -0
  150. package/dist/types/index.d.ts +187 -0
  151. package/dist/types/index.js +1 -0
  152. package/dist/utils/clamp.d.ts +1 -0
  153. package/dist/utils/clamp.js +1 -0
  154. package/dist/utils/index.d.ts +1 -0
  155. package/dist/utils/index.js +1 -0
  156. package/dist/utils/lerp.d.ts +1 -0
  157. package/dist/utils/lerp.js +1 -0
  158. package/dist/utils/parseColor.d.ts +6 -0
  159. package/dist/utils/parseColor.js +67 -0
  160. package/dist/utils/parseColor.test.d.ts +1 -0
  161. package/dist/utils/parseColor.test.js +51 -0
  162. package/dist/utils/smoothstep.d.ts +1 -0
  163. package/dist/utils/smoothstep.js +5 -0
  164. package/package.json +19 -12
  165. package/planning/phase-10-review.md +550 -0
  166. package/planning/phase-7-review.md +411 -0
  167. package/planning/phase-8-review.md +669 -0
  168. package/planning/phase-9-review.md +564 -0
  169. package/planning/roadmap-v0.3.md +284 -0
  170. package/planning/spec-serializer-v0.3.md +324 -0
  171. package/planning/spec-v0.3.md +305 -0
  172. package/src/cli/args.test.ts +28 -0
  173. package/src/cli/args.ts +66 -0
  174. package/src/cli/codegen/__snapshots__/tokens.test.ts.snap +87 -0
  175. package/src/cli/codegen/tokens.test.ts +61 -0
  176. package/src/cli/codegen/tokens.ts +191 -0
  177. package/src/cli/config.ts +71 -0
  178. package/src/cli/validate.test.ts +49 -0
  179. package/src/cli/validate.ts +38 -0
  180. package/src/cli.ts +183 -0
  181. package/src/contrast/apca.test.ts +20 -0
  182. package/src/contrast/apca.ts +26 -0
  183. package/src/contrast/index.ts +4 -0
  184. package/src/contrast/scoring.test.ts +188 -0
  185. package/src/contrast/scoring.ts +48 -0
  186. package/src/contrast/solver.test.ts +147 -0
  187. package/src/contrast/solver.ts +235 -0
  188. package/src/contrast/types.ts +20 -0
  189. package/src/contrast/utils.ts +28 -0
  190. package/src/contrast/wcag2.test.ts +21 -0
  191. package/src/contrast/wcag2.ts +24 -0
  192. package/src/core/createTheme.ts +78 -0
  193. package/src/core/dx-helpers.test.ts +82 -0
  194. package/src/core/index.ts +7 -0
  195. package/src/core/onSolid.test.ts +146 -0
  196. package/src/core/qa.v1.test.ts +149 -0
  197. package/src/core/resolve.test.ts +99 -0
  198. package/src/core/resolve.ts +11 -0
  199. package/src/core/resolveMany.ts +22 -0
  200. package/src/core/tokenRegistry.test.ts +153 -0
  201. package/src/core/tokenRegistry.ts +114 -0
  202. package/src/engine/applyOperators.ts +32 -0
  203. package/src/engine/context.ts +8 -0
  204. package/src/engine/gamut.test.ts +30 -0
  205. package/src/engine/gamut.ts +144 -0
  206. package/src/engine/generateScale.test.ts +46 -0
  207. package/src/engine/generateScale.ts +48 -0
  208. package/src/engine/index.ts +8 -0
  209. package/src/engine/normalize.test.ts +222 -0
  210. package/src/engine/normalize.ts +550 -0
  211. package/src/engine/onSolid.ts +178 -0
  212. package/src/engine/resolveBaseColor.test.ts +117 -0
  213. package/src/engine/resolveBaseColor.ts +203 -0
  214. package/src/export/__snapshots__/exportTheme.test.ts.snap +74 -0
  215. package/src/export/exportTheme.test.ts +144 -0
  216. package/src/export/exportTheme.ts +251 -0
  217. package/src/export/index.ts +1 -0
  218. package/src/export/serializeColor.test.ts +73 -0
  219. package/src/export/serializeColor.ts +1 -0
  220. package/src/export.ts +1 -0
  221. package/src/index.ts +3 -0
  222. package/src/operators/emphasis.test.ts +85 -0
  223. package/src/operators/emphasis.ts +132 -0
  224. package/src/operators/index.ts +3 -0
  225. package/src/operators/state.test.ts +66 -0
  226. package/src/operators/state.ts +122 -0
  227. package/src/operators/types.ts +14 -0
  228. package/src/operators/utils.ts +44 -0
  229. package/src/presets/curves.ts +168 -0
  230. package/src/presets/index.ts +2 -0
  231. package/src/presets/tokens/index.ts +3 -0
  232. package/src/presets/tokens/minimal-ui.ts +55 -0
  233. package/src/presets/tokens/modern-ui.ts +85 -0
  234. package/src/presets/tokens/presets.test.ts +46 -0
  235. package/src/presets/tokens/radixLike-ui.ts +79 -0
  236. package/src/serialize/index.ts +1 -0
  237. package/src/serialize/normalizeOutput.ts +63 -0
  238. package/src/serialize/serializeColor.ts +260 -0
  239. package/src/serialize/serializeResolved.test.ts +57 -0
  240. package/src/serialize.ts +1 -0
  241. package/src/types/index.ts +207 -0
  242. package/src/utils/clamp.ts +2 -0
  243. package/src/utils/index.ts +1 -0
  244. package/src/utils/lerp.ts +1 -0
  245. package/src/utils/parseColor.test.ts +66 -0
  246. package/src/utils/parseColor.ts +87 -0
  247. package/src/utils/smoothstep.ts +6 -0
  248. package/tsconfig.build.json +11 -0
  249. package/tsconfig.json +15 -0
  250. package/dist/alpha/generateAlphaScale.d.ts +0 -5
  251. package/dist/alpha/generateAlphaScale.js +0 -34
  252. package/dist/contrast/onSolid.d.ts +0 -6
  253. package/dist/contrast/onSolid.js +0 -28
  254. package/dist/contrast/solveText.d.ts +0 -2
  255. package/dist/contrast/solveText.js +0 -31
  256. package/dist/createTheme.d.ts +0 -38
  257. package/dist/createTheme.js +0 -148
  258. package/dist/data/radixSeeds.d.ts +0 -3
  259. package/dist/data/radixSeeds.js +0 -34
  260. package/dist/diagnostics/analyzeScale.d.ts +0 -2
  261. package/dist/diagnostics/analyzeScale.js +0 -7
  262. package/dist/diagnostics/analyzeTheme.d.ts +0 -2
  263. package/dist/diagnostics/analyzeTheme.js +0 -35
  264. package/dist/diagnostics/warnings.d.ts +0 -2
  265. package/dist/diagnostics/warnings.js +0 -20
  266. package/dist/engine/curves.d.ts +0 -9
  267. package/dist/engine/curves.js +0 -48
  268. package/dist/engine/oklch.d.ts +0 -8
  269. package/dist/engine/oklch.js +0 -40
  270. package/dist/engine/templates.d.ts +0 -14
  271. package/dist/engine/templates.js +0 -45
  272. package/dist/exporters/selectColorMode.d.ts +0 -2
  273. package/dist/exporters/selectColorMode.js +0 -19
  274. package/dist/exporters/toCssVars.d.ts +0 -13
  275. package/dist/exporters/toCssVars.js +0 -108
  276. package/dist/exporters/toJson.d.ts +0 -3
  277. package/dist/exporters/toJson.js +0 -25
  278. package/dist/exporters/toReactNative.d.ts +0 -54
  279. package/dist/exporters/toReactNative.js +0 -33
  280. package/dist/exporters/toTailwind.d.ts +0 -17
  281. package/dist/exporters/toTailwind.js +0 -111
  282. package/dist/exporters/toTs.d.ts +0 -3
  283. package/dist/exporters/toTs.js +0 -43
  284. package/dist/generateScale.d.ts +0 -48
  285. package/dist/generateScale.js +0 -274
  286. package/dist/overlays/generateOverlayScale.d.ts +0 -2
  287. package/dist/overlays/generateOverlayScale.js +0 -34
  288. package/dist/text/generateTextScale.d.ts +0 -8
  289. package/dist/text/generateTextScale.js +0 -18
  290. package/dist/text/resolveOnBgText.d.ts +0 -9
  291. package/dist/text/resolveOnBgText.js +0 -28
  292. package/dist/tokens/presetRadixLikeUi.d.ts +0 -5
  293. package/dist/tokens/presetRadixLikeUi.js +0 -55
  294. package/dist/types.d.ts +0 -69
  295. /package/dist/{types.js → cli/args.test.d.ts} +0 -0
@@ -0,0 +1,284 @@
1
+ # Palette Kit — Roadmap v0.3
2
+
3
+ > Roadmap técnico e executável para implementação da v0.3 do Palette Kit.
4
+ > Este documento transforma a SPEC v0.3 em fases claras, incrementais e verificáveis,
5
+ > com foco em DX, baixo risco e PRs pequenos.
6
+
7
+ ## Objetivos da v0.3
8
+
9
+ - Tornar o Palette Kit excelente por padrão para qualquer desenvolvedor.
10
+ - Manter o core runtime-first.
11
+ - Adicionar tooling opcional (serializer, exporters, CLI, codegen).
12
+ - Garantir autocomplete total e contratos explícitos.
13
+ - Evitar big-bang refactors.
14
+
15
+ ## Princípios do roadmap
16
+
17
+ - PRs pequenos e revisáveis.
18
+ - Cada fase entrega valor isoladamente.
19
+ - Nenhuma fase depende de comportamento implícito.
20
+ - DX validada a cada etapa (autocomplete + JSDoc).
21
+
22
+ ## Fase 0 — Preparação (fundação)
23
+
24
+ ### Fase 0 — Objetivo
25
+
26
+ Preparar a base do repositório para a v0.3 sem alterar comportamento público.
27
+
28
+ ### Fase 0 — Tarefas
29
+
30
+ - [x] Criar branch `v0.3`.
31
+ - [x] Congelar v0.2 (tag + changelog).
32
+ - [x] Criar `src/planning/spec-v0.3.md`.
33
+ - [x] Criar `src/planning/roadmap-v0.3.md`.
34
+ - [x] Revisar `package.json` (exports atuais).
35
+ - [x] Garantir build limpo.
36
+
37
+ ### Fase 0 — Critério de aceite
38
+
39
+ - Nenhuma mudança funcional.
40
+ - CI verde.
41
+
42
+ ## Fase 1 — Serializer público (núcleo da v0.3)
43
+
44
+ ### Fase 1 — Objetivo
45
+
46
+ Criar a ponte oficial entre o resolver e outputs reais (CSS/RN/JSON).
47
+
48
+ Referência: `src/planning/spec-serializer-v0.3.md`.
49
+
50
+ ### Fase 1 — Entregas
51
+
52
+ - Novo módulo: `src/serialize/`.
53
+ - Funções públicas: `serializeColor`, `serializeResolved`, `theme.serialize`.
54
+
55
+ ### Fase 1 — Tarefas
56
+
57
+ - [x] Definir `ResolvedColor` público.
58
+ - [x] Implementar serialização OKLCH.
59
+ - [x] Implementar sRGB (hex / rgb / rgba).
60
+ - [x] Implementar Display-P3.
61
+ - [x] Implementar precision + strict.
62
+ - [x] Implementar gamut mapping (`preferP3ThenCompress`).
63
+ - [x] JSDoc completo (trade-offs + exemplos).
64
+
65
+ ### Fase 1 — Critério de aceite
66
+
67
+ - Resolver continua retornando `BaseResolvedColor`.
68
+ - Serializer funciona isoladamente.
69
+ - API pública documentada.
70
+
71
+ ## Fase 2 — Helpers DX no runtime
72
+
73
+ ### Fase 2 — Objetivo
74
+
75
+ Reduzir boilerplate para casos comuns sem esconder o core.
76
+
77
+ ### Fase 2 — Entregas
78
+
79
+ - `theme.colorCss(...)`.
80
+ - `theme.onSolidCss(...)`.
81
+ - `resolveMany(...)`.
82
+ - `withContext(...)` bound.
83
+
84
+ ### Fase 2 — Tarefas
85
+
86
+ - [x] Implementar `resolveMany`.
87
+ - [x] Implementar tema bound por contexto.
88
+ - [x] Adicionar helpers CSS.
89
+ - [x] Garantir typings corretos.
90
+ - [x] JSDoc focado em DX.
91
+
92
+ ### Fase 2 — Critério de aceite
93
+
94
+ - Menos código para casos comuns.
95
+ - Zero breaking change.
96
+
97
+ ## Fase 3 — Token Registry (modelo deluxe)
98
+
99
+ ### Fase 3 — Objetivo
100
+
101
+ Introduzir tokens declarativos sem acoplar ao runtime.
102
+
103
+ ### Fase 3 — Entregas
104
+
105
+ - Modelo de token.
106
+ - Estrutura de registry.
107
+ - Validação básica.
108
+
109
+ ### Fase 3 — Tarefas
110
+
111
+ - [x] Definir interface `TokenDefinition`.
112
+ - [x] Definir `TokenRegistry`.
113
+ - [x] Validar queries por token.
114
+ - [x] Resolver tokens via `theme.resolve`.
115
+ - [x] Garantir que tokens não carregam cor.
116
+
117
+ ### Fase 3 — Critério de aceite
118
+
119
+ - Registry é puramente declarativo.
120
+ - Runtime continua independente.
121
+
122
+ ## Fase 4 — Presets oficiais de tokens
123
+
124
+ ### Fase 4 — Objetivo
125
+
126
+ Fornecer caminhos prontos para adoção rápida.
127
+
128
+ ### Fase 4 — Presets
129
+
130
+ - `minimal-ui`.
131
+ - `radixLike-ui`.
132
+ - `modern-ui`.
133
+
134
+ ### Fase 4 — Tarefas
135
+
136
+ - [x] Definir escopo de cada preset.
137
+ - [x] Criar tokens base.
138
+ - [x] Definir estados suportados.
139
+ - [x] Documentar intenção semântica.
140
+ - [x] Testar export + runtime.
141
+
142
+ ### Fase 4 — Critério de aceite
143
+
144
+ - Presets utilizáveis sem configuração extra.
145
+ - Tokens coerentes entre si.
146
+
147
+ ## Fase 5 — Exporters públicos (CSS / JSON)
148
+
149
+ ### Fase 5 — Objetivo
150
+
151
+ Gerar artefatos determinísticos para build-time.
152
+
153
+ ### Fase 5 — Entregas
154
+
155
+ - `exportThemeCss`.
156
+ - `exportThemeJson`.
157
+
158
+ ### Fase 5 — Tarefas
159
+
160
+ - [x] Definir opções de export.
161
+ - [x] Implementar CSS vars com fallback.
162
+ - [x] Implementar JSON estruturado.
163
+ - [x] Garantir ordem determinística.
164
+ - [x] Testes de snapshot.
165
+
166
+ ### Fase 5 — Critério de aceite
167
+
168
+ - Outputs reproduzíveis.
169
+ - Sem dependência do CLI.
170
+ - Status: concluida.
171
+
172
+ ## Fase 6 — CLI tooling
173
+
174
+ ### Fase 6 — Objetivo
175
+
176
+ Facilitar adoção em projetos médios e grandes.
177
+
178
+ ### Fase 6 — Comandos
179
+
180
+ - `palette-kit init`.
181
+ - `palette-kit build`.
182
+
183
+ ### Fase 6 — Tarefas
184
+
185
+ - [x] Implementar `init`.
186
+ - [x] Gerar `palette.config.ts`.
187
+ - [x] Implementar `build`.
188
+ - [x] Integrar exporters.
189
+ - [x] Gerar artefatos em `dist/palette/`.
190
+ - [x] Flags básicas (no magic).
191
+
192
+ ### Fase 6 — Critério de aceite
193
+
194
+ - CLI previsível.
195
+ - Nenhuma ação implícita.
196
+
197
+ ## Fase 7 — Codegen de types (DX máximo)
198
+
199
+ ### Fase 7 — Objetivo
200
+
201
+ Autocomplete total sem amarrar o core.
202
+
203
+ ### Fase 7 — Entregas
204
+
205
+ - `tokens.ts`.
206
+ - `tokens.d.ts`.
207
+
208
+ ### Fase 7 — Tarefas
209
+
210
+ - [x] Gerar objeto navegável.
211
+ - [x] Gerar unions (`TokenName`, `ColorRole`).
212
+ - [x] JSDoc por token.
213
+ - [x] Integração com CLI build.
214
+
215
+ ### Fase 7 — Critério de aceite
216
+
217
+ - Autocomplete funcionando out-of-the-box.
218
+ - Zero impacto em runtime.
219
+
220
+ ## Fase 8 — Inferência forte e validações DX
221
+
222
+ ### Fase 8 — Objetivo
223
+
224
+ Reduzir configuração obrigatória sem perder segurança.
225
+
226
+ ### Fase 8 — Tarefas
227
+
228
+ - [x] Inferir `usage` por prefixo.
229
+ - [x] Inferir `surface` quando óbvio.
230
+ - [x] Implementar strict vs non-strict.
231
+ - [x] Mensagens de erro didáticas.
232
+
233
+ ### Fase 8 — Critério de aceite
234
+
235
+ - Menos parâmetros manuais.
236
+ - Erros claros e acionáveis.
237
+
238
+ ## Fase 9 — Packaging e exports finais
239
+
240
+ ### Fase 9 — Objetivo
241
+
242
+ Finalizar o shape público do pacote.
243
+
244
+ ### Fase 9 — Tarefas
245
+
246
+ - [x] Definir subpath exports.
247
+ - [x] Validar tree-shaking.
248
+ - [x] Garantir compatibilidade ESM.
249
+ - [x] Atualizar README.
250
+
251
+ ### Fase 9 — Critério de aceite
252
+
253
+ - Um único pacote npm.
254
+ - Imports claros e estáveis.
255
+
256
+ ## Fase 10 — QA final e release
257
+
258
+ ### Fase 10 — Objetivo
259
+
260
+ Garantir qualidade antes do release.
261
+
262
+ ### Fase 10 — Checklist
263
+
264
+ - [x] Testes unitários críticos.
265
+ - [x] Testes de snapshot (exporters).
266
+ - [x] Revisão de DX (autocomplete + docs).
267
+ - [x] Atualizar changelog.
268
+ - [x] Release v0.3.0.
269
+
270
+ ## Resultado esperado
271
+
272
+ Ao final da v0.3, o Palette Kit será:
273
+
274
+ - Fácil de usar no runtime.
275
+ - Poderoso para projetos grandes.
276
+ - Tipado, documentado e previsível.
277
+ - Preparado para evolução (v0.4+).
278
+
279
+ ## Próximos passos (v0.4+)
280
+
281
+ - Theming dinâmico por usuário.
282
+ - Data-driven color APIs.
283
+ - Plugins de framework (opcional).
284
+ - Visual tooling / inspector.
@@ -0,0 +1,324 @@
1
+ # Palette Kit — SPEC Técnica do Serializer (v0.3)
2
+
3
+ > Documento técnico que especifica em detalhe o Serializer público da v0.3.
4
+ > Esta é a parte mais sensível da arquitetura, pois define o contrato entre o resolver matemático
5
+ > e os outputs consumíveis (CSS, React Native, JSON, etc.).
6
+
7
+ ## 1. Papel do Serializer na arquitetura
8
+
9
+ O Serializer é a camada de fronteira entre:
10
+
11
+ - o core matemático do Palette Kit (resolver em OKLCH)
12
+ - os formatos finais exigidos por plataformas reais
13
+
14
+ Ele não decide cores, não resolve semântica e não altera intenção visual.
15
+ Sua função é transformar dados já resolvidos em representações utilizáveis.
16
+
17
+ ## 2. Princípios fundamentais
18
+
19
+ 1. Pureza
20
+ - Serializar não deve alterar a cor semanticamente.
21
+ - Ajustes só ocorrem por gamut mapping explícito.
22
+ 2. Previsibilidade
23
+ - Mesma entrada + mesmas opções = mesma saída.
24
+ - Ordem de propriedades determinística.
25
+ 3. DX explícita
26
+ - Nada é automágico.
27
+ - Toda decisão relevante é configurável ou documentada.
28
+ 4. Separação de responsabilidades
29
+ - Resolver -> decide cor.
30
+ - Serializer -> decide formato.
31
+
32
+ ## 3. Entradas suportadas
33
+
34
+ ### 3.1 OKLCH channels
35
+
36
+ ```ts
37
+ type OklchChannels = {
38
+ l: number
39
+ c: number
40
+ h: number
41
+ alpha?: number
42
+ }
43
+ ```
44
+
45
+ - Representa o contrato matemático base.
46
+ - Usado diretamente por `serializeColor`.
47
+
48
+ ### 3.2 BaseResolvedColor
49
+
50
+ ```ts
51
+ {
52
+ oklch: OklchChannels
53
+ step: number
54
+ variantUsed: string
55
+ seedUsed: string
56
+ }
57
+ ```
58
+
59
+ - Shape estável garantido na linha v0.x.
60
+ - Usado por `serializeResolved`.
61
+
62
+ ### 3.3 ColorQuery (atalho DX)
63
+
64
+ ```ts
65
+ serialize(theme, query, options)
66
+ ```
67
+
68
+ - Combina:
69
+ 1. `theme.resolve(query)`
70
+ 2. `serializeResolved(...)`
71
+
72
+ ## 4. APIs públicas
73
+
74
+ ### 4.1 serializeColor
75
+
76
+ ```ts
77
+ serializeColor(
78
+ oklch: OklchChannels,
79
+ options?: SerializeOptions
80
+ ): ResolvedColor
81
+ ```
82
+
83
+ Uso:
84
+
85
+ - casos de baixo nível
86
+ - integrações customizadas
87
+ - testes
88
+
89
+ ### 4.2 serializeResolved
90
+
91
+ ```ts
92
+ serializeResolved(
93
+ color: BaseResolvedColor,
94
+ options?: SerializeOptions
95
+ ): ResolvedColor
96
+ ```
97
+
98
+ Uso:
99
+
100
+ - caminho padrão após `resolve`
101
+ - preserva meta do resolver
102
+
103
+ ### 4.3 theme.serialize
104
+
105
+ ```ts
106
+ theme.serialize(
107
+ query: ColorQuery,
108
+ options?: SerializeOptions
109
+ ): ResolvedColor
110
+ ```
111
+
112
+ Uso:
113
+
114
+ - caminho DX máximo
115
+ - menos boilerplate
116
+
117
+ ## 5. SerializeOptions
118
+
119
+ ```ts
120
+ type SerializeOptions = {
121
+ preferSpace?: "oklch" | "srgb" | "p3"
122
+ includeSpaces?: Array<"oklch" | "srgb" | "p3">
123
+ precision?: {
124
+ l?: number
125
+ c?: number
126
+ h?: number
127
+ alpha?: number
128
+ }
129
+ gamutMapping?: "clip" | "compressChroma" | "preferP3ThenCompress"
130
+ strict?: boolean
131
+ includeMeta?: boolean
132
+ }
133
+ ```
134
+
135
+ ### Defaults obrigatórios
136
+
137
+ | Opção | Default |
138
+ | --- | --- |
139
+ | preferSpace | "oklch" |
140
+ | gamutMapping | "preferP3ThenCompress" |
141
+ | precision | { l: 1, c: 3, h: 1, alpha: 2 } |
142
+ | strict | false |
143
+ | includeMeta | false |
144
+
145
+ ## 6. Saída: ResolvedColor
146
+
147
+ ```ts
148
+ type ResolvedColor = {
149
+ value: string
150
+ alpha: number
151
+ oklch?: string
152
+ srgb?: string
153
+ p3?: string
154
+ meta?: ColorMeta
155
+ }
156
+ ```
157
+
158
+ ### Regras
159
+
160
+ - `value`:
161
+ - sempre presente
162
+ - corresponde a `preferSpace`
163
+ - Outros espaços:
164
+ - só incluídos se listados em `includeSpaces`
165
+ - `alpha`:
166
+ - sempre normalizado `[0..1]`
167
+
168
+ ## 7. Espaços de cor
169
+
170
+ ### 7.1 OKLCH
171
+
172
+ Formato:
173
+
174
+ ```css
175
+ oklch(L% C H / A)
176
+ ```
177
+
178
+ Regras:
179
+
180
+ - L sempre em `%`
181
+ - C com precisão configurável
182
+ - H normalizado `[0..360)`
183
+
184
+ ### 7.2 sRGB
185
+
186
+ Formatos aceitos:
187
+
188
+ - `#RRGGBB`
189
+ - `rgb(r g b)`
190
+ - `rgba(r g b / a)`
191
+
192
+ Regras:
193
+
194
+ - Preferir `hex` por default
195
+ - `rgb/rgba` apenas se explicitado
196
+
197
+ ### 7.3 Display-P3
198
+
199
+ Formato:
200
+
201
+ ```css
202
+ color(display-p3 r g b / a)
203
+ ```
204
+
205
+ Regras:
206
+
207
+ - Valores normalizados `[0..1]`
208
+ - Só emitido se:
209
+ - solicitado
210
+ - gamutMapping permitir
211
+
212
+ ## 8. Gamut Mapping
213
+
214
+ ### Estratégias
215
+
216
+ #### clip
217
+
218
+ - Corta valores fora do gamut
219
+ - Pode distorcer percepção
220
+ - Só recomendado para debug
221
+
222
+ #### compressChroma
223
+
224
+ - Reduz C mantendo L/H
225
+ - Preserva intenção perceptual
226
+ - Estratégia segura
227
+
228
+ #### preferP3ThenCompress (default)
229
+
230
+ 1. Tenta P3
231
+ 2. Se falhar, comprime C
232
+ 3. Nunca clippa sem aviso
233
+
234
+ ## 9. Precision e arredondamento
235
+
236
+ - Arredondamento ocorre no final
237
+ - Nunca durante cálculos intermediários
238
+ - Evita drift cumulativo
239
+
240
+ ## 10. Strict mode
241
+
242
+ ### strict = false (default)
243
+
244
+ - Best-effort
245
+ - Warnings em casos limite
246
+ - Nunca lança erro fatal
247
+
248
+ ### strict = true
249
+
250
+ - Erros lançados quando:
251
+ - conversão falha
252
+ - gamut impossível
253
+ - parâmetros inválidos
254
+
255
+ Mensagens devem ser:
256
+
257
+ - claras
258
+ - acionáveis
259
+ - sem jargon matemático
260
+
261
+ ## 11. Meta e diagnósticos
262
+
263
+ Se `includeMeta: true`, incluir:
264
+
265
+ ```ts
266
+ meta: {
267
+ spaceUsed: "oklch" | "srgb" | "p3"
268
+ gamutMapping: string
269
+ clipped?: boolean
270
+ compressed?: boolean
271
+ }
272
+ ```
273
+
274
+ Meta nunca influencia `value`.
275
+
276
+ ## 12. Ordem interna do algoritmo
277
+
278
+ 1. Receber entrada
279
+ 2. Normalizar alpha
280
+ 3. Converter OKLCH -> espaço alvo
281
+ 4. Aplicar gamut mapping
282
+ 5. Arredondar canais
283
+ 6. Gerar strings
284
+ 7. Montar `ResolvedColor`
285
+
286
+ ## 13. Testes obrigatórios
287
+
288
+ ### Unitários
289
+
290
+ - Cada espaço isoladamente
291
+ - Cada estratégia de gamut
292
+
293
+ ### Snapshot
294
+
295
+ - Serializações completas
296
+ - Comparação determinística
297
+
298
+ ### DX
299
+
300
+ - Autocomplete
301
+ - JSDoc visível no editor
302
+
303
+ ## 14. Critérios de aceite
304
+
305
+ - Serializer não altera intenção visual
306
+ - API estável e previsível
307
+ - Erros claros em strict mode
308
+ - Funciona isoladamente do core
309
+
310
+ ## 15. Anti‑padrões explícitos
311
+
312
+ - Resolver dentro do serializer
313
+ - Decidir contraste
314
+ - Ajustar L/H sem pedido explícito
315
+ - Comportamento implícito não documentado
316
+
317
+ ## Status
318
+
319
+ SPEC técnica fechada e pronta para implementação.
320
+
321
+ Próximo passo natural:
322
+
323
+ - dividir essa spec em PRs pequenos
324
+ - ou iniciar implementação começando por `serializeColor`