foundation: project guide, tooling, design tokens, bilingual shell and routing contracts

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-25 17:06:51 +02:00
parent 1020ac4c68
commit 42e9f01253
89 changed files with 3615 additions and 297 deletions

View File

@@ -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;
}
}