|
|
|
|
@ -88,6 +88,7 @@ export function validateEidosConfig(options: EidosConfig): EidosValidationReport
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
validateThemeKeys(options, issues)
|
|
|
|
|
validateColorScales(options, issues)
|
|
|
|
|
validateColorRoles(options, issues)
|
|
|
|
|
validateTypography(options, issues)
|
|
|
|
|
@ -239,14 +240,22 @@ function validateColorScales(options: EidosConfig, issues: EidosValidationIssue[
|
|
|
|
|
const scales = options.primitives.color?.scales ?? {}
|
|
|
|
|
|
|
|
|
|
for (const [name, scale] of Object.entries(scales)) {
|
|
|
|
|
validateCssTokenKey(`primitives.color.scales.${name}`, name, 'color scale', issues)
|
|
|
|
|
validateColorScale(`primitives.color.scales.${name}`, name, scale, issues)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const [themeId, theme] of Object.entries(options.themes ?? {})) {
|
|
|
|
|
for (const [name, scale] of Object.entries(theme.color?.scales ?? {})) {
|
|
|
|
|
validateCssTokenKey(`themes.${themeId}.color.scales.${name}`, name, 'color scale', issues)
|
|
|
|
|
validateColorScale(`themes.${themeId}.color.scales.${name}`, name, scale, issues)
|
|
|
|
|
}
|
|
|
|
|
for (const [name, scale] of Object.entries(theme.color?.alphaScales ?? {})) {
|
|
|
|
|
validateCssTokenKey(
|
|
|
|
|
`themes.${themeId}.color.alphaScales.${name}`,
|
|
|
|
|
name,
|
|
|
|
|
'alpha color scale',
|
|
|
|
|
issues
|
|
|
|
|
)
|
|
|
|
|
validateColorScale(`themes.${themeId}.color.alphaScales.${name}`, name, scale, issues)
|
|
|
|
|
if (
|
|
|
|
|
!hasOwn(options.primitives.color?.scales ?? {}, name) &&
|
|
|
|
|
@ -261,6 +270,12 @@ function validateColorScales(options: EidosConfig, issues: EidosValidationIssue[
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateThemeKeys(options: EidosConfig, issues: EidosValidationIssue[]): void {
|
|
|
|
|
for (const themeId of Object.keys(options.themes ?? {})) {
|
|
|
|
|
validateCssTokenKey(`themes.${themeId}`, themeId, 'theme id', issues)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateColorRoles(options: EidosConfig, issues: EidosValidationIssue[]): void {
|
|
|
|
|
const roles = options.semantics.color.roles
|
|
|
|
|
const globalScales = options.primitives.color?.scales ?? {}
|
|
|
|
|
@ -741,6 +756,19 @@ function isTextMetric(value: unknown): value is TextMetric {
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateCssTokenKey(
|
|
|
|
|
path: string,
|
|
|
|
|
value: string,
|
|
|
|
|
label: string,
|
|
|
|
|
issues: EidosValidationIssue[]
|
|
|
|
|
): void {
|
|
|
|
|
if (isCssTokenSegment(value)) return
|
|
|
|
|
issues.push({
|
|
|
|
|
path,
|
|
|
|
|
message: `${label} must be a kebab-case CSS token segment`
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveRoleScaleName(
|
|
|
|
|
roleDef: string | ColorRoleDefinition | undefined
|
|
|
|
|
): string | undefined {
|
|
|
|
|
|