/* Typeography */ :root { --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; --min-vw: 360; --max-vw: 800; --line-height: calc(2px + 2ex + 2px); /* Vertical Spacing */ --vs-s: 0.5rem; --vs-base: 1rem; --vs-m: 1.5rem; --vs-l: 2rem; --vs-xl: 4rem; /* Border Radius */ --br-xs: 2px; --br-s: 4px; --br-m: 8px; --br-l: 16px; /* Padding */ --pad-xs: 2px; --pad-s: 6px; --pad-m: 12px; --pad-l: 25px; /* Shadows - Layered, adaptive shadows with light/dark mode support */ --shadow-1: 0 1px 2px rgb(0 0 0 / 0.04); --shadow-2: 0 1px 3px rgb(0 0 0 / 0.06); --shadow-3: 0 2px 4px rgb(0 0 0 / 0.05), 0 4px 8px rgb(0 0 0 / 0.1); --shadow-4: 0 4px 8px rgb(0 0 0 / 0.06), 0 8px 16px rgb(0 0 0 / 0.12); --shadow-5: 0 8px 16px rgb(0 0 0 / 0.08), 0 12px 24px rgb(0 0 0 / 0.14); --shadow-6: 0 12px 24px rgb(0 0 0 / 0.1), 0 16px 32px rgb(0 0 0 / 0.16), 0 24px 48px rgb(0 0 0 / 0.18); --box: 0 1px 2px rgb(0 0 0 / 0.04), inset -1px 1px 2px rgb(255 255 255 / 0.1), inset 1px 1px 2px rgb(255 255 255 / 0.1); /* Color System - OKLCH with 1-9 scales */ /* Base colors (scale 5) */ --yellow: oklch(0.88 0.15 95); --orange: oklch(0.75 0.18 65); --red: oklch(0.62 0.22 35); --pink: oklch(0.62 0.25 350); --green: oklch(0.72 0.18 165); --teal: oklch(0.82 0.08 185); --blue: oklch(0.5 0.28 270); /* Yellow scale */ --yellow-1: oklch(from var(--yellow) l c h / 0.1); --yellow-2: oklch(from var(--yellow) l c h / 0.2); --yellow-3: oklch(from var(--yellow) l c h / 0.3); --yellow-4: oklch(from var(--yellow) l c h / 0.4); --yellow-5: oklch(from var(--yellow) l c h / 0.5); --yellow-6: oklch(from var(--yellow) l c h / 0.6); --yellow-7: oklch(from var(--yellow) l c h / 0.75); --yellow-8: oklch(from var(--yellow) l c h / 0.9); --yellow-9: var(--yellow); /* Orange scale */ --orange-1: oklch(from var(--orange) l c h / 0.1); --orange-2: oklch(from var(--orange) l c h / 0.2); --orange-3: oklch(from var(--orange) l c h / 0.3); --orange-4: oklch(from var(--orange) l c h / 0.4); --orange-5: oklch(from var(--orange) l c h / 0.5); --orange-6: oklch(from var(--orange) l c h / 0.6); --orange-7: oklch(from var(--orange) l c h / 0.75); --orange-8: oklch(from var(--orange) l c h / 0.9); --orange-9: var(--orange); /* Red scale */ --red-1: oklch(from var(--red) l c h / 0.1); --red-2: oklch(from var(--red) l c h / 0.2); --red-3: oklch(from var(--red) l c h / 0.3); --red-4: oklch(from var(--red) l c h / 0.4); --red-5: oklch(from var(--red) l c h / 0.5); --red-6: oklch(from var(--red) l c h / 0.6); --red-7: oklch(from var(--red) l c h / 0.75); --red-8: oklch(from var(--red) l c h / 0.9); --red-9: var(--red); /* Pink scale */ --pink-1: oklch(from var(--pink) l c h / 0.1); --pink-2: oklch(from var(--pink) l c h / 0.2); --pink-3: oklch(from var(--pink) l c h / 0.3); --pink-4: oklch(from var(--pink) l c h / 0.4); --pink-5: oklch(from var(--pink) l c h / 0.5); --pink-6: oklch(from var(--pink) l c h / 0.6); --pink-7: oklch(from var(--pink) l c h / 0.75); --pink-8: oklch(from var(--pink) l c h / 0.9); --pink-9: var(--pink); /* Green scale */ --green-1: oklch(from var(--green) l c h / 0.1); --green-2: oklch(from var(--green) l c h / 0.2); --green-3: oklch(from var(--green) l c h / 0.3); --green-4: oklch(from var(--green) l c h / 0.4); --green-5: oklch(from var(--green) l c h / 0.5); --green-6: oklch(from var(--green) l c h / 0.6); --green-7: oklch(from var(--green) l c h / 0.75); --green-8: oklch(from var(--green) l c h / 0.9); --green-9: var(--green); /* Teal scale */ --teal-1: oklch(from var(--teal) l c h / 0.1); --teal-2: oklch(from var(--teal) l c h / 0.2); --teal-3: oklch(from var(--teal) l c h / 0.3); --teal-4: oklch(from var(--teal) l c h / 0.4); --teal-5: oklch(from var(--teal) l c h / 0.5); --teal-6: oklch(from var(--teal) l c h / 0.6); --teal-7: oklch(from var(--teal) l c h / 0.75); --teal-8: oklch(from var(--teal) l c h / 0.9); --teal-9: var(--teal); /* Blue scale */ --blue-1: oklch(from var(--blue) l c h / 0.1); --blue-2: oklch(from var(--blue) l c h / 0.2); --blue-3: oklch(from var(--blue) l c h / 0.3); --blue-4: oklch(from var(--blue) l c h / 0.4); --blue-5: oklch(from var(--blue) l c h / 0.5); --blue-6: oklch(from var(--blue) l c h / 0.6); --blue-7: oklch(from var(--blue) l c h / 0.75); --blue-8: oklch(from var(--blue) l c h / 0.9); --blue-9: var(--blue); /* Neutral gray scale */ --gray: oklch(0.5 0.02 270); --gray-1: oklch(from var(--gray) l c h / 0.1); --gray-2: oklch(from var(--gray) l c h / 0.2); --gray-3: oklch(from var(--gray) l c h / 0.3); --gray-4: oklch(from var(--gray) l c h / 0.4); --gray-5: oklch(from var(--gray) l c h / 0.5); --gray-6: oklch(from var(--gray) l c h / 0.6); --gray-7: oklch(from var(--gray) l c h / 0.75); --gray-8: oklch(from var(--gray) l c h / 0.9); --gray-9: var(--gray); --fg: light-dark(#000, #fff); --bg: light-dark(#fff, #000); --tint-or-shade: color-mix(in oklab, var(--fg), transparent 95%); --tint-or-shade-harder: color-mix(in oklab, var(--fg), transparent 90%); /* Fluid Type */ --font-size-min: 14; --font-size-max: 18; --font-ratio-min: 1.2; --font-ratio-max: 1.33; --font-width-min: 320; --font-width-max: 1500; /* Line Height Tokens */ --lh-tight: 1.2; --lh-normal: 1.5; --lh-loose: 1.8; /* Easing Tokens - Using linear() for modern, natural motion */ --ease-smooth: linear( 0, 0.0039, 0.0157, 0.0352, 0.0625 9.09%, 0.1407, 0.25, 0.3908, 0.5625, 0.7654, 1 ); --ease-bounce: linear( 0, 0.004, 0.016, 0.035, 0.063, 0.098, 0.141, 0.191, 0.25, 0.316, 0.391 36.36%, 0.563, 0.766, 1 54.55%, 0.946, 0.908 72.73%, 0.953, 1, 0.994, 0.998, 1 ); --ease-emphasized: linear( 0, 0.0038, 0.0155, 0.0352, 0.0625 9%, 0.1407, 0.25 18%, 0.5625 36%, 0.7655 45%, 1 ); color-scheme: light dark; } html { box-sizing: border-box; } html, body, body > .body-fill { height: 100%; margin: 0; } body > .body-fill { display: flex; flex-direction: column; } main { flex: 1; } header, main, footer { width: 100%; } *, *::before, *::after { box-sizing: inherit; } body { font-family: var(--font-sans); line-height: 1.5; margin: 0; min-height: 100vh; } body, h1, h2, h3, h4, h5, h6, p, li, .fluid, textarea, input, select, button, th, td { /* Fluid Typography System * * This system creates responsive font sizes that scale smoothly between viewport sizes. * Set --fl (fluid level) on any element to control its size (-1 to 6). * * How it works: * 1. Calculate min/max font sizes using pow() with modular scale ratios * 2. Find the rate of change (slope) between min and max * 3. Use clamp() to create a fluid value that scales with viewport/container width * * Formula breakdown: * - --fluid-min: Minimum font size = base * ratio^level * - --fluid-max: Maximum font size = base * ratio^level * - --fluid-preferred: Slope of linear interpolation * - --fluid-type: clamp(min, min + slope * viewport, max) */ --fluid-min: calc( var(--font-size-min) * pow(var(--font-ratio-min), var(--fl, 0)) ); --fluid-max: calc( var(--font-size-max) * pow(var(--font-ratio-max), var(--fl, 0)) ); --fluid-preferred: calc( (var(--fluid-max) - var(--fluid-min)) / (var(--font-width-max) - var(--font-width-min)) ); --fluid-type: clamp( (var(--fluid-min) / 16) * 1rem, ((var(--fluid-min) / 16) * 1rem) - (((var(--fluid-preferred) * var(--font-width-min)) / 16) * 1rem) + (var(--fluid-preferred) * var(--variable-unit, 100vi)), (var(--fluid-max) / 16) * 1rem ); font-size: var(--fluid-type); margin-block: 0 var(--vs-base); } /* This makes containers, with container queries use a cqi unit instead of vi */ /* FC Fluid Container */ .fluid-text-container, .fc { container-type: inline-size; --variable-unit: 100cqi; } h1, .h1 { margin-block: 0 var(--vs-base); --fl: 5; } h2, .h2 { --fl: 4; } h3, .h3 { --fl: 3; } h4, .h4 { --fl: 2; } h5, .h5 { --fl: 1; } h6, .h6 { --fl: 0; } p, li, body, input, textarea, select { --fl: 0; } .fs-xs { --fl: -1; } .fs-base { --fl: 0; } .fs-s { --fl: 1; } .fs-m { --fl: 2; } .fs-l { --fl: 3; } .fs-xl { --fl: 4; } .fs-xxl { --fl: 5; } .fs-xxxl { --fl: 6; } img, picture, video, canvas, svg { display: block; max-width: 100%; } input, button, textarea, select { font: inherit; margin: 0; } button, .button { cursor: pointer; background: var(--bg); color: var(--fg); border: solid 1px var(--tint-or-shade); border-radius: var(--br-s); padding: var(--pad-m) var(--pad-l); text-decoration: none; &:hover { background: var(--tint-or-shade); } &:active { background: var(--tint-or-shade-harder); } &:disabled { opacity: 0.5; cursor: not-allowed; } &:focus-visible { outline: 2px solid var(--fg); outline-offset: 2px; } } a { &:hover { opacity: 0.8; } &:active { opacity: 0.6; } &:focus-visible { outline: 2px solid var(--fg); outline-offset: 2px; } } input, textarea, select { &:focus-visible { outline: 2px solid var(--fg); outline-offset: 2px; } &[aria-invalid="true"], &.error { border-color: var(--red-6); &:focus-visible { outline-color: var(--red-6); } } &.success { border-color: var(--green-6); &:focus-visible { outline-color: var(--green-6); } } &.warning { border-color: var(--yellow-7); &:focus-visible { outline-color: var(--yellow-7); } } } label { display: block; --fl: -1; } /* UTILITIES */ .readable { max-width: 900px; width: 100%; } .flex { display: flex; gap: 20px; } .grid { display: grid; gap: var(--gap, 1rem); } .split { display: flex; gap: 20px; align-items: start; justify-content: space-between; } .visually-hidden { position: absolute; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); height: 1px; width: 1px; margin: -1px; padding: 0px; border: 0px; } .no-list { list-style: none; margin: 0; padding: 0; li { margin: 0; padding: 0; } } .row { margin-block: var(--vs-m); } .circle { --size: 40px; border-radius: var(--size); padding: 0; width: var(--size); height: var(--size); } /* Aspect Ratio Utilities */ .aspect-square { aspect-ratio: 1 / 1; } .aspect-video { aspect-ratio: 16 / 9; } .aspect-4-3 { aspect-ratio: 4 / 3; } .aspect-21-9 { aspect-ratio: 21 / 9; } .aspect-custom { aspect-ratio: var(--aspect, 1 / 1); } /* END UTILITIES */ /* LAYOUTS */ /* Card Grid Layout - Auto-fill responsive card grid */ .layout-card { display: grid; grid-template-columns: repeat( auto-fill, minmax(var(--layout-min-card-width, var(--min-card-width, 290px)), 1fr) ); gap: var(--layout-gap, var(--gap, 2rem)); } /* Sidebar Layout - Sidebar + main content area */ .layout-sidebar { display: grid; grid-template-columns: 250px 1fr; gap: var(--layout-gap, var(--gap, 2rem)); align-items: start; } .layout-sidebar.narrow { grid-template-columns: 150px 1fr; } .layout-sidebar.wide { grid-template-columns: 350px 1fr; } .layout-sidebar.invert { grid-template-columns: 1fr 250px; } .layout-sidebar.invert.narrow { grid-template-columns: 1fr 150px; } .layout-sidebar.invert.wide { grid-template-columns: 1fr 350px; } @media (width < 768px) { .layout-sidebar, .layout-sidebar.narrow, .layout-sidebar.wide, .layout-sidebar.invert, .layout-sidebar.invert.narrow, .layout-sidebar.invert.wide { grid-template-columns: 1fr; } } /* Split Layout - 50/50 two column layout */ .layout-split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--layout-gap, var(--gap, 2rem)); align-items: start; } @media (width < 768px) { .layout-split { grid-template-columns: 1fr; } .layout-split.no-stack { grid-template-columns: 1fr 1fr; } } /* Three Column Layout - Three equal columns */ .layout-three-col { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--layout-gap, var(--gap, 2rem)); align-items: start; } @media (width < 1024px) { .layout-three-col { grid-template-columns: 1fr 1fr; } } @media (width < 768px) { .layout-three-col { grid-template-columns: 1fr; } } /* Readable Layout - Max-width for optimal readability */ .layout-readable { width: 100%; max-width: var(--layout-max-width, var(--max-width, 1200px)); padding-inline: var(--layout-padding, var(--padding, 2rem)); } .layout-readable.center { margin-inline: auto; } .layout-readable.end { margin-inline-start: auto; } .layout-holy-grail { display: grid; grid-template-columns: auto 1fr auto; gap: var(--layout-gap, var(--gap, 2rem)); } /* Full Bleed - Break out of readable container */ .layout-readable .full-bleed { width: 100vi; margin-inline: calc(50% - 50vi); } /* Stack Layout - Vertical flexbox stack */ .stack { display: flex; flex-direction: column; justify-content: flex-start; gap: var(--layout-gap, var(--gap, 1rem)); } :is(.stack) > * { margin-block: 0; margin-inline: 0; } /* Cluster Layout - Horizontal wrapping list with gap */ .layout-cluster { display: flex; flex-wrap: wrap; gap: var(--layout-gap, var(--gap, 1rem)); align-items: center; } /* Carousel Layout - Horizontal scroll with scroll snap */ .layout-carousel { display: flex; gap: var(--layout-gap, var(--gap, 1rem)); overflow-x: auto; scroll-snap-type: x mandatory; scroll-padding-inline: var(--layout-padding, var(--padding, 1rem)); scrollbar-width: thin; > * { scroll-snap-align: start; flex-shrink: 0; } } /* Reel Layout - Vertical scroll with scroll snap */ .layout-reel { display: flex; flex-direction: column; gap: var(--layout-gap, var(--gap, 1rem)); overflow-y: auto; scroll-snap-type: y mandatory; scroll-padding-block: var(--layout-padding, var(--padding, 1rem)); scrollbar-width: thin; max-height: var(--reel-height, 80vh); > * { scroll-snap-align: start; flex-shrink: 0; } } :where(h1, h2, h3, h4, h5, h6) { view-transition-name: var(--transition-name); } /* END LAYOUTS */ /* Dark mode shadow overrides - Deeper, more intense shadows */ @media (prefers-color-scheme: dark) { :root { --shadow-1: 0 1px 2px rgb(0 0 0 / 0.5), 0 2px 4px rgb(0 0 0 / 0.3); --shadow-2: 0 2px 4px rgb(0 0 0 / 0.6), 0 4px 8px rgb(0 0 0 / 0.4); --shadow-3: 0 4px 8px rgb(0 0 0 / 0.65), 0 8px 16px rgb(0 0 0 / 0.45), 0 2px 4px rgb(0 0 0 / 0.3); --shadow-4: 0 6px 12px rgb(0 0 0 / 0.7), 0 12px 24px rgb(0 0 0 / 0.5), 0 3px 6px rgb(0 0 0 / 0.35); --shadow-5: 0 10px 20px rgb(0 0 0 / 0.75), 0 16px 32px rgb(0 0 0 / 0.55), 0 4px 8px rgb(0 0 0 / 0.4); --shadow-6: 0 16px 32px rgb(0 0 0 / 0.8), 0 24px 48px rgb(0 0 0 / 0.6), 0 32px 64px rgb(0 0 0 / 0.5), 0 6px 12px rgb(0 0 0 / 0.45); } } .box-1 { background: var(--tint-or-shade); padding: 1rem; border-radius: var(--br-s); box-shadow: var(--box); } .box-2 { background: var(--tint-or-shade); padding: 1rem; border-radius: var(--br-s); box-shadow: var(--box), var(--shadow-5); background: linear-gradient( 180deg, var(--tint-or-shade) 0%, var(--tint-or-shade-harder) 100% ); }