Files
pbakaus_impeccable/public/css/main.css
T
Paul BakausandClaude Opus 4.5 2181137d04 Consolidate skills + add patterns source file
Major changes:
- Consolidate 8 design skills into single frontend-design skill with 7 reference files
- Add source/patterns.md as single source of truth for patterns/antipatterns
- Patterns are merged into skill during build, served via API for website
- Website now dynamically renders both "What TO Do" and "What NOT to Do" sections
- Update build system to handle directory-based skills with references
- Add /api/patterns endpoint to server
- Refactor website with new Antidote section layout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 14:08:30 -08:00

1584 lines
32 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* impeccable.style — Renaissance Redesign
*
* Editorial precision meets fluid motion.
* Light, high-contrast, typographically bold.
*/
@import "tailwindcss";
/* ============================================
TAILWIND THEME - 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: 1400px;
--width-content: 900px;
/* Animation */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
--duration-fast: 0.15s;
--duration-base: 0.3s;
--duration-slow: 0.6s;
--duration-slower: 0.8s;
--duration-slowest: 1.2s;
}
/* ============================================
COLOR TOKENS - Renaissance Palette
============================================ */
:root {
/* Core Colors - Light Mode */
--color-ink: oklch(10% 0 0);
--color-text: oklch(10% 0 0);
--color-paper: oklch(98% 0 0);
--color-cream: oklch(96% 0.005 350);
--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);
/* Accent - Vibrant Magenta/Rose (original) */
--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);
--color-accent-soft: oklch(60% 0.25 350 / 0.25);
}
/* 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-cream: oklch(12% 0.005 350);
--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);
--color-accent-dim: oklch(68% 0.23 350 / 0.15);
--color-accent-soft: oklch(68% 0.23 350 / 0.25);
}
}
/* ============================================
BASE STYLES
============================================ */
* {
box-sizing: border-box;
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
scroll-behavior: smooth;
}
html.lenis, html.lenis body {
height: auto;
}
.lenis.lenis-smooth {
scroll-behavior: auto !important;
}
.lenis.lenis-smooth [data-lenis-prevent] {
overscroll-behavior: contain;
}
.lenis.lenis-stopped {
overflow: hidden;
}
body {
font-family: var(--font-body);
font-size: 16px;
line-height: 1.6;
color: var(--color-text);
background: var(--color-paper);
overflow-x: hidden;
}
h1, h2, h3, h4, h5, h6 {
font-family: var(--font-display);
font-weight: 400;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--color-ink);
}
a {
color: var(--color-accent);
text-decoration: none;
transition: color var(--duration-fast) var(--ease-out);
}
a:hover {
color: var(--color-accent-hover);
}
strong {
font-weight: 600;
color: var(--color-ink);
}
code {
font-family: var(--font-mono);
font-size: 0.9em;
padding: 0.15em 0.4em;
background: var(--color-accent-dim);
color: var(--color-accent);
border-radius: 4px;
}
::selection {
background: var(--color-accent-soft);
color: var(--color-ink);
}
/* ============================================
GRAIN OVERLAY
============================================ */
.grain-overlay {
position: fixed;
inset: 0;
pointer-events: none;
z-index: 9999;
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
background-repeat: repeat;
}
/* ============================================
LAYOUT
============================================ */
.site-content {
max-width: var(--width-max);
margin: 0 auto;
padding: 0 var(--spacing-lg);
}
@media (max-width: 768px) {
.site-content {
padding: 0 var(--spacing-md);
}
}
/* ============================================
SECTION HEADERS
============================================ */
.section-header {
margin-bottom: var(--spacing-xl);
position: relative;
}
.section-number {
display: block;
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.1em;
color: var(--color-accent);
margin-bottom: var(--spacing-sm);
text-transform: uppercase;
}
.section-title {
font-size: clamp(2.5rem, 6vw, 4.5rem);
font-weight: 300;
line-height: 1;
margin: 0;
position: relative;
}
.section-title::after {
content: '';
position: absolute;
bottom: -0.3em;
left: 0;
width: 60px;
height: 2px;
background: var(--color-accent);
}
.section-subtitle {
font-size: 1.125rem;
color: var(--color-ash);
margin-top: var(--spacing-md);
max-width: 50ch;
}
.section-lead {
font-size: clamp(1.125rem, 2.5vw, 1.5rem);
line-height: 1.5;
color: var(--color-charcoal);
max-width: 55ch;
margin-bottom: var(--spacing-xl);
}
/* ============================================
HERO SECTION
============================================ */
.hero-section {
min-height: 100vh;
/* Use dynamic viewport height for mobile browsers */
min-height: 100dvh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
overflow: hidden;
padding: var(--spacing-2xl) var(--spacing-lg);
}
.hero-canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
opacity: 0.4;
}
.hero-container {
position: relative;
z-index: 1;
text-align: center;
max-width: 900px;
}
.hero-content {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
}
.hero-eyebrow {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--color-accent);
/* Animation handled by JS reveal.js */
}
.hero-title {
font-size: clamp(4rem, 15vw, 12rem);
font-weight: 300;
line-height: 0.9;
letter-spacing: -0.04em;
margin: var(--spacing-md) 0;
display: flex;
flex-direction: column;
}
.hero-title-line {
display: block;
}
.hero-title-accent {
font-style: italic;
color: var(--color-accent);
}
.hero-subtitle {
font-size: clamp(1rem, 2.5vw, 1.375rem);
color: var(--color-charcoal);
max-width: 45ch;
line-height: 1.5;
}
.hero-cta {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
margin-top: var(--spacing-lg);
}
.hero-providers {
font-size: 0.8125rem;
color: var(--color-ash);
letter-spacing: 0.03em;
}
.hero-scroll-indicator {
position: absolute;
bottom: var(--spacing-lg);
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-xs);
color: var(--color-ash);
font-size: 0.6875rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
opacity: 0;
/* Restore simple CSS animation */
animation: fadeIn 1s var(--ease-out) 1.5s forwards, float 2s ease-in-out infinite 2s;
}
/* Removed .revealed dependency for scroll indicator */
.hero-scroll-indicator svg {
/* No separate bounce animation needed, handled by float */
}
/* ============================================
PROBLEM SECTION - Clarity Lens
============================================ */
.problem-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.problem-content {
display: grid;
gap: var(--spacing-xl);
}
.lens-comparison {
position: relative;
width: 100%;
max-width: 600px;
margin: 0 auto;
}
.lens-container {
position: relative;
width: 100%;
max-width: 500px;
height: 380px;
margin: 0 auto;
border-radius: 12px;
overflow: hidden;
background: var(--color-cream);
border: 1px solid var(--color-mist);
}
.lens-before,
.lens-after {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.lens-before {
z-index: 1;
}
.lens-after {
clip-path: circle(120px at var(--lens-x, 70%) var(--lens-y, 50%));
transition: clip-path 0.08s ease-out;
z-index: 2;
background: var(--color-paper);
}
.lens-circle {
position: absolute;
width: 240px;
height: 240px;
border: 2px solid var(--color-accent);
border-radius: 50%;
pointer-events: none;
z-index: 3;
left: var(--lens-x, 70%);
top: var(--lens-y, 50%);
transform: translate(-50%, -50%);
transition: left 0.08s ease-out, top 0.08s ease-out;
box-shadow: 0 0 0 4px var(--color-accent-dim), 0 20px 60px rgba(0,0,0,0.15);
}
.lens-label {
position: absolute;
top: -28px;
left: 50%;
transform: translateX(-50%);
font-size: 0.6875rem;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--color-accent);
background: var(--color-paper);
padding: 4px 12px;
border-radius: 4px;
white-space: nowrap;
}
/* Slop Card - Generic AI output */
.slop-card {
width: 280px;
height: 280px;
background: linear-gradient(135deg, #f5f3ff 0%, #ede9fe 50%, #ddd6fe 100%);
border-radius: 16px;
padding: 24px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
font-family: 'Inter', system-ui, sans-serif;
display: flex;
flex-direction: column;
}
.slop-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.slop-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: linear-gradient(135deg, #8b5cf6, #7c3aed);
flex-shrink: 0;
}
.slop-text { flex: 1; }
.slop-title { font-size: 14px; font-weight: 600; color: #1f2937; margin-bottom: 2px; }
.slop-subtitle { font-size: 12px; color: #6b7280; }
.slop-body { font-size: 13px; line-height: 1.5; color: #4b5563; margin-bottom: auto; flex: 1; }
.slop-button {
width: 100%;
padding: 10px 20px;
background: linear-gradient(135deg, #8b5cf6, #7c3aed);
color: white;
border: none;
border-radius: 8px;
font-family: 'Inter', system-ui, sans-serif;
font-size: 13px;
font-weight: 500;
cursor: pointer;
margin-top: auto;
}
/* Callout labels pointing to issues */
.slop-callouts {
position: absolute;
inset: 0;
pointer-events: none;
}
.slop-callout {
position: absolute;
font-size: 0.625rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--color-accent);
background: var(--color-paper);
padding: 4px 8px;
border: 1px solid var(--color-accent);
border-radius: 3px;
white-space: nowrap;
opacity: 0;
animation: calloutFadeIn 0.4s var(--ease-out) forwards;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.slop-callout[data-point="font"] {
top: 15%;
right: 5%;
animation-delay: 0.1s;
}
.slop-callout[data-point="gradient"] {
top: 40%;
left: 5%;
animation-delay: 0.25s;
}
.slop-callout[data-point="copy"] {
bottom: 35%;
right: 8%;
animation-delay: 0.4s;
}
.slop-callout[data-point="rounded"] {
bottom: 12%;
left: 10%;
animation-delay: 0.55s;
}
@keyframes calloutFadeIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* Impeccable Card - With Design Skills */
.impeccable-card {
width: 280px;
height: 280px;
background: var(--color-paper);
border: 1px solid var(--color-mist);
padding: var(--spacing-lg);
text-align: left;
display: flex;
flex-direction: column;
}
.impeccable-eyebrow {
font-family: var(--font-mono);
font-size: 0.625rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--color-accent);
margin-bottom: var(--spacing-xs);
}
.impeccable-title {
font-family: var(--font-display);
font-size: 1.75rem;
font-weight: 300;
font-style: italic;
color: var(--color-ink);
margin-bottom: var(--spacing-sm);
line-height: 1.1;
}
.impeccable-body {
font-size: 0.875rem;
line-height: 1.6;
color: var(--color-ash);
margin-bottom: auto;
flex: 1;
}
.impeccable-button {
display: inline-flex;
padding: 0.625rem 1.5rem;
background: var(--color-ink);
color: var(--color-paper);
border: none;
font-family: var(--font-body);
font-size: 0.8125rem;
font-weight: 500;
letter-spacing: 0.03em;
cursor: pointer;
transition: all var(--duration-base) var(--ease-out);
margin-top: auto;
align-self: flex-start;
}
.impeccable-button:hover {
background: var(--color-accent);
}
/* Lens Labels */
.lens-labels {
display: flex;
justify-content: center;
gap: var(--spacing-lg);
margin-top: var(--spacing-md);
}
.lens-label-item {
display: flex;
align-items: center;
gap: var(--spacing-xs);
font-size: 0.8125rem;
color: var(--color-ash);
}
.lens-label-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--color-mist);
}
.lens-label-dot--accent {
background: var(--color-accent);
}
/* ============================================
SOLUTION SECTION
============================================ */
.solution-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.solution-content {
display: grid;
gap: var(--spacing-xl);
}
/* Two-pillar visual layout */
.solution-visual {
display: grid;
grid-template-columns: 1fr auto 1fr;
gap: var(--spacing-lg);
align-items: stretch;
}
@media (max-width: 900px) {
.solution-visual {
grid-template-columns: 1fr;
gap: var(--spacing-md);
}
}
.solution-pillar {
background: var(--color-cream);
border: 1px solid var(--color-mist);
padding: var(--spacing-lg);
transition: all var(--duration-base) var(--ease-out);
}
.solution-pillar:hover {
border-color: var(--color-accent);
transform: translateY(-4px);
box-shadow: 0 20px 60px var(--color-accent-dim);
}
.pillar-header {
text-align: center;
margin-bottom: var(--spacing-lg);
padding-bottom: var(--spacing-md);
border-bottom: 1px solid var(--color-mist);
}
.pillar-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 56px;
height: 56px;
border-radius: 50%;
background: var(--color-accent-dim);
color: var(--color-accent);
margin-bottom: var(--spacing-sm);
}
.pillar-title {
font-family: var(--font-display);
font-size: 1.75rem;
font-weight: 400;
margin: 0 0 var(--spacing-xs);
}
.pillar-subtitle {
font-size: 0.875rem;
color: var(--color-ash);
margin: 0;
}
.pillar-content {
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.pillar-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--spacing-sm);
background: var(--color-paper);
border-radius: 4px;
transition: all var(--duration-fast) var(--ease-out);
}
.pillar-item:hover {
background: var(--color-accent-dim);
}
.pillar-item-name {
font-weight: 500;
color: var(--color-ink);
font-size: 0.9375rem;
}
.pillar-item-code {
font-family: var(--font-mono);
font-size: 0.875rem;
font-weight: 500;
color: var(--color-accent);
background: transparent;
padding: 0;
}
.pillar-item-desc {
font-size: 0.75rem;
color: var(--color-ash);
}
.pillar-item--more {
justify-content: center;
font-size: 0.8125rem;
font-weight: 500;
color: var(--color-accent);
background: transparent;
border: 1px dashed var(--color-mist);
}
/* Connector between pillars */
.solution-connector {
display: flex;
align-items: center;
justify-content: center;
}
.connector-plus {
font-family: var(--font-display);
font-size: 3rem;
font-weight: 300;
color: var(--color-accent);
opacity: 0.5;
}
@media (max-width: 900px) {
.solution-connector {
padding: var(--spacing-sm) 0;
}
.connector-plus {
font-size: 2rem;
}
}
/* Result statement */
.solution-result {
text-align: center;
padding-top: var(--spacing-lg);
}
.result-arrow {
display: block;
font-size: 2rem;
color: var(--color-accent);
margin-bottom: var(--spacing-sm);
animation: bounce 1.5s ease-in-out infinite;
}
.result-text {
font-size: 1.25rem;
color: var(--color-charcoal);
margin: 0;
}
.result-text em {
font-style: italic;
color: var(--color-accent);
font-weight: 500;
}
/* ============================================
SKILLS SECTION
============================================ */
.skills-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.skills-gallery {
display: grid;
grid-template-columns: 200px 1fr;
gap: var(--spacing-xl);
align-items: start;
}
@media (max-width: 968px) {
.skills-gallery {
grid-template-columns: 1fr;
gap: var(--spacing-lg);
}
}
.skills-nav {
display: flex;
flex-direction: column;
gap: 2px;
position: sticky;
top: var(--spacing-lg);
}
@media (max-width: 968px) {
.skills-nav {
flex-direction: row;
flex-wrap: wrap;
gap: var(--spacing-xs);
position: static;
}
}
.skill-nav-item {
padding: var(--spacing-sm) var(--spacing-md);
background: transparent;
border: none;
border-left: 2px solid transparent;
color: var(--color-ash);
font-family: var(--font-body);
font-size: 0.9375rem;
font-weight: 400;
cursor: pointer;
transition: all 0.2s ease;
text-align: left;
text-decoration: none;
display: block;
}
.skill-nav-item:hover {
color: var(--color-text);
background: var(--color-cream);
}
.skill-nav-item.active {
color: var(--color-accent);
border-left-color: var(--color-accent);
background: var(--color-accent-dim);
font-weight: 500;
}
@media (max-width: 968px) {
.skill-nav-item {
border-left: none;
border-bottom: 2px solid transparent;
padding: var(--spacing-xs) var(--spacing-md);
}
.skill-nav-item.active {
border-bottom-color: var(--color-accent);
}
}
.skills-showcase {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: var(--spacing-lg);
align-items: start;
}
@media (max-width: 1100px) {
.skills-showcase {
grid-template-columns: 1fr;
}
}
.loading-state {
padding: var(--spacing-xl);
text-align: center;
color: var(--color-ash);
font-style: italic;
}
/* ============================================
COMMANDS SECTION
============================================ */
.commands-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.commands-gallery {
display: grid;
grid-template-columns: 200px 1fr;
gap: var(--spacing-xl);
align-items: start;
}
@media (max-width: 968px) {
.commands-gallery {
grid-template-columns: 1fr;
gap: var(--spacing-lg);
}
}
.commands-nav {
display: flex;
flex-direction: column;
gap: 2px;
position: sticky;
top: var(--spacing-lg);
}
@media (max-width: 968px) {
.commands-nav {
flex-direction: row;
flex-wrap: wrap;
gap: var(--spacing-xs);
position: static;
}
}
.commands-showcase {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: var(--spacing-lg);
align-items: start;
}
@media (max-width: 1100px) {
.commands-showcase {
grid-template-columns: 1fr;
}
}
/* ============================================
DOWNLOADS SECTION
============================================ */
.downloads-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.downloads-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: var(--spacing-lg);
}
.download-card {
display: flex;
flex-direction: column;
padding: var(--spacing-lg);
background: var(--color-cream);
border: 1px solid var(--color-mist);
transition: all var(--duration-base) var(--ease-out);
}
.download-card:hover {
border-color: var(--color-accent);
transform: translateY(-4px);
box-shadow: 0 20px 60px var(--color-accent-dim);
}
.download-card-icon {
color: var(--color-accent);
margin-bottom: var(--spacing-md);
}
.download-card-content {
flex: 1;
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.download-card-title {
font-family: var(--font-display);
font-size: 1.5rem;
font-weight: 400;
margin: 0;
}
.download-card-badge {
display: inline-block;
align-self: flex-start;
font-size: 0.625rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 4px 10px;
background: var(--color-accent-dim);
color: var(--color-accent);
border-radius: 4px;
}
.download-card-desc {
font-size: 0.9375rem;
line-height: 1.6;
color: var(--color-ash);
flex: 1;
}
.download-card .btn {
margin-top: var(--spacing-md);
}
/* ============================================
OPEN SOURCE SECTION
============================================ */
.opensource-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
text-align: center;
}
.opensource-content {
max-width: 500px;
margin: 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-md);
}
.opensource-title {
font-size: clamp(2rem, 5vw, 3.5rem);
font-weight: 300;
}
.opensource-desc {
font-size: 1.125rem;
color: var(--color-ash);
line-height: 1.6;
}
/* ============================================
FOOTER
============================================ */
.site-footer {
border-top: 1px solid var(--color-mist);
padding: var(--spacing-xl) var(--spacing-lg);
background: var(--color-cream);
}
.footer-content {
max-width: var(--width-max);
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: var(--spacing-lg);
}
@media (max-width: 768px) {
.footer-content {
flex-direction: column;
text-align: center;
}
}
.footer-brand {
display: flex;
flex-direction: column;
gap: var(--spacing-xs);
}
.footer-logo {
font-family: var(--font-display);
font-size: 1.25rem;
font-weight: 400;
color: var(--color-ink);
}
.footer-tagline {
font-size: 0.875rem;
color: var(--color-ash);
}
.footer-links {
display: flex;
gap: var(--spacing-lg);
flex-wrap: wrap;
}
.footer-links a {
font-size: 0.875rem;
color: var(--color-ash);
transition: color var(--duration-fast) var(--ease-out);
}
.footer-links a:hover {
color: var(--color-accent);
}
/* ============================================
BUTTONS
============================================ */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--spacing-xs);
padding: 1rem 2rem;
font-family: var(--font-body);
font-size: 0.9375rem;
font-weight: 600;
letter-spacing: 0.03em;
border: none;
cursor: pointer;
transition: all var(--duration-base) var(--ease-out);
position: relative;
overflow: hidden;
text-decoration: none;
}
.btn-primary {
background: var(--color-ink);
color: var(--color-paper);
}
.btn-primary::before {
content: '';
position: absolute;
inset: 0;
background: var(--color-accent);
transform: translateY(100%);
transition: transform var(--duration-base) var(--ease-out);
z-index: 0;
}
.btn-primary:hover::before {
transform: translateY(0);
}
.btn-primary:hover {
color: var(--color-paper);
}
.btn-primary span,
.btn-primary svg {
position: relative;
z-index: 1;
}
/* For buttons without span wrapper */
.btn-primary:not(:has(span)) {
position: relative;
z-index: 1;
}
.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);
}
/* ============================================
ANIMATIONS
============================================ */
@keyframes revealUp {
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeIn {
to {
opacity: 1;
}
}
@keyframes float {
0%, 100% { transform: translateX(-50%) translateY(0); }
50% { transform: translateX(-50%) translateY(-8px); }
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(4px); }
}
/* Reveal animation for scroll */
[data-reveal] {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.8s var(--ease-out), transform 0.8s var(--ease-out);
}
[data-reveal].revealed {
opacity: 1;
transform: translateY(0);
}
/* Staggered reveals */
[data-reveal]:nth-child(1) { transition-delay: 0s; }
[data-reveal]:nth-child(2) { transition-delay: 0.1s; }
[data-reveal]:nth-child(3) { transition-delay: 0.2s; }
[data-reveal]:nth-child(4) { transition-delay: 0.3s; }
/* ============================================
IMPORTS
============================================ */
@import "./problem-section.css";
@import "./skill-demos.css";
@import "./gallery.css";
@import "./workflow.css";
/* ============================================
BIAS GRID (Problem Section Enhancement)
============================================ */
.bias-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: var(--spacing-md);
margin-bottom: var(--spacing-xl);
}
.bias-item {
display: flex;
align-items: flex-start;
gap: var(--spacing-sm);
padding: var(--spacing-md);
background: var(--color-cream);
border: 1px solid var(--color-mist);
border-left: 3px solid var(--color-accent);
transition: all var(--duration-fast) var(--ease-out);
}
.bias-item:hover {
border-color: var(--color-accent);
transform: translateX(4px);
}
.bias-icon {
font-size: 1.25rem;
color: var(--color-accent);
font-weight: 300;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.bias-content {
display: flex;
flex-direction: column;
gap: 2px;
}
.bias-content strong {
font-size: 0.9375rem;
font-weight: 600;
color: var(--color-ink);
}
.bias-content span {
font-size: 0.8125rem;
color: var(--color-ash);
}
/* ============================================
ANTIDOTE SECTION
============================================ */
.antidote-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
background: var(--color-cream);
margin-left: calc(-50vw + 50%);
margin-right: calc(-50vw + 50%);
padding-left: calc(50vw - 50% + var(--spacing-lg));
padding-right: calc(50vw - 50% + var(--spacing-lg));
}
.antidote-content {
max-width: var(--width-max);
margin: 0 auto;
}
.antidote-intro {
text-align: center;
margin-bottom: var(--spacing-xl);
}
.antidote-intro p {
font-size: 1.25rem;
color: var(--color-charcoal);
max-width: 50ch;
margin: 0 auto;
}
.antidote-intro strong {
color: var(--color-accent);
font-weight: 600;
}
/* Section titles for patterns/antipatterns */
.patterns-section-title {
font-family: var(--font-display);
font-size: 1.5rem;
font-weight: 400;
color: var(--color-ink);
margin: var(--spacing-lg) 0 var(--spacing-md);
text-align: center;
}
.patterns-section-title::before {
content: '✓ ';
color: var(--color-success, #22c55e);
}
.patterns-section-title--anti::before {
content: '× ';
color: var(--color-accent);
}
/* Patterns grid (what TO do) */
.patterns-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: var(--spacing-lg);
margin-bottom: var(--spacing-xl);
}
.pattern-category {
background: var(--color-paper);
border: 1px solid var(--color-mist);
padding: var(--spacing-lg);
transition: all var(--duration-base) var(--ease-out);
}
.pattern-category:hover {
border-color: var(--color-success, #22c55e);
box-shadow: 0 10px 40px rgba(34, 197, 94, 0.1);
}
.pattern-category-title {
font-family: var(--font-display);
font-size: 1.25rem;
font-weight: 400;
color: var(--color-ink);
margin: 0 0 var(--spacing-md);
padding-bottom: var(--spacing-sm);
border-bottom: 1px solid var(--color-mist);
}
.pattern-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.pattern-list li {
font-size: 0.875rem;
color: var(--color-charcoal);
padding-left: var(--spacing-md);
position: relative;
line-height: 1.5;
}
.pattern-list li::before {
content: '✓';
position: absolute;
left: 0;
color: var(--color-success, #22c55e);
font-weight: 600;
font-size: 0.875rem;
}
/* Anti-patterns grid */
.antipatterns-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: var(--spacing-lg);
margin-bottom: var(--spacing-xl);
}
.antipattern-category {
background: var(--color-paper);
border: 1px solid var(--color-mist);
padding: var(--spacing-lg);
transition: all var(--duration-base) var(--ease-out);
}
.antipattern-category:hover {
border-color: var(--color-accent);
box-shadow: 0 10px 40px var(--color-accent-dim);
}
.antipattern-category-title {
font-family: var(--font-display);
font-size: 1.25rem;
font-weight: 400;
color: var(--color-ink);
margin: 0 0 var(--spacing-md);
padding-bottom: var(--spacing-sm);
border-bottom: 1px solid var(--color-mist);
}
.antipattern-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: var(--spacing-sm);
}
.antipattern-list li {
font-size: 0.875rem;
color: var(--color-charcoal);
padding-left: var(--spacing-md);
position: relative;
line-height: 1.5;
}
.antipattern-list li::before {
content: '×';
position: absolute;
left: 0;
color: var(--color-accent);
font-weight: 600;
font-size: 1rem;
}
/* Antidote CTA */
.antidote-cta {
text-align: center;
padding-top: var(--spacing-lg);
border-top: 1px solid var(--color-mist);
}
.antidote-cta p {
font-size: 1.125rem;
color: var(--color-charcoal);
max-width: 50ch;
margin: 0 auto;
font-style: italic;
}
/* ============================================
SOLUTION SECTION ENHANCEMENTS
============================================ */
/* Main skill item styling */
.pillar-item--main {
background: var(--color-accent-dim);
border: 1px solid var(--color-accent);
}
.pillar-item--main .pillar-item-name {
font-size: 1.125rem;
font-weight: 600;
color: var(--color-accent);
}
.pillar-item--ref {
background: transparent;
padding: var(--spacing-xs) var(--spacing-sm);
}
.pillar-item-label {
font-size: 0.75rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--color-ash);
}
/* Reference domain tags */
.pillar-refs {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-xs);
padding: 0 var(--spacing-sm);
}
.pillar-ref {
font-size: 0.6875rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.03em;
padding: 4px 10px;
background: var(--color-paper);
color: var(--color-ash);
border: 1px solid var(--color-mist);
border-radius: 3px;
transition: all var(--duration-fast) var(--ease-out);
}
.pillar-ref:hover {
border-color: var(--color-accent);
color: var(--color-accent);
}
/* Command groups */
.pillar-command-group {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--spacing-xs);
padding: var(--spacing-sm);
background: var(--color-paper);
border-radius: 4px;
}
.pillar-group-label {
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--color-ash);
width: 100%;
margin-bottom: 4px;
}
.pillar-command-group .pillar-item-code {
font-size: 0.8125rem;
padding: 4px 8px;
background: var(--color-accent-dim);
border-radius: 3px;
}
/* ============================================
PLATFORMS SECTION (alias for downloads)
============================================ */
.platforms-section {
padding: var(--spacing-2xl) 0;
border-top: 1px solid var(--color-mist);
}
.platforms-section .section-subtitle {
max-width: 60ch;
}