Neue Website Kirschner Gebäudeservice
Statische Seite ohne Build und ohne Fremdanfragen: Start, Leistungen, Unternehmen, Karriere, Kontakt, Impressum und Datenschutz. Design „Präzision in Blau" mit Archivo Variable, Motion über lokal eingebundenes GSAP/ScrollTrigger/SplitText und Lenis, reduced-motion-Fallback. Seiten entstehen aus tools/build_pages.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
|
After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" rx="12" fill="#0A1424"/><g transform="translate(10 16)"><polygon fill="#5B8AD6" opacity=".55" points="14,0 24,0 10,16 24,32 14,32 0,16"/><polygon fill="#5B8AD6" points="32,0 42,0 28,16 42,32 32,32 18,16"/></g></svg>
|
||||
|
After Width: | Height: | Size: 305 B |
@@ -0,0 +1,93 @@
|
||||
Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo) Archivo-Italic[wdth,wght].ttf: Copyright 2020 The Archivo Project Authors (https://github.com/Omnibus-Type/Archivo)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 171 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 152 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,359 @@
|
||||
/* ==========================================================================
|
||||
Kirschner Gebäudeservice — Motion
|
||||
Ein Modul. Alles Bewegte läuft in gsap.matchMedia(): bei reduced motion
|
||||
bleibt nur Funktion (Slider, Menü, Umschalter), keine Choreografie.
|
||||
Jede Animation hat einen Zweck — Liste in DESIGN.md.
|
||||
========================================================================== */
|
||||
(() => {
|
||||
const root = document.documentElement;
|
||||
root.classList.add('motion-ready');
|
||||
|
||||
const $ = (s, c = document) => c.querySelector(s);
|
||||
const $$ = (s, c = document) => [...c.querySelectorAll(s)];
|
||||
let lenis = null;
|
||||
|
||||
/* ---------- Fakten, die sich selbst aktualisieren ---------- */
|
||||
const years = new Date().getFullYear() - 2003;
|
||||
$$('[data-years]').forEach((el) => { el.textContent = years; });
|
||||
$$('[data-year]').forEach((el) => { el.textContent = new Date().getFullYear(); });
|
||||
|
||||
/* ---------- Header: fest nach 40px, weg beim Runterscrollen ---------- */
|
||||
const header = $('.site-header');
|
||||
const menuToggle = $('.menu-toggle');
|
||||
let lastY = scrollY;
|
||||
const onScroll = () => {
|
||||
const y = scrollY;
|
||||
if (header) {
|
||||
header.classList.toggle('is-solid', y > 40);
|
||||
const menuOpen = menuToggle && menuToggle.getAttribute('aria-expanded') === 'true';
|
||||
header.classList.toggle('is-hidden', !menuOpen && y > 480 && y > lastY + 2);
|
||||
if (y < lastY - 2) header.classList.remove('is-hidden');
|
||||
}
|
||||
lastY = y;
|
||||
};
|
||||
addEventListener('scroll', onScroll, { passive: true });
|
||||
onScroll();
|
||||
|
||||
/* ---------- Mobiles Menü ---------- */
|
||||
const mnav = $('#mobile-nav');
|
||||
if (menuToggle && mnav) {
|
||||
mnav.inert = true;
|
||||
const setMenu = (open) => {
|
||||
menuToggle.setAttribute('aria-expanded', String(open));
|
||||
menuToggle.setAttribute('aria-label', open ? 'Menü schließen' : 'Menü öffnen');
|
||||
mnav.classList.toggle('is-open', open);
|
||||
mnav.inert = !open;
|
||||
document.body.style.overflow = open ? 'hidden' : '';
|
||||
if (lenis) open ? lenis.stop() : lenis.start();
|
||||
if (open && window.gsap && !matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
gsap.fromTo($$('.mobile-nav__link, .mobile-nav__meta', mnav),
|
||||
{ yPercent: 60, opacity: 0 },
|
||||
{ yPercent: 0, opacity: 1, duration: .8, ease: 'expo.out', stagger: .05, delay: .18 });
|
||||
}
|
||||
if (open) $('.mobile-nav__link', mnav)?.focus({ preventScroll: true });
|
||||
};
|
||||
menuToggle.addEventListener('click', () => setMenu(menuToggle.getAttribute('aria-expanded') !== 'true'));
|
||||
addEventListener('keydown', (e) => { if (e.key === 'Escape' && mnav.classList.contains('is-open')) { setMenu(false); menuToggle.focus(); } });
|
||||
$$('a', mnav).forEach((a) => a.addEventListener('click', () => setMenu(false)));
|
||||
matchMedia('(min-width: 1081px)').addEventListener('change', (e) => { if (e.matches) setMenu(false); });
|
||||
}
|
||||
|
||||
/* ---------- Vorher/Nachher-Slider (Zeiger + Tastatur) ---------- */
|
||||
$$('.compare').forEach((cmp) => {
|
||||
let pos = 50;
|
||||
const set = (v) => {
|
||||
pos = Math.max(0, Math.min(100, v));
|
||||
cmp.style.setProperty('--pos', pos + '%');
|
||||
cmp.setAttribute('aria-valuenow', Math.round(pos));
|
||||
cmp.setAttribute('aria-valuetext', `${Math.round(pos)} % Vorher-Ansicht`);
|
||||
};
|
||||
const fromEvent = (e) => {
|
||||
const r = cmp.getBoundingClientRect();
|
||||
set(((e.clientX - r.left) / r.width) * 100);
|
||||
};
|
||||
let dragging = false;
|
||||
cmp.addEventListener('pointerdown', (e) => { dragging = true; cmp.setPointerCapture(e.pointerId); fromEvent(e); });
|
||||
cmp.addEventListener('pointermove', (e) => { if (dragging) fromEvent(e); });
|
||||
cmp.addEventListener('pointerup', () => { dragging = false; });
|
||||
cmp.addEventListener('pointercancel', () => { dragging = false; });
|
||||
cmp.addEventListener('keydown', (e) => {
|
||||
const step = e.shiftKey ? 10 : 2;
|
||||
const map = { ArrowLeft: pos - step, ArrowDown: pos - step, ArrowRight: pos + step, ArrowUp: pos + step, Home: 0, End: 100, PageDown: pos - 10, PageUp: pos + 10 };
|
||||
if (e.key in map) { e.preventDefault(); set(map[e.key]); }
|
||||
});
|
||||
set(50);
|
||||
cmp._set = set;
|
||||
});
|
||||
|
||||
/* ---------- Umschalter Privat / Gewerbe (Tabs) ---------- */
|
||||
$$('.switch').forEach((sw) => {
|
||||
const tabs = $$('[role="tab"]', sw);
|
||||
const pill = $('.switch__pill', sw);
|
||||
const place = (t) => { if (pill) { pill.style.width = t.offsetWidth + 'px'; pill.style.transform = `translateX(${t.offsetLeft - 4}px)`; } };
|
||||
const select = (t, focus) => {
|
||||
tabs.forEach((x) => {
|
||||
const on = x === t;
|
||||
x.setAttribute('aria-selected', String(on));
|
||||
x.tabIndex = on ? 0 : -1;
|
||||
const panel = document.getElementById(x.getAttribute('aria-controls'));
|
||||
if (panel) panel.hidden = !on;
|
||||
if (on && panel && window.gsap && !matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
gsap.fromTo(panel.children, { opacity: 0, y: 14 }, { opacity: 1, y: 0, duration: .6, ease: 'expo.out', stagger: .035 });
|
||||
}
|
||||
});
|
||||
place(t);
|
||||
if (focus) t.focus();
|
||||
};
|
||||
tabs.forEach((t, i) => {
|
||||
t.addEventListener('click', () => select(t));
|
||||
t.addEventListener('keydown', (e) => {
|
||||
const d = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;
|
||||
if (d) { e.preventDefault(); select(tabs[(i + d + tabs.length) % tabs.length], true); }
|
||||
});
|
||||
});
|
||||
const initial = tabs.find((t) => t.getAttribute('aria-selected') === 'true') || tabs[0];
|
||||
requestAnimationFrame(() => place(initial));
|
||||
addEventListener('resize', () => place(tabs.find((t) => t.getAttribute('aria-selected') === 'true')));
|
||||
});
|
||||
|
||||
/* ---------- Notruf-Pille: nach dem Hero sichtbar, am Seitenende weg ---------- */
|
||||
const sos = $('.sos');
|
||||
if (sos) {
|
||||
const hero = $('.hero, .page-hero');
|
||||
const footer = $('.site-footer');
|
||||
let pastHero = false, atFooter = false;
|
||||
const update = () => sos.classList.toggle('is-visible', pastHero && !atFooter);
|
||||
if (hero) new IntersectionObserver(([e]) => { pastHero = !e.isIntersecting; update(); }, { rootMargin: '-20% 0px 0px 0px' }).observe(hero);
|
||||
if (footer) new IntersectionObserver(([e]) => { atFooter = e.isIntersecting; update(); }).observe(footer);
|
||||
}
|
||||
|
||||
/* ======================================================================
|
||||
Ab hier: Choreografie. Ohne GSAP bleibt alles sichtbar und benutzbar.
|
||||
====================================================================== */
|
||||
if (!window.gsap || !window.ScrollTrigger || !window.SplitText) {
|
||||
root.classList.remove('js', 'has-intro');
|
||||
return;
|
||||
}
|
||||
gsap.registerPlugin(ScrollTrigger, SplitText);
|
||||
gsap.defaults({ ease: 'expo.out', duration: 1 });
|
||||
|
||||
const intro = $('.intro');
|
||||
|
||||
/* Intro: zwei Chevrons + Wortmarke, dann Winkel-Wipe (nur 1× pro Session) */
|
||||
const playIntro = () => new Promise((resolve) => {
|
||||
if (!root.classList.contains('has-intro') || !intro) { resolve(); return; }
|
||||
try { sessionStorage.setItem('kk-intro', '1'); } catch (e) { /* privat */ }
|
||||
intro.style.animation = 'none';
|
||||
gsap.set(intro, { clipPath: 'polygon(0% 0%, 120% 0%, 100% 50%, 120% 100%, 0% 100%)' });
|
||||
const tl = gsap.timeline({
|
||||
onComplete: () => { root.classList.remove('has-intro'); resolve(); },
|
||||
});
|
||||
tl.from('.intro__mark .chev', { xPercent: 140, opacity: 0, duration: .5, stagger: .09 })
|
||||
.from('.intro__word span, .intro__word small', { yPercent: 115, duration: .5, stagger: .06 }, .15)
|
||||
.to(intro, { clipPath: 'polygon(0% 0%, 0% 0%, -20% 50%, 0% 100%, 0% 100%)', duration: .7, ease: 'expo.inOut' }, .75)
|
||||
.add(resolve, 1.0); /* Hero startet, während der Wipe noch läuft */
|
||||
intro.addEventListener('click', () => tl.progress(1), { once: true });
|
||||
});
|
||||
|
||||
const splitLines = (el, vars = {}) => SplitText.create(el, {
|
||||
type: 'lines',
|
||||
mask: 'lines',
|
||||
linesClass: 'line',
|
||||
autoSplit: true,
|
||||
onSplit(self) {
|
||||
el.classList.add('is-split');
|
||||
return gsap.from(self.lines, { yPercent: 115, duration: 1.15, stagger: .09, ...vars });
|
||||
},
|
||||
});
|
||||
|
||||
const mm = gsap.matchMedia();
|
||||
|
||||
mm.add({
|
||||
motion: '(prefers-reduced-motion: no-preference)',
|
||||
desktop: '(min-width: 1024px)',
|
||||
fine: '(pointer: fine)',
|
||||
}, (ctx) => {
|
||||
const { motion, desktop, fine } = ctx.conditions;
|
||||
if (!motion) return;
|
||||
|
||||
/* ---- Smooth-Scroll (Lenis), synchron mit ScrollTrigger; Touch bleibt nativ ---- */
|
||||
lenis = new Lenis({ lerp: .1, wheelMultiplier: 1, anchors: { offset: -90 } });
|
||||
lenis.on('scroll', ScrollTrigger.update);
|
||||
window.lenis = lenis; /* für Anker-Sprünge & Debugging */
|
||||
const raf = (t) => lenis.raf(t * 1000);
|
||||
gsap.ticker.add(raf);
|
||||
gsap.ticker.lagSmoothing(0);
|
||||
|
||||
/* ---- Hero ---- */
|
||||
const hero = $('.hero, .page-hero');
|
||||
const heroH1 = hero && $('[data-split]', hero);
|
||||
const heroRest = hero ? $$('[data-hero]', hero) : [];
|
||||
const heroPaths = hero ? $$('.hero__chevrons path', hero) : [];
|
||||
gsap.set(heroRest, { opacity: 0, y: 24 });
|
||||
gsap.set(heroPaths, { strokeDasharray: 1, strokeDashoffset: 1 });
|
||||
|
||||
const startHero = () => {
|
||||
if (heroH1) splitLines(heroH1, { delay: .05 });
|
||||
gsap.to(heroRest, { opacity: 1, y: 0, duration: 1.1, stagger: .08, delay: .35 });
|
||||
gsap.to(heroPaths, { strokeDashoffset: 0, duration: 1.8, ease: 'expo.inOut', stagger: .12, delay: .1 });
|
||||
const media = hero && $('.hero__media img', hero);
|
||||
if (media) gsap.from(media, { scale: 1.12, duration: 2.2, ease: 'expo.out' });
|
||||
};
|
||||
document.fonts.ready.then(playIntro).then(startHero);
|
||||
|
||||
if (hero) {
|
||||
const chev = $('.hero__chevrons', hero);
|
||||
const media = $('.hero__media img', hero);
|
||||
const content = $('.hero__content, .page-hero__grid', hero);
|
||||
const st = { trigger: hero, start: 'top top', end: 'bottom top', scrub: true };
|
||||
if (chev) gsap.to(chev, { yPercent: -18, xPercent: 6, ease: 'none', scrollTrigger: st });
|
||||
if (media) gsap.to(media, { yPercent: 10, ease: 'none', scrollTrigger: { ...st } });
|
||||
if (content) gsap.to(content, { y: -60, opacity: .2, ease: 'none', scrollTrigger: { ...st, start: 'center center' } });
|
||||
}
|
||||
|
||||
/* ---- Leistungen: horizontal gepinnt (Desktop) ---- */
|
||||
const hs = $('.hscroll');
|
||||
let hsTween = null;
|
||||
if (hs && desktop) {
|
||||
hs.classList.add('is-pinned');
|
||||
const track = $('.hscroll__track', hs);
|
||||
const bar = $('.hscroll__bar i', hs);
|
||||
const count = $('[data-hs-count]', hs);
|
||||
const panels = $$('.panel', hs);
|
||||
gsap.set(panels, { opacity: 1, y: 0 });
|
||||
const dist = () => Math.max(0, track.scrollWidth - innerWidth);
|
||||
hsTween = gsap.to(track, {
|
||||
x: () => -dist(),
|
||||
ease: 'none',
|
||||
scrollTrigger: {
|
||||
trigger: hs,
|
||||
start: 'top top',
|
||||
end: () => '+=' + dist(),
|
||||
pin: true,
|
||||
scrub: .8,
|
||||
invalidateOnRefresh: true,
|
||||
onUpdate: (self) => {
|
||||
if (bar) bar.style.transform = `scaleX(${self.progress})`;
|
||||
if (count) count.textContent = String(Math.min(panels.length, Math.floor(self.progress * panels.length) + 1)).padStart(2, '0');
|
||||
},
|
||||
},
|
||||
});
|
||||
panels.forEach((p) => {
|
||||
const img = $('img', p);
|
||||
if (img) gsap.fromTo(img, { xPercent: -6, scale: 1.18 }, {
|
||||
xPercent: 6, scale: 1.18, ease: 'none',
|
||||
scrollTrigger: { trigger: p, containerAnimation: hsTween, start: 'left right', end: 'right left', scrub: true },
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ---- Textzeilen aus der Maske ---- */
|
||||
$$('[data-split]').forEach((el) => {
|
||||
if (hero && hero.contains(el)) return;
|
||||
splitLines(el, { scrollTrigger: { trigger: el, start: 'top 86%', once: true } });
|
||||
});
|
||||
|
||||
/* ---- Blöcke gestaffelt einblenden ---- */
|
||||
const reveals = $$('[data-reveal]').filter((el) => !(hs && desktop && hs.contains(el)));
|
||||
ScrollTrigger.batch(reveals, {
|
||||
start: 'top 88%',
|
||||
once: true,
|
||||
onEnter: (batch) => gsap.to(batch, { opacity: 1, y: 0, duration: 1, stagger: .08, overwrite: true }),
|
||||
});
|
||||
|
||||
/* ---- Winkel-Reveal für Bilder (Signatur) ---- */
|
||||
$$('.reveal-img').forEach((el) => {
|
||||
const img = $('img', el);
|
||||
const tl = gsap.timeline({ scrollTrigger: { trigger: el, start: 'top 82%', once: true } });
|
||||
tl.to(el, { '--x': '0%', duration: 1.35, ease: 'expo.inOut' });
|
||||
if (img) tl.from(img, { scale: 1.18, duration: 1.8, ease: 'expo.out' }, 0);
|
||||
});
|
||||
|
||||
/* ---- Zähler ---- */
|
||||
$$('[data-count]').forEach((el) => {
|
||||
const to = el.dataset.count === 'years' ? years : Number(el.dataset.count);
|
||||
const o = { v: 0 };
|
||||
el.textContent = '0';
|
||||
gsap.to(o, {
|
||||
v: to, duration: 1.8, ease: 'expo.out',
|
||||
scrollTrigger: { trigger: el, start: 'top 90%', once: true },
|
||||
onUpdate: () => { el.textContent = Math.round(o.v); },
|
||||
});
|
||||
});
|
||||
|
||||
/* ---- Philosophie: Wort für Wort hell (gescrubbt) ---- */
|
||||
$$('[data-scrub-words]').forEach((el) => {
|
||||
SplitText.create(el, {
|
||||
type: 'words',
|
||||
wordsClass: 'word',
|
||||
autoSplit: true,
|
||||
onSplit(self) {
|
||||
return gsap.fromTo(self.words, { opacity: .14 }, {
|
||||
opacity: 1, ease: 'none', stagger: .12,
|
||||
scrollTrigger: { trigger: el, start: 'top 78%', end: 'bottom 42%', scrub: true },
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
/* ---- Timeline-Linie zeichnet sich ---- */
|
||||
$$('.timeline').forEach((tl) => {
|
||||
const line = $('.timeline__line i', tl);
|
||||
if (line) gsap.fromTo(line, { scaleY: 0 }, {
|
||||
scaleY: 1, ease: 'none',
|
||||
scrollTrigger: { trigger: tl, start: 'top 70%', end: 'bottom 65%', scrub: true },
|
||||
});
|
||||
});
|
||||
|
||||
/* ---- Parallax für einzelne Elemente ---- */
|
||||
$$('[data-parallax]').forEach((el) => {
|
||||
const amt = Number(el.dataset.parallax) || 10;
|
||||
gsap.fromTo(el, { yPercent: -amt }, {
|
||||
yPercent: amt, ease: 'none',
|
||||
scrollTrigger: { trigger: el.parentElement, start: 'top bottom', end: 'bottom top', scrub: true },
|
||||
});
|
||||
});
|
||||
|
||||
/* ---- Vorher/Nachher: einmal kurz zeigen, dass man ziehen kann ---- */
|
||||
$$('.compare').forEach((cmp) => {
|
||||
const o = { v: 50 };
|
||||
gsap.timeline({ scrollTrigger: { trigger: cmp, start: 'top 70%', once: true } })
|
||||
.to(o, { v: 72, duration: .9, ease: 'expo.inOut', onUpdate: () => cmp._set(o.v) })
|
||||
.to(o, { v: 50, duration: .9, ease: 'expo.inOut', onUpdate: () => cmp._set(o.v) });
|
||||
});
|
||||
|
||||
/* ---- Magnet-Buttons (nur Maus) ---- */
|
||||
if (fine) {
|
||||
$$('.btn, [data-magnetic]').forEach((btn) => {
|
||||
const xTo = gsap.quickTo(btn, 'x', { duration: .6, ease: 'expo.out' });
|
||||
const yTo = gsap.quickTo(btn, 'y', { duration: .6, ease: 'expo.out' });
|
||||
const clamp = gsap.utils.clamp(-6, 6);
|
||||
const move = (e) => {
|
||||
const r = btn.getBoundingClientRect();
|
||||
xTo(clamp((e.clientX - r.left - r.width / 2) * .18));
|
||||
yTo(clamp((e.clientY - r.top - r.height / 2) * .3));
|
||||
};
|
||||
const leave = () => { xTo(0); yTo(0); };
|
||||
btn.addEventListener('pointermove', move);
|
||||
btn.addEventListener('pointerleave', leave);
|
||||
ctx.add(() => () => { btn.removeEventListener('pointermove', move); btn.removeEventListener('pointerleave', leave); });
|
||||
});
|
||||
}
|
||||
|
||||
/* Nach Font-Load und Bildern Layout neu messen */
|
||||
document.fonts.ready.then(() => ScrollTrigger.refresh());
|
||||
addEventListener('load', () => ScrollTrigger.refresh(), { once: true });
|
||||
|
||||
return () => {
|
||||
gsap.ticker.remove(raf);
|
||||
lenis?.destroy();
|
||||
lenis = null;
|
||||
hs?.classList.remove('is-pinned');
|
||||
};
|
||||
});
|
||||
|
||||
/* Reduced motion: Intro nie zeigen, Zähler stehen schon auf Endwert (HTML) */
|
||||
mm.add('(prefers-reduced-motion: reduce)', () => {
|
||||
root.classList.remove('has-intro');
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,687 @@
|
||||
/* ==========================================================================
|
||||
Kirschner Gebäudeservice — Design-System „Präzision in Blau"
|
||||
Referenz: design-references/entries/gebaeudedienstleister-de.md
|
||||
Details und Begründungen: DESIGN.md
|
||||
========================================================================== */
|
||||
|
||||
/* ---------- Font: Archivo Variable (wght 100–900, wdth 62–125), OFL ---------- */
|
||||
@font-face {
|
||||
font-family: "Archivo";
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 100 900;
|
||||
font-stretch: 62% 125%;
|
||||
src: url("fonts/archivo-latin-ext-wdth-normal.woff2") format("woff2-variations");
|
||||
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Archivo";
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 100 900;
|
||||
font-stretch: 62% 125%;
|
||||
src: url("fonts/archivo-latin-wdth-normal.woff2") format("woff2-variations");
|
||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
|
||||
/* ---------- Tokens ---------- */
|
||||
:root {
|
||||
/* Nacht — blau getönte Dunkeltöne */
|
||||
--night-950: #0A1424;
|
||||
--night-900: #0F1D33;
|
||||
--night-800: #16263F;
|
||||
--night-700: #1F3354;
|
||||
/* Papier — blau getöntes Off-White */
|
||||
--paper: #F2F5F9;
|
||||
--paper-2: #E6ECF4;
|
||||
--white: #FFFFFF;
|
||||
/* Text */
|
||||
--ink: #0A1424; /* auf Papier */
|
||||
--ink-soft: #4A5873; /* auf Papier, 6.5:1 */
|
||||
--fog: #E8EEF6; /* auf Nacht, 15.8:1 */
|
||||
--fog-soft: #A9B7CC; /* auf Nacht, 9.1:1 */
|
||||
--fog-mute: #8C9BB3; /* auf Nacht, 6.5:1 — nur Labels */
|
||||
/* Der eine Akzent: Logo-Mittelblau */
|
||||
--kk: #5B8AD6; /* auf Nacht 5.3:1 */
|
||||
--kk-bright: #6E9AE3;
|
||||
--kk-ink: #2F5FAE; /* Akzent als Text auf Papier, 5.7:1 */
|
||||
--kk-deep: #3B6CC0;
|
||||
/* Linien */
|
||||
--line-dark: rgba(169, 183, 204, .16);
|
||||
--line-light: rgba(10, 20, 36, .12);
|
||||
|
||||
/* Typo */
|
||||
--font: "Archivo", "Helvetica Neue", Arial, sans-serif;
|
||||
--fs-mega: clamp(3.25rem, 9.6vw, 8.5rem);
|
||||
--fs-display: clamp(2.6rem, 6.4vw, 5.75rem);
|
||||
--fs-title: clamp(1.75rem, 3.2vw, 2.75rem);
|
||||
--fs-lead: clamp(1.15rem, 1.5vw, 1.375rem);
|
||||
--fs-body: 1.0625rem;
|
||||
--fs-label: .8125rem;
|
||||
|
||||
/* Raum — 8px-Skala */
|
||||
--s1: .5rem; --s2: 1rem; --s3: 1.5rem; --s4: 2rem; --s5: 3rem; --s6: 4rem; --s7: 6rem;
|
||||
--section: clamp(6rem, 12vw, 10rem);
|
||||
--gutter: clamp(1rem, 3vw, 1.5rem);
|
||||
--max: 1320px;
|
||||
--radius: 4px;
|
||||
|
||||
/* Motion */
|
||||
--ease: cubic-bezier(.16, 1, .3, 1);
|
||||
--ease-io: cubic-bezier(.65, 0, .35, 1);
|
||||
--t-fast: 200ms;
|
||||
--t-mid: 450ms;
|
||||
|
||||
/* Chevron-Winkel (Signatur) — Tiefe des „<" */
|
||||
--chev: 18%;
|
||||
}
|
||||
|
||||
/* ---------- Reset / Basis ---------- */
|
||||
*, *::before, *::after { box-sizing: border-box; }
|
||||
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-padding-top: 96px; }
|
||||
html.lenis, html.lenis body { height: auto; }
|
||||
.lenis.lenis-smooth { scroll-behavior: auto !important; }
|
||||
.lenis.lenis-stopped { overflow: clip; }
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--font);
|
||||
font-size: var(--fs-body);
|
||||
font-stretch: 100%;
|
||||
line-height: 1.6;
|
||||
color: var(--fog);
|
||||
background: var(--night-950);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-rendering: optimizeLegibility;
|
||||
overflow-wrap: break-word;
|
||||
overflow-x: clip;
|
||||
}
|
||||
img, svg, picture { display: block; max-width: 100%; }
|
||||
img { height: auto; }
|
||||
a { color: inherit; text-decoration: none; }
|
||||
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
|
||||
h1, h2, h3, h4, p, ul, ol, figure, dl, dd { margin: 0; }
|
||||
ul[role="list"], ol[role="list"] { list-style: none; padding: 0; }
|
||||
::selection { background: var(--kk); color: var(--night-950); }
|
||||
:focus-visible { outline: 2px solid var(--kk-bright); outline-offset: 3px; border-radius: 2px; }
|
||||
.theme-light :focus-visible { outline-color: var(--kk-ink); }
|
||||
|
||||
.skip-link {
|
||||
position: fixed; left: var(--s2); top: var(--s2); z-index: 200;
|
||||
padding: .75rem 1.25rem; background: var(--kk); color: var(--night-950); font-weight: 700;
|
||||
transform: translateY(-160%); transition: transform var(--t-fast) var(--ease);
|
||||
}
|
||||
.skip-link:focus { transform: none; }
|
||||
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
||||
|
||||
/* ---------- Layout ---------- */
|
||||
.wrap { width: min(100% - 2 * var(--gutter), var(--max)); margin-inline: auto; }
|
||||
.section { padding-block: var(--section); position: relative; }
|
||||
.theme-light { background: var(--paper); color: var(--ink); }
|
||||
.theme-white { background: var(--white); color: var(--ink); }
|
||||
.theme-deep { background: var(--night-900); }
|
||||
.grid-12 { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--s4) var(--gutter); }
|
||||
|
||||
/* ---------- Typo ---------- */
|
||||
.mega, .display, .title {
|
||||
font-stretch: 125%;
|
||||
font-weight: 800;
|
||||
letter-spacing: -.035em;
|
||||
line-height: .92;
|
||||
text-wrap: balance;
|
||||
}
|
||||
.mega { font-size: var(--fs-mega); }
|
||||
.display { font-size: var(--fs-display); line-height: .95; }
|
||||
.title { font-size: var(--fs-title); line-height: 1.02; letter-spacing: -.025em; }
|
||||
.lead { font-size: var(--fs-lead); line-height: 1.5; color: var(--fog-soft); max-width: 38ch; }
|
||||
.theme-light .lead, .theme-white .lead { color: var(--ink-soft); }
|
||||
.prose p + p { margin-top: 1em; }
|
||||
.muted { color: var(--fog-soft); }
|
||||
.theme-light .muted, .theme-white .muted { color: var(--ink-soft); }
|
||||
.accent { color: var(--kk); }
|
||||
.theme-light .accent, .theme-white .accent { color: var(--kk-ink); }
|
||||
|
||||
.eyebrow {
|
||||
display: inline-flex; align-items: center; gap: .75rem;
|
||||
font-size: var(--fs-label); font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
|
||||
color: var(--fog-mute);
|
||||
}
|
||||
.theme-light .eyebrow, .theme-white .eyebrow { color: var(--ink-soft); }
|
||||
.eyebrow::before {
|
||||
content: ""; width: 14px; height: 14px; flex: none;
|
||||
background: var(--kk);
|
||||
clip-path: polygon(100% 0, 55% 0, 0 50%, 55% 100%, 100% 100%, 45% 50%);
|
||||
}
|
||||
.theme-light .eyebrow::before, .theme-white .eyebrow::before { background: var(--kk-ink); }
|
||||
|
||||
/* Zeilen-Maske für SplitText */
|
||||
.line-mask { display: block; overflow: clip; padding-bottom: .06em; margin-bottom: -.06em; }
|
||||
|
||||
/* ---------- Chevron-Motiv ---------- */
|
||||
.chev-mark { width: 44px; height: 32px; flex: none; }
|
||||
.chev { fill: currentColor; }
|
||||
|
||||
/* Winkel-Reveal: --x läuft von 118% auf 0%, die Spitze „<" führt */
|
||||
.reveal-img { --x: 0%; clip-path: polygon(100% 0, var(--x) 0, calc(var(--x) - var(--chev)) 50%, var(--x) 100%, 100% 100%); }
|
||||
.reveal-img img { transform-origin: 70% 50%; }
|
||||
|
||||
/* ---------- Buttons ---------- */
|
||||
.btn {
|
||||
--bg: var(--kk); --fg: var(--night-950);
|
||||
position: relative; display: inline-flex; align-items: center; gap: .9rem;
|
||||
min-height: 56px; padding: 0 1.5rem 0 1.75rem;
|
||||
font-weight: 650; font-stretch: 110%; letter-spacing: -.005em; font-size: 1rem;
|
||||
color: var(--fg); background: var(--bg);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden; isolation: isolate;
|
||||
transition: color var(--t-mid) var(--ease);
|
||||
will-change: transform;
|
||||
}
|
||||
.btn::before {
|
||||
/* Füllung wischt im Chevron-Winkel von rechts herein */
|
||||
content: ""; position: absolute; inset: 0; z-index: -1;
|
||||
background: var(--fog);
|
||||
clip-path: polygon(100% 0, 120% 0, 100% 50%, 120% 100%, 100% 100%);
|
||||
transition: clip-path var(--t-mid) var(--ease);
|
||||
}
|
||||
.btn:hover::before, .btn:focus-visible::before { clip-path: polygon(100% 0, 0 0, -20% 50%, 0 100%, 100% 100%); }
|
||||
.btn__arrow { width: 18px; height: 18px; flex: none; transition: transform var(--t-mid) var(--ease); }
|
||||
.btn:hover .btn__arrow { transform: translateX(4px); }
|
||||
.btn--ghost { --bg: transparent; --fg: var(--fog); box-shadow: inset 0 0 0 1px var(--line-dark); }
|
||||
.btn--ghost:hover { --fg: var(--night-950); }
|
||||
.theme-light .btn--ghost, .theme-white .btn--ghost { --fg: var(--ink); box-shadow: inset 0 0 0 1px var(--line-light); }
|
||||
.theme-light .btn::before, .theme-white .btn::before { background: var(--night-950); }
|
||||
.theme-light .btn:not(.btn--ghost), .theme-white .btn:not(.btn--ghost) { --bg: var(--kk-ink); --fg: var(--white); }
|
||||
.theme-light .btn--ghost:hover, .theme-white .btn--ghost:hover { --fg: var(--white); }
|
||||
.btn-row { display: flex; flex-wrap: wrap; gap: var(--s2); align-items: center; }
|
||||
|
||||
.link-arrow {
|
||||
display: inline-flex; align-items: center; gap: .5rem; font-weight: 600;
|
||||
background: linear-gradient(currentColor, currentColor) 0 100% / 0 1px no-repeat;
|
||||
transition: background-size var(--t-mid) var(--ease);
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
.link-arrow:hover { background-size: 100% 1px; }
|
||||
.link-arrow svg { width: 14px; height: 14px; transition: transform var(--t-mid) var(--ease); }
|
||||
.link-arrow:hover svg { transform: translateX(3px); }
|
||||
|
||||
/* ---------- Header ---------- */
|
||||
.site-header {
|
||||
position: fixed; inset: 0 0 auto; z-index: 100;
|
||||
transition: transform .5s var(--ease), background-color .4s var(--ease), box-shadow .4s var(--ease);
|
||||
}
|
||||
.site-header.is-solid {
|
||||
background: rgba(10, 20, 36, .72);
|
||||
-webkit-backdrop-filter: saturate(160%) blur(16px);
|
||||
backdrop-filter: saturate(160%) blur(16px);
|
||||
box-shadow: 0 1px 0 var(--line-dark);
|
||||
}
|
||||
.site-header.is-hidden { transform: translateY(-100%); }
|
||||
.site-header__inner { display: flex; align-items: center; justify-content: space-between; gap: var(--s3); height: 84px; }
|
||||
.brand { display: inline-flex; align-items: center; gap: .75rem; color: var(--fog); }
|
||||
.brand .chev-mark { color: var(--kk); }
|
||||
.brand__name { display: grid; line-height: 1; }
|
||||
.brand__name b { font-weight: 800; font-stretch: 125%; letter-spacing: .02em; font-size: 1.05rem; }
|
||||
.brand__name span { font-size: .6875rem; letter-spacing: .24em; text-transform: uppercase; color: var(--fog-soft); margin-top: .3rem; }
|
||||
.nav { display: flex; align-items: center; gap: clamp(1.25rem, 2.4vw, 2.25rem); }
|
||||
.nav__link { position: relative; font-weight: 500; font-size: .96875rem; color: var(--fog-soft); transition: color var(--t-fast) var(--ease); padding-block: .5rem; }
|
||||
.nav__link::after {
|
||||
content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--kk);
|
||||
transform: scaleX(0); transform-origin: right; transition: transform var(--t-mid) var(--ease);
|
||||
}
|
||||
.nav__link:hover, .nav__link[aria-current="page"] { color: var(--fog); }
|
||||
.nav__link:hover::after, .nav__link[aria-current="page"]::after { transform: scaleX(1); transform-origin: left; }
|
||||
.header-cta { display: flex; align-items: center; gap: var(--s2); }
|
||||
.header-phone { display: inline-flex; align-items: center; gap: .5rem; font-weight: 600; font-variant-numeric: tabular-nums; font-size: .96875rem; }
|
||||
.header-phone svg { width: 16px; height: 16px; color: var(--kk); }
|
||||
.header-cta .btn { min-height: 44px; padding: 0 1.1rem 0 1.25rem; font-size: .9375rem; }
|
||||
|
||||
.menu-toggle { display: none; width: 48px; height: 48px; place-items: center; border-radius: var(--radius); box-shadow: inset 0 0 0 1px var(--line-dark); }
|
||||
.menu-toggle__bars { position: relative; width: 20px; height: 12px; }
|
||||
.menu-toggle__bars::before, .menu-toggle__bars::after {
|
||||
content: ""; position: absolute; left: 0; right: 0; height: 2px; background: var(--fog);
|
||||
transition: transform var(--t-mid) var(--ease), top var(--t-mid) var(--ease);
|
||||
}
|
||||
.menu-toggle__bars::before { top: 0; }
|
||||
.menu-toggle__bars::after { top: 10px; }
|
||||
[aria-expanded="true"] .menu-toggle__bars::before { top: 5px; transform: rotate(45deg); }
|
||||
[aria-expanded="true"] .menu-toggle__bars::after { top: 5px; transform: rotate(-45deg); }
|
||||
|
||||
.mobile-nav {
|
||||
position: fixed; inset: 0; z-index: 90; background: var(--night-900);
|
||||
display: flex; flex-direction: column; justify-content: flex-end;
|
||||
padding: 110px var(--gutter) var(--s5);
|
||||
clip-path: polygon(100% 0, 118% 0, 100% 50%, 118% 100%, 100% 100%);
|
||||
transition: clip-path .7s var(--ease-io), visibility 0s .7s;
|
||||
visibility: hidden;
|
||||
}
|
||||
.mobile-nav.is-open { clip-path: polygon(100% 0, 0 0, -18% 50%, 0 100%, 100% 100%); visibility: visible; transition: clip-path .7s var(--ease-io), visibility 0s; }
|
||||
.mobile-nav ul { display: grid; gap: .25rem; }
|
||||
.mobile-nav a.mobile-nav__link { display: block; font-size: clamp(2.25rem, 10vw, 3.5rem); font-weight: 800; font-stretch: 125%; letter-spacing: -.03em; line-height: 1.1; }
|
||||
.mobile-nav a.mobile-nav__link[aria-current="page"] { color: var(--kk); }
|
||||
.mobile-nav__meta { margin-top: var(--s5); display: grid; gap: .5rem; color: var(--fog-soft); }
|
||||
.mobile-nav__meta a { color: var(--fog); font-weight: 600; }
|
||||
|
||||
@media (max-width: 1080px) {
|
||||
.nav, .header-phone { display: none; }
|
||||
.menu-toggle { display: grid; }
|
||||
}
|
||||
@media (max-width: 520px) {
|
||||
.header-cta .btn { display: none; }
|
||||
}
|
||||
|
||||
/* ---------- Hero ---------- */
|
||||
.hero {
|
||||
position: relative; min-height: 100svh; display: grid; align-items: end;
|
||||
padding: 140px 0 var(--s5); overflow: clip; isolation: isolate;
|
||||
}
|
||||
.hero__media { position: absolute; inset: 0; z-index: -2; }
|
||||
.hero__media img { width: 100%; height: 115%; object-fit: cover; object-position: 60% 40%; }
|
||||
.hero__media::after {
|
||||
content: ""; position: absolute; inset: 0;
|
||||
background:
|
||||
linear-gradient(90deg, rgba(10, 20, 36, .96) 0%, rgba(10, 20, 36, .82) 42%, rgba(10, 20, 36, .35) 100%),
|
||||
linear-gradient(0deg, rgba(10, 20, 36, 1) 0%, rgba(10, 20, 36, 0) 45%);
|
||||
}
|
||||
.hero__chevrons { position: absolute; right: -6vw; top: 50%; z-index: -1; width: min(62vw, 880px); translate: 0 -50%; color: var(--kk); pointer-events: none; }
|
||||
.hero__chevrons path { fill: none; stroke: currentColor; stroke-width: 1.2; vector-effect: non-scaling-stroke; }
|
||||
.hero__chevrons path:nth-child(2) { opacity: .55; }
|
||||
.hero__chevrons path:nth-child(3) { opacity: .28; }
|
||||
.hero__content { display: grid; gap: var(--s4); }
|
||||
.hero h1 { max-width: 12ch; }
|
||||
.hero .lead { max-width: 44ch; }
|
||||
.hero__foot {
|
||||
margin-top: var(--s6); padding-top: var(--s3); border-top: 1px solid var(--line-dark);
|
||||
display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--s2) var(--s4);
|
||||
font-size: .875rem; color: var(--fog-mute); letter-spacing: .04em;
|
||||
}
|
||||
.hero__foot ul { display: flex; flex-wrap: wrap; gap: var(--s1) var(--s4); list-style: none; padding: 0; }
|
||||
.hero__foot li { display: inline-flex; align-items: center; gap: .6rem; }
|
||||
.hero__foot li::before { content: ""; width: 6px; height: 6px; background: var(--kk); clip-path: polygon(100% 0, 0 50%, 100% 100%); }
|
||||
.scroll-hint { display: inline-flex; align-items: center; gap: .6rem; }
|
||||
.scroll-hint__line { width: 1px; height: 28px; background: var(--line-dark); position: relative; overflow: hidden; }
|
||||
.scroll-hint__line::after { content: ""; position: absolute; inset: 0; background: var(--kk); transform: translateY(-100%); animation: scroll-hint 2.2s var(--ease-io) infinite; }
|
||||
@keyframes scroll-hint { 0% { transform: translateY(-100%); } 60%, 100% { transform: translateY(100%); } }
|
||||
|
||||
/* Unterseiten-Hero */
|
||||
.page-hero { position: relative; padding: 180px 0 var(--s6); overflow: clip; isolation: isolate; }
|
||||
.page-hero .hero__chevrons { width: min(48vw, 620px); right: -8vw; opacity: .7; }
|
||||
.page-hero__grid { display: grid; gap: var(--s4); align-items: end; }
|
||||
.page-hero h1 { max-width: 14ch; }
|
||||
@media (min-width: 900px) { .page-hero__grid { grid-template-columns: 1.4fr 1fr; } }
|
||||
|
||||
/* ---------- Zielgruppen-Leiste ---------- */
|
||||
.audience { border-block: 1px solid var(--line-dark); }
|
||||
.audience ul { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); list-style: none; padding: 0; margin: 0; }
|
||||
.audience li {
|
||||
padding: var(--s4) var(--s3); display: grid; gap: .35rem; border-left: 1px solid var(--line-dark);
|
||||
}
|
||||
.audience li:first-child { border-left: 0; padding-left: 0; }
|
||||
.audience b { hyphens: auto; -webkit-hyphens: auto; font-weight: 700; font-stretch: 112%; font-size: 1.0625rem; }
|
||||
.audience span { color: var(--fog-mute); font-size: .9375rem; }
|
||||
@media (max-width: 860px) {
|
||||
.audience ul { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
.audience li { padding-inline: var(--s2); }
|
||||
.audience li:nth-child(3) { border-left: 0; padding-left: 0; }
|
||||
.audience li:nth-child(n+3) { border-top: 1px solid var(--line-dark); }
|
||||
}
|
||||
|
||||
/* ---------- Kennzahlen ---------- */
|
||||
.stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s4) var(--gutter); }
|
||||
.stat { display: grid; gap: .75rem; align-content: start; padding-top: var(--s3); border-top: 1px solid var(--line-light); }
|
||||
.stat__num { font-size: clamp(3.5rem, 8vw, 7rem); font-weight: 800; font-stretch: 125%; letter-spacing: -.05em; line-height: .85; font-variant-numeric: tabular-nums; color: var(--ink); }
|
||||
.stat__num sup { font-size: .4em; vertical-align: top; position: relative; top: .15em; margin-left: .05em; color: var(--kk-ink); letter-spacing: 0; }
|
||||
.stat__label { color: var(--ink-soft); max-width: 22ch; }
|
||||
@media (max-width: 900px) { .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
||||
|
||||
.intro-split { display: grid; gap: var(--s5); margin-bottom: var(--s7); }
|
||||
@media (min-width: 960px) { .intro-split { grid-template-columns: 1.25fr 1fr; align-items: end; } }
|
||||
|
||||
/* ---------- Leistungen: horizontale Sektion ---------- */
|
||||
.services-head { display: grid; gap: var(--s3); margin-bottom: var(--s6); }
|
||||
@media (min-width: 960px) { .services-head { grid-template-columns: 1.3fr 1fr; align-items: end; } }
|
||||
.hscroll { position: relative; }
|
||||
.hscroll__track { display: grid; gap: var(--s5); }
|
||||
.panel { display: grid; gap: var(--s3); }
|
||||
.panel__media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; border-radius: var(--radius); background: var(--night-800); }
|
||||
.panel__media img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.panel__media picture, .service-row__media picture, .hero__media picture, .compare picture { display: block; width: 100%; height: 100%; }
|
||||
.panel__num { position: absolute; left: var(--s3); top: var(--s2); font-weight: 800; font-stretch: 125%; font-size: 1rem; letter-spacing: .06em; color: var(--fog); mix-blend-mode: normal; text-shadow: 0 1px 12px rgba(10,20,36,.5); }
|
||||
.panel__body { display: grid; gap: var(--s2); max-width: 48ch; }
|
||||
.panel h3, .service-row h3, .job summary h3, .contact-card strong { hyphens: auto; -webkit-hyphens: auto; }
|
||||
.panel h3 { font-size: clamp(1.75rem, 2.6vw, 2.5rem); font-weight: 800; font-stretch: 120%; letter-spacing: -.03em; line-height: 1; }
|
||||
.panel p { color: var(--fog-soft); }
|
||||
.tags { display: flex; flex-wrap: wrap; gap: .5rem; list-style: none; padding: 0; margin: 0; }
|
||||
.tags li { font-size: .8125rem; padding: .35rem .7rem; border-radius: 999px; box-shadow: inset 0 0 0 1px var(--line-dark); color: var(--fog-soft); }
|
||||
.theme-light .tags li, .theme-white .tags li { box-shadow: inset 0 0 0 1px var(--line-light); color: var(--ink-soft); }
|
||||
.hscroll__progress { display: none; }
|
||||
.hscroll:not(.is-pinned) .hscroll__track { width: min(100% - 2 * var(--gutter), var(--max)); margin-inline: auto; }
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.hscroll.is-pinned { height: 100vh; overflow: clip; display: flex; flex-direction: column; justify-content: center; }
|
||||
.hscroll.is-pinned .hscroll__track {
|
||||
display: flex; gap: clamp(2rem, 4vw, 4rem); width: max-content;
|
||||
padding-inline: max(var(--gutter), (100vw - var(--max)) / 2);
|
||||
}
|
||||
.hscroll.is-pinned .panel { width: clamp(420px, 38vw, 560px); flex: none; }
|
||||
.hscroll.is-pinned .panel:nth-child(even) { margin-top: 8vh; }
|
||||
.hscroll.is-pinned .panel__media { aspect-ratio: auto; height: min(44vh, 400px); }
|
||||
.hscroll.is-pinned .hscroll__progress {
|
||||
display: flex; align-items: center; gap: var(--s3);
|
||||
width: min(100% - 2 * var(--gutter), var(--max)); margin: var(--s5) auto 0;
|
||||
font-size: var(--fs-label); letter-spacing: .12em; color: var(--fog-mute); font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.hscroll__bar { flex: 1; height: 2px; background: var(--line-dark); position: relative; overflow: hidden; }
|
||||
.hscroll__bar i { position: absolute; inset: 0; background: var(--kk); transform-origin: left; transform: scaleX(0); }
|
||||
}
|
||||
@media (min-width: 700px) and (max-width: 1023px) {
|
||||
.hscroll__track { grid-template-columns: 1fr 1fr; }
|
||||
}
|
||||
|
||||
/* ---------- Osmose-Feature + Vorher/Nachher ---------- */
|
||||
.feature { display: grid; gap: var(--s5); align-items: center; }
|
||||
@media (min-width: 960px) { .feature { grid-template-columns: 1fr 1.15fr; gap: var(--s6); } }
|
||||
.feature__copy { display: grid; gap: var(--s3); }
|
||||
.checklist { list-style: none; padding: 0; margin: 0; display: grid; gap: .9rem; }
|
||||
.checklist li { display: grid; grid-template-columns: 18px 1fr; gap: .9rem; align-items: baseline; }
|
||||
.checklist li::before { content: ""; width: 12px; height: 12px; background: var(--kk-ink); clip-path: polygon(0 0, 45% 0, 100% 50%, 45% 100%, 0 100%, 55% 50%); transform: translateY(1px); }
|
||||
.theme-deep .checklist li::before, body > .section:not([class*="theme-"]) .checklist li::before { background: var(--kk); }
|
||||
|
||||
.compare {
|
||||
--pos: 50%;
|
||||
position: relative; aspect-ratio: 4 / 3; border-radius: var(--radius); overflow: hidden;
|
||||
user-select: none; touch-action: pan-y; background: var(--night-800); cursor: ew-resize;
|
||||
}
|
||||
.compare img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; pointer-events: none; }
|
||||
.compare__before { position: absolute; inset: 0; clip-path: inset(0 calc(100% - var(--pos)) 0 0); }
|
||||
.compare__handle {
|
||||
position: absolute; top: 0; bottom: 0; left: var(--pos); width: 2px; margin-left: -1px;
|
||||
background: var(--white); box-shadow: 0 0 0 1px rgba(10,20,36,.2);
|
||||
}
|
||||
.compare__knob {
|
||||
position: absolute; top: 50%; left: 50%; width: 56px; height: 56px; transform: translate(-50%, -50%);
|
||||
display: grid; place-items: center; border-radius: 50%; background: var(--white); color: var(--night-950);
|
||||
box-shadow: 0 10px 30px rgba(10,20,36,.35);
|
||||
transition: transform var(--t-fast) var(--ease);
|
||||
}
|
||||
.compare:active .compare__knob, .compare:focus-visible .compare__knob { transform: translate(-50%, -50%) scale(1.08); }
|
||||
.compare__knob svg { width: 26px; height: 26px; }
|
||||
.compare__tag {
|
||||
position: absolute; bottom: var(--s2); padding: .35rem .7rem; border-radius: 999px;
|
||||
font-size: .75rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
|
||||
background: rgba(10,20,36,.72); color: var(--fog); backdrop-filter: blur(6px);
|
||||
}
|
||||
.compare__tag--before { left: var(--s2); }
|
||||
.compare__tag--after { right: var(--s2); background: var(--kk); color: var(--night-950); }
|
||||
.compare:focus-visible { outline-offset: 4px; }
|
||||
.figure-note { margin-top: .75rem; font-size: .8125rem; color: var(--ink-soft); }
|
||||
|
||||
/* ---------- Philosophie ---------- */
|
||||
.philosophy { text-align: left; }
|
||||
.philosophy__words { font-size: var(--fs-mega); font-weight: 800; font-stretch: 125%; letter-spacing: -.045em; line-height: .95; }
|
||||
.philosophy__words .word { display: inline-block; }
|
||||
.philosophy__words .dot { color: var(--kk); }
|
||||
.philosophy__sub { margin-top: var(--s5); display: grid; gap: var(--s4); }
|
||||
@media (min-width: 900px) { .philosophy__sub { grid-template-columns: repeat(3, 1fr); } }
|
||||
.philosophy__sub div { border-top: 1px solid var(--line-dark); padding-top: var(--s3); display: grid; gap: .5rem; }
|
||||
.philosophy__sub b { font-weight: 700; font-stretch: 112%; font-size: 1.125rem; }
|
||||
.philosophy__sub p { color: var(--fog-soft); }
|
||||
|
||||
/* ---------- Karriere-Band ---------- */
|
||||
.band { background: var(--kk); color: var(--night-950); position: relative; overflow: clip; isolation: isolate; }
|
||||
.band__inner { display: grid; gap: var(--s4); padding-block: clamp(4rem, 9vw, 7rem); }
|
||||
@media (min-width: 900px) { .band__inner { grid-template-columns: 1.4fr auto; align-items: end; } }
|
||||
.band .eyebrow { color: var(--night-950); }
|
||||
.band .eyebrow::before { background: var(--night-950); }
|
||||
.band p { max-width: 50ch; font-size: var(--fs-lead); line-height: 1.5; }
|
||||
.band .btn { --bg: var(--night-950); --fg: var(--fog); }
|
||||
.band .btn::before { background: var(--white); }
|
||||
.band .btn:hover { --fg: var(--night-950); }
|
||||
.band__chev { position: absolute; right: -4%; top: 50%; width: 46%; translate: 0 -50%; z-index: -1; color: var(--night-950); opacity: .08; }
|
||||
.band__chev path { fill: currentColor; }
|
||||
|
||||
/* ---------- Kontakt-Abschluss ---------- */
|
||||
.cta-final { display: grid; gap: var(--s5); }
|
||||
@media (min-width: 960px) { .cta-final { grid-template-columns: 1.3fr 1fr; align-items: end; } }
|
||||
.contact-lines { display: grid; gap: 0; border-top: 1px solid var(--line-dark); }
|
||||
.contact-line {
|
||||
display: grid; grid-template-columns: 1fr auto; align-items: center; gap: var(--s2);
|
||||
padding: var(--s3) 0; border-bottom: 1px solid var(--line-dark);
|
||||
transition: padding var(--t-mid) var(--ease), color var(--t-fast);
|
||||
}
|
||||
.contact-line small { display: block; font-size: var(--fs-label); letter-spacing: .12em; text-transform: uppercase; color: var(--fog-mute); margin-bottom: .25rem; }
|
||||
.contact-line strong { font-size: clamp(1.25rem, 2.2vw, 1.75rem); font-weight: 700; font-stretch: 112%; letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
|
||||
.contact-line svg { width: 22px; height: 22px; color: var(--kk); transition: transform var(--t-mid) var(--ease); }
|
||||
a.contact-line:hover { padding-left: var(--s2); }
|
||||
a.contact-line:hover svg { transform: translateX(4px); }
|
||||
.theme-light .contact-lines, .theme-light .contact-line { border-color: var(--line-light); }
|
||||
.theme-light .contact-line small { color: var(--ink-soft); }
|
||||
.theme-light .contact-line svg { color: var(--kk-ink); }
|
||||
|
||||
/* ---------- Footer ---------- */
|
||||
.site-footer { background: var(--night-950); border-top: 1px solid var(--line-dark); padding: var(--s6) 0 var(--s4); color: var(--fog-soft); font-size: .9375rem; }
|
||||
.footer-grid { display: grid; gap: var(--s5); }
|
||||
@media (min-width: 860px) { .footer-grid { grid-template-columns: 1.4fr 1fr 1fr 1fr; } }
|
||||
.footer-grid h2 { font-size: var(--fs-label); letter-spacing: .12em; text-transform: uppercase; color: var(--fog-mute); font-weight: 600; margin-bottom: var(--s2); }
|
||||
.footer-grid ul { list-style: none; padding: 0; margin: 0; display: grid; gap: .5rem; }
|
||||
.footer-grid a { color: var(--fog); transition: color var(--t-fast); }
|
||||
.footer-grid a:hover { color: var(--kk-bright); }
|
||||
.footer-motto { margin-top: var(--s3); color: var(--fog-soft); max-width: 30ch; }
|
||||
.footer-bottom { margin-top: var(--s6); padding-top: var(--s3); border-top: 1px solid var(--line-dark); display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--s2); font-size: .8125rem; color: var(--fog-mute); }
|
||||
.footer-bottom nav { display: flex; gap: var(--s3); }
|
||||
.footer-bottom a:hover { color: var(--fog); }
|
||||
.footer-word {
|
||||
font-size: calc(min(100vw - 2 * var(--gutter), var(--max)) / 7.4); font-weight: 800; font-stretch: 125%; letter-spacing: -.06em; line-height: .8; overflow: hidden;
|
||||
color: var(--night-800); margin-top: var(--s6); white-space: nowrap; user-select: none;
|
||||
}
|
||||
|
||||
/* ---------- Notruf-Pille ---------- */
|
||||
.sos {
|
||||
position: fixed; right: var(--gutter); bottom: var(--gutter); z-index: 80;
|
||||
display: inline-flex; align-items: center; gap: .7rem;
|
||||
padding: .7rem 1.1rem .7rem .9rem; border-radius: 999px;
|
||||
background: var(--fog); color: var(--night-950); font-weight: 650; font-size: .9375rem;
|
||||
box-shadow: 0 14px 40px rgba(10,20,36,.35);
|
||||
transform: translateY(calc(100% + 2rem)); opacity: 0;
|
||||
transition: transform .6s var(--ease), opacity .4s var(--ease);
|
||||
}
|
||||
.sos.is-visible { transform: none; opacity: 1; }
|
||||
.sos__dot { position: relative; width: 10px; height: 10px; border-radius: 50%; background: var(--kk-deep); }
|
||||
.sos__dot::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: var(--kk-deep); animation: pulse 2.4s var(--ease) infinite; }
|
||||
@keyframes pulse { 0% { transform: scale(1); opacity: .6; } 70%, 100% { transform: scale(2.8); opacity: 0; } }
|
||||
.sos small { display: block; font-size: .6875rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-soft); line-height: 1.2; }
|
||||
.sos b { font-variant-numeric: tabular-nums; line-height: 1.2; }
|
||||
html:not(.js) .sos { transform: none; opacity: 1; position: static; margin: var(--s3); }
|
||||
|
||||
/* ---------- Intro (nur Startseite, 1× pro Session) ---------- */
|
||||
.intro { display: none; }
|
||||
html.has-intro .intro {
|
||||
display: grid; place-items: center; position: fixed; inset: 0; z-index: 300; background: var(--night-950);
|
||||
/* Sicherheitsnetz: falls JS nicht läuft, verschwindet das Intro nach 2.4s von selbst */
|
||||
animation: intro-failsafe 0s 2.4s forwards;
|
||||
}
|
||||
@keyframes intro-failsafe { to { visibility: hidden; } }
|
||||
.intro__mark { display: flex; align-items: center; gap: 1.1rem; color: var(--kk); }
|
||||
.intro__mark svg { width: 88px; height: 64px; }
|
||||
.intro__word { overflow: clip; }
|
||||
.intro__word span { display: block; font-weight: 800; font-stretch: 125%; font-size: clamp(1.5rem, 4vw, 2.25rem); letter-spacing: .04em; color: var(--fog); line-height: 1; }
|
||||
.intro__word small { display: block; font-size: .75rem; letter-spacing: .3em; text-transform: uppercase; color: var(--fog-soft); margin-top: .5rem; }
|
||||
|
||||
/* ---------- Leistungsseite ---------- */
|
||||
.switch { display: inline-flex; padding: 4px; border-radius: 999px; box-shadow: inset 0 0 0 1px var(--line-light); background: var(--white); position: relative; }
|
||||
.switch__btn { position: relative; z-index: 1; padding: .7rem 1.4rem; border-radius: 999px; font-weight: 600; font-size: .9375rem; color: var(--ink-soft); transition: color var(--t-mid) var(--ease); }
|
||||
.switch__btn[aria-selected="true"] { color: var(--white); }
|
||||
.switch__pill { position: absolute; top: 4px; bottom: 4px; left: 4px; border-radius: 999px; background: var(--night-950); transition: transform var(--t-mid) var(--ease), width var(--t-mid) var(--ease); }
|
||||
.scope-lists { margin-top: var(--s5); }
|
||||
.scope-list { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); border-top: 1px solid var(--line-light); }
|
||||
.scope-list li { display: flex; align-items: center; gap: .9rem; padding: var(--s3) var(--s2) var(--s3) 0; border-bottom: 1px solid var(--line-light); font-weight: 600; font-stretch: 108%; font-size: 1.125rem; }
|
||||
.scope-list li::before { content: ""; width: 10px; height: 10px; flex: none; background: var(--kk-ink); clip-path: polygon(0 0, 45% 0, 100% 50%, 45% 100%, 0 100%, 55% 50%); }
|
||||
.scope-list[hidden] { display: none; }
|
||||
|
||||
.service-rows { display: grid; gap: var(--s7); }
|
||||
.service-row { display: grid; gap: var(--s4); align-items: center; }
|
||||
.service-row__media { aspect-ratio: 5 / 4; border-radius: var(--radius); overflow: hidden; background: var(--night-800); }
|
||||
.service-row__media img { width: 100%; height: 100%; object-fit: cover; }
|
||||
.service-row__body { display: grid; gap: var(--s3); max-width: 52ch; }
|
||||
.service-row__num { font-weight: 800; font-stretch: 125%; color: var(--kk); letter-spacing: .06em; }
|
||||
@media (min-width: 960px) {
|
||||
.service-row { grid-template-columns: 1.1fr 1fr; gap: var(--s6); }
|
||||
.service-row:nth-child(even) .service-row__media { order: 2; }
|
||||
}
|
||||
|
||||
.downloads { display: grid; gap: var(--s2); }
|
||||
@media (min-width: 760px) { .downloads { grid-template-columns: 1fr 1fr; } }
|
||||
.download {
|
||||
display: grid; grid-template-columns: auto 1fr auto; gap: var(--s3); align-items: center;
|
||||
padding: var(--s3); border-radius: var(--radius); background: var(--white); box-shadow: inset 0 0 0 1px var(--line-light);
|
||||
transition: box-shadow var(--t-mid) var(--ease), transform var(--t-mid) var(--ease);
|
||||
}
|
||||
.download:hover { box-shadow: inset 0 0 0 1px var(--kk-ink), 0 18px 40px rgba(10,20,36,.08); transform: translateY(-2px); }
|
||||
.download__icon { width: 48px; height: 56px; display: grid; place-items: end center; padding-bottom: 8px; background: var(--night-950); color: var(--fog); font-size: .625rem; font-weight: 800; letter-spacing: .08em; clip-path: polygon(0 0, 70% 0, 100% 22%, 100% 100%, 0 100%); }
|
||||
.download b { display: block; font-weight: 700; font-stretch: 108%; }
|
||||
.download span { color: var(--ink-soft); font-size: .875rem; }
|
||||
.download svg { width: 22px; height: 22px; color: var(--kk-ink); }
|
||||
|
||||
/* ---------- Unternehmen ---------- */
|
||||
.timeline { position: relative; display: grid; gap: var(--s6); padding-left: clamp(2rem, 6vw, 5rem); }
|
||||
.timeline__line { position: absolute; left: 0; top: 0; bottom: 0; width: 2px; background: var(--line-light); }
|
||||
.timeline__line i { position: absolute; inset: 0; background: var(--kk-ink); transform-origin: top; }
|
||||
.tl-item { position: relative; display: grid; gap: var(--s2); }
|
||||
@media (min-width: 900px) { .tl-item { grid-template-columns: 220px 1fr; gap: var(--s5); } }
|
||||
.tl-item::before {
|
||||
content: ""; position: absolute; left: calc(-1 * clamp(2rem, 6vw, 5rem) - 7px); top: .55em; width: 16px; height: 16px;
|
||||
background: var(--paper); box-shadow: inset 0 0 0 2px var(--kk-ink); border-radius: 50%;
|
||||
}
|
||||
.tl-item__year { font-size: clamp(2.5rem, 5vw, 4rem); font-weight: 800; font-stretch: 125%; letter-spacing: -.04em; line-height: .9; color: var(--ink); font-variant-numeric: tabular-nums; }
|
||||
.tl-item h3 { font-size: 1.375rem; font-weight: 700; font-stretch: 112%; letter-spacing: -.01em; margin-bottom: .5rem; }
|
||||
.tl-item p { color: var(--ink-soft); max-width: 60ch; }
|
||||
|
||||
.team { display: grid; gap: var(--gutter); grid-template-columns: repeat(2, 1fr); }
|
||||
@media (min-width: 720px) { .team { grid-template-columns: repeat(3, 1fr); } }
|
||||
@media (min-width: 1200px) { .team { grid-template-columns: repeat(6, 1fr); } }
|
||||
.member { position: relative; display: grid; gap: var(--s2); }
|
||||
.member__photo {
|
||||
position: relative; aspect-ratio: 4 / 5; border-radius: var(--radius); overflow: hidden;
|
||||
background: linear-gradient(160deg, var(--night-700), var(--night-900));
|
||||
display: grid; place-items: center;
|
||||
}
|
||||
.member__initials { font-size: clamp(3rem, 6vw, 4.5rem); font-weight: 800; font-stretch: 125%; letter-spacing: -.04em; color: var(--kk); transition: transform .8s var(--ease); }
|
||||
.member__photo svg { position: absolute; right: -18%; bottom: -10%; width: 80%; color: var(--kk); opacity: .12; transition: transform .8s var(--ease), opacity .8s var(--ease); }
|
||||
.member:hover .member__initials { transform: scale(1.06); }
|
||||
.member:hover .member__photo svg { transform: translateX(-8%); opacity: .22; }
|
||||
.member__photo small { position: absolute; left: var(--s2); bottom: var(--s2); font-size: .6875rem; letter-spacing: .12em; text-transform: uppercase; color: var(--fog-mute); }
|
||||
.member b { font-weight: 700; font-stretch: 112%; font-size: 1.125rem; display: block; }
|
||||
.member span { color: var(--ink-soft); }
|
||||
.member--more .member__photo { background: transparent; box-shadow: inset 0 0 0 1px var(--line-light); }
|
||||
.member--more .member__initials { color: var(--ink); font-size: clamp(2.5rem, 5vw, 3.5rem); }
|
||||
|
||||
.map-card { display: grid; gap: var(--s4); align-items: stretch; }
|
||||
@media (min-width: 900px) { .map-card { grid-template-columns: 1fr 1.3fr; } }
|
||||
.map {
|
||||
position: relative; min-height: 360px; border-radius: var(--radius); overflow: hidden; background: var(--night-900);
|
||||
color: var(--fog);
|
||||
}
|
||||
.map svg { position: absolute; inset: 0; width: 100%; height: 100%; }
|
||||
.map__pin { position: absolute; left: 56%; top: 46%; transform: translate(-50%, -100%); display: grid; justify-items: center; gap: .4rem; }
|
||||
.map__pin span { padding: .45rem .8rem; background: var(--kk); color: var(--night-950); font-weight: 700; font-size: .875rem; border-radius: var(--radius); white-space: nowrap; }
|
||||
.map__pin i { width: 14px; height: 14px; border-radius: 50%; background: var(--kk); box-shadow: 0 0 0 6px rgba(91,138,214,.25); }
|
||||
|
||||
/* ---------- Karriere ---------- */
|
||||
.benefits { list-style: none; padding: 0; margin: 0; display: grid; gap: 0; border-top: 1px solid var(--line-dark); }
|
||||
@media (min-width: 900px) { .benefits { grid-template-columns: 1fr 1fr; column-gap: var(--s5); } }
|
||||
.benefits li { padding: var(--s3) 0; border-bottom: 1px solid var(--line-dark); display: grid; gap: .25rem; }
|
||||
.benefits b { font-weight: 700; font-stretch: 112%; font-size: 1.125rem; }
|
||||
.benefits span { color: var(--fog-soft); }
|
||||
|
||||
.jobs { display: grid; border-top: 1px solid var(--line-light); }
|
||||
.job { border-bottom: 1px solid var(--line-light); }
|
||||
.job summary {
|
||||
list-style: none; cursor: pointer; display: grid; grid-template-columns: 1fr auto; gap: var(--s3); align-items: center;
|
||||
padding: var(--s4) 0;
|
||||
}
|
||||
.job summary::-webkit-details-marker { display: none; }
|
||||
.job summary h3 { font-size: clamp(1.5rem, 3vw, 2.5rem); font-weight: 800; font-stretch: 122%; letter-spacing: -.03em; line-height: 1.02; }
|
||||
.job summary .job__meta { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .75rem; }
|
||||
.job summary .job__meta span { font-size: .8125rem; padding: .3rem .7rem; border-radius: 999px; box-shadow: inset 0 0 0 1px var(--line-light); color: var(--ink-soft); }
|
||||
.job__toggle { width: 56px; height: 56px; border-radius: 50%; display: grid; place-items: center; box-shadow: inset 0 0 0 1px var(--line-light); transition: background-color var(--t-mid) var(--ease), transform var(--t-mid) var(--ease); }
|
||||
.job__toggle svg { width: 20px; height: 20px; transition: transform var(--t-mid) var(--ease); }
|
||||
.job[open] .job__toggle { background: var(--night-950); color: var(--fog); }
|
||||
.job[open] .job__toggle svg { transform: rotate(45deg); }
|
||||
.job summary:hover .job__toggle { transform: scale(1.06); }
|
||||
.job__body { display: grid; gap: var(--s4); padding-bottom: var(--s5); }
|
||||
@media (min-width: 900px) { .job__body { grid-template-columns: 1fr 1fr; } }
|
||||
.job__body h4 { font-size: var(--fs-label); letter-spacing: .12em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; margin-bottom: var(--s2); }
|
||||
.job__body ul { padding: 0; margin: 0; list-style: none; display: grid; gap: .6rem; }
|
||||
.job__body li { display: grid; grid-template-columns: 14px 1fr; gap: .75rem; }
|
||||
.job__body li::before { content: ""; width: 9px; height: 9px; margin-top: .55em; background: var(--kk-ink); clip-path: polygon(0 0, 45% 0, 100% 50%, 45% 100%, 0 100%, 55% 50%); }
|
||||
.job__text { grid-column: 1 / -1; color: var(--ink-soft); max-width: 70ch; }
|
||||
.job__text p + p { margin-top: .75em; }
|
||||
.job__apply { grid-column: 1 / -1; }
|
||||
|
||||
/* ---------- Kontaktseite ---------- */
|
||||
.contact-grid { display: grid; gap: var(--gutter); }
|
||||
@media (min-width: 900px) { .contact-grid { grid-template-columns: repeat(3, 1fr); } }
|
||||
.contact-card {
|
||||
position: relative; display: grid; gap: var(--s2); align-content: start; padding: var(--s4); min-height: 240px;
|
||||
border-radius: var(--radius); background: var(--night-900); box-shadow: inset 0 0 0 1px var(--line-dark);
|
||||
overflow: hidden; isolation: isolate;
|
||||
transition: box-shadow var(--t-mid) var(--ease);
|
||||
}
|
||||
.contact-card::before {
|
||||
content: ""; position: absolute; inset: 0; z-index: -1; background: var(--night-800);
|
||||
clip-path: polygon(100% 0, 118% 0, 100% 50%, 118% 100%, 100% 100%);
|
||||
transition: clip-path .7s var(--ease);
|
||||
}
|
||||
a.contact-card:hover::before { clip-path: polygon(100% 0, 0 0, -18% 50%, 0 100%, 100% 100%); }
|
||||
a.contact-card:hover { box-shadow: inset 0 0 0 1px var(--kk); }
|
||||
.contact-card small { font-size: var(--fs-label); letter-spacing: .12em; text-transform: uppercase; color: var(--fog-mute); }
|
||||
.contact-card strong { font-size: clamp(1.5rem, 2.4vw, 2rem); font-weight: 800; font-stretch: 118%; letter-spacing: -.02em; line-height: 1.1; font-variant-numeric: tabular-nums; word-break: break-word; }
|
||||
.contact-card p { color: var(--fog-soft); }
|
||||
.contact-card__go { margin-top: auto; display: inline-flex; align-items: center; gap: .5rem; color: var(--kk); font-weight: 600; }
|
||||
.contact-card__go svg { width: 16px; height: 16px; transition: transform var(--t-mid) var(--ease); }
|
||||
a.contact-card:hover .contact-card__go svg { transform: translateX(4px); }
|
||||
.contact-card--sos { background: var(--kk); color: var(--night-950); box-shadow: none; }
|
||||
.contact-card--sos::before { background: var(--kk-bright); }
|
||||
.contact-card--sos small, .contact-card--sos p, .contact-card--sos .contact-card__go { color: var(--night-950); }
|
||||
a.contact-card--sos:hover { box-shadow: none; }
|
||||
|
||||
/* ---------- Rechtstexte ---------- */
|
||||
.legal { max-width: 72ch; }
|
||||
.legal h2 { font-size: 1.5rem; font-weight: 800; font-stretch: 115%; letter-spacing: -.015em; margin: var(--s5) 0 var(--s2); }
|
||||
.legal h3 { font-size: 1.125rem; font-weight: 700; margin: var(--s4) 0 var(--s1); }
|
||||
.legal p, .legal li { color: var(--ink-soft); }
|
||||
.legal p + p { margin-top: .9em; }
|
||||
.legal ul { padding-left: 1.2rem; display: grid; gap: .4rem; margin: .75rem 0; }
|
||||
.legal a { color: var(--kk-ink); text-decoration: underline; text-underline-offset: 3px; }
|
||||
.legal address { font-style: normal; color: var(--ink); line-height: 1.7; }
|
||||
.todo { display: block; margin: var(--s2) 0; padding: var(--s2) var(--s3); border: 2px dashed #B3261E; border-radius: var(--radius); color: #8C1D18; background: #FCEEEE; font-size: .9375rem; }
|
||||
|
||||
/* ---------- Reveal-Startzustände (nur mit JS, nur mit Motion) ---------- */
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
html.js [data-reveal] { opacity: 0; transform: translateY(28px); }
|
||||
html.js .reveal-img { --x: 118%; }
|
||||
html.js [data-split] { visibility: hidden; }
|
||||
html.js [data-split].is-split { visibility: visible; }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
*, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; scroll-behavior: auto !important; }
|
||||
}
|
||||
|
||||
/* ---------- Seitenübergänge: Cross-Document View Transitions ---------- */
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
@view-transition { navigation: auto; }
|
||||
::view-transition-old(root) { animation: vt-out .6s var(--ease-io) both; }
|
||||
::view-transition-new(root) { animation: vt-in .75s var(--ease-io) both; }
|
||||
::view-transition-old(site-header), ::view-transition-new(site-header) { animation: none; }
|
||||
.site-header { view-transition-name: site-header; }
|
||||
}
|
||||
@keyframes vt-out { to { opacity: .35; transform: translateX(-4%); } }
|
||||
@keyframes vt-in {
|
||||
from { clip-path: polygon(100% 0, 120% 0, 100% 50%, 120% 100%, 100% 100%); }
|
||||
to { clip-path: polygon(100% 0, 0 0, -20% 50%, 0 100%, 100% 100%); }
|
||||
}
|
||||
|
||||
/* ---------- Hilfen ---------- */
|
||||
.mt-2 { margin-top: var(--s2); } .mt-3 { margin-top: var(--s3); } .mt-4 { margin-top: var(--s4); } .mt-5 { margin-top: var(--s5); } .mt-6 { margin-top: var(--s6); }
|
||||
.stack { display: grid; gap: var(--s3); }
|
||||
.section-head { display: grid; gap: var(--s3); margin-bottom: var(--s6); max-width: 60rem; }
|
||||
@@ -0,0 +1,11 @@
|
||||
/*!
|
||||
* ScrollTrigger 3.15.0
|
||||
* https://gsap.com
|
||||
*
|
||||
* @license Copyright 2026, GreenSock. All rights reserved.
|
||||
* Subject to the terms at https://gsap.com/standard-license.
|
||||
* @author: Jack Doyle, jack@greensock.com
|
||||
*/
|
||||
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).window=e.window||{})}(this,function(e){"use strict";function _defineProperties(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function r(){return Se||"undefined"!=typeof window&&(Se=window.gsap)&&Se.registerPlugin&&Se}function z(e,t){return~Le.indexOf(e)&&Le[Le.indexOf(e)+1][t]}function A(e){return!!~t.indexOf(e)}function B(e,t,r,n,i){return e.addEventListener(t,r,{passive:!1!==n,capture:!!i})}function C(e,t,r,n){return e.removeEventListener(t,r,!!n)}function F(){return Re&&Re.isPressed||Ie.cache++}function G(r,n){function fd(e){if(e||0===e){i&&(Ce.history.scrollRestoration="manual");var t=Re&&Re.isPressed;e=fd.v=Math.round(e)||(Re&&Re.iOS?1:0),r(e),fd.cacheID=Ie.cache,t&&o("ss",e)}else(n||Ie.cache!==fd.cacheID||o("ref"))&&(fd.cacheID=Ie.cache,fd.v=r());return fd.v+fd.offset}return fd.offset=0,r&&fd}function J(e,t){return(t&&t._ctx&&t._ctx.selector||Se.utils.toArray)(e)[0]||("string"==typeof e&&!1!==Se.config().nullTargetWarn?console.warn("Element not found:",e):null)}function L(t,e){var r=e.s,n=e.sc;A(t)&&(t=Me.scrollingElement||ke);var i=Ie.indexOf(t),o=n===Xe.sc?1:2;~i||(i=Ie.push(t)-1),Ie[i+o]||B(t,"scroll",F);var a=Ie[i+o],s=a||(Ie[i+o]=G(z(t,r),!0)||(A(t)?n:G(function(e){return arguments.length?t[r]=e:t[r]})));return s.target=t,a||(s.smooth="smooth"===Se.getProperty(t,"scrollBehavior")),s}function M(e,t,i){function Hd(e,t){var r=Ye();t||n<r-s?(a=o,o=e,l=s,s=r):i?o+=e:o=a+(e-a)/(r-l)*(s-l)}var o=e,a=e,s=Ye(),l=s,n=t||50,c=Math.max(500,3*n);return{update:Hd,reset:function reset(){a=o=i?0:o,l=s=0},getVelocity:function getVelocity(e){var t=l,r=a,n=Ye();return!e&&0!==e||e===o||Hd(e),s===l||c<n-l?0:(o+(i?r:-r))/((i?n:s)-t)*1e3}}}function N(e,t){return t&&!e._gsapAllow&&!1!==e.cancelable&&e.preventDefault(),e.changedTouches?e.changedTouches[0]:e}function O(e){var t=Math.max.apply(Math,e),r=Math.min.apply(Math,e);return Math.abs(t)>=Math.abs(r)?t:r}function P(){(Ae=Se.core.globals().ScrollTrigger)&&Ae.core&&function _integrate(){var e=Ae.core,r=e.bridge||{},t=e._scrollers,n=e._proxies;t.push.apply(t,Ie),n.push.apply(n,Le),Ie=t,Le=n,o=function _bridge(e,t){return r[e](t)}}()}function Q(e){return Se=e||r(),!Te&&Se&&"undefined"!=typeof document&&document.body&&(Ce=window,ke=(Me=document).documentElement,Ee=Me.body,t=[Ce,Me,ke,Ee],Se.utils.clamp,Be=Se.core.context||function(){},Oe="onpointerenter"in Ee?"pointer":"mouse",Pe=k.isTouch=Ce.matchMedia&&Ce.matchMedia("(hover: none), (pointer: coarse)").matches?1:"ontouchstart"in Ce||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints?2:0,De=k.eventTypes=("ontouchstart"in ke?"touchstart,touchmove,touchcancel,touchend":"onpointerdown"in ke?"pointerdown,pointermove,pointercancel,pointerup":"mousedown,mousemove,mouseup,mouseup").split(","),setTimeout(function(){return i=0},500),Te=1),Ae||P(),Te}var Se,Te,Ce,Me,ke,Ee,Pe,Oe,Ae,t,Re,De,Be,i=1,ze=[],Ie=[],Le=[],Ye=Date.now,o=function _bridge(e,t){return t},n="scrollLeft",a="scrollTop",Ne={s:n,p:"left",p2:"Left",os:"right",os2:"Right",d:"width",d2:"Width",a:"x",sc:G(function(e){return arguments.length?Ce.scrollTo(e,Xe.sc()):Ce.pageXOffset||Me[n]||ke[n]||Ee[n]||0})},Xe={s:a,p:"top",p2:"Top",os:"bottom",os2:"Bottom",d:"height",d2:"Height",a:"y",op:Ne,sc:G(function(e){return arguments.length?Ce.scrollTo(Ne.sc(),e):Ce.pageYOffset||Me[a]||ke[a]||Ee[a]||0})};Ne.op=Xe,Ie.cache=0;var k=(Observer.prototype.init=function init(e){Te||Q(Se)||console.warn("Please gsap.registerPlugin(Observer)"),Ae||P();var i=e.tolerance,a=e.dragMinimum,t=e.type,o=e.target,r=e.lineHeight,n=e.debounce,s=e.preventDefault,l=e.onStop,c=e.onStopDelay,u=e.ignore,f=e.wheelSpeed,d=e.event,p=e.onDragStart,g=e.onDragEnd,h=e.onDrag,v=e.onPress,b=e.onRelease,m=e.onRight,y=e.onLeft,x=e.onUp,_=e.onDown,w=e.onChangeX,S=e.onChangeY,T=e.onChange,k=e.onToggleX,E=e.onToggleY,R=e.onHover,D=e.onHoverEnd,z=e.onMove,I=e.ignoreCheck,Y=e.isNormalizer,X=e.onGestureStart,U=e.onGestureEnd,q=e.onWheel,H=e.onEnable,W=e.onDisable,V=e.onClick,G=e.scrollSpeed,j=e.capture,K=e.allowClicks,$=e.lockAxis,Z=e.onLockAxis;function hf(){return xe=Ye()}function jf(e,t){return(se.event=e)&&u&&function _isWithin(e,t){for(var r=t.length;r--;)if(t[r]===e||t[r].contains(e))return!0;return!1}(e.target,u)||t&&he&&"touch"!==e.pointerType||I&&I(e,t)}function lf(){var e=se.deltaX=O(me),t=se.deltaY=O(ye),r=Math.abs(e)>=i,n=Math.abs(t)>=i;T&&(r||n)&&T(se,e,t,me,ye),r&&(m&&0<se.deltaX&&m(se),y&&se.deltaX<0&&y(se),w&&w(se),k&&se.deltaX<0!=le<0&&k(se),le=se.deltaX,me[0]=me[1]=me[2]=0),n&&(_&&0<se.deltaY&&_(se),x&&se.deltaY<0&&x(se),S&&S(se),E&&se.deltaY<0!=ce<0&&E(se),ce=se.deltaY,ye[0]=ye[1]=ye[2]=0),(ne||re)&&(z&&z(se),re&&(p&&1===re&&p(se),h&&h(se),re=0),ne=!1),oe&&!(oe=!1)&&Z&&Z(se),ie&&(q(se),ie=!1),ee=0}function mf(e,t,r){me[r]+=e,ye[r]+=t,se._vx.Line truncated
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
/*!
|
||||
* SplitText 3.15.0
|
||||
* https://gsap.com
|
||||
*
|
||||
* @license Copyright 2026, GreenSock. All rights reserved. Subject to the terms at https://gsap.com/standard-license.
|
||||
* @author: Jack Doyle
|
||||
*/
|
||||
|
||||
(function(k,A){typeof exports=="object"&&typeof module!="undefined"?A(exports):typeof define=="function"&&define.amd?define(["exports"],A):(k=typeof globalThis!="undefined"?globalThis:k||self,A(k.window=k.window||{}))})(this,function(k){"use strict";let A,D,Z=typeof Symbol=="function"?Symbol():"_split",K,he=()=>K||Y.register(window.gsap),$=typeof Intl!="undefined"&&"Segmenter"in Intl?new Intl.Segmenter:0,I=e=>e?typeof e=="string"?I(document.querySelectorAll(e)):"length"in e?Array.from(e).reduce((t,i)=>(typeof i=="string"?t.push(...I(i)):t.push(i),t),[]):[e]:[],ee=e=>I(e).filter(t=>t&&t.nodeType===1),Q=[],U=function(){},de={add:e=>e()},pe=/\s+/g,te=new RegExp("\\p{RI}\\p{RI}|\\p{Emoji}(\\p{EMod}|\\u{FE0F}\\u{20E3}?|[\\u{E0020}-\\u{E007E}]+\\u{E007F})?(\\u{200D}\\p{Emoji}(\\p{EMod}|\\u{FE0F}\\u{20E3}?|[\\u{E0020}-\\u{E007E}]+\\u{E007F})?)*|.","gu"),J={left:0,top:0,width:0,height:0},ue=(e,t)=>{for(;++t<e.length&&e[t]===J;);return e[t]||J},ie=({element:e,html:t,ariaL:i,ariaH:n})=>{e.innerHTML=t,i?e.setAttribute("aria-label",i):e.removeAttribute("aria-label"),n?e.setAttribute("aria-hidden",n):e.removeAttribute("aria-hidden")},ne=(e,t)=>{if(t){let i=new Set(e.join("").match(t)||Q),n=e.length,a,c,l,o;if(i.size)for(;--n>-1;){c=e[n];for(l of i)if(l.startsWith(c)&&l.length>c.length){for(a=0,o=c;l.startsWith(o+=e[n+ ++a])&&o.length<l.length;);if(a&&o.length===l.length){e[n]=l,e.splice(n+1,a);break}}}}return e},le=e=>window.getComputedStyle(e).display==="inline"&&(e.style.display="inline-block"),M=(e,t,i)=>t.insertBefore(typeof e=="string"?document.createTextNode(e):e,i),X=(e,t,i)=>{let n=t[e+"sClass"]||"",{tag:a="div",aria:c="auto",propIndex:l=!1}=t,o=e==="line"?"block":"inline-block",d=n.indexOf("++")>-1,_=y=>{let m=document.createElement(a),E=i.length+1;return n&&(m.className=n+(d?" "+n+E:"")),l&&m.style.setProperty("--"+e,E+""),c!=="none"&&m.setAttribute("aria-hidden","true"),a!=="span"&&(m.style.position="relative",m.style.display=o),m.textContent=y,i.push(m),m};return d&&(n=n.replace("++","")),_.collection=i,_},fe=(e,t,i,n)=>{let a=X("line",i,n),c=window.getComputedStyle(e).textAlign||"left";return(l,o)=>{let d=a("");for(d.style.textAlign=c,e.insertBefore(d,t[l]);l<o;l++)d.appendChild(t[l]);d.normalize()}},se=(e,t,i,n,a,c,l,o,d,_)=>{var y;let m=Array.from(e.childNodes),E=0,{wordDelimiter:R,reduceWhiteSpace:B=!0,prepareText:V}=t,G=e.getBoundingClientRect(),j=G,q=!B&&window.getComputedStyle(e).whiteSpace.substring(0,3)==="pre",C=0,b=i.collection,r,f,O,s,g,x,z,h,p,W,S,T,N,F,w,u,L,v;for(typeof R=="object"?(O=R.delimiter||R,f=R.replaceWith||""):f=R===""?"":R||" ",r=f!==" ";E<m.length;E++)if(s=m[E],s.nodeType===3){for(w=s.textContent||"",B?w=w.replace(pe," "):q&&(w=w.replace(/\n/g,f+`
|
||||
`)),V&&(w=V(w,e)),s.textContent=w,g=f||O?w.split(O||f):w.match(o)||Q,L=g[g.length-1],h=r?L.slice(-1)===" ":!L,L||g.pop(),j=G,z=r?g[0].charAt(0)===" ":!g[0],z&&M(" ",e,s),g[0]||g.shift(),ne(g,d),c&&_||(s.textContent=""),p=1;p<=g.length;p++)if(u=g[p-1],!B&&q&&u.charAt(0)===`
|
||||
`&&((y=s.previousSibling)==null||y.remove(),M(document.createElement("br"),e,s),u=u.slice(1)),!B&&u==="")M(f,e,s);else if(u===" ")e.insertBefore(document.createTextNode(" "),s);else{if(r&&u.charAt(0)===" "&&M(" ",e,s),C&&p===1&&!z&&b.indexOf(C.parentNode)>-1?(x=b[b.length-1],x.appendChild(document.createTextNode(n?"":u))):(x=i(n?"":u),M(x,e,s),C&&p===1&&!z&&x.insertBefore(C,x.firstChild)),n)for(S=$?ne([...$.segment(u)].map(H=>H.segment),d):u.match(o)||Q,v=0;v<S.length;v++)x.appendChild(S[v]===" "?document.createTextNode(" "):n(S[v]));if(c&&_){if(w=s.textContent=w.substring(u.length+1,w.length),W=x.getBoundingClientRect(),W.top>j.top&&W.left<=j.left){for(T=e.cloneNode(),N=e.childNodes[0];N&&N!==x;)F=N,N=N.nextSibling,T.appendChild(F);e.parentNode.insertBefore(T,e),a&&le(T)}j=W}(p<g.length||h)&&M(p>=g.length?" ":r&&u.slice(-1)===" "?" "+f:f,e,s)}e.removeChild(s),C=0}else s.nodeType===1&&(l&&l.indexOf(s)>-1?(b.indexOf(s.previousSibling)>-1&&b[b.length-1].appendChild(s),C=s):(se(s,t,i,n,a,c,l,o,d,!0),C=0),a&&le(s))};const re=class ae{constructor(t,i){this.isSplit=!1,he(),this.elements=ee(t),this.chars=[],this.words=[],this.lines=[],this.masks=[],this.vars=i,this.elements.forEach(l=>{var o;i.overwrite!==!1&&((o=l[Z])==null||o._data.orig.filter(({element:d})=>d===l).forEach(ie)),l[Z]=this}),this._split=()=>this.isSplit&&this.split(this.vars);let n=[],a,c=()=>{let l=n.length,o;for(;l--;){o=n[l];let d=o.element.offsetWidth;if(d!==o.width){o.width=d,this._split();return}}};this._data={orig:n,obs:typeof ResizeObserver!="undefined"&&new ResizeObserver(()=>{clearTimeout(a),a=setTimeout(c,200)})},U(this),this.split(i)}split(t){return(this._ctx||de).add(()=>{this.isSplit&&this.revert(),this.vars=t=t||this.vars||{};let{type:i="chars,words,lines",aria:n="auto",deepSlice:a=!0,smartWrap:c,onSplit:l,autoSplit:o=!1,specialChars:d,mask:_}=this.vars,y=i.indexOf("lines")>-1,m=i.indexOf("chars")>-1,E=i.indexOf("words")>-1,R=m&&!E&&!y,B=d&&("push"in d?new RegExp("(?:"+d.join("|")+")","gu"):d),V=B?new RegExp(B.source+"|"+te.source,"gu"):te,G=!!t.ignore&&ee(t.ignore),{orig:j,animTime:q,obs:C}=this._data,b;(m||E||y)&&(this.elements.forEach((r,f)=>{j[f]={element:r,html:r.innerHTML,ariaL:r.getAttribute("aria-label"),ariaH:r.getAttribute("aria-hidden")},n==="auto"?r.setAttribute("aria-label",(r.textContent||"").trim()):n==="hidden"&&r.setAttribute("aria-hidden","true");let O=[],s=[],g=[],x=m?X("char",t,O):null,z=X("word",t,s),h,p,W,S;if(se(r,t,z,x,R,a&&(y||R),G,V,B,!1),y){let T=I(r.childNodes),N=fe(r,T,t,g),F,w=[],u=0,L=T.map(P=>P.nodeType===1?P.getBoundingClientRect():J),v=J,H;for(h=0;h<T.length;h++)F=T[h],F.nodeType===1&&(F.nodeName==="BR"?((!h||T[h-1].nodeName!=="BR")&&(w.push(F),N(u,h+1)),u=h+1,v=ue(L,h)):(H=L[h],h&&H.top>v.top&&H.left<v.left+v.width-1&&(N(u,h),u=h),v=H));u<h&&N(u,h),w.forEach(P=>{var oe;return(oe=P.parentNode)==null?void 0:oe.removeChild(P)})}if(!E){for(h=0;h<s.length;h++)if(p=s[h],m||!p.nextSibling||p.nextSibling.nodeType!==3)if(c&&!y){for(W=document.createElement("span"),W.style.whiteSpace="nowrap";p.firstChild;)W.appendChild(p.firstChild);p.replaceWith(W)}else p.replaceWith(...p.childNodes);else S=p.nextSibling,S&&S.nodeType===3&&(S.textContent=(p.textContent||"")+(S.textContent||""),p.remove());s.length=0,r.normalize()}this.lines.push(...g),this.words.push(...s),this.chars.push(...O)}),_&&this[_]&&this.masks.push(...this[_].map(r=>{let f=r.cloneNode();return r.replaceWith(f),f.appendChild(r),r.className&&(f.className=r.className.trim().split(" ").map(O=>O+"-mask").join(" ")),f.style.overflow="clip",f}))),this.isSplit=!0,D&&y&&o&&D.addEventListener("loadingdone",this._split),(b=l&&l(this))&&b.totalTime&&(this._data.anim=q?b.totalTime(q):b),y&&o&&this.elements.forEach((r,f)=>{j[f].width=r.offsetWidth,C&&C.observe(r)})}),this}kill(){let{obs:t}=this._data;t&&t.disconnect(),D==null||D.removeEventListener("loadingdone",this._split)}revert(){var t,i;if(this.isSplit){let{orig:n,anim:a}=this._data;this.kill(),n.forEach(ie),this.chars.length=this.words.length=this.lines.length=n.length=this.masks.length=0,this.isSplit=!1,a&&(this._data.animTime=a.totalTime(),a.revert()),(i=(t=this.vars).onRevert)==null||i.call(t,this)}return this}static create(t,i){return new ae(t,i)}static register(t){A=A||t||window.gsap,A&&(I=A.utils.toArray,U=A.core.context||U),!K&&window.innerWidth>0&&(D=document.fonts,K=!0)}};re.version="3.15.0";let Y=re;k.SplitText=Y,k.default=Y;if (typeof(window)==="undefined"||window!==k){Object.defineProperty(k,"__esModule",{value:!0})} else {delete k.default}});
|
||||
@@ -0,0 +1,11 @@
|
||||
/*!
|
||||
* GSAP 3.15.0
|
||||
* https://gsap.com
|
||||
*
|
||||
* @license Copyright 2026, GreenSock. All rights reserved.
|
||||
* Subject to the terms at https://gsap.com/standard-license.
|
||||
* @author: Jack Doyle, jack@greensock.com
|
||||
*/
|
||||
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).window=t.window||{})}(this,function(e){"use strict";function _inheritsLoose(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}function _assertThisInitialized(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t){return"string"==typeof t}function s(t){return"function"==typeof t}function t(t){return"number"==typeof t}function u(t){return void 0===t}function v(t){return"object"==typeof t}function w(t){return!1!==t}function x(){return"undefined"!=typeof window}function y(t){return s(t)||r(t)}function R(t){return(i=bt(t,ht))&&Fe}function S(t,e){return console.warn("Invalid property",t,"set to",e,"Missing plugin? gsap.registerPlugin()")}function T(t,e){return!e&&console.warn(t)}function U(t,e){return t&&(ht[t]=e)&&i&&(i[t]=e)||ht}function V(){return 0}function ga(t){var e,r,i=t[0];if(v(i)||s(i)||(t=[t]),!(e=(i._gsap||{}).harness)){for(r=yt.length;r--&&!yt[r].targetTest(i););e=yt[r]}for(r=t.length;r--;)t[r]&&(t[r]._gsap||(t[r]._gsap=new Xt(t[r],e)))||t.splice(r,1);return t}function ha(t){return t._gsap||ga(Pt(t))[0]._gsap}function ia(t,e,r){return(r=t[e])&&s(r)?t[e]():u(r)&&t.getAttribute&&t.getAttribute(e)||r}function ja(t,e){return(t=t.split(",")).forEach(e)||t}function ka(t){return Math.round(1e5*t)/1e5||0}function la(t){return Math.round(1e7*t)/1e7||0}function ma(t,e){var r=e.charAt(0),i=parseFloat(e.substr(2));return t=parseFloat(t),"+"===r?t+i:"-"===r?t-i:"*"===r?t*i:t/i}function na(t,e){for(var r=e.length,i=0;t.indexOf(e[i])<0&&++i<r;);return i<r}function oa(){var t,e,r=pt.length,i=pt.slice(0);for(_t={},t=pt.length=0;t<r;t++)(e=i[t])&&e._lazy&&(e.render(e._lazy[0],e._lazy[1],!0)._lazy=0)}function pa(t){return!!(t._initted||t._startAt||t.add)}function qa(t,e,r,i){pt.length&&!I&&oa(),t.render(e,r,i||!!(I&&e<0&&pa(t))),pt.length&&!I&&oa()}function ra(t){var e=parseFloat(t);return(e||0===e)&&(t+"").match(ot).length<2?e:r(t)?t.trim():t}function sa(t){return t}function ta(t,e){for(var r in e)r in t||(t[r]=e[r]);return t}function wa(t,e){for(var r in e)"__proto__"!==r&&"constructor"!==r&&"prototype"!==r&&(t[r]=v(e[r])?wa(t[r]||(t[r]={}),e[r]):e[r]);return t}function xa(t,e){var r,i={};for(r in t)r in e||(i[r]=t[r]);return i}function ya(t){var e=t.parent||L,r=t.keyframes?function _setKeyframeDefaults(i){return function(t,e){for(var r in e)r in t||"duration"===r&&i||"ease"===r||(t[r]=e[r])}}(K(t.keyframes)):ta;if(w(t.inherit))for(;e;)r(t,e.vars.defaults),e=e.parent||e._dp;return t}function Aa(t,e,r,i,n){void 0===r&&(r="_first"),void 0===i&&(i="_last");var a,s=t[i];if(n)for(a=e[n];s&&s[n]>a;)s=s._prev;return s?(e._next=s._next,s._next=e):(e._next=t[r],t[r]=e),e._next?e._next._prev=e:t[i]=e,e._prev=s,e.parent=e._dp=t,e}function Ba(t,e,r,i){void 0===r&&(r="_first"),void 0===i&&(i="_last");var n=e._prev,a=e._next;n?n._next=a:t[r]===e&&(t[r]=a),a?a._prev=n:t[i]===e&&(t[i]=n),e._next=e._prev=e.parent=null}function Ca(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Da(t,e){if(t&&(!e||e._end>t._dur||e._start<0))for(var r=t;r;)r._dirty=1,r=r.parent;return t}function Fa(t,e,r,i){return t._startAt&&(I?t._startAt.revert(ft):t.vars.immediateRender&&!t.vars.autoRevert||t._startAt.render(e,!0,i))}function Ha(t){return t._repeat?wt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ja(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ka(t){return t._end=la(t._start+(t._tDur/Math.abs(t._ts||t._rts||q)||0))}function La(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=la(r._time-(0<t._ts?e/t._ts:((t._dirty?t.totalDuration():t._tDur)-e)/-t._ts)),Ka(t),r._dirty||Da(r,t)),t}function Ma(t,e){var r;if((e._time||!e._dur&&e._initted||e._start<t._time&&(e._dur||!e.add))&&(r=Ja(t.rawTime(),e),(!e._dur||Mt(0,e.totalDuration(),r)-e._tTime>q)&&e.render(r,!0)),Da(t,e)._dp&&t._initted&&t._time>=t._dur&&t._ts){if(t._dur<t.duration())for(r=t;r._dp;)0<=r.rawTime()&&r.totalTime(r._tTime),r=r._dp;t._zTime=-q}}function Na(e,r,i,n){return r.parent&&Ca(r),r._start=la((t(i)?i:i||e!==L?Ot(e,i,r):e._time)+r._delay),r._end=la(r._start+(r.totalDuration()/Math.abs(r.timeScale())||0)),Aa(e,r,"_first","_last",e._sort?"_start":0),xt(r)||(e._recent=r),n||Ma(e,r),e._ts<0&&La(e,e._tTime),e}function Oa(t,e){return(ht.ScrollTrigger||S("scrollTrigger",e))&&ht.ScrollTrigger.create(e,t)}function Pa(t,e,r,i,n){return Ht(t,e,n),t._initted?!r&&t._pt&&!I&&(t._dur&&!1!==t.vars.lazy||!t._dur&&t.vars.lazy)&&f!==It.frame?(pt.push(t),t._lazy=[n,i],1):void 0:1}function Ua(t,e,r,i){var n=t._repeat,a=la(e)||0,s=t._tTime/t._tDur;return s&&!i&&(t._time*=a/t._dur),t._dur=a,t._tDur=n?n<0?1e10:la(a*(n+1)+t._rDelay*n):a,0<s&&!i&&La(t,t._tTime=t._tDur*s),t.parent&&Ka(t),r||Da(t.parent,t),t}function Va(t){return t instanceof Gt?Da(t)Line truncated
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
(function(){var e=`1.3.26`;function t(e,t,n){return Math.max(e,Math.min(t,n))}function n(e,t,n){return(1-n)*e+n*t}function r(e,t,r,i){return n(e,t,1-Math.exp(-r*i))}function i(e,t){return(e%t+t)%t}var a=class{isRunning=!1;value=0;from=0;to=0;currentTime=0;lerp;duration;easing;onUpdate;advance(e){if(!this.isRunning)return;let n=!1;if(this.duration&&this.easing){this.currentTime+=e;let r=t(0,this.currentTime/this.duration,1);n=r>=1;let i=n?1:this.easing(r);this.value=this.from+(this.to-this.from)*i}else this.lerp?(this.value=r(this.value,this.to,this.lerp*60,e),Math.round(this.value)===Math.round(this.to)&&(this.value=this.to,n=!0)):(this.value=this.to,n=!0);n&&this.stop(),this.onUpdate?.(this.value,n)}stop(){this.isRunning=!1}fromTo(e,t,{lerp:n,duration:r,easing:i,onStart:a,onUpdate:o}){this.from=this.value=e,this.to=t,this.lerp=n,this.duration=r,this.easing=i,this.currentTime=0,this.isRunning=!0,a?.(),this.onUpdate=o}};function o(e,t){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>{n=void 0,e.apply(this,r)},t)}}var s=class{width=0;height=0;scrollHeight=0;scrollWidth=0;debouncedResize;wrapperResizeObserver;contentResizeObserver;constructor(e,t,{autoResize:n=!0,debounce:r=250}={}){this.wrapper=e,this.content=t,n&&(this.debouncedResize=o(this.resize,r),this.wrapper instanceof Window?window.addEventListener(`resize`,this.debouncedResize):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),this.wrapper===window&&this.debouncedResize&&window.removeEventListener(`resize`,this.debouncedResize)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper instanceof Window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper instanceof Window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)};get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}},c=class{events={};emit(e,...t){let n=this.events[e]||[];for(let e=0,r=n.length;e<r;e++)n[e]?.(...t)}on(e,t){return this.events[e]?this.events[e].push(t):this.events[e]=[t],()=>{this.events[e]=this.events[e]?.filter(e=>t!==e)}}off(e,t){this.events[e]=this.events[e]?.filter(e=>t!==e)}destroy(){this.events={}}};let l={passive:!1};function u(e,t){return e===1?16.666666666666668:e===2?t:1}var d=class{touchStart={x:0,y:0};lastDelta={x:0,y:0};window={width:0,height:0};emitter=new c;constructor(e,t={wheelMultiplier:1,touchMultiplier:1}){this.element=e,this.options=t,window.addEventListener(`resize`,this.onWindowResize),this.onWindowResize(),this.element.addEventListener(`wheel`,this.onWheel,l),this.element.addEventListener(`touchstart`,this.onTouchStart,l),this.element.addEventListener(`touchmove`,this.onTouchMove,l),this.element.addEventListener(`touchend`,this.onTouchEnd,l)}on(e,t){return this.emitter.on(e,t)}destroy(){this.emitter.destroy(),window.removeEventListener(`resize`,this.onWindowResize),this.element.removeEventListener(`wheel`,this.onWheel,l),this.element.removeEventListener(`touchstart`,this.onTouchStart,l),this.element.removeEventListener(`touchmove`,this.onTouchMove,l),this.element.removeEventListener(`touchend`,this.onTouchEnd,l)}onTouchStart=e=>{let{clientX:t,clientY:n}=e.targetTouches?e.targetTouches[0]:e;this.touchStart.x=t,this.touchStart.y=n,this.lastDelta={x:0,y:0},this.emitter.emit(`scroll`,{deltaX:0,deltaY:0,event:e})};onTouchMove=e=>{let{clientX:t,clientY:n}=e.targetTouches?e.targetTouches[0]:e,r=-(t-this.touchStart.x)*this.options.touchMultiplier,i=-(n-this.touchStart.y)*this.options.touchMultiplier;this.touchStart.x=t,this.touchStart.y=n,this.lastDelta={x:r,y:i},this.emitter.emit(`scroll`,{deltaX:r,deltaY:i,event:e})};onTouchEnd=e=>{this.emitter.emit(`scroll`,{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:e})};onWheel=e=>{let{deltaX:t,deltaY:n,deltaMode:r}=e,i=u(r,this.window.width),a=u(r,this.window.height);t*=i,n*=a,t*=this.options.wheelMultiplier,n*=this.options.wheelMultiplier,this.emitter.emit(`scroll`,{deltaX:t,deltaY:n,event:e})};onWindowResize=()=>{this.window={width:window.innerWidth,height:window.innerHeight}}};let f=e=>Math.min(1,1.001-2**(-10*e));var p=class{_isScrolling=!1;_isStopped=!1;_isLocked=!1;_preventNextNativeScrollEvent=!1;_resetVelocityTimeout=null;_rafId=null;_isDraggingSelection=!1;reducedMotionMediaQuery=window.matchMedia(`(prefers-reduced-motion: reduce)`);isTouching;isIos;time=0;userData={};lastVelocity=0;velocity=0;direction=0;options;targetScroll;animatedScroll;animate=new a;emitter=new c;dimensions;virtualScroll;conLine truncated
|
||||
//# sourceMappingURL=lenis.min.js.map
|
||||