Skip to content

Commit 36dd820

Browse files
committed
feat: Extend ThemeBuilder with reference token processing
1 parent 60f8181 commit 36dd820

File tree

5 files changed

+162
-2
lines changed

5 files changed

+162
-2
lines changed

src/browser/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"compilerOptions": {
3-
"lib": ["es5", "es2015.collection", "dom"],
3+
"lib": ["es2017", "dom"],
44
"types": [],
55
"module": "esnext",
66
"moduleResolution": "node",

src/build/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@ export {
1313
Value,
1414
resolveTheme,
1515
resolveThemeWithPaths,
16+
ReferenceTokens,
17+
ColorReferenceTokens,
18+
ColorPaletteInput,
19+
ColorPaletteDefinition,
20+
PaletteStep,
1621
} from '../shared/theme';

src/shared/theme/builder.ts

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
import { Theme, Context, Mode } from './interfaces';
3+
import {
4+
Theme,
5+
Context,
6+
Mode,
7+
ReferenceTokens,
8+
ColorReferenceTokens,
9+
ColorPaletteInput,
10+
PaletteStep,
11+
} from './interfaces';
412

513
export type TokenCategory<T extends string, V> = Record<T, V>;
614

@@ -46,7 +54,93 @@ export class ThemeBuilder {
4654
return this;
4755
}
4856

57+
addReferenceTokens(referenceTokens: ReferenceTokens): ThemeBuilder {
58+
this.theme.referenceTokens = referenceTokens;
59+
60+
// Process reference tokens and add generated tokens to theme
61+
if (referenceTokens.color) {
62+
const generatedTokens = this.processReferenceTokens(referenceTokens.color);
63+
this.theme.tokens = { ...this.theme.tokens, ...generatedTokens };
64+
}
65+
66+
return this;
67+
}
68+
4969
build(): Theme {
5070
return this.theme;
5171
}
72+
73+
private processReferenceTokens(colorTokens: ColorReferenceTokens): Record<string, string> {
74+
const generatedTokens: Record<string, string> = {};
75+
76+
Object.entries(colorTokens).forEach(([colorName, paletteInput]) => {
77+
const palette = this.processColorPaletteInput(paletteInput);
78+
79+
// Add generated palette tokens with naming convention: colorPrimary50, colorPrimary600, etc.
80+
Object.entries(palette).forEach(([step, value]) => {
81+
const tokenName = `color${this.capitalize(colorName)}${step}`;
82+
generatedTokens[tokenName] = value;
83+
});
84+
});
85+
86+
return generatedTokens;
87+
}
88+
89+
private processColorPaletteInput(input: ColorPaletteInput): Record<PaletteStep, string> {
90+
if (typeof input === 'string') {
91+
// Simple seed case: generate basic palette from seed
92+
return this.generateBasicPalette(input);
93+
} else {
94+
// Complex case: object with seed and/or explicit step values
95+
const validSteps = [
96+
50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000,
97+
];
98+
99+
// Start with generated palette if seed is provided, otherwise empty
100+
const result: Record<PaletteStep, string> = input.seed
101+
? this.generateBasicPalette(input.seed)
102+
: ({} as Record<PaletteStep, string>);
103+
104+
// Override with explicit step values
105+
Object.entries(input).forEach(([step, value]) => {
106+
const numStep = Number(step);
107+
if (step !== 'seed' && value && validSteps.includes(numStep)) {
108+
result[numStep as PaletteStep] = value;
109+
}
110+
});
111+
112+
return result;
113+
}
114+
}
115+
116+
private generateBasicPalette(seed: string): Record<PaletteStep, string> {
117+
// Placeholder implementation - will be replaced with HCT generation later
118+
// For now, just return the seed color for all steps to establish the plumbing
119+
return {
120+
50: seed,
121+
100: seed,
122+
150: seed,
123+
200: seed,
124+
250: seed,
125+
300: seed,
126+
350: seed,
127+
400: seed,
128+
450: seed,
129+
500: seed,
130+
550: seed,
131+
600: seed,
132+
650: seed,
133+
700: seed,
134+
750: seed,
135+
800: seed,
136+
850: seed,
137+
900: seed,
138+
950: seed,
139+
1000: seed,
140+
};
141+
}
142+
143+
private capitalize(str: string): string {
144+
return str.charAt(0).toUpperCase() + str.slice(1);
145+
}
52146
}

src/shared/theme/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ export {
1111
GlobalValue,
1212
ModeValue,
1313
TypedModeValueOverride,
14+
ReferenceTokens,
15+
ColorReferenceTokens,
16+
ColorPaletteInput,
17+
ColorPaletteDefinition,
18+
PaletteStep,
1419
} from './interfaces';
1520
export { ThemeBuilder, TokenCategory } from './builder';
1621
export {

src/shared/theme/interfaces.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,62 @@ export interface Theme {
3535
modes: Record<string, Mode>;
3636
tokenModeMap: Record<string, string>;
3737
contexts: Record<string, Context>;
38+
referenceTokens?: ReferenceTokens;
39+
}
40+
41+
/**
42+
* Reference tokens enable seed-based palette generation and semantic token organization.
43+
*/
44+
export interface ReferenceTokens {
45+
color?: ColorReferenceTokens;
46+
}
47+
48+
export interface ColorReferenceTokens {
49+
primary?: ColorPaletteInput;
50+
neutral?: ColorPaletteInput;
51+
error?: ColorPaletteInput;
52+
success?: ColorPaletteInput;
53+
warning?: ColorPaletteInput;
54+
info?: ColorPaletteInput;
55+
}
56+
57+
/**
58+
* Color reference tokens organized by semantic color categories.
59+
* Each category can be defined using a seed color (string) or detailed palette definition.
60+
*/
61+
export type ColorPaletteInput = string | ColorPaletteDefinition;
62+
63+
/**
64+
* Palette steps available across all color types. Different color categories
65+
* may use different subsets of these steps.
66+
*/
67+
export type PaletteStep =
68+
| 50
69+
| 100
70+
| 150
71+
| 200
72+
| 250
73+
| 300
74+
| 350
75+
| 400
76+
| 450
77+
| 500
78+
| 550
79+
| 600
80+
| 650
81+
| 700
82+
| 750
83+
| 800
84+
| 850
85+
| 900
86+
| 950
87+
| 1000;
88+
89+
/**
90+
* Color palette definition supporting both seed generation and explicit overrides.
91+
*/
92+
export interface ColorPaletteDefinition extends Partial<Record<PaletteStep, string>> {
93+
seed?: string;
3894
}
3995

4096
type Tokens = Partial<Record<string, GlobalValue | TypedModeValueOverride>>;

0 commit comments

Comments
 (0)