/* ================================================================= SHILOH WEBSITE — CSS FRAMEWORK ----------------------------------------------------------------- Sections: 1. Design Tokens 2. Reset & Base 3. Typography 4. Layout Primitives 5. Backgrounds (video / image / solid) 6. Buttons 7. Navigation 8. Links & Text Utilities 9. Floating Components (message icon, back-to-top, theme toggle, streak) 10. Footer 11. Scroll Reveal & Cursor Glow 12. Hero Interactives (stack picker) 13. Stat Counters 14. Comparison Cards (big tech vs Shiloh, hosting plans) 15. Tech Stack Constellation 16. Creed Match Quiz 17. Hero Thesis & What We Believe 18. Projects Grid 19. (reserved) 20. Streak Badge & Confetti 21. Themes (day / night / sabbath) 22. Responsive Breakpoints (mobile-first) 23. Reduced Motion / Accessibility ================================================================= */ /* ----------------------------------------------------------------- 1. DESIGN TOKENS ----------------------------------------------------------------- */ :root { /* Color palette — green-based monochrome */ --color-bg: #579c8b; --color-bg-2: #43786b; --color-surface-1: #3a5952; --color-surface-2: #1f302b; --color-surface-3: #15201d; --color-text: #f1f7f3; --color-heading: #ffffff; --color-accent: #7cf2a0; --color-accent-rgb: 124, 242, 160; --color-button-bg: #7cf2a0; --color-button-text: #0d1a18; --color-button-border:#7cf2a0; --color-back-to-top: #43786b; --color-overlay: rgba(0, 0, 0, 0); --color-warn: #e8d27a; --color-warn-rgb: 232, 210, 122; --color-good: #9be8a8; --color-good-rgb: 155, 232, 168; --color-bad: #d98a8a; --color-bad-rgb: 217, 138, 138; /* Typography */ --font-sans: "FiraCode", Arial, Helvetica, sans-serif; --font-display: Inter, "FiraCode", Arial, sans-serif; --fs-h1: clamp(2rem, 1rem + 4vw, 4rem); --fs-h2: clamp(1.75rem, 1rem + 3vw, 3.25rem); --fs-h3: clamp(1.25rem, 1rem + 1.5vw, 2rem); --fs-body: clamp(1rem, 0.95rem + 0.25vw, 1.125rem); --fw-light: 100; --fw-normal: 400; --fw-button: 200; --lh-base: 1.6; --lh-tight: 1.1; /* Spacing scale */ --space-xs: 0.5rem; --space-sm: 1rem; --space-md: 2rem; --space-lg: 4rem; --space-xl: 6rem; --space-section: clamp(3rem, 8vh, 6rem); /* Radii */ --radius-sm: 5px; --radius-md: 10px; --radius-lg: 18px; --radius-full: 50%; /* Transitions */ --transition-fast: 0.2s ease; --transition-base: 0.3s ease; --transition-slow: 0.5s ease; /* Layout */ --content-max: 1000px; --nav-height: 64px; /* Breakpoints (reference only — not usable inside media queries) --bp-tablet: 768px --bp-desktop: 960px --bp-large: 1200px */ } @font-face { font-family: "FiraCode"; src: url("/assets/FiraCode-VariableFont_wght.ttf") format("truetype"); font-display: swap; } /* ----------------------------------------------------------------- 2. RESET & BASE ----------------------------------------------------------------- */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } body { background: var(--color-bg); color: var(--color-text); font-family: var(--font-sans); font-size: var(--fs-body); line-height: var(--lh-base); min-height: 100vh; overflow-x: hidden; transition: background-color var(--transition-slow), color var(--transition-slow); } img { max-width: 100%; height: auto; display: block; } video { max-width: 100%; height: auto; } a { color: var(--color-heading); text-decoration: none; transition: color var(--transition-slow); } ul, ol { list-style: none; } /* ----------------------------------------------------------------- 3. TYPOGRAPHY ----------------------------------------------------------------- */ h1, h2, h3, h4 { color: var(--color-heading); font-weight: var(--fw-light); line-height: var(--lh-tight); text-align: center; position: relative; z-index: 1; } h1, h2 { font-size: var(--fs-h1); } h3, h4 { font-size: var(--fs-h3); } .header-large { font-size: var(--fs-h1); } p, ul, ol, td, li, cite { word-break: normal; color: var(--color-text); text-align: left; max-width: var(--content-max); width: 100%; } .break-all { word-break: break-all; } /* ----------------------------------------------------------------- 4. LAYOUT PRIMITIVES ----------------------------------------------------------------- */ main { flex: 1; display: flex; flex-wrap: wrap; justify-content: space-around; align-items: flex-start; } .flex-column { flex: 1 1 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; color: var(--color-text); padding: var(--space-section) var(--space-md); min-height: 80svh; width: 100%; } .flex-row { flex: 1 1 100%; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-evenly; align-items: center; gap: var(--space-md); margin: var(--space-xs); text-align: center; border-radius: var(--radius-sm); } .flex-row-items { flex: 1 1 auto; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-evenly; align-items: center; gap: var(--space-lg); margin: var(--space-xs); text-align: center; border-radius: var(--radius-sm); } .flex-container { flex: 1 1 0; display: flex; flex-direction: column; flex-wrap: wrap; justify-content: space-evenly; align-items: center; gap: var(--space-sm); margin: var(--space-xs); padding: var(--space-md); } .flex-container-left { flex: 1 1 0; display: flex; flex-direction: column; flex-wrap: wrap; justify-content: space-evenly; align-items: flex-start; gap: var(--space-sm); margin: var(--space-xs); padding: var(--space-md); } .flex-container-left img { margin: auto; } /* --- Logo sizing ----------------------------------------------- Most logo PNGs are ~400-500px wide. `width: 100%` in HTML stretches them to 1000+px on desktop, causing visible pixelation. These rules let the logo scale DOWN responsively but cap it at a sensible per-logo max-width based on the source resolution. */ .flex img { display: block; max-width: 100%; height: auto; } .flex > img, .flex > div > img { width: auto; max-width: min(100%, var(--logo-max-w, 360px)); height: auto; } img.logo-echo { --logo-max-w: 460px; } img.logo-hosting { --logo-max-w: 400px; } img.logo-client { --logo-max-w: 240px; } img.logo-tall { --logo-max-w: 180px; } @media (max-width: 480px) { .flex > img, .flex > div > img { max-width: min(100%, var(--logo-max-w, 240px)); } } .trust-list { list-style: none; padding: 0; margin: var(--space-sm) 0; display: flex; flex-direction: column; gap: var(--space-xs); text-align: center; } .trust-list li { position: relative; padding-left: 1.5em; color: var(--color-text); } .trust-list li::before { content: "✓"; position: absolute; left: 0; color: var(--color-accent); font-weight: var(--fw-normal); } /* Client logo strip on /solutions */ .client-logos { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--space-md); margin: var(--space-sm) 0 var(--space-md); width: 100%; } .client-logos img.logo-client { max-width: min(100%, var(--logo-max-w, 240px)); flex: 0 1 auto; height: auto; } .seo-intro { max-width: var(--content-max); margin: 0 auto; padding: var(--space-lg) var(--space-md); color: var(--color-text); line-height: var(--lh-base); } .seo-intro h2 { font-size: var(--fs-h2); color: var(--color-heading); margin-bottom: var(--space-md); line-height: var(--lh-tight); } .seo-intro h3 { font-size: var(--fs-h3); color: var(--color-heading); margin: var(--space-md) 0 var(--space-sm); } .seo-intro p { margin-bottom: var(--space-sm); font-size: var(--fs-body); } .seo-intro ul { list-style: disc; padding-left: 1.5em; margin: var(--space-sm) 0; } .seo-intro li { margin-bottom: var(--space-xs); } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .flex { display: flex; flex-direction: column; align-items: center; gap: var(--space-sm); z-index: 1; } /* ----------------------------------------------------------------- 5. BACKGROUNDS ----------------------------------------------------------------- */ .bg-vid { position: relative; background-color: var(--color-bg-2); color: var(--color-text); } /* Even-indexed video sections alternate to a slightly different green so the page reads as distinct panels. */ .bg-vid:nth-of-type(even) { background-color: var(--color-surface-1); color: var(--color-text); } /* Sections without bg-vid get the page background via the body. */ .bg-img { background: url("/assets/last_hour_hosting_logo_blue.png") center/cover no-repeat; height: clamp(200px, 40vw, 300px); color: var(--color-heading); text-align: center; padding: var(--space-md); border-radius: var(--radius-sm); } .bg-one { border-radius: var(--radius-sm); background-color: var(--color-surface-1); transition: box-shadow var(--transition-fast); } .bg-two { border-radius: var(--radius-sm); background-color: var(--color-surface-2); transition: box-shadow var(--transition-fast); } /* ----------------------------------------------------------------- 6. BUTTONS ----------------------------------------------------------------- */ .button-1, .button-2 { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; height: fit-content; padding: var(--space-xs) clamp(1.5rem, 5vw, 5rem); border-radius: var(--radius-sm); font-family: var(--font-display); font-size: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); font-weight: var(--fw-button); line-height: 1; margin: var(--space-sm); white-space: nowrap; text-align: center; text-decoration: none; cursor: pointer; user-select: none; touch-action: manipulation; position: relative; z-index: 1; transition: background var(--transition-base), color var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base), transform var(--transition-fast); } .button-1 { background: var(--color-button-bg); color: var(--color-button-text); border: 2px solid var(--color-button-border); } .button-1:hover, .button-1:focus-visible { background: transparent; color: var(--color-button-bg); border-color: var(--color-button-bg); box-shadow: 0 6px 22px rgba(var(--color-accent-rgb), 0.35); transform: translateY(-2px); } .button-2 { background: transparent; color: var(--color-heading); border: 2px solid transparent; } .button-2:hover, .button-2:focus-visible { color: var(--color-accent); transform: translateY(-2px); } /* ----------------------------------------------------------------- 7. NAVIGATION ----------------------------------------------------------------- */ header { position: sticky; top: 0; display: flex; justify-content: space-between; align-items: center; width: 100%; z-index: 10; background: var(--color-bg); transition: background-color var(--transition-slow); } .nav-bar { display: flex; width: 100%; justify-content: space-between; align-items: center; gap: var(--space-md); padding: var(--space-sm); background: var(--color-bg); transition: background-color var(--transition-slow); } .logo { display: flex; justify-content: center; align-items: center; color: var(--color-heading); position: relative; } .logo img { width: auto; height: auto; max-height: 40px; transition: transform var(--transition-fast); } .logo:hover img { transform: scale(1.04); } .logo-tagline { position: absolute; top: 100%; left: 50%; transform: translateX(-50%) translateY(2px); font-size: 0.75rem; font-family: var(--font-sans); color: var(--color-accent); background: var(--color-surface-2); padding: 0.25rem 0.6rem; border-radius: var(--radius-sm); white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity var(--transition-fast), transform var(--transition-fast); z-index: 12; margin-top: 6px; } .logo:hover .logo-tagline, .logo:focus-within .logo-tagline { opacity: 1; transform: translateX(-50%) translateY(0); } .menu { display: flex; align-items: center; gap: var(--space-sm); } .menu-item { font-size: 1.125rem; position: relative; color: var(--color-heading); cursor: pointer; transition: color var(--transition-fast); } .menu-item::before { content: ""; position: absolute; left: 0; bottom: -2px; width: 0; height: 1px; background-color: var(--color-heading); transition: width var(--transition-fast); z-index: 1; } .menu-item:hover::before { width: 100%; } .mobile-menu-icon { display: none; } /* ----------------------------------------------------------------- 8. LINKS & TEXT UTILITIES ----------------------------------------------------------------- */ .page-link { color: var(--color-heading); text-align: left; margin: 0 auto; padding: 0; transition: color var(--transition-slow); } .page-link:hover { color: var(--color-accent); } /* ----------------------------------------------------------------- 9. FLOATING COMPONENTS ----------------------------------------------------------------- */ .message-icon-container { position: fixed; bottom: var(--space-md); right: var(--space-md); display: flex; align-items: center; justify-content: center; width: 50px; height: 50px; background-color: var(--color-bg); color: var(--color-heading); border-radius: var(--radius-full); cursor: pointer; z-index: 20; transition: width var(--transition-fast), height var(--transition-fast), background-color var(--transition-slow); } .message-icon-container:hover { width: 55px; height: 55px; } #back-to-top { position: fixed; bottom: -40px; left: var(--space-md); background-color: var(--color-back-to-top); color: var(--color-heading); border: none; padding: var(--space-xs) var(--space-sm); border-radius: var(--radius-md); cursor: pointer; opacity: 0; z-index: 20; transition: bottom var(--transition-base), opacity var(--transition-base); } #back-to-top.show { bottom: var(--space-lg); opacity: 1; } /* Theme toggle (Day / Night / Sabbath) */ .theme-toggle { position: fixed; bottom: var(--space-md); right: calc(var(--space-md) + 60px); display: flex; align-items: center; gap: 4px; padding: 4px; background: var(--color-surface-2); border-radius: var(--radius-md); z-index: 20; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25); } .theme-toggle button { background: transparent; border: 0; color: var(--color-text); font-family: var(--font-sans); font-size: 0.85rem; padding: 6px 10px; border-radius: var(--radius-sm); cursor: pointer; transition: background var(--transition-fast), color var(--transition-fast); } .theme-toggle button:hover { color: var(--color-accent); } .theme-toggle button[aria-pressed="true"] { background: var(--color-accent); color: var(--color-button-text); } /* Touch-grass streak badge */ .streak-badge { position: fixed; top: calc(var(--nav-height) + var(--space-sm)); right: var(--space-sm); display: none; align-items: center; gap: 6px; padding: 6px 10px; background: var(--color-surface-1); color: var(--color-heading); font-family: var(--font-sans); font-size: 0.8rem; border-radius: var(--radius-md); z-index: 15; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); border: 1px solid var(--color-accent); } .streak-badge.visible { display: inline-flex; } .streak-badge .leaf { font-size: 1rem; } /* ----------------------------------------------------------------- 10. FOOTER ----------------------------------------------------------------- */ footer { color: var(--color-text); background-color: var(--color-bg); text-align: center; padding: var(--space-md); flex: 1; display: flex; flex-wrap: wrap; justify-content: space-evenly; gap: var(--space-md); transition: background-color var(--transition-slow); } /* ----------------------------------------------------------------- 11. SCROLL REVEAL & CURSOR GLOW ----------------------------------------------------------------- */ /* Sections start hidden & shifted; JS adds .is-visible on intersect. */ .reveal { opacity: 0; transform: translateY(24px); transition: opacity 0.7s ease, transform 0.7s ease; will-change: opacity, transform; } .reveal.is-visible { opacity: 1; transform: translateY(0); } /* Cursor glow inside the hero */ .cursor-glow { position: absolute; inset: 0; pointer-events: none; z-index: 0; background: radial-gradient( 360px circle at var(--mx, 50%) var(--my, 50%), rgba(var(--color-accent-rgb), 0.18), transparent 60% ); transition: opacity var(--transition-base); } .cursor-glow ~ .flex { position: relative; z-index: 1; } @media (hover: none) { .cursor-glow { display: none; } } /* ----------------------------------------------------------------- 12. HERO INTERACTIVES (stack picker) ----------------------------------------------------------------- */ /* Stack picker mini-game */ .stack-picker { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-sm); margin: var(--space-md) 0 var(--space-sm); width: 100%; max-width: 720px; } .stack-card { flex: 1 1 180px; max-width: 220px; background: var(--color-surface-1); color: var(--color-heading); border: 2px solid transparent; border-radius: var(--radius-md); padding: var(--space-md) var(--space-sm); cursor: pointer; text-align: center; font-family: var(--font-sans); transition: transform var(--transition-fast), border-color var(--transition-base), background var(--transition-base), box-shadow var(--transition-base); } .stack-card:hover { transform: translateY(-3px); border-color: var(--color-accent); box-shadow: 0 6px 18px rgba(var(--color-accent-rgb), 0.2); } .stack-card.selected { border-color: var(--color-accent); background: var(--color-surface-2); box-shadow: 0 0 0 2px var(--color-accent) inset; } .stack-card .icon { font-size: 1.8rem; display: block; margin-bottom: var(--space-xs); } .stack-card .label { font-weight: 600; font-size: 1.05rem; display: block; } .stack-card .blurb { display: block; font-size: 0.85rem; color: var(--color-text); margin-top: 0.4rem; opacity: 0.85; } .stack-result { display: none; margin-top: var(--space-sm); padding: var(--space-sm) var(--space-md); background: var(--color-surface-1); border-radius: var(--radius-md); border: 1px solid var(--color-accent); text-align: center; max-width: 720px; } .stack-result.visible { display: block; animation: rise 0.4s ease; } .stack-result strong { color: var(--color-accent); } @keyframes rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* ----------------------------------------------------------------- 13. STAT COUNTERS ----------------------------------------------------------------- */ .stat-grid { display: flex; flex-wrap: wrap; justify-content: center; align-items: stretch; gap: var(--space-md); margin: var(--space-md) auto; max-width: var(--content-max); width: 100%; } .stat-card { flex: 1 1 200px; min-width: 200px; background: var(--color-surface-1); color: var(--color-heading); border-radius: var(--radius-md); padding: var(--space-md); text-align: center; border: 1px solid rgba(var(--color-accent-rgb), 0.15); transition: transform var(--transition-base), box-shadow var(--transition-base); } .stat-card:hover { transform: translateY(-3px); box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25); } .stat-card .num { font-size: clamp(2rem, 1.2rem + 3vw, 3rem); font-weight: var(--fw-light); color: var(--color-accent); display: block; line-height: 1; } .stat-card .label { display: block; margin-top: var(--space-xs); color: var(--color-text); font-size: 0.95rem; } /* ----------------------------------------------------------------- 14. COMPARISON CARDS (big tech vs Shiloh, hosting plans) ----------------------------------------------------------------- */ .compare { display: grid; grid-template-columns: 1fr; gap: var(--space-md); max-width: var(--content-max); width: 100%; margin: var(--space-md) auto; } @media (min-width: 768px) { .compare { grid-template-columns: 1fr 1fr; } } .compare-col { background: var(--color-surface-1); border-radius: var(--radius-md); padding: var(--space-md); border: 1px solid transparent; text-align: left; transition: transform var(--transition-base); } .compare-col:hover { transform: translateY(-3px); } .compare-col h3 { text-align: left; margin-bottom: var(--space-sm); font-size: 1.25rem; } .compare-col.bad { border-color: rgba(var(--color-bad-rgb), 0.4); } .compare-col.good { border-color: rgba(var(--color-good-rgb), 0.4); } .compare-col ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.6rem; } .compare-col li { position: relative; padding-left: 1.5em; color: var(--color-text); font-size: 0.95rem; } .compare-col.bad li::before { content: "✕"; position: absolute; left: 0; color: var(--color-bad); } .compare-col.good li::before { content: "✓"; position: absolute; left: 0; color: var(--color-good); } /* Hosting plan cards */ .plans { display: grid; grid-template-columns: 1fr; gap: var(--space-md); max-width: var(--content-max); width: 100%; margin: var(--space-md) auto; } @media (min-width: 768px) { .plans { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1100px) { .plans { grid-template-columns: repeat(3, 1fr); } } .plan-card { position: relative; background: var(--color-surface-1); color: var(--color-text); border-radius: var(--radius-md); padding: var(--space-md); display: flex; flex-direction: column; gap: var(--space-sm); border: 1px solid rgba(var(--color-accent-rgb), 0.12); transition: transform var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base); } .plan-card:hover { transform: translateY(-4px); border-color: var(--color-accent); box-shadow: 0 8px 22px rgba(var(--color-accent-rgb), 0.18); } .plan-card.featured { border-color: var(--color-accent); background: linear-gradient(180deg, var(--color-surface-2), var(--color-surface-1)); box-shadow: 0 0 0 2px var(--color-accent) inset, 0 8px 22px rgba(var(--color-accent-rgb), 0.15); } .plan-card .ribbon { position: absolute; top: -10px; right: -10px; background: var(--color-accent); color: var(--color-button-text); font-size: 0.7rem; font-weight: 700; padding: 4px 8px; border-radius: var(--radius-sm); letter-spacing: 0.05em; text-transform: uppercase; } .plan-card .name { font-size: 1.3rem; color: var(--color-heading); } .plan-card .price { font-size: 2.2rem; font-weight: var(--fw-light); color: var(--color-accent); line-height: 1; } .plan-card .price small { font-size: 0.9rem; color: var(--color-text); margin-left: 4px; } .plan-card .blurb { color: var(--color-text); font-size: 0.9rem; opacity: 0.9; } .plan-card ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.4rem; } .plan-card li { position: relative; padding-left: 1.4em; font-size: 0.9rem; color: var(--color-text); } .plan-card li::before { content: "✓"; position: absolute; left: 0; color: var(--color-accent); } .plan-card .pick { margin-top: auto; align-self: center; } .plan-card.flipped { transform: rotateY(180deg); } .plan-card .flipped-face { display: none; flex-direction: column; gap: var(--space-sm); text-align: center; flex: 1; justify-content: center; } .plan-card.flipped .front-face { display: none; } .plan-card.flipped .flipped-face { display: flex; } /* ----------------------------------------------------------------- 15. TECH STACK CONSTELLATION ----------------------------------------------------------------- */ .constellation { position: relative; width: 100%; max-width: 720px; height: clamp(360px, 55vw, 520px); margin: var(--space-md) auto; background: radial-gradient(circle at center, rgba(var(--color-accent-rgb), 0.06), transparent 70%); border: 1px dashed rgba(var(--color-accent-rgb), 0.2); border-radius: var(--radius-lg); overflow: hidden; touch-action: none; } .constellation svg { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; } .constellation .node { position: absolute; display: flex; align-items: center; justify-content: center; width: 78px; height: 78px; border-radius: var(--radius-full); background: var(--color-surface-1); border: 2px solid var(--color-accent); color: var(--color-heading); font-family: var(--font-sans); font-size: 0.7rem; text-align: center; padding: 4px; cursor: pointer; user-select: none; transform: translate(-50%, -50%); transition: transform var(--transition-fast), box-shadow var(--transition-base), background var(--transition-base); } .constellation .node:hover, .constellation .node.active { transform: translate(-50%, -50%) scale(1.1); background: var(--color-accent); color: var(--color-button-text); box-shadow: 0 0 24px rgba(var(--color-accent-rgb), 0.6); z-index: 2; } .constellation .node.dragging { transition: none; cursor: grabbing; } .constellation .legend { position: absolute; bottom: 8px; left: 0; right: 0; text-align: center; font-size: 0.8rem; color: var(--color-text); opacity: 0.75; } .constellation .tooltip { position: absolute; pointer-events: none; background: var(--color-surface-2); color: var(--color-heading); font-size: 0.8rem; padding: 6px 10px; border-radius: var(--radius-sm); border: 1px solid var(--color-accent); transform: translate(-50%, -120%); white-space: nowrap; opacity: 0; transition: opacity var(--transition-fast); z-index: 3; } .constellation .tooltip.visible { opacity: 1; } /* ----------------------------------------------------------------- 16. (reserved) ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- 17. HERO THESIS & WHAT WE BELIEVE ----------------------------------------------------------------- */ .hero-thesis { font-size: clamp(1.15rem, 1rem + 0.8vw, 1.45rem); max-width: 640px; text-align: center; line-height: 1.5; color: var(--color-text); margin: var(--space-xs) 0; } .hero-thesis strong { color: var(--color-heading); font-weight: var(--fw-normal); } .hero-projects-row { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-xs); margin: var(--space-sm) 0; } .hero-project-chip { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-sans); font-size: 0.85rem; color: var(--color-heading); background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 999px; padding: 4px 12px; text-decoration: none; transition: background var(--transition-fast), border-color var(--transition-fast); } .hero-project-chip:hover { background: rgba(var(--color-accent-rgb), 0.12); border-color: var(--color-accent); } .hero-project-chip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--color-accent); display: inline-block; } /* What we believe section */ section.belief-section { padding: var(--space-section) var(--space-md); width: 100%; text-align: center; color: var(--color-text); } .belief { max-width: 760px; margin: 0 auto; text-align: center; } .belief .lede { font-size: clamp(1.1rem, 1rem + 0.6vw, 1.35rem); color: var(--color-heading); line-height: 1.55; margin: 0 auto var(--space-md); max-width: 640px; } .belief .lede em { color: var(--color-accent); font-style: normal; } .belief-pillars { display: grid; grid-template-columns: 1fr; gap: var(--space-sm); margin: var(--space-md) auto; max-width: 720px; text-align: left; } @media (min-width: 720px) { .belief-pillars { grid-template-columns: repeat(3, 1fr); } } .belief-pillar { background: var(--color-surface-1); border: 1px solid rgba(var(--color-accent-rgb), 0.15); border-radius: var(--radius-md); padding: var(--space-md) var(--space-sm); text-align: left; transition: transform var(--transition-base), border-color var(--transition-base); } .belief-pillar:hover { transform: translateY(-3px); border-color: var(--color-accent); } .belief-pillar h3 { text-align: left; font-size: 1.05rem; color: var(--color-heading); margin-bottom: var(--space-xs); } .belief-pillar p { font-size: 0.9rem; color: var(--color-text); opacity: 0.9; text-align: left; } /* Verse pull */ .verse-pull { max-width: 720px; margin: 0 auto; padding: var(--space-md) var(--space-md); text-align: center; border-top: 1px solid rgba(var(--color-accent-rgb), 0.15); border-bottom: 1px solid rgba(var(--color-accent-rgb), 0.15); } .verse-pull blockquote { font-family: var(--font-display); font-size: clamp(1.1rem, 1rem + 0.8vw, 1.4rem); line-height: 1.45; color: var(--color-heading); font-style: italic; font-weight: var(--fw-light); margin: 0 auto var(--space-xs); max-width: 640px; } .verse-pull cite { display: block; font-style: normal; font-family: var(--font-sans); font-size: 0.85rem; color: var(--color-accent); letter-spacing: 0.08em; text-transform: uppercase; margin-top: var(--space-xs); } /* ----------------------------------------------------------------- 18. PROJECTS GRID ----------------------------------------------------------------- */ .projects { display: grid; grid-template-columns: 1fr; gap: var(--space-md); max-width: var(--content-max); width: 100%; margin: var(--space-md) auto; } @media (min-width: 768px) { .projects { grid-template-columns: repeat(3, 1fr); } } .project-card { position: relative; display: flex; flex-direction: column; gap: var(--space-sm); background: var(--color-surface-1); color: var(--color-text); border: 1px solid rgba(var(--color-accent-rgb), 0.15); border-radius: var(--radius-md); padding: var(--space-md); text-align: left; text-decoration: none; transition: transform var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base); } .project-card:hover { transform: translateY(-4px); border-color: var(--color-accent); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.25); } .project-card .project-tag { display: inline-block; font-family: var(--font-sans); font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--color-accent); background: rgba(var(--color-accent-rgb), 0.1); border: 1px solid rgba(var(--color-accent-rgb), 0.3); border-radius: 999px; padding: 3px 10px; align-self: flex-start; } .project-card .project-icon { font-size: 2.4rem; line-height: 1; color: var(--color-heading); align-self: flex-start; max-height: 72px; width: auto; height: auto; object-fit: contain; } /* Img variant of project-icon: cap height so logos don't dominate the card */ .project-card .project-icon[src] { max-width: 200px; max-height: 72px; background: var(--color-surface-2); border-radius: var(--radius-sm); padding: 8px 12px; } .project-card h3 { text-align: left; font-size: 1.3rem; color: var(--color-heading); margin: 0; } .project-card .project-blurb { color: var(--color-text); font-size: 0.95rem; opacity: 0.92; text-align: left; flex: 1; } .project-card .project-cta { font-family: var(--font-sans); color: var(--color-accent); font-size: 0.9rem; letter-spacing: 0.05em; margin-top: auto; align-self: flex-start; } .project-card .project-cta::after { content: " \2192"; transition: transform var(--transition-fast); display: inline-block; } .project-card:hover .project-cta::after { transform: translateX(3px); } /* ----------------------------------------------------------------- 19. (reserved) ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- 20. CONFETTI ----------------------------------------------------------------- */ .confetti-piece { position: fixed; top: -20px; width: 10px; height: 14px; background: var(--color-accent); z-index: 9999; pointer-events: none; will-change: transform, opacity; animation: confetti-fall var(--dur, 2.4s) cubic-bezier(0.2, 0.6, 0.3, 1) forwards; } @keyframes confetti-fall { 0% { transform: translate3d(0, -20px, 0) rotate(0deg); opacity: 1; } 100% { transform: translate3d(var(--dx, 0), 100vh, 0) rotate(720deg); opacity: 0.9; } } .konami-toast { position: fixed; top: 20%; left: 50%; transform: translateX(-50%); background: var(--color-accent); color: var(--color-button-text); font-family: var(--font-sans); font-weight: 700; padding: 0.8rem 1.4rem; border-radius: var(--radius-md); z-index: 10000; box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4); animation: pop 0.3s ease, fade 2.2s ease 0.3s forwards; } @keyframes pop { from { transform: translateX(-50%) scale(0.6); opacity: 0; } to { transform: translateX(-50%) scale(1); opacity: 1; } } @keyframes fade { to { opacity: 0; transform: translateX(-50%) translateY(-20px); } } .offline-toast { position: fixed; bottom: var(--space-lg); left: 50%; transform: translateX(-50%); background: var(--color-surface-1); color: var(--color-heading); border: 1px solid var(--color-accent); padding: 0.7rem 1.1rem; border-radius: var(--radius-md); z-index: 10000; font-family: var(--font-sans); box-shadow: 0 4px 18px rgba(0, 0, 0, 0.35); animation: rise 0.3s ease; } /* ----------------------------------------------------------------- 19. THEMES (day / night / sabbath) ----------------------------------------------------------------- */ /* Night (default) — already covered by :root tokens */ /* Day — light green-tinted paper */ body[data-theme="day"] { --color-bg: #e8f0e6; --color-bg-2: #c8d8cc; --color-surface-1: #ffffff; --color-surface-2: #d8e6dc; --color-surface-3: #c0d4c5; --color-text: #1a2a22; --color-heading: #0d1a18; --color-accent: #1f8a5f; --color-button-bg: #1f8a5f; --color-button-text: #ffffff; --color-button-border:#1f8a5f; --color-back-to-top: #c8d8cc; --color-good: #0a7a2e; --color-bad: #a23a3a; } body[data-theme="day"] .bg-vid { background-color: var(--color-bg-2); } body[data-theme="day"] .bg-vid:nth-of-type(even) { background-color: var(--color-surface-1); } /* Sabbath — deep green stillness */ body[data-theme="sabbath"] { --color-bg: #1f302b; --color-bg-2: #15201d; --color-surface-1: #15201d; --color-surface-2: #0d1714; --color-surface-3: #050a08; --color-text: #d6e0d8; --color-heading: #e8f0e6; --color-accent: #8aa88e; --color-button-bg: #8aa88e; --color-button-text: #0d1714; --color-button-border:#8aa88e; --color-back-to-top: #0d1714; --color-good: #8aa88e; --color-bad: #a37c7c; } body[data-theme="sabbath"] .bg-vid { background-color: var(--color-surface-1); } body[data-theme="sabbath"] .bg-vid:nth-of-type(even) { background-color: var(--color-bg-2); } body[data-theme="sabbath"]::before { content: "Honoring the rhythm — videos are paused."; position: fixed; top: var(--space-sm); left: 50%; transform: translateX(-50%); background: var(--color-surface-1); color: var(--color-accent); font-family: var(--font-sans); font-size: 0.75rem; padding: 4px 10px; border-radius: var(--radius-sm); z-index: 30; border: 1px solid var(--color-accent); } /* ----------------------------------------------------------------- 22. RESPONSIVE BREAKPOINTS (mobile-first escalations) ----------------------------------------------------------------- */ /* Tablet & up (>= 768px) */ @media (min-width: 768px) { .flex-column { padding: var(--space-section) var(--space-lg); } .logo img { max-height: none; } } /* Desktop & up (>= 960px) — full nav, larger spacing */ @media (min-width: 960px) { .nav-bar { padding: var(--space-sm) var(--space-md); } .menu { gap: var(--space-md); } } /* Mobile (< 960px) — collapsible nav, stacked content */ @media (max-width: 959px) { .nav-bar { display: block; flex-direction: column; align-items: flex-start; padding: var(--space-xs); } /* Keep the logo small and out of the icon's way on mobile. */ .nav-bar .logo { width: auto; max-width: calc(100% - 60px); } .menu { display: none; position: absolute; top: 100%; left: 0; width: 100%; flex-direction: column; align-items: flex-start; background-color: var(--color-surface-3); padding: var(--space-sm) 0; gap: var(--space-xs); } .menu-item { width: 100%; padding: var(--space-xs) var(--space-md); } .menu-item::before { display: none; } .mobile-menu-icon { display: block; position: absolute; top: 15px; right: 10px; z-index: 2; cursor: pointer; } .mobile-menu-icon img { width: 24px; height: 24px; display: block; } .show-menu { display: flex; } /* Echo variant nav (kept for parity with .nav-bar-echo usage) */ .nav-bar-echo { display: block; flex-direction: column; align-items: flex-start; padding: var(--space-xs); } .menu-echo { display: none; position: absolute; top: 100%; left: 0; width: 100%; flex-direction: column; align-items: flex-start; background-color: var(--color-bg-2); padding: var(--space-sm) 0; } /* Stack inner .flex contents directly */ .flex { display: contents; } /* Body text reads better centered on phones */ p, ul, ol, td, li, cite { text-align: center; max-width: 100%; } a { text-align: center; } .theme-toggle { right: var(--space-sm); bottom: calc(var(--space-md) + 60px); } .streak-badge { top: calc(var(--nav-height) + var(--space-xs)); right: var(--space-xs); font-size: 0.7rem; } } /* Small phones (< 480px) — tighten buttons & spacing */ @media (max-width: 480px) { .flex-column { padding: var(--space-lg) var(--space-sm); min-height: 90svh; } .button-1, .button-2 { width: 100%; max-width: 280px; padding: var(--space-xs) var(--space-md); } .flex-row { gap: var(--space-sm); } .stat-card { min-width: 140px; flex: 1 1 140px; } .constellation { height: 380px; } .constellation .node { width: 64px; height: 64px; font-size: 0.6rem; } .project-card { padding: var(--space-sm); } .project-card h3 { font-size: 1.15rem; } .belief-pillar { padding: var(--space-sm); } .verse-pull blockquote { font-size: 1.05rem; } } /* ----------------------------------------------------------------- 23. REDUCED MOTION / ACCESSIBILITY ----------------------------------------------------------------- */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; } .reveal { opacity: 1 !important; transform: none !important; } .bg-vid { background-color: var(--color-surface-2); } .cursor-glow { display: none; } } /* Focus visibility for keyboard users */ a:focus-visible, button:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }