39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
|
import warning from '../../warning';
|
||
|
import type { DerivativeFunc, TokenType } from './interface';
|
||
|
|
||
|
let uuid = 0;
|
||
|
|
||
|
/**
|
||
|
* Theme with algorithms to derive tokens from design tokens.
|
||
|
* Use `createTheme` first which will help to manage the theme instance cache.
|
||
|
*/
|
||
|
export default class Theme<DesignToken extends TokenType, DerivativeToken extends TokenType> {
|
||
|
private derivatives: DerivativeFunc<DesignToken, DerivativeToken>[];
|
||
|
public readonly id: number;
|
||
|
|
||
|
constructor(
|
||
|
derivatives:
|
||
|
| DerivativeFunc<DesignToken, DerivativeToken>
|
||
|
| DerivativeFunc<DesignToken, DerivativeToken>[],
|
||
|
) {
|
||
|
this.derivatives = Array.isArray(derivatives) ? derivatives : [derivatives];
|
||
|
this.id = uuid;
|
||
|
|
||
|
if (derivatives.length === 0) {
|
||
|
warning(
|
||
|
derivatives.length > 0,
|
||
|
'[Ant Design Vue CSS-in-JS] Theme should have at least one derivative function.',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
uuid += 1;
|
||
|
}
|
||
|
|
||
|
getDerivativeToken(token: DesignToken): DerivativeToken {
|
||
|
return this.derivatives.reduce<DerivativeToken>(
|
||
|
(result, derivative) => derivative(token, result),
|
||
|
undefined as any,
|
||
|
);
|
||
|
}
|
||
|
}
|