foundation: project guide, tooling, design tokens, bilingual shell and routing contracts
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
173
src/styles.scss
173
src/styles.scss
@@ -1,15 +1,180 @@
|
||||
/* You can add global styles to this file, and also import other style files */
|
||||
/* Design tokens — the only place raw brand hex values are defined. */
|
||||
:root {
|
||||
/* Color — surface ramp built on #0a0a0f */
|
||||
--color-surface: #0a0a0f;
|
||||
--color-surface-raised: #12121a;
|
||||
--color-surface-overlay: #1a1a24;
|
||||
--color-surface-muted: #22222e;
|
||||
|
||||
/* Color — accent ramp */
|
||||
--color-accent: #6366f1;
|
||||
--color-accent-strong: #8b5cf6;
|
||||
--color-accent-soft: #a855f7;
|
||||
--color-accent-cool: #3b82f6;
|
||||
|
||||
/* Color — text ramp. muted and subtle stay at least 4.5:1 on --color-surface. */
|
||||
--color-text: #f4f4f8;
|
||||
--color-text-muted: #d2d2dc;
|
||||
--color-text-subtle: #b8b8c8;
|
||||
|
||||
/* Color — glass and elevation */
|
||||
--surface-glass: linear-gradient(
|
||||
135deg,
|
||||
rgba(255, 255, 255, 0.1) 0%,
|
||||
rgba(255, 255, 255, 0.05) 100%
|
||||
);
|
||||
--surface-glass-border: rgba(255, 255, 255, 0.15);
|
||||
--surface-glass-border-strong: rgba(255, 255, 255, 0.25);
|
||||
--shadow-soft: 0 4px 24px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||
--shadow-raised: 0 8px 32px rgba(99, 102, 241, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.15);
|
||||
--blur-glass: 16px;
|
||||
|
||||
/* Typography */
|
||||
--font-sans: system-ui, sans-serif;
|
||||
--font-mono:
|
||||
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
|
||||
monospace;
|
||||
--text-xs: clamp(0.75rem, 0.7rem + 0.2vw, 0.8125rem);
|
||||
--text-sm: clamp(0.875rem, 0.8rem + 0.25vw, 0.9375rem);
|
||||
--text-md: clamp(1rem, 0.95rem + 0.3vw, 1.125rem);
|
||||
--text-lg: clamp(1.125rem, 1rem + 0.5vw, 1.375rem);
|
||||
--text-xl: clamp(1.375rem, 1.1rem + 0.9vw, 1.75rem);
|
||||
--text-2xl: clamp(1.75rem, 1.3rem + 1.4vw, 2.25rem);
|
||||
--text-3xl: clamp(2.25rem, 1.6rem + 2vw, 3rem);
|
||||
--leading-tight: 1.2;
|
||||
--leading-normal: 1.5;
|
||||
--leading-relaxed: 1.7;
|
||||
--tracking-wide: 0.08em;
|
||||
|
||||
/* Spacing */
|
||||
--space-1: 0.25rem;
|
||||
--space-2: 0.5rem;
|
||||
--space-3: 0.75rem;
|
||||
--space-4: 1rem;
|
||||
--space-5: 1.25rem;
|
||||
--space-6: 1.5rem;
|
||||
--space-7: 2rem;
|
||||
--space-8: 2.5rem;
|
||||
--space-9: 3rem;
|
||||
--space-10: 4rem;
|
||||
--space-11: 5rem;
|
||||
--space-12: 6rem;
|
||||
|
||||
/* Radii and layout */
|
||||
--radius-sm: 0.375rem;
|
||||
--radius-md: 0.75rem;
|
||||
--radius-lg: 1rem;
|
||||
--radius-pill: 999px;
|
||||
--content-max: 72rem;
|
||||
--content-gutter: clamp(1rem, 4vw, 2rem);
|
||||
|
||||
/* Motion */
|
||||
--duration-fast: 150ms;
|
||||
--duration-base: 250ms;
|
||||
--duration-slow: 400ms;
|
||||
--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
--ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
|
||||
|
||||
/* Focus */
|
||||
--focus-ring-color: var(--color-accent);
|
||||
--focus-ring-width: 2px;
|
||||
--focus-ring-offset: 3px;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
color-scheme: dark;
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: #0a0a0f;
|
||||
color: #fff;
|
||||
background: var(--color-surface);
|
||||
color: var(--color-text);
|
||||
font-family: var(--font-sans);
|
||||
font-size: var(--text-md);
|
||||
line-height: var(--leading-normal);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: var(--focus-ring-width) solid var(--focus-ring-color);
|
||||
outline-offset: var(--focus-ring-offset);
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.skip-link {
|
||||
position: absolute;
|
||||
top: var(--space-2);
|
||||
left: var(--space-2);
|
||||
z-index: 1000;
|
||||
padding: var(--space-2) var(--space-4);
|
||||
background: var(--color-surface-raised);
|
||||
color: var(--color-text);
|
||||
border-radius: var(--radius-sm);
|
||||
text-decoration: none;
|
||||
transform: translateY(-200%);
|
||||
transition: transform var(--duration-fast) var(--ease-standard);
|
||||
}
|
||||
|
||||
.skip-link:focus {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.glass-surface {
|
||||
background: var(--surface-glass);
|
||||
backdrop-filter: blur(var(--blur-glass));
|
||||
-webkit-backdrop-filter: blur(var(--blur-glass));
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
box-shadow: var(--shadow-soft);
|
||||
}
|
||||
|
||||
.content-container {
|
||||
width: min(100% - 2 * var(--content-gutter), var(--content-max));
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.stack {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-4);
|
||||
}
|
||||
|
||||
.cluster {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-3);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html {
|
||||
scroll-behavior: auto;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
animation-duration: 0.01ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
transition-duration: 0.01ms !important;
|
||||
scroll-behavior: auto !important;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user