Transform qualifying scenarios into marketing-ready use cases with: - AI-generated titles, descriptions, ROI estimates, business value - Persona/industry/category taxonomy for targeting - Browseable feed with filtering and ranking - SEO-optimized case study pages - Daily cron job for generation and ranking Database: - Add Persona, Industry, Category lookup tables - Add UseCase model with marketing content fields - Add junction tables for personas/industries/categories - Add SocialProof model for cached metrics API: - GET /api/use-cases - Global directory with filtering - GET /api/use-cases/[id] - Individual use case details - GET /api/public/users/[username]/collections/[slug]/use-cases - POST /api/cron/use-cases - Nightly generation job Frontend: - /use-cases - Global feed with persona dropdown - /use-cases/[slug] - SEO case study page - /[username]/collections/[slug]/use-cases - Collection feed - UseCasesFeed component - Sortable table component - UseCaseCaseStudy component - Full case study layout
849 lines
22 KiB
CSS
849 lines
22 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
/* Light mode (default) - Warm earthy palette with copper accent */
|
|
:root {
|
|
/* ===========================================
|
|
COMPREHENSIVE COLOR PALETTE
|
|
Warm, earthy tones with copper accent
|
|
=========================================== */
|
|
|
|
/* Backgrounds - Layered surface system */
|
|
--background: 30 15% 95%; /* #F5F3F0 - Warm off-white base */
|
|
--surface: 0 0% 100%; /* #FFFFFF - Cards, panels */
|
|
--surface-2: 30 20% 97%; /* #FAF8F6 - Elevated surfaces */
|
|
--surface-3: 25 12% 93%; /* #F0EDEA - Highest elevation */
|
|
--surface-secondary: 30 10% 95%; /* Legacy alias */
|
|
--surface-elevated: 30 20% 97%; /* Legacy alias */
|
|
--surface-overlay: 0 0% 100%; /* Overlays, modals */
|
|
|
|
/* Text - Clear hierarchy */
|
|
--foreground: 25 15% 10%; /* #1A1715 - Primary text */
|
|
--foreground-secondary: 25 8% 35%; /* #5C564F - Secondary text */
|
|
--foreground-tertiary: 25 6% 50%; /* #817B74 - Tertiary text */
|
|
--foreground-muted: 25 5% 60%; /* #9A958F - Muted/hints */
|
|
|
|
/* Borders - Warm grays */
|
|
--border: 30 8% 80%; /* #CEC9C3 - Default borders */
|
|
--border-strong: 25 8% 50%; /* #857F77 - Emphasized borders */
|
|
--border-subtle: 30 6% 88%; /* #E3E0DC - Subtle borders */
|
|
|
|
/* Primary - Copper accent #A6592D */
|
|
--primary: 22 57% 41%; /* #A6592D - Brand copper */
|
|
--primary-hover: 22 57% 35%; /* #8B4A26 - Hover state */
|
|
--primary-active: 22 57% 30%; /* #753F20 - Active/pressed */
|
|
--primary-foreground: 0 0% 100%; /* White text on primary */
|
|
|
|
/* Accent - Copper variations */
|
|
--accent: 22 57% 41%; /* #A6592D - Same as primary */
|
|
--accent-strong: 22 60% 35%; /* #8F4722 - Darker/hover */
|
|
--accent-muted: 22 30% 90%; /* #EDE5DF - Soft copper tint */
|
|
--accent-foreground: 0 0% 100%; /* White text */
|
|
|
|
/* Secondary - Warm neutrals */
|
|
--secondary: 30 10% 92%; /* #EDEBE8 - Soft warm bg */
|
|
--secondary-hover: 30 10% 88%; /* #E3E0DC - Hover */
|
|
--secondary-foreground: 25 15% 10%; /* Dark text */
|
|
|
|
/* Muted - Subtle backgrounds */
|
|
--muted: 30 8% 94%; /* #F2F0ED - Muted background */
|
|
--muted-foreground: 25 8% 40%; /* #6B655E - Muted text */
|
|
|
|
/* Status Colors - Earthy, warm variants */
|
|
--success: 145 45% 36%; /* #327D52 - Forest green */
|
|
--success-light: 145 35% 92%; /* #E5F3EC - Light bg */
|
|
--success-foreground: 0 0% 100%;
|
|
|
|
--warning: 38 75% 50%; /* #D9A020 - Warm amber */
|
|
--warning-light: 38 60% 92%; /* #F8F2E0 - Light bg */
|
|
--warning-foreground: 25 15% 10%;
|
|
|
|
--error: 0 55% 50%; /* #C44545 - Warm red */
|
|
--error-light: 0 50% 95%; /* #F9EDED - Light bg */
|
|
--error-foreground: 0 0% 100%;
|
|
|
|
--info: 210 60% 50%; /* #3380CC - Cool blue */
|
|
--info-light: 210 50% 95%; /* #EDF4FB - Light bg */
|
|
--info-foreground: 0 0% 100%;
|
|
|
|
/* Destructive (alias for error) */
|
|
--destructive: 0 55% 50%;
|
|
--destructive-foreground: 0 0% 100%;
|
|
|
|
/* Form Elements */
|
|
--input: 30 8% 80%; /* Input borders */
|
|
--input-focus: 22 57% 41%; /* Copper focus */
|
|
--ring: 22 57% 41%; /* Focus ring - copper */
|
|
--ring-offset: 0 0% 100%;
|
|
|
|
/* Grid/Blueprint Pattern */
|
|
--grid-color: 25 8% 88%;
|
|
--grid-size: 24px;
|
|
|
|
/* Card */
|
|
--card: 0 0% 100%;
|
|
--card-foreground: 25 15% 10%;
|
|
|
|
/* Border Radii - SHARP CORNERS (0) */
|
|
--radius-sm: 0;
|
|
--radius-md: 0;
|
|
--radius-lg: 0;
|
|
--radius-xl: 0;
|
|
--radius: 0;
|
|
|
|
/* Spacing - Generous whitespace */
|
|
--spacing-section: 8rem;
|
|
--spacing-component: 4rem;
|
|
--spacing-element: 2rem;
|
|
--spacing-tight: 1rem;
|
|
--spacing-comfortable: 3rem;
|
|
|
|
/* Typography */
|
|
--font-sans: var(--font-inter), -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
--font-mono: var(--font-jetbrains), "JetBrains Mono", "SF Mono", Consolas, monospace;
|
|
|
|
/* Line Heights */
|
|
--leading-tight: 1.2;
|
|
--leading-snug: 1.4;
|
|
--leading-normal: 1.6;
|
|
--leading-relaxed: 1.7;
|
|
--leading-loose: 1.8;
|
|
--leading-editorial: 1.9;
|
|
|
|
/* Letter Spacing */
|
|
--tracking-tighter: -0.03em;
|
|
--tracking-tight: -0.015em;
|
|
--tracking-normal: 0;
|
|
--tracking-wide: 0.025em;
|
|
--tracking-wider: 0.05em;
|
|
--tracking-widest: 0.1em;
|
|
|
|
/* Brutalist Accents */
|
|
--brutalist-accent: 22 57% 41%;
|
|
--brutalist-accent-hover: 22 57% 35%;
|
|
|
|
/* Gradients */
|
|
--gradient-start: 24 70% 50%;
|
|
--gradient-end: 15 60% 20%;
|
|
|
|
/* ===========================================
|
|
MOTION & ANIMATION TOKENS
|
|
Motion communicates state, not decoration
|
|
Fast by default (150-200ms)
|
|
=========================================== */
|
|
|
|
/* Duration tokens */
|
|
--motion-instant: 0ms;
|
|
--motion-fast: 150ms;
|
|
--motion-base: 200ms;
|
|
--motion-slow: 300ms;
|
|
--motion-slower: 500ms;
|
|
|
|
/* Easing tokens */
|
|
--easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
--easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
|
|
--easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
|
|
--easing-linear: linear;
|
|
--easing-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
|
|
/* ===========================================
|
|
TYPOGRAPHY SCALE
|
|
Modular scale with 1.25 ratio
|
|
Base: 16px
|
|
=========================================== */
|
|
|
|
/* Type scale */
|
|
--text-xs: 0.75rem; /* 12px */
|
|
--text-sm: 0.875rem; /* 14px */
|
|
--text-base: 1rem; /* 16px */
|
|
--text-lg: 1.125rem; /* 18px */
|
|
--text-xl: 1.25rem; /* 20px */
|
|
--text-2xl: 1.5rem; /* 24px */
|
|
--text-3xl: 2rem; /* 32px */
|
|
--text-4xl: 2.5rem; /* 40px */
|
|
--text-5xl: 3rem; /* 48px */
|
|
--text-6xl: 4rem; /* 64px */
|
|
|
|
/* Max line widths for readability */
|
|
--prose-width: 65ch;
|
|
--prose-width-narrow: 45ch;
|
|
--prose-width-wide: 80ch;
|
|
|
|
/* ===========================================
|
|
BREAKPOINTS
|
|
Mobile-first responsive design
|
|
=========================================== */
|
|
|
|
/* Breakpoint values (for reference, Tailwind handles classes) */
|
|
--breakpoint-sm: 640px;
|
|
--breakpoint-md: 768px;
|
|
--breakpoint-lg: 1024px;
|
|
--breakpoint-xl: 1280px;
|
|
--breakpoint-2xl: 1536px;
|
|
|
|
/* ===========================================
|
|
DENSITY MODES
|
|
Compact / Comfortable / Spacious
|
|
=========================================== */
|
|
|
|
/* Default is comfortable */
|
|
--density-row-height: 48px;
|
|
--density-cell-padding-x: 16px;
|
|
--density-cell-padding-y: 12px;
|
|
--density-icon-size: 20px;
|
|
--density-font-size: var(--text-sm);
|
|
|
|
/* ===========================================
|
|
Z-INDEX SCALE
|
|
Consistent layering
|
|
=========================================== */
|
|
|
|
--z-base: 0;
|
|
--z-dropdown: 100;
|
|
--z-sticky: 200;
|
|
--z-fixed: 300;
|
|
--z-modal-backdrop: 400;
|
|
--z-modal: 500;
|
|
--z-popover: 600;
|
|
--z-tooltip: 700;
|
|
--z-toast: 800;
|
|
|
|
/* ===========================================
|
|
FOCUS & ACCESSIBILITY
|
|
Never remove focus indicators
|
|
=========================================== */
|
|
|
|
--focus-ring-width: 2px;
|
|
--focus-ring-offset: 2px;
|
|
--focus-ring-color: var(--ring);
|
|
|
|
/* ===========================================
|
|
ELEVATION & SHADOWS
|
|
Subtle depth, prefer borders for emphasis
|
|
=========================================== */
|
|
|
|
--shadow-none: none;
|
|
--shadow-xs: 0 1px 2px 0 hsl(var(--foreground) / 0.05);
|
|
--shadow-sm:
|
|
0 1px 3px 0 hsl(var(--foreground) / 0.08), 0 1px 2px -1px hsl(var(--foreground) / 0.08);
|
|
--shadow-md:
|
|
0 4px 6px -1px hsl(var(--foreground) / 0.08), 0 2px 4px -2px hsl(var(--foreground) / 0.08);
|
|
--shadow-lg:
|
|
0 10px 15px -3px hsl(var(--foreground) / 0.08), 0 4px 6px -4px hsl(var(--foreground) / 0.08);
|
|
--shadow-xl:
|
|
0 20px 25px -5px hsl(var(--foreground) / 0.08), 0 8px 10px -6px hsl(var(--foreground) / 0.08);
|
|
--shadow-2xl: 0 25px 50px -12px hsl(var(--foreground) / 0.15);
|
|
--shadow-inner: inset 0 2px 4px 0 hsl(var(--foreground) / 0.05);
|
|
|
|
/* ===========================================
|
|
RADIUS SCALE
|
|
Sharp corners by default (brutalist)
|
|
Explicit tokens for rare roundness
|
|
=========================================== */
|
|
|
|
--radius-none: 0;
|
|
--radius-xs: 2px;
|
|
--radius-sm: 4px;
|
|
--radius-md: 6px;
|
|
--radius-lg: 8px;
|
|
--radius-xl: 12px;
|
|
--radius-2xl: 16px;
|
|
--radius-full: 9999px;
|
|
|
|
/* ===========================================
|
|
BORDER WIDTH SCALE
|
|
=========================================== */
|
|
|
|
--border-hairline: 0.5px;
|
|
--border-thin: 1px;
|
|
--border-medium: 2px;
|
|
--border-thick: 4px;
|
|
--border-heavy: 6px;
|
|
--border-brutalist: 8px;
|
|
|
|
/* ===========================================
|
|
OPACITY SCALE
|
|
For disabled, subtle, overlay states
|
|
=========================================== */
|
|
|
|
--opacity-0: 0;
|
|
--opacity-disabled: 0.5;
|
|
--opacity-subtle: 0.6;
|
|
--opacity-muted: 0.4;
|
|
--opacity-overlay: 0.8;
|
|
--opacity-overlay-heavy: 0.9;
|
|
--opacity-hover: 0.9;
|
|
--opacity-full: 1;
|
|
|
|
/* ===========================================
|
|
ADDITIONAL Z-INDEX LAYERS
|
|
Extended from base scale
|
|
=========================================== */
|
|
|
|
--z-drawer: 350;
|
|
--z-command-palette: 900;
|
|
--z-notification: 850;
|
|
}
|
|
|
|
/* Dark mode (opt-in) - Warm dark with copper accent */
|
|
.dark {
|
|
/* ===========================================
|
|
DARK MODE - Warm charcoal with copper
|
|
=========================================== */
|
|
|
|
/* Backgrounds - Layered dark surfaces */
|
|
--background: 25 10% 6%; /* #0F0E0D - Warm dark base */
|
|
--surface: 25 10% 9%; /* #171514 - Cards, panels */
|
|
--surface-2: 25 10% 12%; /* #1F1D1B - Elevated */
|
|
--surface-3: 25 10% 16%; /* #2A2725 - Highest elevation */
|
|
--surface-secondary: 25 10% 10%;
|
|
--surface-elevated: 25 10% 12%;
|
|
--surface-overlay: 25 10% 16%;
|
|
|
|
/* Text - Clear hierarchy in dark */
|
|
--foreground: 30 10% 90%; /* #E8E5E2 - Primary text */
|
|
--foreground-secondary: 25 6% 60%; /* #9A9592 - Secondary */
|
|
--foreground-tertiary: 25 5% 45%; /* #757270 - Tertiary */
|
|
--foreground-muted: 25 4% 35%; /* #5A5856 - Muted */
|
|
|
|
/* Borders - Subtle in dark */
|
|
--border: 25 8% 20%; /* #363230 - Default */
|
|
--border-strong: 25 8% 35%; /* #5C5854 - Emphasized */
|
|
--border-subtle: 25 6% 14%; /* #252321 - Subtle */
|
|
|
|
/* Primary - Copper, brighter for dark mode */
|
|
--primary: 22 57% 50%; /* #C96A38 - Brighter copper */
|
|
--primary-hover: 22 57% 55%; /* #D47942 - Hover */
|
|
--primary-active: 22 57% 45%; /* #B55E2E - Active */
|
|
--primary-foreground: 0 0% 100%;
|
|
|
|
/* Accent - Copper variations */
|
|
--accent: 22 57% 50%;
|
|
--accent-strong: 22 60% 55%;
|
|
--accent-muted: 22 20% 15%;
|
|
--accent-foreground: 0 0% 100%;
|
|
|
|
/* Secondary - Warm dark */
|
|
--secondary: 25 10% 15%;
|
|
--secondary-hover: 25 10% 20%;
|
|
--secondary-foreground: 30 10% 90%;
|
|
|
|
/* Muted - Subtle dark */
|
|
--muted: 25 8% 12%;
|
|
--muted-foreground: 25 6% 55%;
|
|
|
|
/* Status Colors - Brighter for dark mode */
|
|
--success: 145 50% 45%; /* Brighter green */
|
|
--success-light: 145 30% 15%;
|
|
--success-foreground: 0 0% 100%;
|
|
|
|
--warning: 38 80% 55%; /* Brighter amber */
|
|
--warning-light: 38 40% 15%;
|
|
--warning-foreground: 25 15% 10%;
|
|
|
|
--error: 0 60% 55%; /* Brighter red */
|
|
--error-light: 0 40% 15%;
|
|
--error-foreground: 0 0% 100%;
|
|
|
|
--info: 210 70% 55%; /* Brighter blue */
|
|
--info-light: 210 40% 15%;
|
|
--info-foreground: 0 0% 100%;
|
|
|
|
/* Destructive */
|
|
--destructive: 0 60% 55%;
|
|
--destructive-foreground: 0 0% 100%;
|
|
|
|
/* Form Elements */
|
|
--input: 25 8% 20%;
|
|
--input-focus: 22 57% 50%;
|
|
--ring: 22 57% 50%;
|
|
--ring-offset: 25 10% 6%;
|
|
|
|
/* Grid */
|
|
--grid-color: 25 8% 15%;
|
|
|
|
/* Card */
|
|
--card: 25 10% 9%;
|
|
--card-foreground: 30 10% 90%;
|
|
|
|
/* Brutalist Accents */
|
|
--brutalist-accent: 22 57% 50%;
|
|
--brutalist-accent-hover: 22 57% 55%;
|
|
|
|
/* Border Radii - SHARP CORNERS (0) */
|
|
--radius-sm: 0;
|
|
--radius-md: 0;
|
|
--radius-lg: 0;
|
|
--radius-xl: 0;
|
|
--radius: 0;
|
|
|
|
/* ===========================================
|
|
DARK MODE SHADOWS
|
|
Darker, more prominent for visibility
|
|
=========================================== */
|
|
|
|
--shadow-none: none;
|
|
--shadow-xs: 0 1px 2px 0 hsl(0 0% 0% / 0.2);
|
|
--shadow-sm: 0 1px 3px 0 hsl(0 0% 0% / 0.25), 0 1px 2px -1px hsl(0 0% 0% / 0.25);
|
|
--shadow-md: 0 4px 6px -1px hsl(0 0% 0% / 0.25), 0 2px 4px -2px hsl(0 0% 0% / 0.25);
|
|
--shadow-lg: 0 10px 15px -3px hsl(0 0% 0% / 0.25), 0 4px 6px -4px hsl(0 0% 0% / 0.25);
|
|
--shadow-xl: 0 20px 25px -5px hsl(0 0% 0% / 0.3), 0 8px 10px -6px hsl(0 0% 0% / 0.3);
|
|
--shadow-2xl: 0 25px 50px -12px hsl(0 0% 0% / 0.4);
|
|
--shadow-inner: inset 0 2px 4px 0 hsl(0 0% 0% / 0.2);
|
|
|
|
/* Radius, border, opacity tokens inherit from light mode */
|
|
}
|
|
|
|
/* Base element styles */
|
|
* {
|
|
@apply border-border;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
overflow-x: hidden;
|
|
max-width: 100vw;
|
|
}
|
|
|
|
body {
|
|
@apply bg-background text-foreground;
|
|
font-family: var(--font-sans);
|
|
font-feature-settings:
|
|
"rlig" 1,
|
|
"calt" 1;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
}
|
|
|
|
/* Grid/Blueprint background patterns */
|
|
.grid-background {
|
|
background-image:
|
|
linear-gradient(hsl(var(--grid-color)) 1px, transparent 1px),
|
|
linear-gradient(90deg, hsl(var(--grid-color)) 1px, transparent 1px);
|
|
background-size: var(--grid-size) var(--grid-size);
|
|
background-position: -1px -1px;
|
|
}
|
|
|
|
.dotted-grid-background {
|
|
background-image: radial-gradient(circle, hsl(var(--grid-color)) 1px, transparent 1px);
|
|
background-size: var(--grid-size) var(--grid-size);
|
|
}
|
|
|
|
.blueprint-background {
|
|
background-color: hsl(var(--background));
|
|
/* Major grid lines (4x size) */
|
|
background-image:
|
|
linear-gradient(hsl(var(--grid-color)) 1px, transparent 1px),
|
|
linear-gradient(90deg, hsl(var(--grid-color)) 1px, transparent 1px),
|
|
/* Minor grid lines (1x size) */
|
|
linear-gradient(hsl(var(--grid-color) / 0.3) 1px, transparent 1px),
|
|
linear-gradient(90deg, hsl(var(--grid-color) / 0.3) 1px, transparent 1px);
|
|
background-size:
|
|
calc(var(--grid-size) * 4) calc(var(--grid-size) * 4),
|
|
calc(var(--grid-size) * 4) calc(var(--grid-size) * 4),
|
|
var(--grid-size) var(--grid-size),
|
|
var(--grid-size) var(--grid-size);
|
|
}
|
|
|
|
/* Animated grid (subtle pulse) */
|
|
.grid-background-animated {
|
|
@apply grid-background;
|
|
animation: grid-pulse 8s ease-in-out infinite;
|
|
}
|
|
|
|
@keyframes grid-pulse {
|
|
0%,
|
|
100% {
|
|
opacity: 0.4;
|
|
}
|
|
50% {
|
|
opacity: 0.6;
|
|
}
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
/* Border utilities */
|
|
.border-1 {
|
|
border-width: 1px;
|
|
}
|
|
|
|
.border-dotted-1 {
|
|
border-width: 1px;
|
|
border-style: dotted;
|
|
}
|
|
|
|
.border-dashed-1 {
|
|
border-width: 1px;
|
|
border-style: dashed;
|
|
}
|
|
|
|
.border-dotted-2 {
|
|
border-width: 2px;
|
|
border-style: dotted;
|
|
}
|
|
|
|
/* Directional dotted borders */
|
|
.border-t-dotted {
|
|
border-top-width: 1px;
|
|
border-top-style: dotted;
|
|
}
|
|
|
|
.border-b-dotted {
|
|
border-bottom-width: 1px;
|
|
border-bottom-style: dotted;
|
|
}
|
|
|
|
.border-l-dotted {
|
|
border-left-width: 1px;
|
|
border-left-style: dotted;
|
|
}
|
|
|
|
.border-r-dotted {
|
|
border-right-width: 1px;
|
|
border-right-style: dotted;
|
|
}
|
|
|
|
/* Shadow utilities - Blueprint aesthetic */
|
|
.shadow-blueprint {
|
|
box-shadow:
|
|
0 1px 2px 0 rgb(0 0 0 / 0.03),
|
|
0 0 0 1px rgb(0 0 0 / 0.02);
|
|
}
|
|
|
|
.shadow-blueprint-hover {
|
|
box-shadow:
|
|
0 2px 4px 0 rgb(0 0 0 / 0.05),
|
|
0 0 0 1px rgb(0 0 0 / 0.03);
|
|
}
|
|
|
|
/* Transition presets */
|
|
.transition-base {
|
|
transition-property: background-color, border-color, color, fill, stroke;
|
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
transition-duration: 200ms;
|
|
}
|
|
|
|
.transition-transform {
|
|
transition-property: transform;
|
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
transition-duration: 200ms;
|
|
}
|
|
|
|
.transition-all-smooth {
|
|
transition-property: all;
|
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
transition-duration: 300ms;
|
|
}
|
|
|
|
/* Hover effects */
|
|
.hover-lift {
|
|
@apply transition-transform hover:-translate-y-0.5 hover:shadow-md;
|
|
}
|
|
|
|
/* Focus ring (modern, accessible) */
|
|
.focus-ring {
|
|
@apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background;
|
|
}
|
|
|
|
/* Custom animations */
|
|
@keyframes slide-up {
|
|
from {
|
|
transform: translateY(10px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
0% {
|
|
background-position: -1000px 0;
|
|
}
|
|
100% {
|
|
background-position: 1000px 0;
|
|
}
|
|
}
|
|
|
|
.animate-slide-up {
|
|
animation: slide-up 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
}
|
|
|
|
.animate-shimmer {
|
|
animation: shimmer 2s infinite linear;
|
|
background: linear-gradient(
|
|
90deg,
|
|
hsl(var(--muted)) 0%,
|
|
hsl(var(--accent)) 50%,
|
|
hsl(var(--muted)) 100%
|
|
);
|
|
background-size: 1000px 100%;
|
|
}
|
|
|
|
/* Brutalist Typography */
|
|
.brutalist-heading {
|
|
font-size: clamp(48px, 8vw, 120px);
|
|
font-weight: 800;
|
|
letter-spacing: -0.05em;
|
|
line-height: 0.9;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.brutalist-subheading {
|
|
font-size: clamp(24px, 4vw, 56px);
|
|
font-weight: 700;
|
|
letter-spacing: -0.025em;
|
|
line-height: 1.1;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
/* Brutalist Borders */
|
|
.brutalist-border {
|
|
border: 6px solid hsl(var(--foreground));
|
|
border-radius: 0;
|
|
}
|
|
|
|
.brutalist-border-thick {
|
|
border: 8px solid hsl(var(--foreground));
|
|
border-radius: 0;
|
|
}
|
|
|
|
.brutalist-border-mega {
|
|
border: 12px solid hsl(var(--foreground));
|
|
border-radius: 0;
|
|
}
|
|
|
|
/* Brutalist Shadows - Hard, not soft */
|
|
.brutalist-shadow {
|
|
box-shadow: 0 10px 0 0 hsl(var(--brutalist-accent));
|
|
}
|
|
|
|
.brutalist-shadow-hover {
|
|
box-shadow: 0 12px 0 0 hsl(var(--brutalist-accent));
|
|
}
|
|
|
|
.brutalist-shadow-sm {
|
|
box-shadow: 0 6px 0 0 hsl(var(--brutalist-accent));
|
|
}
|
|
|
|
/* Glitch Animation */
|
|
@keyframes glitch {
|
|
0%,
|
|
100% {
|
|
transform: translateX(0);
|
|
}
|
|
20% {
|
|
transform: translateX(-5px);
|
|
}
|
|
40% {
|
|
transform: translateX(5px);
|
|
}
|
|
60% {
|
|
transform: translateX(-3px);
|
|
}
|
|
80% {
|
|
transform: translateX(3px);
|
|
}
|
|
}
|
|
|
|
.animate-glitch {
|
|
animation: glitch 500ms ease-in-out;
|
|
}
|
|
|
|
/* Brutalist Entrance Animation */
|
|
@keyframes brutalist-entrance {
|
|
from {
|
|
transform: translateY(40px) scale(0.9);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0) scale(1);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
.animate-brutalist-entrance {
|
|
animation: brutalist-entrance 600ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
|
}
|
|
|
|
/* Bar Growth Animation */
|
|
@keyframes bar-grow {
|
|
from {
|
|
transform: scaleY(0);
|
|
transform-origin: bottom;
|
|
}
|
|
to {
|
|
transform: scaleY(1);
|
|
transform-origin: bottom;
|
|
}
|
|
}
|
|
|
|
.animate-bar-grow {
|
|
animation: bar-grow 800ms ease-out forwards;
|
|
}
|
|
|
|
/* Stagger delays for entrance animations */
|
|
.stagger-1 {
|
|
animation-delay: 80ms;
|
|
}
|
|
.stagger-2 {
|
|
animation-delay: 160ms;
|
|
}
|
|
.stagger-3 {
|
|
animation-delay: 240ms;
|
|
}
|
|
.stagger-4 {
|
|
animation-delay: 320ms;
|
|
}
|
|
.stagger-5 {
|
|
animation-delay: 400ms;
|
|
}
|
|
|
|
/* Blueprint Scanline Animation */
|
|
@keyframes scanline {
|
|
0% {
|
|
transform: translateY(-100%);
|
|
}
|
|
100% {
|
|
transform: translateY(100vh);
|
|
}
|
|
}
|
|
|
|
.blueprint-scanline {
|
|
position: absolute;
|
|
width: 100%;
|
|
height: 2px;
|
|
background: linear-gradient(
|
|
90deg,
|
|
transparent,
|
|
hsl(var(--brutalist-accent) / 0.3),
|
|
transparent
|
|
);
|
|
animation: scanline 30s linear infinite;
|
|
pointer-events: none;
|
|
z-index: 1;
|
|
}
|
|
|
|
/* Slide Down Animation (for Activity Stream) */
|
|
@keyframes slide-down {
|
|
from {
|
|
transform: translateY(-10px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
.animate-slide-down {
|
|
animation: slide-down 300ms ease-out forwards;
|
|
}
|
|
|
|
/* Motion Preferences - Accessibility */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*,
|
|
*::before,
|
|
*::after {
|
|
animation-duration: 0.01ms;
|
|
animation-iteration-count: 1;
|
|
transition-duration: 0.01ms;
|
|
}
|
|
}
|
|
|
|
/* ===========================================
|
|
DENSITY MODES
|
|
Use data-density attribute on container
|
|
=========================================== */
|
|
|
|
/* Compact density */
|
|
[data-density="compact"] {
|
|
--density-row-height: 36px;
|
|
--density-cell-padding-x: 8px;
|
|
--density-cell-padding-y: 6px;
|
|
--density-icon-size: 16px;
|
|
--density-font-size: var(--text-xs);
|
|
}
|
|
|
|
/* Comfortable density (default) */
|
|
[data-density="comfortable"] {
|
|
--density-row-height: 48px;
|
|
--density-cell-padding-x: 16px;
|
|
--density-cell-padding-y: 12px;
|
|
--density-icon-size: 20px;
|
|
--density-font-size: var(--text-sm);
|
|
}
|
|
|
|
/* Spacious density */
|
|
[data-density="spacious"] {
|
|
--density-row-height: 64px;
|
|
--density-cell-padding-x: 24px;
|
|
--density-cell-padding-y: 20px;
|
|
--density-icon-size: 24px;
|
|
--density-font-size: var(--text-base);
|
|
}
|
|
|
|
/* Density utility classes */
|
|
.density-row {
|
|
height: var(--density-row-height);
|
|
font-size: var(--density-font-size);
|
|
}
|
|
|
|
.density-cell {
|
|
padding: var(--density-cell-padding-y) var(--density-cell-padding-x);
|
|
font-size: var(--density-font-size);
|
|
}
|
|
|
|
.density-icon {
|
|
width: var(--density-icon-size);
|
|
height: var(--density-icon-size);
|
|
}
|
|
|
|
/* ===========================================
|
|
PROSE WIDTHS FOR READABILITY
|
|
=========================================== */
|
|
|
|
.prose-width {
|
|
max-width: var(--prose-width);
|
|
}
|
|
|
|
.prose-width-narrow {
|
|
max-width: var(--prose-width-narrow);
|
|
}
|
|
|
|
.prose-width-wide {
|
|
max-width: var(--prose-width-wide);
|
|
}
|
|
|
|
/* ===========================================
|
|
MOTION UTILITIES
|
|
Using CSS custom properties
|
|
=========================================== */
|
|
|
|
.motion-fast {
|
|
transition-duration: var(--motion-fast);
|
|
transition-timing-function: var(--easing-standard);
|
|
}
|
|
|
|
.motion-base {
|
|
transition-duration: var(--motion-base);
|
|
transition-timing-function: var(--easing-standard);
|
|
}
|
|
|
|
.motion-slow {
|
|
transition-duration: var(--motion-slow);
|
|
transition-timing-function: var(--easing-standard);
|
|
}
|
|
|
|
.motion-linear {
|
|
transition-timing-function: var(--easing-linear);
|
|
}
|
|
|
|
.motion-spring {
|
|
transition-timing-function: var(--easing-spring);
|
|
}
|
|
}
|