|
|
|
|
@ -13,6 +13,7 @@ import {
|
|
|
|
|
MOTION_DISTANCE_KEYS,
|
|
|
|
|
MOTION_SCALE_KEYS,
|
|
|
|
|
OPACITY_KEYS,
|
|
|
|
|
RADIUS_KEYS,
|
|
|
|
|
SHADOW_KEYS,
|
|
|
|
|
SIZE_PRIMITIVE_KEYS,
|
|
|
|
|
TEXT_SIZES,
|
|
|
|
|
@ -56,6 +57,7 @@ const ICON_STROKE_WIDTH_KEY_SET = new Set<string>(ICON_STROKE_WIDTH_KEYS)
|
|
|
|
|
const MOTION_DISTANCE_KEY_SET = new Set<string>(MOTION_DISTANCE_KEYS)
|
|
|
|
|
const MOTION_SCALE_KEY_SET = new Set<string>(MOTION_SCALE_KEYS)
|
|
|
|
|
const OPACITY_KEY_SET = new Set<string>(OPACITY_KEYS)
|
|
|
|
|
const RADIUS_KEY_SET = new Set<string>(RADIUS_KEYS)
|
|
|
|
|
const SHADOW_KEY_SET = new Set<string>(SHADOW_KEYS)
|
|
|
|
|
const SIZE_PRIMITIVE_KEY_SET = new Set<string>(SIZE_PRIMITIVE_KEYS)
|
|
|
|
|
const TEXT_SIZE_SET = new Set<string>(TEXT_SIZES)
|
|
|
|
|
@ -103,6 +105,7 @@ export function validateEidosConfig(options: EidosConfig): EidosValidationReport
|
|
|
|
|
validateColorRoles(options, issues)
|
|
|
|
|
validateTypography(options, issues)
|
|
|
|
|
validateSizePrimitives(options, issues)
|
|
|
|
|
validateStaticPrimitives(options, issues)
|
|
|
|
|
validateBorderPrimitives(options, issues)
|
|
|
|
|
validateLayoutPrimitives(options, issues)
|
|
|
|
|
validateDensityPrimitives(options, issues)
|
|
|
|
|
@ -526,6 +529,30 @@ function validateSizePrimitive(
|
|
|
|
|
validateNonEmptyCssValue(`${path}.gap`, size.gap, issues)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateStaticPrimitives(options: EidosConfig, issues: EidosValidationIssue[]): void {
|
|
|
|
|
validateOpenScalePrimitive('primitives.space', options.primitives.space, 'space', issues)
|
|
|
|
|
validateRecordPrimitive(
|
|
|
|
|
'primitives.controlHeight',
|
|
|
|
|
options.primitives.controlHeight,
|
|
|
|
|
SIZE_PRIMITIVE_KEYS,
|
|
|
|
|
SIZE_PRIMITIVE_KEY_SET,
|
|
|
|
|
issues
|
|
|
|
|
)
|
|
|
|
|
validateRecordPrimitive(
|
|
|
|
|
'primitives.radius',
|
|
|
|
|
options.primitives.radius,
|
|
|
|
|
RADIUS_KEYS,
|
|
|
|
|
RADIUS_KEY_SET,
|
|
|
|
|
issues
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const focusRing = options.primitives.focusRing
|
|
|
|
|
if (!focusRing) return
|
|
|
|
|
|
|
|
|
|
validateNonEmptyCssValue('primitives.focusRing.offset', focusRing.offset, issues)
|
|
|
|
|
validateNonEmptyCssValue('primitives.focusRing.width', focusRing.width, issues)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateBorderPrimitives(options: EidosConfig, issues: EidosValidationIssue[]): void {
|
|
|
|
|
const border = options.primitives.border
|
|
|
|
|
if (!border) return
|
|
|
|
|
@ -755,6 +782,20 @@ function validateRecordPrimitive(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateOpenScalePrimitive(
|
|
|
|
|
path: string,
|
|
|
|
|
record: Record<string, string | number> | undefined,
|
|
|
|
|
label: string,
|
|
|
|
|
issues: EidosValidationIssue[]
|
|
|
|
|
): void {
|
|
|
|
|
if (!record) return
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(record)) {
|
|
|
|
|
validateCssTokenSuffix(`${path}.${key}`, key, label, issues)
|
|
|
|
|
validateNonEmptyCssValue(`${path}.${key}`, String(value), issues)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function validateTypographySizeValue(
|
|
|
|
|
path: string,
|
|
|
|
|
value: unknown,
|
|
|
|
|
|