|
1 | 1 | // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
2 | 2 | // 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'; |
4 | 12 |
|
5 | 13 | export type TokenCategory<T extends string, V> = Record<T, V>; |
6 | 14 |
|
@@ -46,7 +54,93 @@ export class ThemeBuilder { |
46 | 54 | return this; |
47 | 55 | } |
48 | 56 |
|
| 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 | + |
49 | 69 | build(): Theme { |
50 | 70 | return this.theme; |
51 | 71 | } |
| 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 | + } |
52 | 146 | } |
0 commit comments