/* * impeccable.style — Tailwind CSS v4 + Custom Components * * Architecture: * - Tailwind v4 with custom theme tokens * - Custom components for complex UI patterns * - Minimal CSS for what Tailwind can't express */ @import "tailwindcss"; /* ============================================ TAILWIND THEME - Static Design Tokens ============================================ */ @theme { /* Typography */ --font-display: 'Cormorant Garamond', Georgia, serif; --font-body: 'Instrument Sans', system-ui, sans-serif; --font-mono: 'Space Grotesk', monospace; /* Spacing Scale */ --spacing-xs: 8px; --spacing-sm: 16px; --spacing-md: 24px; --spacing-lg: 48px; --spacing-xl: 80px; --spacing-2xl: 128px; --spacing-3xl: 192px; /* Width */ --width-max: 1280px; --width-content: 840px; /* Animation */ --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); --duration-fast: 0.2s; --duration-base: 0.3s; --duration-slow: 0.6s; --duration-slower: 0.8s; --duration-slowest: 1.2s; } /* ============================================ COLOR TOKENS - Light/Dark Mode via CSS ============================================ */ :root { /* Colors - Light Mode */ --color-ink: oklch(10% 0 0); --color-text: oklch(10% 0 0); --color-paper: oklch(98% 0 0); --color-charcoal: oklch(25% 0 0); --color-ash: oklch(55% 0 0); --color-mist: oklch(92% 0 0); --color-bg: oklch(96% 0.005 350); --color-accent: oklch(60% 0.25 350); --color-accent-hover: oklch(52% 0.25 350); --color-accent-dim: oklch(60% 0.25 350 / 0.15); } /* Dark Mode */ @media (prefers-color-scheme: dark) { :root { --color-ink: oklch(98% 0 0); --color-text: oklch(98% 0 0); --color-paper: oklch(10% 0 0); --color-charcoal: oklch(92% 0 0); --color-ash: oklch(65% 0 0); --color-mist: oklch(20% 0 0); --color-bg: oklch(12% 0.005 350); --color-accent: oklch(68% 0.23 350); --color-accent-hover: oklch(76% 0.23 350); } } /* ============================================ BASE STYLES ============================================ */ html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } body { font-family: var(--font-body); color: var(--color-ink); background: var(--color-paper); } h1, h2, h3, h4, h5, h6 { font-family: var(--font-display); font-weight: 600; line-height: 1.1; letter-spacing: -0.02em; } a { color: var(--color-accent); text-decoration: none; transition: opacity var(--duration-fast) var(--ease-out); } a:hover { opacity: 0.7; } /* ============================================ SECTION TITLE - With accent underline ============================================ */ .section-title { font-size: clamp(2rem, 4vw, 3rem); font-weight: 600; position: relative; display: block; padding-bottom: var(--spacing-sm); } .section-title::after { content: ''; position: absolute; bottom: -0.25em; left: 0; width: 80px; height: 2px; background: var(--color-accent); } /* ============================================ BACKGROUND ATMOSPHERE ============================================ */ body::before { content: ''; position: fixed; inset: 0; background: radial-gradient(circle at 20% 30%, var(--color-accent-dim) 0%, transparent 50%), radial-gradient(circle at 80% 70%, var(--color-accent-dim) 0%, transparent 50%); opacity: 0; z-index: -1; animation: fadeInBg var(--duration-slowest) var(--ease-out) 0.3s forwards; pointer-events: none; } /* ============================================ HERO DECORATIONS ============================================ */ .deco-line { position: absolute; width: 160px; height: 2px; background: var(--color-accent); top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-25deg); animation: expandLine 1s var(--ease-out) 0.6s both; } .deco-circle { position: absolute; width: 120px; height: 120px; border: 2px solid var(--color-accent); border-radius: 50%; top: 50%; left: 50%; transform: translate(-50%, -50%); animation: drawCircle 1s var(--ease-out) 0.8s both; opacity: 0.3; } /* ============================================ BUTTONS ============================================ */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.875rem 2rem; font-family: var(--font-body); font-size: 0.9375rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; border: none; cursor: pointer; transition: all var(--duration-base) var(--ease-out); position: relative; overflow: hidden; text-decoration: none; } .btn-primary { background: var(--color-accent); color: var(--color-paper); width: 100%; position: relative; z-index: 1; } .btn-primary::before { content: ''; position: absolute; inset: 0; background: var(--color-ink); transform: translateY(100%); transition: transform var(--duration-base) var(--ease-out); z-index: -1; } .btn-primary:hover::before { transform: translateY(0); } .btn-secondary { background: transparent; color: var(--color-ink); border: 1px solid var(--color-ink); } .btn-secondary:hover { background: var(--color-ink); color: var(--color-paper); } /* ============================================ CARD COMPONENTS ============================================ */ .card-inner { height: 100%; padding: var(--spacing-lg); background: var(--color-paper); border: 1px solid var(--color-mist); display: flex; flex-direction: column; gap: var(--spacing-md); transition: all var(--duration-base) var(--ease-out); position: relative; overflow: hidden; } .card-inner::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: var(--color-accent); transform: translateX(-100%); transition: transform 0.4s var(--ease-out); } .card-inner:hover { border-color: var(--color-accent); transform: translateY(-4px); } .card-inner:hover::before { transform: translateX(0); } .badge { font-size: 0.625rem; text-transform: uppercase; letter-spacing: 0.1em; padding: 0.25em 0.625em; border: 1px solid var(--color-accent); color: var(--color-accent); border-radius: 2px; font-weight: 600; white-space: nowrap; } /* ============================================ SOLUTION CARDS ============================================ */ .solution-card { padding: var(--spacing-lg); background: var(--color-paper); border-left: 3px solid var(--color-accent); transition: all var(--duration-base) var(--ease-out); } .solution-card:hover { background: color-mix(in oklch, var(--color-paper) 90%, var(--color-accent)); transform: translateX(4px); } .solution-card code { font-family: var(--font-mono); font-size: 0.875em; background: color-mix(in oklch, var(--color-accent) 15%, transparent); color: var(--color-accent); padding: 0.125em 0.375em; border-radius: 3px; } /* ============================================ ANIMATIONS ============================================ */ @keyframes fadeInBg { to { opacity: 1; } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-40px); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(40px); } } @keyframes fadeInUp { to { opacity: 1; transform: translateY(0); } } @keyframes expandLine { from { width: 0; } } @keyframes drawCircle { from { opacity: 0; scale: 0; } to { opacity: 1; scale: 1; } } [data-animate] { opacity: 0; transform: translateY(20px); } [data-animate].animated { animation: fadeInUp var(--duration-slow) var(--ease-out) both; } /* Hero animations */ .hero-content { animation: slideInLeft var(--duration-slower) var(--ease-out) 0.1s both; } .hero-decoration { animation: slideInRight var(--duration-slower) var(--ease-out) 0.3s both; } /* ============================================ IMPORTS - Complex components that need custom CSS ============================================ */ @import "./problem-section.css"; @import "./skill-demos.css"; @import "./gallery.css"; @import "./workflow.css";