mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-14 15:16:35 +03:00
Sync generated provider output
This commit is contained in:
@@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe
|
||||
- **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows.
|
||||
- **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth.
|
||||
- **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus.
|
||||
- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably.
|
||||
- **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery.
|
||||
- **Coverage:** every brief requirement present and findable within seconds.
|
||||
|
||||
|
||||
@@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes
|
||||
|| concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) {
|
||||
errors.push(`concept ${id} must have exactly three structural tags`);
|
||||
}
|
||||
// The slop this world in particular is at risk of. Optional, because 541
|
||||
// entries predate it and none of them are wrong for lacking it. A world built
|
||||
// from posters is at risk of shouting and one built from instruments is at
|
||||
// risk of dead greys; a global detector cannot know which, and the author can.
|
||||
if (concept?.avoid !== undefined) {
|
||||
if (!Array.isArray(concept.avoid)
|
||||
|| concept.avoid.length < 2
|
||||
|| concept.avoid.length > 3
|
||||
|| concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) {
|
||||
errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`);
|
||||
}
|
||||
}
|
||||
if (!Array.isArray(concept?.system)
|
||||
|| concept.system.length !== SYSTEM_PREFIXES.length
|
||||
|| concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) {
|
||||
|
||||
Reference in New Issue
Block a user