shiloh-website/css/styles.css
2026-07-07 13:51:27 -07:00

1808 lines
40 KiB
CSS

/* =================================================================
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;
}