Files
alwisp/www/css/style.css
Claude 3e26125afa Add Dockerized LAMP stack and website skeleton for ALWISP
- Docker Compose orchestrating PHP 8.2/Apache web container and MySQL 8.0
- Dockerfile with GD, PDO, MySQLi extensions and security hardening
- Apache vhost with mod_rewrite, deflate, expires, and security headers
- PHP config with OPcache enabled and display_errors off
- MySQL init schema (contacts, coverage_zones tables)
- Front-controller PHP router (index.php → pages/)
- Responsive homepage: hero, stats bar, services cards, why section, coverage CTA
- Stub pages: services, coverage, about, contact (with working form skeleton), 404
- CSS design system using brand palette from logo (navy #0d1b3e → teal #00bcd4 + orange #f57c00 accents)
- JS: nav scroll/mobile toggle, IntersectionObserver counter animation, scroll reveal

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
2026-02-28 21:39:21 +00:00

708 lines
20 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
ALWISP Mesh Network Solutions
Brand palette extracted from logo:
--navy: #0d1b3e (darkest bg)
--blue: #1565c0 (primary mid)
--teal: #00bcd4 (accent highlight)
--orange: #f57c00 (mesh node accent)
--white: #ffffff
============================================================ */
/* ── RESET & BASE ──────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
/* Brand */
--navy: #0d1b3e;
--navy-mid: #132145;
--blue: #1565c0;
--blue-light:#1e88e5;
--teal: #00bcd4;
--teal-dark: #00acc1;
--orange: #f57c00;
--orange-lt: #ffb74d;
/* Neutrals */
--white: #ffffff;
--off-white: #f0f4f8;
--gray-100: #e8edf3;
--gray-300: #b0bec5;
--gray-500: #607d8b;
--gray-700: #37474f;
--gray-900: #1a2332;
/* Gradients */
--grad-hero: linear-gradient(135deg, #0d1b3e 0%, #1565c0 60%, #00bcd4 100%);
--grad-text: linear-gradient(90deg, #00bcd4, #1565c0);
--grad-cta: linear-gradient(135deg, #1565c0, #00bcd4);
/* Typography */
--font-body: 'Inter', system-ui, sans-serif;
--font-heading: 'Space Grotesk', system-ui, sans-serif;
/* Layout */
--max-width: 1200px;
--section-py: 5rem;
--nav-h: 70px;
/* Radius */
--r-sm: 6px;
--r-md: 12px;
--r-lg: 20px;
--r-full: 9999px;
/* Shadow */
--shadow-sm: 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.08);
--shadow-md: 0 4px 16px rgba(0,0,0,.18);
--shadow-lg: 0 10px 40px rgba(0,0,0,.28);
/* Transition */
--t-fast: 0.18s ease;
--t-base: 0.28s ease;
}
html { scroll-behavior: smooth; font-size: 16px; }
body {
font-family: var(--font-body);
background: var(--navy);
color: var(--white);
line-height: 1.65;
-webkit-font-smoothing: antialiased;
}
a { color: var(--teal); text-decoration: none; transition: color var(--t-fast); }
a:hover { color: var(--orange-lt); }
img { max-width: 100%; display: block; }
ul { list-style: none; }
/* ── UTILITIES ──────────────────────────────────────────────── */
.container {
width: 100%;
max-width: var(--max-width);
margin-inline: auto;
padding-inline: 1.5rem;
}
.gradient-text {
background: var(--grad-text);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.accent { color: var(--teal); }
.section { padding-block: var(--section-py); }
.section--alt { background: var(--navy-mid); }
.section__header { text-align: center; margin-bottom: 3rem; }
.section__eyebrow {
font-size: .8rem;
font-weight: 600;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--teal);
display: block;
margin-bottom: .5rem;
}
.section__heading {
font-family: var(--font-heading);
font-size: clamp(1.75rem, 3.5vw, 2.75rem);
font-weight: 700;
line-height: 1.2;
color: var(--white);
}
.section__sub {
margin-top: .75rem;
color: var(--gray-300);
font-size: 1.05rem;
max-width: 600px;
margin-inline: auto;
}
.placeholder-block {
background: rgba(255,255,255,.05);
border: 1px dashed rgba(255,255,255,.15);
border-radius: var(--r-md);
padding: 3rem 2rem;
text-align: center;
color: var(--gray-300);
font-size: .95rem;
}
/* ── BUTTONS ────────────────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
gap: .5rem;
padding: .75rem 1.75rem;
border-radius: var(--r-full);
font-family: var(--font-heading);
font-size: .95rem;
font-weight: 600;
cursor: pointer;
border: 2px solid transparent;
transition: all var(--t-base);
white-space: nowrap;
}
.btn--primary {
background: var(--grad-cta);
color: var(--white);
box-shadow: 0 4px 20px rgba(0,188,212,.3);
}
.btn--primary:hover {
color: var(--white);
transform: translateY(-2px);
box-shadow: 0 8px 28px rgba(0,188,212,.45);
}
.btn--ghost {
background: transparent;
border-color: rgba(255,255,255,.35);
color: var(--white);
}
.btn--ghost:hover {
border-color: var(--teal);
color: var(--teal);
background: rgba(0,188,212,.08);
}
/* ── NAV ────────────────────────────────────────────────────── */
.site-header {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 100;
height: var(--nav-h);
background: rgba(13,27,62,.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(255,255,255,.07);
transition: background var(--t-base), box-shadow var(--t-base);
}
.site-header.scrolled {
background: rgba(13,27,62,.97);
box-shadow: var(--shadow-md);
}
.nav {
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
}
.nav__logo {
display: flex;
align-items: center;
gap: .6rem;
text-decoration: none;
}
.nav__logo-img { height: 38px; width: auto; }
.nav__logo-text {
font-family: var(--font-heading);
font-size: 1.35rem;
font-weight: 700;
color: var(--white);
letter-spacing: .04em;
}
.nav__menu {
display: flex;
align-items: center;
gap: .25rem;
}
.nav__link {
display: block;
padding: .5rem .9rem;
border-radius: var(--r-full);
font-size: .9rem;
font-weight: 500;
color: rgba(255,255,255,.8);
transition: color var(--t-fast), background var(--t-fast);
}
.nav__link:hover { color: var(--white); background: rgba(255,255,255,.08); }
.nav__link--cta {
background: var(--grad-cta);
color: var(--white) !important;
padding: .5rem 1.2rem;
font-weight: 600;
}
.nav__link--cta:hover {
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(0,188,212,.4);
background: var(--grad-cta);
}
/* Hamburger */
.nav__toggle {
display: none;
flex-direction: column;
gap: 5px;
background: none;
border: none;
cursor: pointer;
padding: .5rem;
}
.nav__toggle-bar {
display: block;
width: 24px;
height: 2px;
background: var(--white);
border-radius: 2px;
transition: transform var(--t-base), opacity var(--t-base);
}
/* ── HERO ───────────────────────────────────────────────────── */
.hero {
position: relative;
min-height: 100vh;
display: flex;
align-items: center;
overflow: hidden;
padding-top: var(--nav-h);
background: var(--grad-hero);
}
.hero__mesh-bg {
position: absolute;
inset: 0;
background-image:
radial-gradient(circle at 20% 50%, rgba(0,188,212,.12) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(21,101,192,.18) 0%, transparent 45%),
radial-gradient(circle at 60% 80%, rgba(245,124,0,.07) 0%, transparent 40%);
/* Mesh dot pattern */
background-image:
radial-gradient(circle at 20% 50%, rgba(0,188,212,.12) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(21,101,192,.18) 0%, transparent 45%),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='60'%3E%3Ccircle cx='30' cy='30' r='1' fill='rgba(255,255,255,0.06)'/%3E%3C/svg%3E");
background-repeat: no-repeat, no-repeat, repeat;
animation: meshPulse 8s ease-in-out infinite alternate;
}
@keyframes meshPulse {
from { opacity: .7; }
to { opacity: 1; }
}
.hero__content {
position: relative;
z-index: 1;
max-width: 700px;
padding-block: 4rem;
}
.hero__eyebrow {
font-size: .8rem;
font-weight: 600;
letter-spacing: .15em;
text-transform: uppercase;
color: var(--teal);
margin-bottom: 1rem;
}
.hero__heading {
font-family: var(--font-heading);
font-size: clamp(2.4rem, 6vw, 4rem);
font-weight: 700;
line-height: 1.1;
margin-bottom: 1.25rem;
}
.hero__sub {
font-size: clamp(1rem, 2vw, 1.2rem);
color: rgba(255,255,255,.78);
max-width: 560px;
margin-bottom: 2rem;
}
.hero__actions {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.hero__scroll-hint {
position: absolute;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: .4rem;
}
.hero__scroll-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--teal);
animation: scrollBounce 1.8s ease-in-out infinite;
opacity: .6;
}
@keyframes scrollBounce {
0%, 100% { transform: translateY(0); opacity: .6; }
50% { transform: translateY(8px); opacity: 1; }
}
/* ── STATS BAR ──────────────────────────────────────────────── */
.stats-bar {
background: rgba(255,255,255,.04);
border-top: 1px solid rgba(255,255,255,.07);
border-bottom: 1px solid rgba(255,255,255,.07);
padding-block: 2.5rem;
}
.stats-bar__grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
text-align: center;
}
.stat__value {
font-family: var(--font-heading);
font-size: 2.5rem;
font-weight: 700;
color: var(--teal);
}
.stat__unit {
font-family: var(--font-heading);
font-size: 1.2rem;
font-weight: 600;
color: var(--teal);
}
.stat__label {
display: block;
font-size: .82rem;
color: var(--gray-300);
text-transform: uppercase;
letter-spacing: .08em;
margin-top: .25rem;
}
/* ── CARDS ──────────────────────────────────────────────────── */
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
}
.card {
background: rgba(255,255,255,.04);
border: 1px solid rgba(255,255,255,.08);
border-radius: var(--r-lg);
padding: 2rem 1.75rem;
transition: transform var(--t-base), box-shadow var(--t-base), border-color var(--t-base);
}
.card--hover:hover {
transform: translateY(-5px);
box-shadow: 0 16px 40px rgba(0,0,0,.35);
border-color: rgba(0,188,212,.3);
}
.card__icon {
width: 48px;
height: 48px;
margin-bottom: 1.25rem;
color: var(--teal);
}
.card__icon svg { width: 100%; height: 100%; }
.card__title {
font-family: var(--font-heading);
font-size: 1.1rem;
font-weight: 600;
margin-bottom: .6rem;
}
.card__body {
color: var(--gray-300);
font-size: .93rem;
line-height: 1.6;
margin-bottom: 1.25rem;
}
.card__link {
font-weight: 600;
font-size: .88rem;
color: var(--teal);
letter-spacing: .03em;
}
.card__link:hover { color: var(--orange-lt); }
/* ── WHY ALWISP ─────────────────────────────────────────────── */
.why__grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
}
.why__text .section__heading { text-align: left; }
.why__text p {
color: var(--gray-300);
margin-block: 1rem 1.5rem;
max-width: 480px;
}
.why__list {
display: flex;
flex-direction: column;
gap: .6rem;
}
.why__list li {
display: flex;
align-items: center;
gap: .75rem;
font-size: .95rem;
color: rgba(255,255,255,.85);
}
.why__check {
color: var(--teal);
font-weight: 700;
font-size: 1rem;
flex-shrink: 0;
}
/* Mesh SVG diagram */
.why__visual { display: flex; justify-content: center; }
.mesh-diagram { width: 100%; max-width: 380px; }
.mesh-svg { width: 100%; height: auto; }
.mesh-node {
filter: drop-shadow(0 0 6px currentColor);
}
.mesh-node--tower {
filter: drop-shadow(0 0 10px rgba(245,124,0,.8));
animation: nodePulse 2.5s ease-in-out infinite;
}
@keyframes nodePulse {
0%, 100% { r: 12; opacity: .9; }
50% { r: 14; opacity: 1; }
}
/* ── CTA BAND ───────────────────────────────────────────────── */
.cta-band {
background: linear-gradient(135deg, rgba(21,101,192,.25), rgba(0,188,212,.15));
border-top: 1px solid rgba(0,188,212,.2);
border-bottom: 1px solid rgba(0,188,212,.2);
}
.cta-band__content { text-align: center; }
.cta-band__heading {
font-family: var(--font-heading);
font-size: clamp(1.5rem, 3vw, 2.2rem);
font-weight: 700;
margin-bottom: .6rem;
}
.cta-band__sub { color: var(--gray-300); margin-bottom: 1.75rem; }
.cta-band__form {
display: flex;
gap: .75rem;
justify-content: center;
flex-wrap: wrap;
max-width: 560px;
margin-inline: auto;
}
.cta-band__input {
flex: 1;
min-width: 240px;
padding: .75rem 1.25rem;
border-radius: var(--r-full);
border: 1px solid rgba(255,255,255,.2);
background: rgba(255,255,255,.07);
color: var(--white);
font-size: .95rem;
outline: none;
transition: border-color var(--t-fast), background var(--t-fast);
}
.cta-band__input::placeholder { color: var(--gray-300); }
.cta-band__input:focus {
border-color: var(--teal);
background: rgba(255,255,255,.12);
}
/* ── PAGE HERO ──────────────────────────────────────────────── */
.page-hero {
padding-top: calc(var(--nav-h) + 3rem);
padding-bottom: 3rem;
background: linear-gradient(135deg, #0d1b3e 0%, #132145 100%);
border-bottom: 1px solid rgba(255,255,255,.06);
text-align: center;
}
/* ── CONTACT ────────────────────────────────────────────────── */
.contact__grid {
display: grid;
grid-template-columns: 280px 1fr;
gap: 4rem;
align-items: start;
}
.contact__heading {
font-family: var(--font-heading);
font-size: 1.4rem;
font-weight: 700;
margin-bottom: 1.25rem;
}
.contact__details {
display: flex;
flex-direction: column;
gap: 1rem;
color: var(--gray-300);
font-size: .95rem;
line-height: 1.7;
}
.contact__details a { color: var(--teal); }
/* ── FORM ───────────────────────────────────────────────────── */
.form { display: flex; flex-direction: column; gap: 1.25rem; }
.form__row { display: flex; gap: 1rem; }
.form__row--2 > * { flex: 1; }
.form__group { display: flex; flex-direction: column; gap: .4rem; }
.form__label {
font-size: .85rem;
font-weight: 500;
color: var(--gray-300);
}
.form__label span { color: var(--teal); }
.form__input {
padding: .7rem 1rem;
border-radius: var(--r-sm);
border: 1px solid rgba(255,255,255,.15);
background: rgba(255,255,255,.06);
color: var(--white);
font-size: .95rem;
font-family: var(--font-body);
outline: none;
transition: border-color var(--t-fast);
}
.form__input:focus { border-color: var(--teal); background: rgba(255,255,255,.1); }
.form__textarea { resize: vertical; min-height: 130px; }
select.form__input option { background: var(--navy); }
/* ── ALERTS ─────────────────────────────────────────────────── */
.alert {
padding: 1rem 1.25rem;
border-radius: var(--r-sm);
font-size: .93rem;
margin-bottom: 1.25rem;
}
.alert--success { background: rgba(0,188,212,.15); border: 1px solid rgba(0,188,212,.4); color: #b2ebf2; }
.alert--error { background: rgba(229,57,53,.15); border: 1px solid rgba(229,57,53,.4); color: #ffcdd2; }
.alert ul { list-style: disc; padding-left: 1.25rem; }
/* ── FOOTER ─────────────────────────────────────────────────── */
.site-footer {
background: #080f1f;
border-top: 1px solid rgba(255,255,255,.07);
padding-top: 3.5rem;
}
.footer__grid {
display: grid;
grid-template-columns: 1.5fr 1fr 1fr 1.2fr;
gap: 2.5rem;
padding-bottom: 3rem;
}
.footer__tagline {
color: var(--gray-300);
font-size: .9rem;
line-height: 1.7;
margin-top: .75rem;
}
.footer__heading {
font-family: var(--font-heading);
font-size: .8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: .1em;
color: var(--teal);
margin-bottom: 1rem;
}
.footer__links ul { display: flex; flex-direction: column; gap: .5rem; }
.footer__links a {
color: var(--gray-300);
font-size: .9rem;
}
.footer__links a:hover { color: var(--white); }
.footer__contact p {
color: var(--gray-300);
font-size: .9rem;
margin-bottom: .5rem;
}
.footer__contact a { color: var(--gray-300); }
.footer__contact a:hover { color: var(--teal); }
.footer__social {
display: flex;
gap: .5rem;
margin-top: 1rem;
}
.footer__social-link {
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
border-radius: var(--r-sm);
background: rgba(255,255,255,.07);
font-size: .72rem;
font-weight: 700;
color: var(--gray-300);
transition: background var(--t-fast), color var(--t-fast);
}
.footer__social-link:hover { background: var(--teal); color: var(--white); }
.footer__bottom {
padding-block: 1.25rem;
border-top: 1px solid rgba(255,255,255,.06);
text-align: center;
color: var(--gray-500);
font-size: .82rem;
}
/* ── RESPONSIVE ─────────────────────────────────────────────── */
@media (max-width: 1024px) {
.why__grid { grid-template-columns: 1fr; gap: 2.5rem; }
.why__visual { display: none; }
.footer__grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
:root { --section-py: 3.5rem; }
/* Mobile nav */
.nav__toggle { display: flex; }
.nav__menu {
position: fixed;
top: var(--nav-h);
left: 0; right: 0;
background: rgba(13,27,62,.98);
flex-direction: column;
align-items: stretch;
padding: 1rem 1.5rem 2rem;
gap: .25rem;
border-bottom: 1px solid rgba(255,255,255,.1);
transform: translateY(-110%);
opacity: 0;
transition: transform var(--t-base), opacity var(--t-base);
pointer-events: none;
}
.nav__menu.is-open {
transform: translateY(0);
opacity: 1;
pointer-events: auto;
}
.nav__link { padding: .75rem 1rem; border-radius: var(--r-sm); }
.nav__link--cta { text-align: center; margin-top: .5rem; }
.stats-bar__grid { grid-template-columns: repeat(2, 1fr); gap: 1.5rem; }
.contact__grid { grid-template-columns: 1fr; gap: 2rem; }
.form__row--2 { flex-direction: column; }
.footer__grid { grid-template-columns: 1fr; gap: 2rem; }
}
@media (max-width: 480px) {
.hero__actions { flex-direction: column; }
.hero__actions .btn { text-align: center; justify-content: center; }
.stats-bar__grid { grid-template-columns: 1fr 1fr; }
.cta-band__form { flex-direction: column; }
.cta-band__input { min-width: 100%; }
}