Files
diana/_site/css/main.css
2026-07-31 13:41:52 +02:00

1908 lines
38 KiB
CSS
Raw Permalink 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.
/* =============================================================================
HER — Home Enhancement and Renovation
main.css | Mobile-first production stylesheet
=============================================================================
TABLE OF CONTENTS
-----------------
1. Design Tokens
2. Reset & Base
3. Skip Link
4. Layout Utilities
5. Typography Helpers
6. Navigation
7. Buttons
8. Hero (Homepage)
9. Services Section (Homepage)
10. Why HER Section
11. Testimonials Strip (Homepage)
12. Service Area Section (Homepage)
13. CTA Band
14. Footer
15. Inner Page Hero
16. Breadcrumb
17. Service Detail Page
18. Services Hub Page
19. About Page
20. Testimonials Page
21. Contact / Form Page
22. Quote Form
23. Visually Hidden / Honeypot
24. Animation
============================================================================= */
/* =============================================================================
1. DESIGN TOKENS
============================================================================= */
:root {
/* Colors */
--col-graphite: #252B30;
--col-linen: #F4F1EB;
--col-copper: #B5622A;
--col-copper-hover: #9A4E20;
--col-slate: #5C7080;
--col-mist: #E8ECF0;
--col-chalk: #EDEDEB;
--col-ink: #1A1A1A;
--col-white: #FFFFFF;
/* Typography */
--font-display: 'Fraunces', Georgia, serif;
--font-body: 'DM Sans', system-ui, sans-serif;
/* Type scale */
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.375rem;
--text-2xl: 1.75rem;
--text-3xl: 2.25rem;
--text-4xl: 3rem;
--text-5xl: 4rem;
/* Spacing (8-point grid) */
--space-1: 0.5rem;
--space-2: 1rem;
--space-3: 1.5rem;
--space-4: 2rem;
--space-6: 3rem;
--space-8: 4rem;
--space-12: 6rem;
--space-16: 8rem;
/* Other */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 16px;
--shadow-card: 0 2px 8px rgba(37, 43, 48, 0.08);
--max-width: 1160px;
--nav-height: 64px;
}
/* =============================================================================
2. RESET & BASE
============================================================================= */
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: var(--font-body);
background: var(--col-linen);
color: var(--col-ink);
line-height: 1.6;
}
img {
max-width: 100%;
display: block;
}
h1,
h2,
h3,
h4,
h5 {
margin: 0;
line-height: 1.2;
}
p {
margin: 0;
}
ul,
ol {
margin: 0;
padding: 0;
}
a {
color: var(--col-copper);
}
/* Global focus ring — copper accent on all interactive elements */
:focus-visible {
outline: 2px solid var(--col-copper);
outline-offset: 2px;
}
/* =============================================================================
3. SKIP LINK
============================================================================= */
.skip-link {
position: absolute;
left: 50%;
top: -100%;
transform: translateX(-50%) translateY(0);
background: var(--col-copper);
color: var(--col-white);
font-family: var(--font-body);
font-size: var(--text-sm);
font-weight: 600;
padding: 0.5rem 1rem;
border-radius: var(--radius-sm);
text-decoration: none;
white-space: nowrap;
z-index: 999;
transition: top 0.2s ease;
}
.skip-link:focus {
top: var(--space-2);
}
/* =============================================================================
4. LAYOUT UTILITIES
============================================================================= */
.container {
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.container {
padding-inline: var(--space-4);
}
}
.section {
padding-block: var(--space-6);
}
@media (min-width: 768px) {
.section {
padding-block: var(--space-8);
}
}
.bg-linen {
background: var(--col-linen);
}
.bg-mist {
background: var(--col-mist);
}
.bg-graphite {
background: var(--col-graphite);
color: var(--col-white);
}
.bg-copper {
background: var(--col-copper);
color: var(--col-white);
}
/* =============================================================================
5. TYPOGRAPHY HELPERS
============================================================================= */
.section-eyebrow {
display: block;
font-family: var(--font-body);
font-weight: 500;
font-size: var(--text-xs);
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--col-copper);
margin: 0;
}
.display-title {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-4xl);
line-height: 1.1;
margin: 0;
}
@media (min-width: 1024px) {
.display-title {
font-size: var(--text-5xl);
}
}
.lead-text {
font-family: var(--font-body);
font-size: var(--text-lg);
line-height: 1.6;
color: var(--col-slate);
margin: 0;
}
/* Adapt lead-text for dark backgrounds */
.bg-graphite .lead-text {
color: rgba(255, 255, 255, 0.8);
}
.bg-copper .lead-text {
color: rgba(255, 255, 255, 0.85);
}
/* =============================================================================
6. NAVIGATION
============================================================================= */
.nav {
position: sticky;
top: 0;
z-index: 100;
background: var(--col-graphite);
height: var(--nav-height);
display: flex;
align-items: center;
transition: border-bottom 0.25s ease, box-shadow 0.25s ease;
}
/* Compact state when user has scrolled */
.nav--compact {
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.nav--compact .nav__inner {
/* Slightly tighter feel — height is fixed by .nav so only visual tweaks here */
padding-block: 0;
}
/* Inner row — full-height flex container */
.nav__inner {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
height: 100%;
}
@media (min-width: 768px) {
.nav__inner {
padding-inline: var(--space-4);
}
}
/* Brand / wordmark */
.nav__brand {
display: flex;
align-items: center;
gap: 0.6rem;
text-decoration: none;
transition: color 0.2s ease;
}
.nav__brand-her {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-2xl);
color: var(--col-copper);
letter-spacing: -0.01em;
line-height: 1;
flex-shrink: 0;
transition: color 0.2s ease;
}
.nav__brand-tagline {
font-family: var(--font-body);
font-size: 0.65rem;
font-weight: 500;
color: var(--col-copper);
line-height: 1.38;
border-left: 1px solid rgba(181, 98, 42, 0.35);
padding-left: 0.6rem;
transition: color 0.2s ease;
}
/* Georgia italic has a far more elegant ampersand than Fraunces at small sizes */
/* Shared elegant ampersand — applied via the styleAmp filter in headings
and directly in nav/footer brand markup */
.amp,
.nav__brand-amp,
.footer__brand-amp {
font-family: Georgia, 'Times New Roman', serif;
font-style: italic;
}
.nav__brand:hover .nav__brand-her,
.nav__brand:hover .nav__brand-tagline {
color: var(--col-copper-hover);
}
/* Desktop nav links — hidden on mobile */
.nav__links {
display: none;
list-style: none;
align-items: center;
gap: var(--space-4);
margin: 0;
padding: 0;
}
@media (min-width: 1024px) {
.nav__links {
display: flex;
}
}
.nav__links a {
font-family: var(--font-body);
font-weight: 500;
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.85);
text-decoration: none;
transition: color 0.2s ease;
}
.nav__links a:hover {
color: var(--col-white);
}
/* Action cluster (phone icon + hamburger) */
.nav__actions {
display: flex;
align-items: center;
gap: var(--space-2);
}
/* Phone icon link — visible on mobile as icon-only CTA */
.nav__phone {
display: flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
color: var(--col-copper);
text-decoration: none;
flex-shrink: 0;
border-radius: var(--radius-sm);
transition: color 0.2s ease;
}
.nav__phone:hover {
color: var(--col-copper-hover);
}
/* Hamburger toggle — 44×44 touch target */
.nav__toggle {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 5px;
width: 44px;
height: 44px;
padding: 0;
background: transparent;
border: none;
color: var(--col-white);
cursor: pointer;
flex-shrink: 0;
border-radius: var(--radius-sm);
}
/* The three bars drawn with child spans */
.nav__toggle-bar {
display: block;
width: 22px;
height: 2px;
background: currentColor;
border-radius: 2px;
transform-origin: center;
transition: transform 0.25s ease, opacity 0.25s ease, width 0.25s ease;
}
/* X state when menu is open */
.nav__toggle[aria-expanded="true"] .nav__toggle-bar:nth-child(1) {
transform: translateY(7px) rotate(45deg);
}
.nav__toggle[aria-expanded="true"] .nav__toggle-bar:nth-child(2) {
opacity: 0;
width: 0;
}
.nav__toggle[aria-expanded="true"] .nav__toggle-bar:nth-child(3) {
transform: translateY(-7px) rotate(-45deg);
}
/* Hide hamburger on desktop */
@media (min-width: 1024px) {
.nav__toggle {
display: none;
}
.nav__phone {
display: none;
}
}
/* Mobile overlay menu — fullscreen, centered links */
.nav__overlay {
display: none;
position: fixed;
inset: 0;
background: var(--col-graphite);
z-index: 99;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-4);
}
.nav__overlay.is-open {
display: flex;
}
.nav__overlay-links {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-3);
list-style: none;
margin: 0;
padding: 0;
}
.nav__overlay-links a {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-2xl);
color: var(--col-white);
text-decoration: none;
transition: color 0.2s ease;
}
.nav__overlay-links a:hover {
color: var(--col-copper);
}
/* Close button — positioned top-right, aligned with nav height */
.nav__overlay-close {
position: absolute;
top: calc((var(--nav-height) - 44px) / 2);
right: var(--space-2);
display: flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
background: transparent;
border: none;
color: var(--col-white);
cursor: pointer;
font-size: var(--text-xl);
border-radius: var(--radius-sm);
transition: color 0.2s ease;
}
.nav__overlay-close:hover {
color: var(--col-copper);
}
@media (min-width: 768px) {
.nav__overlay-close {
right: var(--space-4);
}
}
/* =============================================================================
7. BUTTONS
============================================================================= */
.btn {
display: inline-flex;
align-items: center;
gap: var(--space-1);
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-sm);
line-height: 1;
border-radius: var(--radius-md);
padding: 0.75rem 1.5rem;
border: 2px solid transparent;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
transition: background-color 0.2s ease,
border-color 0.2s ease,
color 0.2s ease,
box-shadow 0.2s ease;
}
.btn:focus-visible {
outline: 2px solid var(--col-copper);
outline-offset: 2px;
}
/* Primary — filled copper */
.btn--primary {
background: var(--col-copper);
color: var(--col-white);
border-color: var(--col-copper);
}
.btn--primary:hover {
background: var(--col-copper-hover);
border-color: var(--col-copper-hover);
}
/* Secondary — outlined copper */
.btn--secondary {
background: transparent;
color: var(--col-copper);
border-color: var(--col-copper);
}
.btn--secondary:hover {
background: rgba(181, 98, 42, 0.1);
}
/* Ghost white — for use on dark backgrounds */
.btn--ghost-white {
background: transparent;
color: var(--col-white);
border-color: rgba(255, 255, 255, 0.6);
}
.btn--ghost-white:hover {
background: rgba(255, 255, 255, 0.1);
border-color: var(--col-white);
}
/* Full-width variant */
.btn--full {
width: 100%;
justify-content: center;
}
/* =============================================================================
8. HERO (HOMEPAGE)
============================================================================= */
.hero {
background: var(--col-linen);
padding-top: calc(var(--nav-height) + var(--space-8));
padding-bottom: var(--space-8);
}
.hero__inner {
display: flex;
flex-direction: column;
gap: var(--space-6);
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.hero__inner {
padding-inline: var(--space-4);
}
}
@media (min-width: 1024px) {
.hero__inner {
display: grid;
grid-template-columns: 55% 45%;
align-items: stretch;
gap: var(--space-8);
flex-direction: unset;
}
}
.hero__content {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
@media (min-width: 1024px) {
.hero__content {
/* No extra padding — section handles outer breathing room.
Image will be exactly the natural height of the text stack. */
justify-content: flex-start;
}
}
.hero__actions {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
align-items: center;
}
.hero__contact {
display: flex;
align-items: center;
gap: var(--space-1);
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--col-slate);
}
.hero__contact a {
color: var(--col-slate);
text-decoration: none;
transition: color 0.2s ease;
}
.hero__contact a:hover {
color: var(--col-copper);
text-decoration: underline;
}
/* Image container — stacks below content on mobile, right column on desktop */
.hero__image {
width: 100%;
border-radius: var(--radius-lg);
overflow: hidden;
}
.hero__image img {
width: 100%;
border-radius: var(--radius-lg);
aspect-ratio: 3 / 4;
object-fit: cover;
object-position: top;
display: block;
}
@media (min-width: 1024px) {
.hero__image {
border-radius: var(--radius-lg);
}
.hero__image img {
/* Fill the content column height exactly; crop from the top
so only Diana's face and shoulders are visible. */
height: 100%;
object-position: center 8%;
aspect-ratio: unset;
border-radius: 0;
}
}
/* =============================================================================
9. SERVICES SECTION (HOMEPAGE)
============================================================================= */
.services-section {
background: var(--col-linen);
padding-block: var(--space-6);
}
@media (min-width: 768px) {
.services-section {
padding-block: var(--space-8);
}
}
.services-section__header {
text-align: center;
margin-bottom: var(--space-6);
}
.services-section__header .section-eyebrow {
margin-bottom: var(--space-2);
}
/* Grid: 2 cols mobile, 3 cols desktop */
.services-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
}
@media (min-width: 1024px) {
.services-grid {
grid-template-columns: repeat(3, 1fr);
}
}
/* Service card */
.service-card {
display: flex;
flex-direction: column;
background: var(--col-white);
border-radius: var(--radius-md);
overflow: hidden;
box-shadow: var(--shadow-card);
text-decoration: none;
color: inherit;
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.service-card:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(37, 43, 48, 0.14);
}
.service-card__image {
aspect-ratio: 4 / 3;
overflow: hidden;
}
.service-card__image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.35s ease;
}
.service-card:hover .service-card__image img {
transform: scale(1.03);
}
.service-card__body {
display: flex;
flex-direction: column;
flex: 1;
gap: var(--space-1);
padding: var(--space-3);
}
.service-card__name {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-base);
color: var(--col-ink);
margin: 0;
}
.service-card__desc {
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--col-slate);
flex: 1;
margin: 0;
}
.service-card__arrow {
color: var(--col-copper);
margin-top: auto;
align-self: flex-start;
font-size: var(--text-base);
line-height: 1;
padding-top: var(--space-1);
}
/* =============================================================================
10. WHY HER SECTION
============================================================================= */
.why-her {
background: var(--col-mist);
padding-block: var(--space-6);
}
@media (min-width: 768px) {
.why-her {
padding-block: var(--space-8);
}
}
.why-her__header {
text-align: center;
margin-bottom: var(--space-6);
}
.why-her__header .section-eyebrow {
margin-bottom: var(--space-2);
}
.why-her__grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-6);
}
@media (min-width: 1024px) {
.why-her__grid {
grid-template-columns: repeat(3, 1fr);
}
}
/* Trust pillar — centered on mobile, left-aligned on md+ */
.trust-pillar {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: var(--space-2);
}
@media (min-width: 768px) {
.trust-pillar {
align-items: flex-start;
text-align: left;
}
}
.trust-pillar__icon {
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
background: rgba(181, 98, 42, 0.1);
border-radius: 50%;
color: var(--col-copper);
flex-shrink: 0;
font-size: 1.25rem;
}
.trust-pillar__title {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-xl);
color: var(--col-ink);
margin: 0;
}
.trust-pillar__body {
font-family: var(--font-body);
font-size: var(--text-base);
color: var(--col-slate);
line-height: 1.6;
margin: 0;
}
/* =============================================================================
11. TESTIMONIALS STRIP (HOMEPAGE)
============================================================================= */
.testimonials-strip {
background: var(--col-linen);
padding-block: var(--space-6);
}
@media (min-width: 768px) {
.testimonials-strip {
padding-block: var(--space-8);
}
}
.testimonials-strip__header {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: var(--space-2);
margin-bottom: var(--space-6);
}
.testimonials-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-4);
}
@media (min-width: 768px) {
.testimonials-grid {
grid-template-columns: repeat(2, 1fr);
}
}
.testimonial-card {
background: var(--col-white);
border-radius: var(--radius-md);
padding: var(--space-4);
box-shadow: var(--shadow-card);
}
/* Decorative large opening quote mark */
.testimonial-card__quote {
position: relative;
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-lg);
line-height: 1.55;
color: var(--col-ink);
margin: 0 0 var(--space-3);
padding-top: 1.75rem;
}
.testimonial-card__quote::before {
content: '\201C';
position: absolute;
top: -0.5rem;
left: -0.125rem;
font-family: var(--font-display);
font-style: italic;
font-size: 5rem;
line-height: 1;
color: rgba(181, 98, 42, 0.18);
pointer-events: none;
user-select: none;
}
.testimonial-card__author {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-sm);
color: var(--col-copper);
margin: 0;
}
.testimonial-card__city {
font-family: var(--font-body);
font-size: var(--text-xs);
color: var(--col-slate);
margin: 0.125rem 0 0;
}
/* =============================================================================
12. SERVICE AREA SECTION (HOMEPAGE)
============================================================================= */
.service-area {
background: var(--col-graphite);
color: var(--col-white);
text-align: center;
padding: var(--space-8) 0;
}
.service-area__title {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-2xl);
color: var(--col-white);
margin: 0 0 var(--space-3);
}
.service-area__cities {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: var(--space-1) var(--space-2);
margin-top: var(--space-3);
}
.service-area__city {
font-family: var(--font-body);
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.7);
background: rgba(255, 255, 255, 0.08);
border-radius: var(--radius-sm);
padding: 0.25rem 0.75rem;
}
/* =============================================================================
13. CTA BAND
============================================================================= */
.cta-band {
background: var(--col-copper);
padding: var(--space-8) 0;
text-align: center;
}
.cta-band__inner {
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.cta-band__inner {
padding-inline: var(--space-4);
}
}
.cta-band__title {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-3xl);
color: var(--col-white);
line-height: 1.15;
margin: 0 0 var(--space-3);
}
@media (min-width: 1024px) {
.cta-band__title {
font-size: var(--text-4xl);
}
}
.cta-band__sub {
font-family: var(--font-body);
font-size: var(--text-lg);
color: rgba(255, 255, 255, 0.85);
margin: 0 0 var(--space-6);
}
/* =============================================================================
14. FOOTER
============================================================================= */
.footer {
background: var(--col-graphite);
color: rgba(255, 255, 255, 0.75);
padding: var(--space-8) 0 var(--space-4);
}
.footer__inner {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-6);
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.footer__inner {
padding-inline: var(--space-4);
}
}
@media (min-width: 1024px) {
.footer__inner {
grid-template-columns: 1fr 2fr 1fr;
}
}
.footer__brand {
display: flex;
align-items: center;
gap: 0.6rem;
text-decoration: none;
transition: color 0.2s ease;
}
.footer__brand-her {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-2xl);
color: var(--col-copper);
letter-spacing: -0.01em;
line-height: 1;
flex-shrink: 0;
transition: color 0.2s ease;
}
.footer__brand-tagline {
font-family: var(--font-body);
font-size: 0.65rem;
font-weight: 500;
color: var(--col-copper);
line-height: 1.38;
border-left: 1px solid rgba(181, 98, 42, 0.35);
padding-left: 0.6rem;
transition: color 0.2s ease;
}
/* .footer__brand-amp covered by shared .amp rule in section 6 (Navigation) */
.footer__brand:hover .footer__brand-her,
.footer__brand:hover .footer__brand-tagline {
color: var(--col-copper-hover);
}
.footer__nav-heading {
display: block;
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-xs);
text-transform: uppercase;
letter-spacing: 0.1em;
color: rgba(255, 255, 255, 0.4);
margin-bottom: var(--space-2);
}
.footer__nav-cols {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-4);
}
.footer__nav {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.footer__nav a {
font-family: var(--font-body);
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.75);
text-decoration: none;
transition: color 0.2s ease;
}
.footer__nav a:hover {
color: var(--col-white);
}
.footer__contact {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.footer__contact a {
font-family: var(--font-body);
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.75);
text-decoration: none;
transition: color 0.2s ease;
}
.footer__contact a:hover {
color: var(--col-white);
}
/* Bottom strip — copyright / legal */
.footer__bottom {
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin: var(--space-6) auto 0;
border-top: 1px solid rgba(255, 255, 255, 0.1);
padding-top: var(--space-4);
font-family: var(--font-body);
font-size: var(--text-xs);
color: rgba(255, 255, 255, 0.4);
text-align: center;
}
@media (min-width: 768px) {
.footer__bottom {
padding-inline: var(--space-4);
}
}
/* =============================================================================
15. INNER PAGE HERO
============================================================================= */
.page-hero {
background: var(--col-graphite);
color: var(--col-white);
padding-top: calc(var(--nav-height) + var(--space-2));
padding-bottom: var(--space-6);
}
.page-hero__inner {
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.page-hero__inner {
padding-inline: var(--space-4);
}
}
.page-hero__title {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-4xl);
color: var(--col-white);
line-height: 1.1;
margin-top: var(--space-2);
}
@media (min-width: 1024px) {
.page-hero__title {
font-size: var(--text-5xl);
}
}
.page-hero__lead {
font-family: var(--font-body);
font-size: var(--text-lg);
color: rgba(255, 255, 255, 0.8);
max-width: 640px;
margin-top: var(--space-3);
line-height: 1.6;
}
.page-hero__inner > .btn {
margin-top: var(--space-4);
}
/* =============================================================================
16. BREADCRUMB
============================================================================= */
.breadcrumb ol {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0 var(--space-1);
font-family: var(--font-body);
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.55);
}
.breadcrumb li {
display: flex;
align-items: center;
gap: var(--space-1);
}
.breadcrumb a {
color: rgba(255, 255, 255, 0.55);
text-decoration: none;
transition: color 0.2s ease;
}
.breadcrumb a:hover {
color: rgba(255, 255, 255, 0.85);
}
/* Separator injected between list items */
.breadcrumb li + li::before {
content: '/';
color: rgba(255, 255, 255, 0.3);
speak: none;
}
/* Current page */
.breadcrumb [aria-current] {
color: var(--col-white);
}
/* =============================================================================
17. SERVICE DETAIL PAGE
============================================================================= */
.service-detail {
padding: var(--space-8) 0;
}
/* Gallery grid — auto-adapts to image count via :has() where supported */
.service-detail__gallery {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-3);
margin-bottom: var(--space-8);
}
@media (min-width: 768px) {
.service-detail__gallery {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.service-detail__gallery {
grid-template-columns: repeat(3, 1fr);
}
/* When only 2 images, use 2 equal columns */
.service-detail__gallery:has(figure:nth-child(2):last-child) {
grid-template-columns: repeat(2, 1fr);
}
/* Single image — full width */
.service-detail__gallery:has(figure:only-child) {
grid-template-columns: 1fr;
}
}
.service-detail__gallery figure {
margin: 0;
overflow: hidden;
border-radius: var(--radius-md);
}
.service-detail__gallery figure img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
display: block;
}
.service-detail__body {
max-width: 720px;
}
.service-detail__body h2 {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-2xl);
color: var(--col-ink);
margin: 0 0 var(--space-3);
}
/* Checkmark list */
.service-detail__list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.service-detail__list li {
display: flex;
align-items: flex-start;
gap: var(--space-2);
font-family: var(--font-body);
font-size: var(--text-base);
color: var(--col-ink);
}
.service-detail__list li::before {
content: '\2713';
color: var(--col-copper);
font-weight: 700;
flex-shrink: 0;
margin-top: 0.1em;
}
/* Service area callout block */
.service-detail__area {
margin-top: var(--space-4);
padding: var(--space-3);
background: var(--col-mist);
border-radius: var(--radius-md);
border-left: 3px solid var(--col-copper);
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--col-slate);
}
.service-detail__cta,
.service-detail__body > .btn {
margin-top: var(--space-6);
}
/* =============================================================================
18. SERVICES HUB PAGE
============================================================================= */
.services-hub {
padding-block: var(--space-6);
}
@media (min-width: 768px) {
.services-hub {
padding-block: var(--space-8);
}
}
.services-hub__intro {
text-align: center;
max-width: 640px;
margin: 0 auto var(--space-8);
}
/* =============================================================================
19. ABOUT PAGE
============================================================================= */
.about-page {
padding: var(--space-8) 0;
}
/* Two-column layout on desktop: content 55%, image 45% */
.about-page__grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-8);
align-items: start;
width: 100%;
max-width: var(--max-width);
padding-inline: var(--space-2);
margin-inline: auto;
}
@media (min-width: 768px) {
.about-page__grid {
padding-inline: var(--space-4);
}
}
@media (min-width: 1024px) {
.about-page__grid {
grid-template-columns: 55% 45%;
}
}
.about-page__image img {
width: 100%;
border-radius: var(--radius-lg);
aspect-ratio: 3 / 4;
object-fit: cover;
object-position: top;
}
.about-page__content {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.about-page__bio {
font-family: var(--font-body);
font-size: var(--text-base);
line-height: 1.75;
color: var(--col-ink);
margin: 0;
}
.about-page__pullquote {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-2xl);
color: var(--col-copper);
line-height: 1.3;
border-left: 3px solid var(--col-copper);
padding-left: var(--space-4);
margin: var(--space-4) 0;
}
@media (min-width: 1024px) {
.about-page__pullquote {
font-size: var(--text-3xl);
}
}
/* =============================================================================
20. TESTIMONIALS PAGE
============================================================================= */
.testimonials-page {
padding: var(--space-8) 0;
}
.testimonials-page__grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-4);
}
@media (min-width: 768px) {
.testimonials-page__grid {
grid-template-columns: repeat(2, 1fr);
}
}
.testimonial-full {
background: var(--col-linen);
border-radius: var(--radius-md);
padding: var(--space-6);
}
.testimonial-full__quote {
font-family: var(--font-display);
font-style: italic;
font-size: var(--text-lg);
line-height: 1.6;
color: var(--col-ink);
margin: 0 0 var(--space-4);
}
.testimonial-full__author {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-base);
color: var(--col-copper);
margin: 0;
}
.testimonial-full__city {
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--col-slate);
margin: 0.125rem 0 0;
}
/* =============================================================================
21. CONTACT / FORM PAGE
============================================================================= */
.contact-page {
padding: var(--space-8) 0;
}
/* Two-column layout: form 60%, secondary info 40% */
.contact-page__grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-8);
align-items: start;
}
@media (min-width: 1024px) {
.contact-page__grid {
grid-template-columns: 60% 40%;
}
}
/* Secondary contact methods column */
.contact-secondary {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.contact-secondary__method {
display: flex;
align-items: flex-start;
gap: var(--space-3);
}
.contact-secondary__icon {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
background: var(--col-mist);
border-radius: 50%;
color: var(--col-copper);
flex-shrink: 0;
}
.contact-secondary__label {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-sm);
color: var(--col-ink);
display: block;
margin: 0 0 0.125rem;
}
.contact-secondary__value a {
font-family: var(--font-body);
font-size: var(--text-base);
color: var(--col-copper);
text-decoration: none;
transition: text-decoration 0.2s ease;
}
.contact-secondary__value a:hover {
text-decoration: underline;
}
/* =============================================================================
22. QUOTE FORM
============================================================================= */
.quote-form {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.form-field {
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.form-field label {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-sm);
color: var(--col-ink);
}
.form-field input,
.form-field select,
.form-field textarea {
width: 100%;
border: 1.5px solid var(--col-chalk);
border-radius: var(--radius-md);
padding: 0.75rem 1rem;
font-family: var(--font-body);
font-size: var(--text-base);
color: var(--col-ink);
background: var(--col-white);
appearance: none;
transition: border-color 0.2s ease, outline-color 0.2s ease;
}
.form-field input:focus,
.form-field select:focus,
.form-field textarea:focus {
border-color: var(--col-copper);
outline: 2px solid rgba(181, 98, 42, 0.3);
outline-offset: 0;
}
/* Input-specific */
.form-field input::placeholder,
.form-field textarea::placeholder {
color: rgba(26, 26, 26, 0.35);
}
/* Textarea sizing */
.form-field textarea {
min-height: 120px;
resize: vertical;
}
@media (min-width: 768px) {
.form-field textarea {
min-height: 160px;
}
}
/* Validation error state */
.form-field input[aria-invalid="true"],
.form-field select[aria-invalid="true"],
.form-field textarea[aria-invalid="true"] {
border-color: #C0392B;
}
.form-field input[aria-invalid="true"]:focus,
.form-field select[aria-invalid="true"]:focus,
.form-field textarea[aria-invalid="true"]:focus {
outline: 2px solid rgba(192, 57, 43, 0.3);
}
/* Inline error message — hidden until role="alert" is set */
.form-field__error {
font-family: var(--font-body);
font-size: var(--text-sm);
color: #C0392B;
margin: 0;
display: none;
}
.form-field__error[role="alert"] {
display: block;
}
/* Hint text */
.form-field__hint {
font-family: var(--font-body);
font-size: var(--text-sm);
color: var(--col-slate);
margin: 0;
}
/* Character counter */
.form-field__char-count {
font-family: var(--font-body);
font-size: var(--text-xs);
color: var(--col-slate);
text-align: right;
margin: 0;
}
.form-field__char-count.warn {
color: #B7791F;
}
/* Submit row — full width on mobile, auto-width on md+ */
.form__submit {
margin-top: var(--space-2);
}
.form__submit .btn {
width: 100%;
justify-content: center;
}
@media (min-width: 768px) {
.form__submit .btn {
width: auto;
min-width: 200px;
}
}
/* Form-level error banner — hidden until role="alert" present */
.form-error-banner {
background: #FEF2F2;
border: 1px solid #FECACA;
border-radius: var(--radius-md);
padding: var(--space-3);
font-family: var(--font-body);
font-size: var(--text-sm);
color: #991B1B;
margin-bottom: var(--space-4);
display: none;
}
.form-error-banner[role="alert"] {
display: block;
}
/* Success confirmation — hidden until .is-visible is toggled */
.form-success {
display: none;
background: var(--col-mist);
border-radius: var(--radius-md);
padding: var(--space-6);
text-align: center;
}
.form-success.is-visible {
display: block;
}
.form-success__icon {
display: flex;
align-items: center;
justify-content: center;
width: 64px;
height: 64px;
background: rgba(181, 98, 42, 0.1);
border-radius: 50%;
color: var(--col-copper);
font-size: 2rem;
margin: 0 auto var(--space-4);
}
.form-success__title {
font-family: var(--font-body);
font-weight: 600;
font-size: var(--text-2xl);
color: var(--col-ink);
margin: 0 0 var(--space-2);
}
.form-success__body {
font-family: var(--font-body);
font-size: var(--text-base);
color: var(--col-slate);
line-height: 1.6;
margin: 0;
}
/* =============================================================================
23. VISUALLY HIDDEN / HONEYPOT
============================================================================= */
/* Accessible screen-reader-only text */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
}
/* Spam-trap field — never shown, never submitted by real users */
.visually-trap {
position: absolute;
opacity: 0;
pointer-events: none;
width: 0;
height: 0;
overflow: hidden;
}
/* =============================================================================
24. ANIMATION
============================================================================= */
/* All motion-based transitions respect the user's OS preference */
@media (prefers-reduced-motion: no-preference) {
/* Scroll-triggered fade-up reveal */
.fade-up {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s ease, transform 0.5s ease;
}
.fade-up.is-visible {
opacity: 1;
transform: translateY(0);
}
/* Button scale on hover */
.btn--primary:hover {
transform: scale(1.02);
}
/* Nav compact transition — smooth border/shadow appearance */
.nav {
transition: border-bottom 0.25s ease, box-shadow 0.25s ease;
}
/* Service card lift */
.service-card {
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.service-card:hover {
transform: translateY(-2px);
}
/* Image scale inside service card */
.service-card__image img {
transition: transform 0.35s ease;
}
/* Hamburger bar animation */
.nav__toggle-bar {
transition: transform 0.25s ease, opacity 0.25s ease, width 0.25s ease;
}
}
/* Hard-stop all animations for motion-sensitive users */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
/* Ensure fade-up elements are always visible */
.fade-up {
opacity: 1;
transform: none;
}
}