Skip to content

Commit c5dda15

Browse files
committed
feat(theming-material): add SchemeStaticColorBuilder
1 parent 2527b56 commit c5dda15

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import {
2+
ThemeBuilder,
3+
ThemeBuilderContext,
4+
ThemeTokens,
5+
} from '@angularity/theming';
6+
import {
7+
argbFromHex,
8+
hexFromArgb,
9+
TonalPalette,
10+
} from '@material/material-color-utilities';
11+
12+
import { SchemeMode } from './scheme';
13+
14+
export interface SchemeStaticColorBuilderConfig {
15+
name: string;
16+
source: string;
17+
mode: SchemeMode;
18+
}
19+
20+
export class SchemeStaticColorBuilder
21+
implements ThemeBuilder<SchemeStaticColorBuilderConfig>
22+
{
23+
build(
24+
context: ThemeBuilderContext<SchemeStaticColorBuilderConfig>,
25+
): ThemeTokens {
26+
const { name, config } = context;
27+
const palette = TonalPalette.fromInt(argbFromHex(config.source));
28+
const tones = this.getStaticColorTones(config.mode);
29+
return {
30+
[`${name}-${config.name}`]: hexFromArgb(palette.tone(tones.color)),
31+
[`${name}-on-${config.name}`]: hexFromArgb(palette.tone(tones.onColor)),
32+
[`${name}-${config.name}-container`]: hexFromArgb(
33+
palette.tone(tones.colorContainer),
34+
),
35+
[`${name}-on-${config.name}-container`]: hexFromArgb(
36+
palette.tone(tones.onColorContainer),
37+
),
38+
};
39+
}
40+
41+
protected getStaticColorTones(
42+
mode: SchemeMode,
43+
): Record<
44+
'color' | 'onColor' | 'colorContainer' | 'onColorContainer',
45+
number
46+
> {
47+
switch (mode) {
48+
case SchemeMode.Light:
49+
return {
50+
color: 40,
51+
onColor: 100,
52+
colorContainer: 90,
53+
onColorContainer: 10,
54+
};
55+
case SchemeMode.Dark:
56+
return {
57+
color: 80,
58+
onColor: 20,
59+
colorContainer: 30,
60+
onColorContainer: 90,
61+
};
62+
default:
63+
throw new Error('Non-exhaustive match for mode');
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)