Connect With Us

Talk to a Friendly Arctic Peer

Got a logistical puzzle about your upcoming winter itinerary? Wondering if you really need heavy snow bibs for February, or whether renting a two-wheel drive in Kittilä is a mistake? Write us a line. We reply as real people who spend months living in sub-zero snow.

Send a Field Inquiry

Fill out the fields below and our editorial desk will get back to you within two working days.

Registered Office

Operating Entity

Storyporch Arctic Ventures Oy

Business Registration ID

FI-2983412-8

Postal & Registered Address

Koskikatu 14 B
96200 Rovaniemi, Lapland
Finland

Direct Inquiries

[email protected]

Arctic Location Map 66.5039° N, 25.7294° E
Rovaniemi Core ARCTIC CIRCLE • 66° 33′ N

Our registered base sits on the banks of the Kemijoki River in Rovaniemi, just eight kilometers south of the Arctic Circle marker.

===ENDFILE=== ===FILE: styles.css=== /* ========================================================================== LAPLAND ADVENTURES — SOFT ARCTIC MODERN DESIGN SYSTEM Brand: storyporchfreshsgn.pics Year: 2026 ========================================================================== */ :root { /* Core Arctic Palette */ --c-polar-night: #101820; --c-deep-arctic: #162B35; --c-fjord-slate: #294650; --c-glacier-blue: #6FA6B2; --c-frozen-mist: #BFD5D8; --c-aurora-mint: #83C7B5; --c-aurora-lilac: #9D91C8; --c-winter-rose: #C98E9D; --c-ice-gold: #D6B36A; --c-birch-cream: #F0EEE7; --c-snow-white: #FAFBF9; --c-soft-stone: #D8D9D5; --c-arctic-ink: #172126; /* Semantic Typography & Surfaces */ --bg-primary: #FAFBF9; --bg-surface: rgba(255, 255, 255, 0.82); --bg-surface-elevated: #FAFBF9; --bg-dark-section: #101820; --text-main: #172126; --text-muted: #294650; --text-light: #FAFBF9; --text-light-muted: #BFD5D8; --border-subtle: rgba(41, 70, 80, 0.14); --border-dark-subtle: rgba(191, 213, 216, 0.16); --shadow-soft: 0 10px 30px -8px rgba(16, 24, 32, 0.08); --shadow-medium: 0 16px 40px -12px rgba(16, 24, 32, 0.14); /* Spacing Scale (4, 8, 16, 24, 40, 64) */ --space-4: 4px; --space-8: 8px; --space-16: 16px; --space-24: 24px; --space-40: 40px; --space-64: 64px; /* Radii */ --radius-sm: 8px; --radius-md: 16px; --radius-card: 24px; --radius-pill: 999px; /* Typography */ --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; --line-height-body: 1.65; --line-height-heading: 1.25; } /* Base Reset & Box Sizing */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 100%; scroll-behavior: smooth; background-color: var(--bg-primary); color: var(--text-main); text-rendering: optimizeLegibility; } body { font-family: var(--font-family); font-size: 1.0625rem; line-height: var(--line-height-body); background-color: var(--bg-primary); color: var(--text-main); min-height: 100vh; display: flex; flex-direction: column; } /* Responsive safety rules */ img, svg, picture { display: block; max-width: 100%; height: auto; } h1, h2, h3, h4, h5, h6, .brand-text, .brand-link, nav, p, a { overflow-wrap: anywhere; } /* Accessibility Focus States */ :focus-visible { outline: 3px solid var(--c-aurora-mint); outline-offset: 3px; } /* Global Container */ .container { width: 100%; max-width: 1160px; margin-left: auto; margin-right: auto; padding-left: var(--space-24); padding-right: var(--space-24); min-width: 0; } .text-container { max-width: 820px; } /* ========================================================================== HEADER (Non-Sticky, 56-64px desktop, 48-52px mobile) ========================================================================== */ .site-header { position: static; /* Strictly non-sticky per spec */ height: 64px; background: var(--c-polar-night); border-bottom: 1px solid var(--border-dark-subtle); display: flex; align-items: center; z-index: 100; } .header-inner { width: 100%; max-width: 1160px; margin: 0 auto; padding: 0 var(--space-24); display: flex; align-items: center; justify-content: space-between; height: 100%; } .brand-link { display: inline-flex; align-items: center; gap: var(--space-8); text-decoration: none; color: var(--text-light); font-weight: 700; font-size: 1.05rem; letter-spacing: -0.01em; background: transparent; } .brand-mark { flex-shrink: 0; } .brand-text { color: var(--text-light); } .primary-nav { display: flex; align-items: center; } .nav-list { list-style: none; display: flex; align-items: center; gap: var(--space-24); } .nav-link { color: var(--c-frozen-mist); text-decoration: none; font-size: 0.95rem; font-weight: 500; transition: color 0.2s ease; } .nav-link:hover { color: var(--c-aurora-mint); } .nav-link.is-current { color: var(--text-light); border-bottom: 2px solid var(--c-aurora-mint); padding-bottom: 2px; } .mobile-cta-item { display: none; } .header-cta-slot { display: block; } .nav-toggle { display: none; background: transparent; border: 1px solid var(--border-dark-subtle); border-radius: var(--radius-sm); padding: var(--space-8); cursor: pointer; } .hamburger-line { display: block; width: 20px; height: 2px; background-color: var(--text-light); margin: 4px 0; transition: transform 0.2s ease, opacity 0.2s ease; } /* ========================================================================== BUTTON SYSTEM ========================================================================== */ .button { display: inline-flex; align-items: center; justify-content: center; padding: 10px 22px; border-radius: var(--radius-pill); font-size: 0.95rem; font-weight: 600; text-decoration: none; border: 1px solid transparent; cursor: pointer; transition: background-color 0.2s ease, transform 0.15s ease, border-color 0.2s ease; } .button:hover { transform: translateY(-1px); } .button-header { background-color: rgba(131, 199, 181, 0.12); color: var(--c-aurora-mint); border-color: rgba(131, 199, 181, 0.35); padding: 8px 18px; font-size: 0.88rem; } .button-header:hover { background-color: var(--c-aurora-mint); color: var(--c-polar-night); } .button-primary { background-color: var(--c-deep-arctic); color: var(--text-light); border-color: var(--c-deep-arctic); } .button-primary:hover { background-color: var(--c-polar-night); border-color: var(--c-polar-night); } .button-secondary { background-color: var(--c-birch-cream); color: var(--c-arctic-ink); border-color: var(--c-soft-stone); } .button-secondary:hover { background-color: #E6E4DC; } .button-accent { background-color: var(--c-aurora-mint); color: var(--c-polar-night); } .button-accent:hover { background-color: #72B8A6; } /* ========================================================================== CRITICAL IMAGE / CONTENT SEPARATION SPECIFICATION Non-negotiable rule: TEXT MUST NEVER SIT DIRECTLY OVER AN IMAGE. Structure: IMAGE -> CLEAR 24-40px SPACING -> SEPARATE CONTENT PANEL ========================================================================== */ .card-spacing-gap { height: 32px; /* Preferred separation 32px (within 24-40px window) */ width: 100%; } /* Hero Section */ .hero-section { padding-top: var(--space-40); padding-bottom: var(--space-64); background: linear-gradient(180deg, #F0EEE7 0%, #FAFBF9 100%); } .hero-visual-frame { border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-medium); background-color: var(--c-deep-arctic); } .hero-image { width: 100%; height: 480px; object-fit: cover; display: block; } .hero-content-panel { background: rgba(255, 255, 255, 0.94); backdrop-filter: blur(8px); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-40); box-shadow: var(--shadow-soft); max-width: 960px; margin-left: auto; margin-right: auto; } .eyebrow-badge { display: inline-block; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 700; color: var(--c-fjord-slate); background-color: rgba(111, 166, 178, 0.16); padding: 4px 12px; border-radius: var(--radius-pill); margin-bottom: var(--space-16); } .hero-heading { font-size: clamp(2rem, 4vw, 3.2rem); line-height: 1.15; color: var(--c-polar-night); margin-bottom: var(--space-16); font-weight: 800; } .hero-lead { font-size: 1.2rem; line-height: 1.6; color: var(--c-fjord-slate); margin-bottom: var(--space-16); } .hero-sub { font-size: 1.05rem; line-height: 1.65; color: var(--text-muted); margin-bottom: var(--space-24); } .hero-actions { display: flex; gap: var(--space-16); flex-wrap: wrap; } /* Topics Grid */ .topics-section { padding-top: var(--space-64); padding-bottom: var(--space-64); } .section-intro { text-align: center; max-width: 720px; margin: 0 auto var(--space-40) auto; } .section-heading { font-size: clamp(1.8rem, 3vw, 2.4rem); color: var(--c-polar-night); line-height: var(--line-height-heading); margin-bottom: var(--space-16); font-weight: 700; } .section-description { font-size: 1.1rem; color: var(--c-fjord-slate); } .topics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: var(--space-40); } /* Separation-First Card Architecture */ .polar-card { display: flex; flex-direction: column; min-width: 0; } .card-media { border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-soft); background-color: var(--c-deep-arctic); } .card-img { width: 100%; height: 240px; object-fit: cover; transition: transform 0.3s ease; } .polar-card:hover .card-img { transform: scale(1.02); } .card-content-panel { background: rgba(255, 255, 255, 0.88); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-24); box-shadow: var(--shadow-soft); display: flex; flex-direction: column; flex-grow: 1; } .card-tag { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--c-glacier-blue); margin-bottom: var(--space-8); } .card-title { font-size: 1.4rem; color: var(--c-polar-night); margin-bottom: var(--space-16); line-height: 1.3; } .card-copy { font-size: 0.98rem; color: var(--c-fjord-slate); margin-bottom: var(--space-16); flex-grow: 1; } .card-meta-list { display: flex; flex-wrap: wrap; gap: var(--space-8); margin-bottom: var(--space-16); } .meta-item { font-size: 0.8rem; background-color: var(--c-birch-cream); color: var(--c-fjord-slate); padding: 3px 10px; border-radius: var(--radius-pill); } .card-link { font-size: 0.95rem; font-weight: 700; color: var(--c-fjord-slate); text-decoration: none; transition: color 0.2s ease, transform 0.2s ease; display: inline-flex; align-items: center; gap: 4px; } .card-link:hover { color: var(--c-deep-arctic); transform: translateX(3px); } /* Travel Ethos Section */ .travel-ethos-section { padding-top: var(--space-40); padding-bottom: var(--space-64); background-color: var(--c-birch-cream); } .ethos-card { display: flex; flex-direction: column; } .ethos-media { border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-soft); } .ethos-image { width: 100%; height: 380px; object-fit: cover; } .ethos-content { background: var(--bg-surface-elevated); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-40); box-shadow: var(--shadow-soft); } .ethos-title { font-size: clamp(1.6rem, 2.5vw, 2.2rem); color: var(--c-polar-night); margin-bottom: var(--space-16); } .ethos-text { font-size: 1.08rem; line-height: 1.7; color: var(--c-fjord-slate); margin-bottom: var(--space-24); } .pillars-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-24); } .pillar-box { background: var(--c-birch-cream); padding: var(--space-24); border-radius: var(--radius-md); } .pillar-heading { font-size: 1.15rem; color: var(--c-polar-night); margin-bottom: var(--space-8); } .pillar-copy { font-size: 0.95rem; color: var(--c-fjord-slate); } /* Planning Tips Section */ .planning-tips-section { padding-top: var(--space-64); padding-bottom: var(--space-64); } .tips-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--space-24); } .tip-card { background: var(--c-snow-white); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-24); box-shadow: var(--shadow-soft); } .tip-number { font-size: 1.8rem; font-weight: 800; color: var(--c-glacier-blue); display: block; margin-bottom: var(--space-8); } .tip-title { font-size: 1.18rem; color: var(--c-polar-night); margin-bottom: var(--space-12); } .tip-body { font-size: 0.95rem; color: var(--c-fjord-slate); line-height: 1.6; } /* CTA Banner Section */ .cta-banner-section { padding-bottom: var(--space-64); } .cta-banner-box { background: linear-gradient(135deg, var(--c-polar-night) 0%, var(--c-deep-arctic) 100%); color: var(--text-light); border-radius: var(--radius-card); padding: var(--space-40); display: flex; align-items: center; justify-content: space-between; gap: var(--space-24); flex-wrap: wrap; } .cta-text-side { max-width: 680px; } .cta-banner-title { font-size: clamp(1.6rem, 2.5vw, 2rem); margin-bottom: var(--space-8); color: var(--text-light); } .cta-banner-lead { font-size: 1.05rem; color: var(--c-frozen-mist); } /* ========================================================================== SUB-PAGE EDITORIAL SYSTEM ========================================================================== */ .page-intro-section { padding-top: var(--space-40); padding-bottom: var(--space-40); background: linear-gradient(180deg, #F0EEE7 0%, #FAFBF9 100%); } .intro-media-frame { border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-medium); background-color: var(--c-deep-arctic); } .intro-image { width: 100%; height: 420px; object-fit: cover; } .intro-content-panel { background: rgba(255, 255, 255, 0.94); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-40); box-shadow: var(--shadow-soft); max-width: 900px; margin: 0 auto; } .page-title { font-size: clamp(1.9rem, 3.5vw, 2.8rem); color: var(--c-polar-night); line-height: 1.2; margin-bottom: var(--space-16); font-weight: 800; } .page-lead { font-size: 1.18rem; line-height: 1.65; color: var(--c-fjord-slate); margin-bottom: var(--space-16); font-weight: 500; } .page-body { font-size: 1.05rem; line-height: 1.7; color: var(--text-muted); } /* Content Body */ .content-body-section { padding-top: var(--space-40); padding-bottom: var(--space-64); } .content-body-section h2 { font-size: 1.75rem; color: var(--c-polar-night); margin-top: var(--space-40); margin-bottom: var(--space-16); line-height: 1.3; } .content-body-section h3 { font-size: 1.35rem; color: var(--c-deep-arctic); margin-top: var(--space-24); margin-bottom: var(--space-12); } .content-body-section p { font-size: 1.05rem; line-height: 1.75; color: var(--text-main); margin-bottom: var(--space-16); } .content-body-section ul, .content-body-section ol { margin-left: var(--space-24); margin-bottom: var(--space-24); } .content-body-section li { font-size: 1.02rem; line-height: 1.7; margin-bottom: var(--space-8); color: var(--text-main); } /* Callouts & Checklists */ .info-callout { background: rgba(111, 166, 178, 0.12); border-left: 4px solid var(--c-glacier-blue); border-radius: 0 var(--radius-md) var(--radius-md) 0; padding: var(--space-24); margin: var(--space-24) 0; } .callout-title { font-size: 1.15rem; color: var(--c-deep-arctic); margin-bottom: var(--space-8); } .callout-text { font-size: 0.98rem; line-height: 1.65; color: var(--c-fjord-slate); margin-bottom: 0 !important; } .checklist-box { background: var(--c-birch-cream); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-24); margin: var(--space-40) 0; } .checklist-title { font-size: 1.3rem; color: var(--c-polar-night); margin-bottom: var(--space-16); } .checklist-items { list-style: none; margin: 0 !important; } .checklist-items li { position: relative; padding-left: 28px; margin-bottom: var(--space-12); font-size: 0.98rem; color: var(--c-arctic-ink); } .checklist-items li::before { content: "✓"; position: absolute; left: 0; top: 0; font-weight: bold; color: var(--c-aurora-mint); } /* Separated Mid-Page Feature Card */ .feature-block { margin: var(--space-40) 0; } .feature-media { border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-soft); } .feature-img { width: 100%; height: 320px; object-fit: cover; } .feature-panel { background: var(--c-snow-white); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-24); box-shadow: var(--shadow-soft); } .feature-heading { font-size: 1.4rem; color: var(--c-polar-night); margin-bottom: var(--space-16); } .comparison-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--space-24); margin-top: var(--space-16); } .comp-col { background: var(--c-birch-cream); border-radius: var(--radius-md); padding: var(--space-16); } .comp-title { font-size: 1.1rem; color: var(--c-deep-arctic); margin-bottom: var(--space-8); } .comp-text { font-size: 0.95rem; line-height: 1.6; margin-bottom: var(--space-8) !important; } .page-navigation-footer { display: flex; gap: var(--space-16); flex-wrap: wrap; margin-top: var(--space-40); padding-top: var(--space-24); border-top: 1px solid var(--border-subtle); } /* ========================================================================== LEGAL PAGES & TABLES ========================================================================== */ .legal-page-section { padding-top: var(--space-40); padding-bottom: var(--space-64); } .legal-effective-date { font-size: 0.9rem; color: var(--c-glacier-blue); font-weight: 600; margin-bottom: var(--space-24); } .legal-page-section h2 { font-size: 1.45rem; color: var(--c-polar-night); margin-top: var(--space-40); margin-bottom: var(--space-16); } .legal-address-box { background: var(--c-birch-cream); padding: var(--space-16); border-radius: var(--radius-md); margin: var(--space-16) 0; font-size: 0.95rem; line-height: 1.6; } .table-wrap { width: 100%; overflow-x: auto; margin: var(--space-24) 0; border-radius: var(--radius-md); border: 1px solid var(--border-subtle); background: #fff; } .cookie-table { width: 100%; border-collapse: collapse; text-align: left; font-size: 0.92rem; } .cookie-table th, .cookie-table td { padding: 12px 16px; border-bottom: 1px solid var(--border-subtle); vertical-align: top; } .cookie-table th { background-color: var(--c-deep-arctic); color: var(--text-light); font-weight: 600; } .cookie-table tr:last-child td { border-bottom: none; } .reset-box { background: var(--c-birch-cream); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-24); margin: var(--space-40) 0; } .reset-heading { font-size: 1.2rem; color: var(--c-polar-night); margin-bottom: var(--space-8); } .reset-status { display: block; margin-top: var(--space-8); font-size: 0.9rem; color: var(--c-deep-arctic); font-weight: 600; } /* ========================================================================== CONTACT PAGE & STATIC MAP BLOCK ========================================================================== */ .contact-header-section { padding-top: var(--space-40); padding-bottom: var(--space-24); background: linear-gradient(180deg, #F0EEE7 0%, #FAFBF9 100%); } .contact-main-section { padding-top: var(--space-24); padding-bottom: var(--space-64); } .contact-grid { display: grid; grid-template-columns: 1.2fr 1fr; gap: var(--space-40); align-items: start; } .form-panel, .details-panel, .static-map-panel { background: var(--c-snow-white); border: 1px solid var(--border-subtle); border-radius: var(--radius-card); padding: var(--space-40); box-shadow: var(--shadow-soft); } .form-title, .details-title { font-size: 1.6rem; color: var(--c-polar-night); margin-bottom: var(--space-8); } .form-intro { font-size: 0.98rem; color: var(--c-fjord-slate); margin-bottom: var(--space-24); } .form-group { margin-bottom: var(--space-24); } .form-label { display: block; font-size: 0.92rem; font-weight: 600; color: var(--c-deep-arctic); margin-bottom: var(--space-8); } .req { color: #B23B3B; } .form-input, .form-select, .form-textarea { width: 100%; padding: 12px 16px; font-family: inherit; font-size: 0.98rem; color: var(--c-arctic-ink); background-color: #fff; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); transition: border-color 0.2s ease, box-shadow 0.2s ease; } .form-input:focus, .form-select:focus, .form-textarea:focus { border-color: var(--c-glacier-blue); box-shadow: 0 0 0 3px rgba(111, 166, 178, 0.25); outline: none; } .form-input.is-invalid, .form-select.is-invalid, .form-textarea.is-invalid { border-color: #B23B3B; background-color: #FFF9F9; } .field-error-msg { display: block; font-size: 0.82rem; color: #B23B3B; margin-top: 4px; min-height: 1.1em; } .button-submit { width: 100%; padding: 14px; font-size: 1rem; } .form-feedback-alert { margin-top: var(--space-24); padding: var(--space-16); border-radius: var(--radius-sm); font-size: 0.95rem; line-height: 1.5; } .form-feedback-alert.is-success { background-color: rgba(131, 199, 181, 0.2); color: #0E4839; border: 1px solid #83C7B5; } .form-feedback-alert.is-error { background-color: rgba(201, 142, 157, 0.2); color: #6C1E2F; border: 1px solid #C98E9D; } .details-block { margin-bottom: var(--space-16); } .details-label { display: block; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 700; color: var(--c-glacier-blue); margin-bottom: 2px; } .details-value { font-size: 1rem; color: var(--c-arctic-ink); line-height: 1.5; } /* Static Styled Map */ .static-map-panel { padding: var(--space-24); } .map-visual-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-12); } .map-label-tag { font-size: 0.8rem; font-weight: 700; text-transform: uppercase; color: var(--c-fjord-slate); } .map-coords { font-size: 0.8rem; font-family: monospace; color: var(--c-glacier-blue); } .map-canvas-frame { border-radius: var(--radius-md); overflow: hidden; box-shadow: inset 0 2px 8px rgba(0,0,0,0.15); margin-bottom: var(--space-12); } .map-svg-illustration { width: 100%; height: auto; display: block; } .map-caption { font-size: 0.88rem; line-height: 1.5; color: var(--c-fjord-slate); } /* ========================================================================== FOOTER (Consistent, Accessible Contrast) ========================================================================== */ .site-footer { background-color: var(--c-polar-night); color: var(--text-light); padding-top: var(--space-64); padding-bottom: var(--space-40); border-top: 1px solid var(--border-dark-subtle); margin-top: auto; } .footer-columns { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--space-40); margin-bottom: var(--space-40); } .footer-col-brand { max-width: 480px; } .footer-brand { margin-bottom: var(--space-16); } .footer-description { font-size: 0.95rem; line-height: 1.6; color: var(--c-frozen-mist); margin-bottom: var(--space-16); } .footer-legal-snippet { font-size: 0.85rem; line-height: 1.6; color: var(--c-soft-stone); } .footer-heading { font-size: 1.05rem; color: var(--text-light); margin-bottom: var(--space-16); font-weight: 700; } .footer-nav-list { list-style: none; } .footer-nav-list li { margin-bottom: var(--space-8); } .footer-nav-list a { color: var(--c-frozen-mist); text-decoration: none; font-size: 0.92rem; transition: color 0.2s ease; } .footer-nav-list a:hover { color: var(--c-aurora-mint); text-decoration: underline; } .inline-link { color: var(--c-aurora-mint); text-decoration: underline; } .inline-link:hover { color: var(--c-frozen-mist); } .footer-bottom { padding-top: var(--space-24); border-top: 1px solid var(--border-dark-subtle); font-size: 0.85rem; color: var(--c-soft-stone); display: flex; flex-direction: column; gap: var(--space-8); } .footer-disclaimer { color: rgba(216, 217, 213, 0.65); } /* ========================================================================== COOKIE CONSENT BANNER (Fixed Bottom, [data-cookie-choice]) ========================================================================== */ .cookie-banner { position: fixed; bottom: 0; left: 0; right: 0; background-color: var(--c-deep-arctic); color: var(--text-light); border-top: 1px solid var(--border-dark-subtle); box-shadow: 0 -8px 24px rgba(16, 24, 32, 0.35); padding: var(--space-16) 0; z-index: 1000; } .cookie-banner[hidden] { display: none !important; } .cookie-banner-inner { width: 100%; max-width: 1160px; margin: 0 auto; padding: 0 var(--space-24); display: flex; align-items: center; justify-content: space-between; gap: var(--space-24); flex-wrap: wrap; } .cookie-text { max-width: 620px; } .cookie-title { display: block; font-size: 0.98rem; color: var(--text-light); margin-bottom: 4px; } .cookie-desc { font-size: 0.88rem; line-height: 1.5; color: var(--c-frozen-mist); } .cookie-actions { display: flex; align-items: center; gap: var(--space-12); flex-wrap: wrap; } .button-cookie { padding: 8px 16px; font-size: 0.88rem; border-radius: var(--radius-pill); cursor: pointer; font-weight: 600; border: 1px solid transparent; } .button-cookie-accent { background-color: var(--c-aurora-mint); color: var(--c-polar-night); } .button-cookie-accent:hover { background-color: #70BCA9; } .button-cookie-hollow { background-color: transparent; color: var(--text-light); border-color: var(--c-frozen-mist); } .button-cookie-hollow:hover { background-color: rgba(255,255,255,0.1); } .cookie-policy-link { color: var(--c-frozen-mist); font-size: 0.88rem; text-decoration: underline; } .cookie-policy-link:hover { color: var(--c-aurora-mint); } /* ========================================================================== RESPONSIVE DESIGN & BREAKPOINTS ========================================================================== */ @media (max-width: 900px) { .contact-grid { grid-template-columns: 1fr; } .footer-columns { grid-template-columns: 1fr 1fr; } .footer-col-brand { grid-column: span 2; } } @media (max-width: 768px) { .site-header { height: 52px; } .nav-toggle { display: block; } .header-cta-slot { display: none; } /* Hamburger Overlay Menu */ .primary-nav { position: fixed; top: 52px; left: 0; right: 0; bottom: 0; background-color: var(--c-polar-night); padding: var(--space-40) var(--space-24); display: flex; flex-direction: column; align-items: flex-start; transform: translateX(100%); transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1); z-index: 99; overflow-y: auto; } .primary-nav.is-active { transform: translateX(0); } .nav-list { flex-direction: column; align-items: flex-start; gap: var(--space-24); width: 100%; } .nav-link { font-size: 1.25rem; display: block; width: 100%; padding: var(--space-8) 0; } .mobile-cta-item { display: block; width: 100%; margin-top: var(--space-16); } .mobile-cta-item .button { width: 100%; text-align: center; } .hero-image { height: 320px; } .hero-content-panel, .intro-content-panel, .ethos-content, .form-panel, .details-panel { padding: var(--space-24); } .footer-columns { grid-template-columns: 1fr; gap: var(--space-24); } .footer-col-brand { grid-column: span 1; } } /* Breakpoint below 400px (down to 320px) */ @media (max-width: 400px) { .container { padding-left: var(--space-16); padding-right: var(--space-16); } .brand-text { font-size: 0.95rem; } .hero-heading { font-size: 1.7rem; } .button { width: 100%; text-align: center; } .hero-actions { flex-direction: column; } .cookie-banner-inner { padding: 0 var(--space-16); } .cookie-actions { flex-direction: column; align-items: stretch; width: 100%; } .button-cookie { width: 100%; } } /* ========================================================================== ACCESSIBILITY: PREFERS-REDUCED-MOTION ========================================================================== */ @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; } } ===ENDFILE=== ===FILE: script.js=== /** * LAPLAND ADVENTURES — CLIENT INTERACTIONS * storyporchfreshsgn.pics * Year: 2026 */ (function () { 'use strict'; // --- 1. MOBILE NAVIGATION --- const menuToggle = document.querySelector('[data-menu-toggle]'); const primaryNav = document.querySelector('[data-primary-nav]'); if (menuToggle && primaryNav) { menuToggle.addEventListener('click', function () { const isExpanded = menuToggle.getAttribute('aria-expanded') === 'true'; const nextState = !isExpanded; menuToggle.setAttribute('aria-expanded', String(nextState)); primaryNav.classList.toggle('is-active', nextState); // Prevent body scroll when menu is active on small viewports if (nextState) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = ''; } }); // Close menu if a nav link is tapped const navLinks = primaryNav.querySelectorAll('a'); navLinks.forEach(function (link) { link.addEventListener('click', function () { if (primaryNav.classList.contains('is-active')) { menuToggle.setAttribute('aria-expanded', 'false'); primaryNav.classList.remove('is-active'); document.body.style.overflow = ''; } }); }); } // --- 2. COOKIE CONSENT BANNER --- const cookieBanner = document.querySelector('[data-cookie-banner]'); const cookieButtons = document.querySelectorAll('[data-cookie-choice]'); const COOKIE_STORAGE_KEY = 'storyporch_cookie_choice_2026'; function initCookieBanner() { if (!cookieBanner) return; try { const savedChoice = localStorage.getItem(COOKIE_STORAGE_KEY); if (!savedChoice) { cookieBanner.removeAttribute('hidden'); } else { cookieBanner.setAttribute('hidden', ''); } } catch (err) { // LocalStorage might be disabled in private browsing cookieBanner.removeAttribute('hidden'); } cookieButtons.forEach(function (button) { button.addEventListener('click', function () { const choice = button.getAttribute('data-cookie-choice'); try { localStorage.setItem(COOKIE_STORAGE_KEY, choice); } catch (e) { // Fallback if storage restricted } if (cookieBanner) { cookieBanner.setAttribute('hidden', ''); } }); }); } initCookieBanner(); // Reset Cookie Button on Cookie Policy Page const resetCookieBtn = document.querySelector('[data-reset-cookie-btn]'); const resetStatusMsg = document.getElementById('reset-status-msg'); if (resetCookieBtn) { resetCookieBtn.addEventListener('click', function () { try { localStorage.removeItem(COOKIE_STORAGE_KEY); if (cookieBanner) { cookieBanner.removeAttribute('hidden'); } if (resetStatusMsg) { resetStatusMsg.textContent = 'Your cookie preferences have been cleared. The prompt has reappeared below.'; } } catch (e) { if (resetStatusMsg) { resetStatusMsg.textContent = 'Unable to access local storage.'; } } }); } // --- 3. CONTACT FORM VALIDATION --- const contactForm = document.querySelector('[data-contact-form]'); if (contactForm) { const statusBox = contactForm.querySelector('[data-form-status]'); // Individual field validation function validateField(field) { const fieldName = field.getAttribute('data-field'); const errorSpan = contactForm.querySelector('[data-error-for="' + fieldName + '"]'); let isValid = true; let errorMessage = ''; const val = field.value.trim(); if (field.hasAttribute('required') && !val) { isValid = false; errorMessage = 'This field cannot be left blank.'; } else if (field.type === 'email' && val) { // Standard accessible email regex check const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(val)) { isValid = false; errorMessage = 'Please enter a valid email address (e.g. [email protected]).'; } } else if (field.tagName.toLowerCase() === 'textarea' && val && val.length < 10) { isValid = false; errorMessage = 'Please provide a little more detail (at least 10 characters).'; } if (!isValid) { field.classList.add('is-invalid'); if (errorSpan) errorSpan.textContent = errorMessage; } else { field.classList.remove('is-invalid'); if (errorSpan) errorSpan.textContent = ''; } return isValid; } // Bind real-time input check after first interaction const inputs = contactForm.querySelectorAll('[data-field]'); inputs.forEach(function (input) { input.addEventListener('blur', function () { validateField(input); }); input.addEventListener('input', function () { if (input.classList.contains('is-invalid')) { validateField(input); } }); }); // Handle submission contactForm.addEventListener('submit', function (event) { event.preventDefault(); let formIsValid = true; inputs.forEach(function (input) { const fieldValid = validateField(input); if (!fieldValid) { formIsValid = false; } }); if (!statusBox) return; if (!formIsValid) { statusBox.removeAttribute('hidden'); statusBox.className = 'form-feedback-alert is-error'; statusBox.textContent = 'Please correct the highlighted fields above before sending.'; return; } // Simulate clean asynchronous submission const submitBtn = contactForm.querySelector('[data-submit-btn]'); if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Sending...'; } setTimeout(function () { contactForm.reset(); if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = 'Send Inquiry'; } statusBox.removeAttribute('hidden'); statusBox.className = 'form-feedback-alert is-success'; statusBox.textContent = 'Thank you for reaching out! We have received your message and will reply via email within two business days.'; }, 700); }); } })(); ===ENDFILE===