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>
This commit is contained in:
NotPika69andClaude Opus 5.5 committed 2026-09-30 20:34:00 +02:00
commit 62916fc179
66 files changed
+3466

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

+1
View File
@@ -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

+93
View File
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

+359
View File
@@ -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');
});
})();
+687
View File
@@ -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; }
+11
View File
@@ -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
+11
View File
@@ -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}});
+11
View File
@@ -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
+2
View File
@@ -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