@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.
- package/.codex/skills/color-pipeline-implementer/SKILL.md +23 -0
- package/.codex/skills/commit-message-crafter/SKILL.md +63 -0
- package/.codex/skills/commit-message-crafter/references/benchmarks.md +20 -0
- package/.codex/skills/contrast-solver-helper/SKILL.md +20 -0
- package/.codex/skills/exporters-builder/SKILL.md +20 -0
- package/.codex/skills/markdownlint-writer/SKILL.md +32 -0
- package/.codex/skills/phase-implementation-runbook/SKILL.md +92 -0
- package/.codex/skills/type-contract-auditor/SKILL.md +21 -0
- package/.github/skills/review-guide/SKILL.md +23 -0
- package/.github/skills/review-guide/references/review-guide-v0.3.md +629 -0
- package/.markdownlint.json +4 -0
- package/AGENTS.md +16 -0
- package/CHANGELOG.md +34 -0
- package/README.md +79 -169
- package/biome.json +43 -0
- package/dist/cli/args.d.ts +12 -0
- package/dist/cli/args.js +56 -0
- package/dist/cli/args.test.js +22 -0
- package/dist/cli/codegen/__snapshots__/tokens.test.js.snap +87 -0
- package/dist/cli/codegen/tokens.d.ts +12 -0
- package/dist/cli/codegen/tokens.js +139 -0
- package/dist/cli/codegen/tokens.test.d.ts +1 -0
- package/dist/cli/codegen/tokens.test.js +51 -0
- package/dist/cli/config.d.ts +40 -0
- package/dist/cli/config.js +34 -0
- package/dist/cli/validate.d.ts +2 -0
- package/dist/cli/validate.js +33 -0
- package/dist/cli/validate.test.d.ts +1 -0
- package/dist/cli/validate.test.js +40 -0
- package/dist/cli.js +138 -140
- package/dist/contrast/apca.d.ts +2 -2
- package/dist/contrast/apca.js +14 -4
- package/dist/contrast/apca.test.d.ts +1 -0
- package/dist/contrast/apca.test.js +16 -0
- package/dist/contrast/index.d.ts +4 -0
- package/dist/contrast/index.js +4 -0
- package/dist/contrast/scoring.d.ts +4 -0
- package/dist/contrast/scoring.js +31 -0
- package/dist/contrast/scoring.test.d.ts +1 -0
- package/dist/contrast/scoring.test.js +148 -0
- package/dist/contrast/solver.d.ts +13 -0
- package/dist/contrast/solver.js +170 -0
- package/dist/contrast/solver.test.d.ts +1 -0
- package/dist/contrast/solver.test.js +75 -0
- package/dist/contrast/types.d.ts +17 -0
- package/dist/contrast/types.js +1 -0
- package/dist/contrast/utils.d.ts +4 -0
- package/dist/contrast/utils.js +18 -0
- package/dist/contrast/wcag2.d.ts +3 -0
- package/dist/contrast/wcag2.js +19 -0
- package/dist/contrast/wcag2.test.d.ts +1 -0
- package/dist/contrast/wcag2.test.js +17 -0
- package/dist/core/createTheme.d.ts +35 -0
- package/dist/core/createTheme.js +24 -0
- package/dist/core/dx-helpers.test.d.ts +1 -0
- package/dist/core/dx-helpers.test.js +61 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +2 -0
- package/dist/core/onSolid.test.d.ts +1 -0
- package/dist/core/onSolid.test.js +118 -0
- package/dist/core/qa.v1.test.d.ts +1 -0
- package/dist/core/qa.v1.test.js +112 -0
- package/dist/core/resolve.d.ts +3 -0
- package/dist/core/resolve.js +8 -0
- package/dist/core/resolve.test.d.ts +1 -0
- package/dist/core/resolve.test.js +89 -0
- package/dist/core/resolveMany.d.ts +8 -0
- package/dist/core/resolveMany.js +17 -0
- package/dist/core/tokenRegistry.d.ts +23 -0
- package/dist/core/tokenRegistry.js +83 -0
- package/dist/core/tokenRegistry.test.d.ts +1 -0
- package/dist/core/tokenRegistry.test.js +133 -0
- package/dist/engine/applyOperators.d.ts +3 -0
- package/dist/engine/applyOperators.js +23 -0
- package/dist/engine/context.d.ts +4 -0
- package/dist/engine/context.js +1 -0
- package/dist/engine/gamut.d.ts +13 -0
- package/dist/engine/gamut.js +101 -0
- package/dist/engine/gamut.test.d.ts +1 -0
- package/dist/engine/gamut.test.js +23 -0
- package/dist/engine/generateScale.d.ts +15 -0
- package/dist/engine/generateScale.js +29 -0
- package/dist/engine/generateScale.test.d.ts +1 -0
- package/dist/engine/generateScale.test.js +32 -0
- package/dist/engine/index.d.ts +8 -0
- package/dist/engine/index.js +4 -0
- package/dist/engine/normalize.d.ts +43 -0
- package/dist/engine/normalize.js +403 -0
- package/dist/engine/normalize.test.d.ts +1 -0
- package/dist/engine/normalize.test.js +136 -0
- package/dist/engine/onSolid.d.ts +3 -0
- package/dist/engine/onSolid.js +110 -0
- package/dist/engine/resolveBaseColor.d.ts +25 -0
- package/dist/engine/resolveBaseColor.js +127 -0
- package/dist/engine/resolveBaseColor.test.d.ts +1 -0
- package/dist/engine/resolveBaseColor.test.js +97 -0
- package/dist/export/__snapshots__/exportTheme.test.js.snap +74 -0
- package/dist/export/exportTheme.d.ts +47 -0
- package/dist/export/exportTheme.js +170 -0
- package/dist/export/exportTheme.test.d.ts +1 -0
- package/dist/export/exportTheme.test.js +118 -0
- package/dist/export/index.d.ts +1 -0
- package/dist/export/index.js +1 -0
- package/dist/export/serializeColor.d.ts +1 -0
- package/dist/export/serializeColor.js +1 -0
- package/dist/export/serializeColor.test.d.ts +1 -0
- package/dist/export/serializeColor.test.js +54 -0
- package/dist/export.d.ts +1 -0
- package/dist/export.js +1 -0
- package/dist/index.d.ts +3 -22
- package/dist/index.js +2 -18
- package/dist/operators/emphasis.d.ts +3 -0
- package/dist/operators/emphasis.js +113 -0
- package/dist/operators/emphasis.test.d.ts +1 -0
- package/dist/operators/emphasis.test.js +69 -0
- package/dist/operators/index.d.ts +3 -0
- package/dist/operators/index.js +2 -0
- package/dist/operators/state.d.ts +3 -0
- package/dist/operators/state.js +102 -0
- package/dist/operators/state.test.d.ts +1 -0
- package/dist/operators/state.test.js +48 -0
- package/dist/operators/types.d.ts +13 -0
- package/dist/operators/types.js +1 -0
- package/dist/operators/utils.d.ts +16 -0
- package/dist/operators/utils.js +23 -0
- package/dist/presets/curves.d.ts +28 -0
- package/dist/presets/curves.js +145 -0
- package/dist/presets/index.d.ts +2 -0
- package/dist/presets/index.js +1 -0
- package/dist/presets/tokens/index.d.ts +3 -0
- package/dist/presets/tokens/index.js +3 -0
- package/dist/presets/tokens/minimal-ui.d.ts +6 -0
- package/dist/presets/tokens/minimal-ui.js +53 -0
- package/dist/presets/tokens/modern-ui.d.ts +5 -0
- package/dist/presets/tokens/modern-ui.js +83 -0
- package/dist/presets/tokens/presets.test.d.ts +1 -0
- package/dist/presets/tokens/presets.test.js +31 -0
- package/dist/presets/tokens/radixLike-ui.d.ts +6 -0
- package/dist/presets/tokens/radixLike-ui.js +77 -0
- package/dist/serialize/index.d.ts +1 -0
- package/dist/serialize/index.js +1 -0
- package/dist/serialize/normalizeOutput.d.ts +6 -0
- package/dist/serialize/normalizeOutput.js +45 -0
- package/dist/serialize/serializeColor.d.ts +21 -0
- package/dist/serialize/serializeColor.js +178 -0
- package/dist/serialize/serializeResolved.test.d.ts +1 -0
- package/dist/serialize/serializeResolved.test.js +45 -0
- package/dist/serialize.d.ts +1 -0
- package/dist/serialize.js +1 -0
- package/dist/types/index.d.ts +187 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/clamp.d.ts +1 -0
- package/dist/utils/clamp.js +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/lerp.d.ts +1 -0
- package/dist/utils/lerp.js +1 -0
- package/dist/utils/parseColor.d.ts +6 -0
- package/dist/utils/parseColor.js +67 -0
- package/dist/utils/parseColor.test.d.ts +1 -0
- package/dist/utils/parseColor.test.js +51 -0
- package/dist/utils/smoothstep.d.ts +1 -0
- package/dist/utils/smoothstep.js +5 -0
- package/package.json +19 -12
- package/planning/phase-10-review.md +550 -0
- package/planning/phase-7-review.md +411 -0
- package/planning/phase-8-review.md +669 -0
- package/planning/phase-9-review.md +564 -0
- package/planning/roadmap-v0.3.md +284 -0
- package/planning/spec-serializer-v0.3.md +324 -0
- package/planning/spec-v0.3.md +305 -0
- package/src/cli/args.test.ts +28 -0
- package/src/cli/args.ts +66 -0
- package/src/cli/codegen/__snapshots__/tokens.test.ts.snap +87 -0
- package/src/cli/codegen/tokens.test.ts +61 -0
- package/src/cli/codegen/tokens.ts +191 -0
- package/src/cli/config.ts +71 -0
- package/src/cli/validate.test.ts +49 -0
- package/src/cli/validate.ts +38 -0
- package/src/cli.ts +183 -0
- package/src/contrast/apca.test.ts +20 -0
- package/src/contrast/apca.ts +26 -0
- package/src/contrast/index.ts +4 -0
- package/src/contrast/scoring.test.ts +188 -0
- package/src/contrast/scoring.ts +48 -0
- package/src/contrast/solver.test.ts +147 -0
- package/src/contrast/solver.ts +235 -0
- package/src/contrast/types.ts +20 -0
- package/src/contrast/utils.ts +28 -0
- package/src/contrast/wcag2.test.ts +21 -0
- package/src/contrast/wcag2.ts +24 -0
- package/src/core/createTheme.ts +78 -0
- package/src/core/dx-helpers.test.ts +82 -0
- package/src/core/index.ts +7 -0
- package/src/core/onSolid.test.ts +146 -0
- package/src/core/qa.v1.test.ts +149 -0
- package/src/core/resolve.test.ts +99 -0
- package/src/core/resolve.ts +11 -0
- package/src/core/resolveMany.ts +22 -0
- package/src/core/tokenRegistry.test.ts +153 -0
- package/src/core/tokenRegistry.ts +114 -0
- package/src/engine/applyOperators.ts +32 -0
- package/src/engine/context.ts +8 -0
- package/src/engine/gamut.test.ts +30 -0
- package/src/engine/gamut.ts +144 -0
- package/src/engine/generateScale.test.ts +46 -0
- package/src/engine/generateScale.ts +48 -0
- package/src/engine/index.ts +8 -0
- package/src/engine/normalize.test.ts +222 -0
- package/src/engine/normalize.ts +550 -0
- package/src/engine/onSolid.ts +178 -0
- package/src/engine/resolveBaseColor.test.ts +117 -0
- package/src/engine/resolveBaseColor.ts +203 -0
- package/src/export/__snapshots__/exportTheme.test.ts.snap +74 -0
- package/src/export/exportTheme.test.ts +144 -0
- package/src/export/exportTheme.ts +251 -0
- package/src/export/index.ts +1 -0
- package/src/export/serializeColor.test.ts +73 -0
- package/src/export/serializeColor.ts +1 -0
- package/src/export.ts +1 -0
- package/src/index.ts +3 -0
- package/src/operators/emphasis.test.ts +85 -0
- package/src/operators/emphasis.ts +132 -0
- package/src/operators/index.ts +3 -0
- package/src/operators/state.test.ts +66 -0
- package/src/operators/state.ts +122 -0
- package/src/operators/types.ts +14 -0
- package/src/operators/utils.ts +44 -0
- package/src/presets/curves.ts +168 -0
- package/src/presets/index.ts +2 -0
- package/src/presets/tokens/index.ts +3 -0
- package/src/presets/tokens/minimal-ui.ts +55 -0
- package/src/presets/tokens/modern-ui.ts +85 -0
- package/src/presets/tokens/presets.test.ts +46 -0
- package/src/presets/tokens/radixLike-ui.ts +79 -0
- package/src/serialize/index.ts +1 -0
- package/src/serialize/normalizeOutput.ts +63 -0
- package/src/serialize/serializeColor.ts +260 -0
- package/src/serialize/serializeResolved.test.ts +57 -0
- package/src/serialize.ts +1 -0
- package/src/types/index.ts +207 -0
- package/src/utils/clamp.ts +2 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/lerp.ts +1 -0
- package/src/utils/parseColor.test.ts +66 -0
- package/src/utils/parseColor.ts +87 -0
- package/src/utils/smoothstep.ts +6 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +15 -0
- package/dist/alpha/generateAlphaScale.d.ts +0 -5
- package/dist/alpha/generateAlphaScale.js +0 -34
- package/dist/contrast/onSolid.d.ts +0 -6
- package/dist/contrast/onSolid.js +0 -28
- package/dist/contrast/solveText.d.ts +0 -2
- package/dist/contrast/solveText.js +0 -31
- package/dist/createTheme.d.ts +0 -38
- package/dist/createTheme.js +0 -148
- package/dist/data/radixSeeds.d.ts +0 -3
- package/dist/data/radixSeeds.js +0 -34
- package/dist/diagnostics/analyzeScale.d.ts +0 -2
- package/dist/diagnostics/analyzeScale.js +0 -7
- package/dist/diagnostics/analyzeTheme.d.ts +0 -2
- package/dist/diagnostics/analyzeTheme.js +0 -35
- package/dist/diagnostics/warnings.d.ts +0 -2
- package/dist/diagnostics/warnings.js +0 -20
- package/dist/engine/curves.d.ts +0 -9
- package/dist/engine/curves.js +0 -48
- package/dist/engine/oklch.d.ts +0 -8
- package/dist/engine/oklch.js +0 -40
- package/dist/engine/templates.d.ts +0 -14
- package/dist/engine/templates.js +0 -45
- package/dist/exporters/selectColorMode.d.ts +0 -2
- package/dist/exporters/selectColorMode.js +0 -19
- package/dist/exporters/toCssVars.d.ts +0 -13
- package/dist/exporters/toCssVars.js +0 -108
- package/dist/exporters/toJson.d.ts +0 -3
- package/dist/exporters/toJson.js +0 -25
- package/dist/exporters/toReactNative.d.ts +0 -54
- package/dist/exporters/toReactNative.js +0 -33
- package/dist/exporters/toTailwind.d.ts +0 -17
- package/dist/exporters/toTailwind.js +0 -111
- package/dist/exporters/toTs.d.ts +0 -3
- package/dist/exporters/toTs.js +0 -43
- package/dist/generateScale.d.ts +0 -48
- package/dist/generateScale.js +0 -274
- package/dist/overlays/generateOverlayScale.d.ts +0 -2
- package/dist/overlays/generateOverlayScale.js +0 -34
- package/dist/text/generateTextScale.d.ts +0 -8
- package/dist/text/generateTextScale.js +0 -18
- package/dist/text/resolveOnBgText.d.ts +0 -9
- package/dist/text/resolveOnBgText.js +0 -28
- package/dist/tokens/presetRadixLikeUi.d.ts +0 -5
- package/dist/tokens/presetRadixLikeUi.js +0 -55
- package/dist/types.d.ts +0 -69
- /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`
|