Define a major-third (1.25) type scale as CSS custom properties in the tokens layer (--text-2xs through --text-5xl), along with line-height (--leading-*), font-weight (--font-*), and letter-spacing (--tracking-*) tokens. Migrate all 28 core CSS files from ad-hoc values to token references with clamp()-based responsive scaling for headings. Add TypographyTokenContractTest to enforce token-only usage via grep-based assertions. Task run: UI-TYPOGRAPHY-SCALE-001 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
65 lines
1.7 KiB
CSS
65 lines
1.7 KiB
CSS
@layer components {
|
|
/* Empty state placeholders — dashed border cards with icon, message, and optional action. */
|
|
.app-empty-state {
|
|
border: 1px dashed var(--app-empty-border-color);
|
|
border-radius: var(--app-border-radius);
|
|
background: var(--app-empty-bg);
|
|
color: var(--app-empty-text);
|
|
padding: calc(var(--app-spacing) * 1.5) var(--app-spacing);
|
|
display: grid;
|
|
gap: calc(var(--app-spacing) * 0.35);
|
|
text-align: center;
|
|
justify-items: center;
|
|
}
|
|
|
|
.app-empty-state[data-size="compact"] {
|
|
padding: calc(var(--app-spacing) * 0.75) calc(var(--app-spacing) * 0.75);
|
|
gap: calc(var(--app-spacing) * 0.25);
|
|
}
|
|
.app-empty-state[data-size="small"] {
|
|
padding: calc(var(--app-spacing) * 0.5) calc(var(--app-spacing) * 0.5);
|
|
gap: calc(var(--app-spacing) * 0.15);
|
|
}
|
|
|
|
.app-empty-state[data-align="left"] {
|
|
text-align: left;
|
|
justify-items: start;
|
|
}
|
|
|
|
.app-empty-state-icon {
|
|
color: var(--app-empty-hint);
|
|
opacity: 0.5;
|
|
margin-bottom: calc(var(--app-spacing) * 0.15);
|
|
}
|
|
|
|
.app-empty-state[data-size="compact"] .app-empty-state-icon {
|
|
width: 28px;
|
|
height: 28px;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.app-empty-state-message {
|
|
margin: 0;
|
|
color: var(--app-empty-hint);
|
|
font-size: var(--text-xs);
|
|
line-height: var(--leading-snug);
|
|
}
|
|
|
|
.app-empty-state-hint {
|
|
margin: 0;
|
|
color: var(--app-empty-hint);
|
|
font-size: var(--text-sm);
|
|
line-height: var(--leading-snug);
|
|
opacity: 0.75;
|
|
}
|
|
|
|
.app-empty-state-action {
|
|
justify-self: center;
|
|
margin-top: calc(var(--app-spacing) * 0.25);
|
|
}
|
|
|
|
.app-empty-state[data-align="left"] .app-empty-state-action {
|
|
justify-self: start;
|
|
}
|
|
}
|