1808 lines
40 KiB
CSS
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;
|
|
}
|