tischlerei-staffenberger/css/style.css
mrwhiski b74dd3744e Fix SEO/a11y issues, add Impressum UID, stop tracking raw photos
- Use absolute og:image URLs and add missing og:description on Impressum
- Load Google Fonts via <link> instead of blocking @import
- Prevent default on shop request button to avoid stray URL hash
- Guard optimize-images.js against silent filename collisions
- Add real Umsatzsteuer-Identifikationsnummer (UID) to Impressum
- Correct README's shop description to match actual empty state
- Stop tracking images/fotowebsite/ (raw, uncompressed source photos)
  since only images/optimized/ is served by the site
2026-08-25 21:48:57 +02:00

719 lines
15 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.

/* ============================================
Tischlerei Staffenberger - Main Stylesheet
Traditional, warm, responsive design
============================================ */
/* Google Fonts are loaded via <link rel="preconnect"/stylesheet"> in each page's <head> */
/* --- CSS Custom Properties --- */
:root {
/* Warm wood & earth tones */
--color-wood-dark: #3d2914;
--color-wood-medium: #5c4033;
--color-wood-light: #8b7355;
--color-beige: #e8dfd4;
--color-beige-light: #f5f0e8;
--color-cream: #faf8f5;
/* Accent */
--color-accent: #2d4a3e;
--color-accent-hover: #3d5a4e;
/* Neutrals */
--color-text: #2c2419;
--color-text-muted: #5a5248;
--color-border: #d4c9bc;
/* Typography */
--font-heading: 'Cormorant Garamond', Georgia, serif;
--font-body: 'Source Sans 3', 'Segoe UI', sans-serif;
/* Spacing & layout */
--max-width: 960px;
--spacing-xs: 0.5rem;
--spacing-sm: 1rem;
--spacing-md: 1.5rem;
--spacing-lg: 2rem;
--spacing-xl: 3rem;
--radius: 4px;
--shadow: 0 2px 8px rgba(61, 41, 20, 0.08);
}
/* --- Reset & Base --- */
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: var(--font-body);
font-size: 1rem;
line-height: 1.6;
color: var(--color-text);
background-color: var(--color-cream);
}
img {
max-width: 100%;
height: auto;
display: block;
}
a {
color: var(--color-accent);
text-decoration: none;
}
a:hover {
color: var(--color-accent-hover);
text-decoration: underline;
}
/* --- Layout wrapper --- */
.layout {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 var(--spacing-md);
}
/* ============================================
Header & Hero Banner (widescreen image)
============================================ */
.site-header {
position: relative;
color: var(--color-beige);
border-bottom: 3px solid var(--color-wood-light);
}
/* Full-width hero image container; fixed aspect/height for responsive look */
.hero-banner {
position: relative;
width: 100%;
min-height: 40vh;
max-height: 60vh;
height: 50vh;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: space-between;
}
/* Background image: carpentry/woodworking – optimized WebP with JPEG fallback */
.hero-banner .hero-image {
position: absolute;
inset: 0;
background-image: url('../images/optimized/banner-1920w.jpg');
background-image: image-set(
url('../images/optimized/banner-1920w.webp') type('image/webp'),
url('../images/optimized/banner-1920w.jpg') type('image/jpeg')
);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
@media (max-width: 640px) {
.hero-banner .hero-image {
background-image: url('../images/optimized/banner-800w.jpg');
background-image: image-set(
url('../images/optimized/banner-800w.webp') type('image/webp'),
url('../images/optimized/banner-800w.jpg') type('image/jpeg')
);
}
}
/* Dark overlay so title and nav stay readable */
.hero-banner .hero-overlay {
position: absolute;
inset: 0;
background: rgba(45, 33, 20, 0.5);
pointer-events: none;
}
/* Logo above title in hero banner */
.hero-logo {
width: clamp(60px, 9vw, 90px);
height: auto;
margin: 0 auto var(--spacing-sm);
filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.4));
}
/* Centered title and subtitle on top of the image */
.hero-text {
position: relative;
z-index: 1;
text-align: center;
padding: var(--spacing-xl) var(--spacing-md) var(--spacing-md);
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
}
.hero-text h1 {
margin: 0;
font-family: var(--font-heading);
font-size: clamp(1.75rem, 4vw, 2.5rem);
font-weight: 700;
letter-spacing: 0.02em;
color: var(--color-beige-light);
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.hero-text .hero-subtitle {
margin: var(--spacing-xs) 0 0;
font-size: clamp(0.9rem, 2vw, 1.05rem);
color: var(--color-beige);
opacity: 0.95;
font-weight: 400;
}
/* Main Navigation at bottom of banner */
.hero-banner .main-nav {
position: relative;
z-index: 1;
margin-top: 0;
}
.main-nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0;
border-top: 1px solid rgba(232, 223, 212, 0.25);
background: rgba(45, 33, 20, 0.4);
}
.main-nav li {
margin: 0;
}
.main-nav a {
display: block;
padding: var(--spacing-sm) var(--spacing-md);
color: var(--color-beige);
text-decoration: none;
font-weight: 500;
transition: background-color 0.2s ease, color 0.2s ease;
}
.main-nav a:hover {
background-color: rgba(255, 255, 255, 0.1);
color: var(--color-beige-light);
text-decoration: none;
}
.main-nav a.active {
background-color: var(--color-accent);
color: var(--color-beige-light);
}
/* ============================================
Main content area
============================================ */
main {
padding: var(--spacing-xl) 0;
min-height: 50vh;
}
main .layout {
padding: 0 var(--spacing-md);
}
/* --- Typography in content --- */
h2 {
font-family: var(--font-heading);
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 600;
color: var(--color-wood-dark);
margin: 0 0 var(--spacing-md);
border-bottom: 2px solid var(--color-border);
padding-bottom: var(--spacing-xs);
}
h3 {
font-family: var(--font-heading);
font-size: 1.25rem;
font-weight: 600;
color: var(--color-wood-medium);
margin: 0 0 var(--spacing-sm);
}
/* ============================================
Landing page sections
============================================ */
.hero {
text-align: center;
padding: var(--spacing-lg) 0;
background: var(--color-beige-light);
border-radius: var(--radius);
margin-bottom: var(--spacing-xl);
border: 1px solid var(--color-border);
}
.hero h2 {
border: none;
margin-bottom: var(--spacing-sm);
}
.hero p {
margin: 0;
max-width: 36em;
margin-left: auto;
margin-right: auto;
color: var(--color-text-muted);
}
.section {
margin-bottom: var(--spacing-xl);
}
.section p {
margin: 0 0 var(--spacing-sm);
color: var(--color-text-muted);
}
/* --- Services grid --- */
.services-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: var(--spacing-lg);
margin-top: var(--spacing-md);
}
.service-card {
background: var(--color-beige-light);
border: 1px solid var(--color-border);
border-radius: var(--radius);
padding: var(--spacing-lg);
transition: box-shadow 0.2s ease;
}
.service-card:hover {
box-shadow: var(--shadow);
}
.service-card h3 {
margin-top: 0;
}
/* --- CTA --- */
.cta-section {
text-align: center;
padding: var(--spacing-xl) 0;
}
.btn {
display: inline-block;
padding: var(--spacing-sm) var(--spacing-lg);
font-family: var(--font-body);
font-size: 1rem;
font-weight: 600;
color: var(--color-beige-light);
background-color: var(--color-accent);
border: none;
border-radius: var(--radius);
cursor: pointer;
text-decoration: none;
transition: background-color 0.2s ease;
}
.btn:hover {
background-color: var(--color-accent-hover);
text-decoration: none;
color: var(--color-beige-light);
}
/* ============================================
Pictures / Gallery page
============================================ */
.gallery-header {
margin-bottom: var(--spacing-lg);
}
.gallery-filters {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-sm);
margin-bottom: var(--spacing-lg);
justify-content: center;
}
.gallery-filters button {
padding: var(--spacing-xs) var(--spacing-md);
font-family: var(--font-body);
font-size: 0.95rem;
font-weight: 500;
color: var(--color-wood-medium);
background: var(--color-beige-light);
border: 1px solid var(--color-border);
border-radius: var(--radius);
cursor: pointer;
transition: background-color 0.2s ease, color 0.2s ease;
}
.gallery-filters button:hover,
.gallery-filters button.active {
background: var(--color-accent);
color: var(--color-beige-light);
border-color: var(--color-accent);
}
.gallery-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--spacing-md);
}
.gallery-item {
border-radius: var(--radius);
overflow: hidden;
border: 1px solid var(--color-border);
background: var(--color-beige-light);
}
.gallery-item img {
width: 100%;
aspect-ratio: 4/3;
object-fit: cover;
}
.gallery-item figcaption {
display: none; /* Hide gallery item captions (file names/descriptions) */
padding: var(--spacing-sm);
font-size: 0.9rem;
color: var(--color-text-muted);
text-align: center;
}
/* Clickable gallery image (cursor + no drag) */
.gallery-item .gallery-image-link {
display: block;
cursor: pointer;
line-height: 0;
}
.gallery-item .gallery-image-link img {
pointer-events: none;
}
/* ============================================
Lightbox / Modal (Bilder page)
============================================ */
.lightbox {
display: none;
position: fixed;
inset: 0;
z-index: 1000;
align-items: center;
justify-content: center;
padding: var(--spacing-md);
background: rgba(0, 0, 0, 0.85);
opacity: 0;
transition: opacity 0.2s ease;
}
.lightbox.is-open {
display: flex;
opacity: 1;
}
.lightbox-backdrop {
position: absolute;
inset: 0;
cursor: pointer;
}
.lightbox-content {
position: relative;
z-index: 1;
max-width: 90vw;
max-height: 85vh;
display: flex;
align-items: center;
justify-content: center;
}
.lightbox-content img {
max-width: 100%;
max-height: 85vh;
width: auto;
height: auto;
object-fit: contain;
border-radius: var(--radius);
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
}
/* Prev / Next navigation buttons */
.lightbox-prev,
.lightbox-next {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 2;
width: 3rem;
height: 3rem;
padding: 0;
font-size: 2.5rem;
line-height: 1;
color: var(--color-beige);
background: rgba(45, 33, 20, 0.55);
border: 1px solid rgba(232, 223, 212, 0.25);
border-radius: var(--radius);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s ease;
user-select: none;
}
.lightbox-prev:hover,
.lightbox-next:hover {
background: var(--color-accent);
}
.lightbox-prev { left: var(--spacing-sm); }
.lightbox-next { right: var(--spacing-sm); }
.lightbox-prev[hidden],
.lightbox-next[hidden] { display: none; }
/* Close button (X) */
.lightbox-close {
position: absolute;
top: -2.5rem;
right: 0;
width: 2.25rem;
height: 2.25rem;
padding: 0;
font-size: 1.5rem;
line-height: 1;
color: var(--color-beige);
background: var(--color-wood-medium);
border: 1px solid var(--color-border);
border-radius: var(--radius);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s ease;
}
.lightbox-close:hover {
background: var(--color-accent);
color: var(--color-beige-light);
}
/* ============================================
Shop page
============================================ */
.shop-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: var(--spacing-lg);
}
.shop-empty-message {
margin: var(--spacing-lg) 0 0;
text-align: center;
color: var(--color-text-muted);
font-size: 1.05rem;
}
.product-card {
background: var(--color-beige-light);
border: 1px solid var(--color-border);
border-radius: var(--radius);
overflow: hidden;
display: flex;
flex-direction: column;
transition: box-shadow 0.2s ease;
}
.product-card:hover {
box-shadow: var(--shadow);
}
.product-card .product-image {
aspect-ratio: 1;
object-fit: cover;
width: 100%;
background: var(--color-beige);
}
.product-card .product-body {
padding: var(--spacing-md);
flex: 1;
display: flex;
flex-direction: column;
}
.product-card h3 {
margin: 0 0 var(--spacing-xs);
font-size: 1.15rem;
}
.product-card .product-desc {
font-size: 0.9rem;
color: var(--color-text-muted);
margin: 0 0 var(--spacing-sm);
flex: 1;
}
.product-card .product-price {
font-weight: 600;
color: var(--color-wood-dark);
margin-bottom: var(--spacing-sm);
}
.product-card .btn {
margin-top: auto;
text-align: center;
}
/* ============================================
Impressum page
============================================ */
.impressum-content {
max-width: 640px;
}
.impressum-content section {
margin-bottom: var(--spacing-lg);
}
.impressum-content h2 {
font-size: 1.35rem;
margin-bottom: var(--spacing-sm);
}
.impressum-content p,
.impressum-content address {
margin: 0 0 var(--spacing-sm);
color: var(--color-text-muted);
font-style: normal;
}
.impressum-content address {
line-height: 1.7;
}
/* ============================================
Footer
============================================ */
.site-footer {
background: var(--color-wood-medium);
color: var(--color-beige);
padding: var(--spacing-lg) var(--spacing-md);
margin-top: auto;
}
.site-footer .layout {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: var(--spacing-md);
}
.site-footer a {
color: var(--color-beige);
}
.site-footer a:hover {
color: var(--color-beige-light);
text-decoration: underline;
}
.footer-contact {
font-size: 0.95rem;
}
.footer-logo {
width: 48px;
height: auto;
margin-bottom: var(--spacing-xs);
opacity: 0.8;
}
.footer-contact p {
margin: 0;
}
.footer-links {
display: flex;
gap: var(--spacing-md);
}
.footer-links a {
text-decoration: none;
}
.footer-links a:hover {
text-decoration: underline;
}
/* ============================================
Page title (inner pages)
============================================ */
.page-title {
font-family: var(--font-heading);
font-size: clamp(1.5rem, 3vw, 2rem);
color: var(--color-wood-dark);
margin: 0 0 var(--spacing-lg);
border-bottom: 2px solid var(--color-border);
padding-bottom: var(--spacing-sm);
}
/* ============================================
Responsive adjustments
============================================ */
@media (max-width: 640px) {
.hero-banner {
min-height: 35vh;
max-height: 55vh;
height: 45vh;
}
.hero-text {
padding: var(--spacing-md);
}
.main-nav ul {
flex-direction: column;
}
.main-nav a {
text-align: center;
border-bottom: 1px solid rgba(232, 223, 212, 0.15);
}
.lightbox-close {
top: var(--spacing-sm);
right: var(--spacing-sm);
}
.site-footer .layout {
flex-direction: column;
text-align: center;
}
.footer-links {
justify-content: center;
}
.gallery-grid {
grid-template-columns: 1fr;
}
.shop-grid {
grid-template-columns: 1fr;
}
}