Skip to content

Commit c5cc163

Browse files
committed
feat(theming-material): add ExtendedSchemeBuilder
1 parent 4cbe625 commit c5cc163

1 file changed

Lines changed: 39 additions & 0 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@angular/core';
2+
import {
3+
ThemeBuilder,
4+
ThemeBuilderContext,
5+
ThemeTokens,
6+
} from '@angularity/theming';
7+
import { DynamicColor, hexFromArgb } from '@material/material-color-utilities';
8+
9+
import { SchemeBuilder, SchemeBuilderConfig } from './scheme';
10+
11+
export interface ExtendedSchemeBuilderConfig extends SchemeBuilderConfig {
12+
extension?: (context: ExtendedSchemeBuilderExtensionContext) => ThemeTokens;
13+
}
14+
15+
export interface ExtendedSchemeBuilderExtensionContext {
16+
hex: (role: DynamicColor) => string;
17+
argb: (role: DynamicColor) => number;
18+
}
19+
20+
@Injectable({ providedIn: 'root' })
21+
export class ExtendedSchemeBuilder
22+
extends SchemeBuilder
23+
implements ThemeBuilder<ExtendedSchemeBuilderConfig>
24+
{
25+
override build(
26+
context: ThemeBuilderContext<ExtendedSchemeBuilderConfig>,
27+
): ThemeTokens {
28+
const scheme = this.getScheme(context.config);
29+
const tokens = super.build(context);
30+
if (context.config.extension) {
31+
const hex = (role: DynamicColor) => hexFromArgb(role.getArgb(scheme));
32+
const argb = (role: DynamicColor) => role.getArgb(scheme);
33+
const extension = context.config.extension?.({ hex, argb });
34+
for (const [name, value] of Object.entries(extension))
35+
tokens[`${context.name}-${name}`] = value;
36+
}
37+
return tokens;
38+
}
39+
}

0 commit comments

Comments
 (0)